Суеверный лифт отеля


54

Описание

Вот очень суеверный лифт отеля в Шанхае:

               введите описание изображения здесь

Он избегает числа 13, потому что тринадцать не повезло в западном мире, и он избегает цифры 4, потому что четыре не повезло в некоторых частях Азии. Что если этот отель был выше?

Считайте положительное четное целое число nиз STDIN, представляющее количество этажей, и напечатайте, как макет кнопки будет выглядеть как STDOUT:, -1а затем следующие n-1положительные целые числа, которые не равны 13 и не содержат цифру 4. Расположите их числа в двух столбцах, такие как на изображении выше: выведите два номера этажа в строке, разделенных горизонтальной табуляцией, чтобы при чтении строк в обратном порядке слева направо получалась последовательность в порядке возрастания. (При желании вы также можете распечатать завершающий символ новой строки.)

Контрольные примеры

Для ввода 14вывод должен быть таким, как на рисунке выше:

15  16
11  12
9   10
7   8
5   6
2   3
-1  1

где пробел в каждой строке представляет собой одиночный горизонтальный символ табуляции.

Для ввода 2вы должны распечатать -1 1.

Для ввода 100вы должны напечатать:

120 121
118 119
116 117
113 115
111 112
109 110
107 108
105 106
102 103
100 101
98  99
96  97
93  95
91  92
89  90
87  88
85  86
82  83
80  81
78  79
76  77
73  75
71  72
69  70
67  68
65  66
62  63
60  61
58  59
56  57
53  55
51  52
39  50
37  38
35  36
32  33
30  31
28  29
26  27
23  25
21  22
19  20
17  18
15  16
11  12
9   10
7   8
5   6
2   3
-1  1

Цель

Это . Кратчайший ответ в байтах побеждает.


2
@Mauris 6138, может и нет, но 113? Я думаю, что ключом будет то, скажете ли вы «тринадцать», когда вы прочитаете номер вслух.
Random832

12
@ Random832 То, что вы предлагаете, - это произвольные изменения в спецификации. Этикет PPCG не одобряет такие изменения после того, как ответы были даны, особенно если существующие ответы будут фактически признаны недействительными, какими они и были бы в этом случае
Digital Trauma

8
FWIW, 4 не повезло. 4 просто звучит очень похоже на «умереть» или «смерть» на различных китайских диалектах / языках.
Slebetman

10
@ Slebetman: Ну да, вот почему 4 не повезло. Это все еще суеверие, каким бы ни было происхождение! Но это становится немного не по теме.
Линн

13
Подождите! Подсчитав кнопки, я вижу, что в отеле ровно 13 этажей (исключая подвал). Я никак не могу там
Уровень Река Сент-

Ответы:


8

Pyth, 27 байт

jjLC9_c+_1.f&!@\4`ZnZ13tQ)2

Попробуйте это онлайн здесь .

Получает .fпервые Q-1числа, которые соответствуют фильтру !=13и 4отсутствуют в строковом представлении числа. Затем он добавляется -1, разбивается пополам, объединяется с помощью tabs ( C9) и соединяется переводом строки.


19

Bash + общие утилиты, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq генерирует возрастающие целые числа от 1 до N с дополнительными 9 цифрами впереди - более чем достаточно для 64-битного целочисленного ввода
  • sedотфильтровывает незадачливые полы и вставляет -1перед строкой 1
  • rs превращается в два столбца, разделенных табуляцией
  • sed останавливается после N / 2 строк
  • tac меняет порядок вывода строк

Я могу бриться 5 байт для вас - заменить sed $[$1/2]qпосле того, как rsс sed $1qдо него. Я думаю, что это делает его совместимым с POSIX-оболочкой.
Тоби Спейт

1
В конце концов, предыдущего 1не будет достаточно, чтобы компенсировать прохождение только 0,9 ^ n входов (числа, не содержащие, 4становятся все меньше и меньше по мере увеличения числа цифр). Но если в вашем отеле более нескольких сотен миллионов этажей, у вас, вероятно, возникнут другие проблемы, такие как работа сантехники и организация работы персонала.
Тоби Спейт

@TobySpeight у тебя тоже может быть космический лифт :)
Digital Trauma

@TobySpeight Даже с максимальным 64-разрядным целым числом со знаком в качестве входного (9223372036854775807) достаточно просто поставить префикс 1 (почти) - по крайней мере, с моим базовым вычислением базы 9. Остальная часть ответа ограничена этим диапазоном в любом случае из-за $[]арифметики оболочки . Я думаю, что это разумное ограничение в отсутствие явного упоминания произвольной арифметики точности в вопросе. Несмотря на это, я теперь 9вместо этого префикс 1, просто чтобы быть в безопасности.
Цифровая травма

10

JavaScript ES6, 236 234 233 210 195 188 байт

Спасли целую кучу байтов благодаря нам и друзьям!

Использует function*для генераторов. Вероятно, более короткий способ сделать это, но это было весело. Кстати, весело. Готов поспорить, можно поиграть в гольф. Эти странные пробелы являются вкладками.

z=prompt(i=x=0,l=[]);y=(function*(){while(i<z-x)yield(i?(/4/.test(i)||i==13?--x&&".":i):-1)+(0*++i)})();while(a=y.next().value)+a&&l.push(a);l.join`    `.match(/-?\d+  \d+/g).reverse().join`
`

z=+prompt(i=x=0,l=[]);==> z=prompt(i=x=0,l=[]);(-1 байт)
usandfriends

@usandfriends Спасибо! Я забыл об автоматическом преобразовании типов.
Конор О'Брайен

.joinс табуляцией и замените пробел на /-?\d+ \d+/gтабуляцию, удалите .map(x=>x.replace(/ /,"\t"))(следует сохранить 23 байта)
usandfriends

1
.filter(x=>x!=".0")==> .filter(x=>+x), (-5 байт)
usandfriends

2
^ Поцарапайте это , просто удалите всю .filter(..)часть! Попробуйте l.push(a);==> +a&&l.push(a);(-15 байт)
usandfriends

7

C, 282 байта

int main(int r,char*v[]){int c=atoi(v[1]),a[c],b,E=1E9,g,i,t,o=t=g=(E)-2;while(i++<c){while(t>0){r=t%10;t=t/10;if(r==4||g==(E)+13||g<=o||g==E)t=++g;}a[i-1]=o=t=g;}for(c-=3;c>=0;c-=2){printf("%d\t",a[c+1]-E);printf("%d\n",a[c+2]-E);}printf("%d\t",a[0]-E);if(i%2)printf("%d",a[1]-E);}

Отформатировано:

int main ( int r , char * v[] ) {
    int c = atoi ( v[ 1 ] ) , a[c] , b , E = 1E9 , g , i , t , o = t = g = ( E ) - 2;
    while ( i ++ < c ) {
        while ( t > 0 ) {
            r = t % 10;
            t = t / 10;
            if ( r == 4 || g == ( E ) + 13 || g <= o || g == E )t = ++ g;
        }
        a[ i - 1 ] = o = t = g;
    }
    for ( c -= 3 ; c >= 0 ; c -= 2 ) {
        printf ( "%d\t" , a[ c + 1 ] - E );
        printf ( "%d\n" , a[ c + 2 ] - E );
    }
    printf ( "%d\t" , a[ 0 ] - E );
    if ( i % 2 )printf ( "%d" , a[ 1 ] - E );
}

Функции :

Он может рассчитывать до 2095984 этажей, если каждый этаж 19.5mвысокий (включая потолок), то это здание достаточно длинное, чтобы обернуться вокруг экватора! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet,


1
Хороший ответ, но ваша география немного не в порядке. Расстояние от экватора до северного полюса составляет 10000 км по определению en.wikipedia.org/wiki/Metre, что означает, что длина окружности экватора составляет чуть более 40000 км .
Уровень Река Сент-

1
Хороший комментарий, но ваше определение метра немного устарело. ;-)
Мерфи

@steveverrill Я просто использовал первый номер, который я получил от Google, я обновлю расчет.
x13

Вы можете сохранить несколько байтов, опустив int из main. Действительно ли необходимы скобки вокруг E? Сначала whileможно преобразовать в, forи это позволит вам удалить несколько фигурных скобок. t/=10на байт короче t=t/10. Добавьте 1 в c в forцикле, чтобы сохранить пару байтов -> a[c+1]становится a[c], в то время как все другие числа имеют одинаковую длину. Я также объединил бы два printfs в цикле и снова сбросил фигурные скобки.
aragaer

Я думаю, что ваше определение «высота пола» может быть немного неправильным - типичный этаж около 3 м в высоту, а не 19,5 м в высоту.
nneonneo

6

Юлия, 134 132 байта

x=[-1;filter(i->i!=13&&'4'"$i",1:2(n=parse(readline())))][1:n]
for i=2:2:endof(x) println(join((r=reverse)(r(x)[i-1:i]),"  "))end

Этот забавный пробел там буквальная вкладка. Как отметил Конор О'Брайен, это на байт короче, чем на самом деле \t.

Ungolfed:

# Read an integer from STDIN
n = parse(readline())

# Generate all numbers from 1 to 2n, exclude 0, 13, and all numbers containing 4,
# prepend -1, then take the first n
x = [-1; filter(i -> i != 13 && '4'  "$i", 1:2n)][1:n]

# Loop over pairs, print tab-separated
for i = 2:2:endof(x)
    println(join(reverse(reverse(x)[i-1:i]), "  "))
end

6

Python 2, 120 110 байт

N=input()
n=['-1']+[`i`for i in range(N*2)if i!=13and'4'not in`i`][1:N]
while n:x=n.pop();print n.pop()+'\t'+x

Я думаю, что вы можете использовать i-13вместоi!=13
12Me21

6

JavaScript, 116 122

Редактировать Сохранено 6 байт thx @Neil

Простое решение для массива - даже не используя ES6

Попробуйте с любым браузером

/* test */ console.log=function(x){ O.innerHTML+=x+'\n'; }

n=prompt();for(r=[-1],v=1;n;v++)v!=13&!/4/.test(v)&&--n&&r.push(v);for(;r[0];)console.log(a=r.pop(b=r.pop())+'\t'+b)
<pre id=O></pre>


Вы можете сохранить 6 байтов, используя !/4/.test(v).
Нил

Вы можете сохранить один байт ' 'вместо '\t'(буквальная вкладка)
Mwr247

6

Python 2 , 94 байта

n=input();c=-1;s=''
while n:
 if('4'in`c`)==0!=c!=13:n-=1;s=(n%2*'%d	%%d\n'+s)%c
 c+=1
print s

Попробуйте онлайн!

В строке есть символ табуляции, который SE не отображает (спасибо Sp3000 за предложение использовать его, сохраняя байт).

Проверяет полы, cначиная с пола и -1до достижения квоты nэтажей. Для каждого этажа, тесты, которые не содержат 4ни равно, 0ни 13. Если это так, добавляет его к строке лифта sи уменьшает квоту n.

Трюк со строковым форматированием используется, чтобы два этажа на столбец отображались в правильном порядке при добавлении. Каждая новая строка подготовлена ​​так '%d\t%%d\n', что, когда два этажа заменяются по порядку, первый находится слева, а второй справа. Например,

('%d\t%%d\n'%2)%3 == ('2\t%d\n')%3 == '2\t3\n'  

Довольно круто, но на самом деле это 96 байтов . Вероятно, удалить запятую?
Моватика

2
@movatica Хороший улов на запятой, так как в задании указывается завершающий символ новой строки. Разница в 1 байт была в том, что блок кода SE не может отображать вкладки, поэтому я вставил \t. Ах, дни до TIO существовали.
XNOR

5

C #, 296 байт

namespace System.Collections.Generic{using Linq;class X{static void Main(){var a=new List<int>();var b=new List<int>();for(int i=int.Parse(Console.ReadLine()),j=-2;i>0;)if(++j!=13&&j!=0&&!(j+"").Contains("4"))(i--%2<1?a:b).Insert(0,j);Console.Write(string.Join("\n",a.Zip(b,(x,y)=>x+"\t"+y)));}}}

Ungolfed:

namespace System.Collections.Generic
{
    using Linq;
    class X
    {
        static void Main()
        {
            var a = new List<int>();
            var b = new List<int>();
            for (int i = int.Parse(Console.ReadLine()), j = -2; i > 0;)
                if (++j != 13 && j != 0 && !(j + "").Contains("4"))
                    (i-- % 2 < 1 ? a : b).Insert(0, j);
            Console.Write(string.Join("\n", a.Zip(b, (x, y) => x + "\t" + y)));
        }
    }
}

Используемые гольф-трюки:

  • i ( текущий счетчик) и j (текущий рассматриваемый номер) соответственно уменьшаются / увеличиваются внутри выражения в теле цикла вместо оператора for, как обычно
  • j+"" вместо j.ToString()
  • Разместите все внутри namespace System.Collections.Genericне только так, чтобы мы могли получить к ним доступ List<T>, но и неявно использовали пространство имен Systemбез дальнейшей квалификации
  • Поместите usingвнутри пространство имен, чтобы мы могли писать using Linq;вместоusing System.Linq;
  • .Insert(0,j)короче чем использование .Add(j)и последующее применение.Reverse()

К сожалению, using Linq;это необходимо, так как это нужно только для .Zip, но писать это как Linq.Enumerable.Zip()дольше.


5

Ruby 2.3, 84 83 символа

(82 символа кода + 1 символ командной строки)

puts (["-1",*?1..?1+$_].grep_v(/^13$|4/)[0..$_.to_i]*?\t).scan(/\S+\t\d+/).reverse

Образец прогона:

bash-4.3$ ruby -ne 'puts (["-1",*?1..?1+$_].grep_v(/^13$|4/)[0..$_.to_i]*?\t).scan(/\S+\t\d+/).reverse' <<< '14'
15      16
11      12
9       10
7       8
5       6
2       3
-1      1

Рубин, 93 92 персонажа

(Код из 91 символа + 1 символ командной строки)

puts ([-1,*1..2*n=$_.to_i].reject{|i|i==13||i.to_s[?4]}[0..n]*?\t).scan(/\S+\t\d+/).reverse

Образец прогона:

bash-4.3$ ruby -ne 'puts ([-1,*1..2*n=$_.to_i].reject{|i|i==13||i.to_s[?4]}[0..n]*?\t).scan(/\S+\t\d+/).reverse' <<< '14'
15      16
11      12
9       10
7       8
5       6
2       3
-1      1

4

Луа, 169 байт

t={-1}i=1 repeat if(i..""):find("4")or i==13 then else table.insert(t,i)end i=i+1 until #t==arg[1] for i=#t%2==0 and#t-1 or#t,1,-2 do print(t[i],t[i+1]and t[i+1]or"")end

Довольно просто, мы сначала собираем таблицу, заполненную всеми значениями кнопок. Затем мы выполняем его в обратном порядке, печатая два значения за раз или ничего, если второе значение не существует.


4

Mathematica, 105 байт

StringRiffle[Reverse[Select[Range[2#]-2,#!=13&&#!=0&&DigitCount[#,10,4]<1&][[;;#]]~Partition~2],"
","\t"]&

Замените \tфактическим символом табуляции.


4

Брахилог , 105 байт

,Ll?,Lbb:1{h_.|[L:I]hhH,I+1=J((13;J:Zm4),L:J:1&.;Lb:J:1&:[J]c.)}:[1:-1]c{_|hJ,?bhw,[9:J]:"~c~w
"w,?bb:2&}

С поддержкой CLPFD было бы намного короче, здесь я должен итеративно пробовать целые числа в первом предикате.

Новая строка перед "w,?bb:2&}обязательна, это новая строка, которая печатается между каждой строкой.


Приятно! Один вопрос: почему бы не заставить всю целочисленную арифметику в Brachylog автоматически использовать ограничения CLP (FD)? Это было бы естественным логическим продолжением.
Мат

@mat, потому что я ленивый, и я не сделал. Но я должен!
Роковая

Это было бы круто! Встроенные неявные ограничения CLP (FD) для всей целочисленной арифметики! Проложить будущее декларативного программирования! «И вам должно показаться блаженством произвести впечатление на вашу руку тысячелетиями, как на воске. Блаженство писать на тысячелетней воле, как на бронзе - тяжелее бронзы, благороднее бронзы. Только благородней всего труднее».
коврик

@mat Не могли бы вы присоединиться ко мне в этом чате, чтобы обсудить это? Мне нужен совет от кого-то явно более опытного с Прологом, чем от меня.
Роковая

3

C #, 277 343

using System;using System.Collections.Generic;static void f(int v){List<int>a=new List<int>();List<int>b=new List<int>();int s=1;for(int i=-1;i<v-1;i++){if(i==13||i.ToString().Contains("4")||i==0){ v++;continue;}if(s==1){s=2;a.Add(i);}else{s=1;b.Add(i);}}a.Reverse();b.Reverse();int l=0;foreach(int y in a){Console.WriteLine(y+" "+b[l]);l++;}}

Это только как функция. Я новичок в C #. Увеличение должно было быть действительным для 40-49, и для включения usingс

Ungolfed, как полная программа бега:

using System;
using System.Collections.Generic;

class P {
    static void Main()
    {
        List<int> a = new List<int>();
        List<int> b = new List<int>();
        int v = Int32.Parse(Console.ReadLine());
        int s = 1;
        for (int i = -1; i < v - 1; i++)
        {
            if (i == 13 || i.ToString().Contains("4") || i == 0)
            {
                v++;
                continue;
            }
            if (s == 1)
            {
                s = 2;
                a.Add(i);
            }
            else {
                s = 1;
                b.Add(i);
            }
        }
        a.Reverse();
        b.Reverse();
        int l = 0;
        foreach (int y in a)
        {
            Console.WriteLine(y + " " + b[l]);
            l++;
        }
        Console.ReadLine();
    }
}

Разъяснения

Я создаю два списка и чередую нажатие на них, переворачиваю их, перебираю один и беру другой по индексу.


Я не знаю много о C #, но вы не можете заменить if(s==1)на if(s)(автоматическое приведение от int к логическому
значению

Нет, потому что остальное для s == 2, хотя я мог бы сделать флаг 0 и 1 вместо 1 и 2. Я попробую это.
Гусь

3

Python 3, 155 байт

Я думаю, что прослушивание, реверсирование и самоархивирование генератора номера этажа, s()возможно, было слишком умным для его же блага, но другие уже сделали альтернативу (выталкивая два элемента за один раз), не говоря уже об использовании Python 2, который сохраняет байты по некоторым ключевым моментам.

def s(m,n=-1):
 while m:
  if not(n in(0,13)or'4'in str(n)):yield n;m-=1
  n+=1
*f,=s(int(input()))
g=iter(f[::-1])
h=zip(g,g)
for a,b in h:print(b,'\t',a)

Более короткая, но уже сделанная-лучшая альтернатива занимает 140 байт.

def s(m,n=-1):
 while m:
  if not(n in(0,13)or'4'in str(n)):yield n;m-=1
  n+=1
*f,=s(int(input()))
while f:a=f.pop();print(f.pop(),'\t',a)

Для второй альтернативы на (0!=n!=13)!=('4'in str(n))5 байт короче, чем not(n in(0,13)or'4'in str(n)).
моватика

3

Japt, 42 байта

JoU*2 k0 kD f@!Xs f4} ¯U ã f@Yv} w ®q'    } ·

Четыре пробела должны быть фактическим символом табуляции. Попробуйте онлайн!

Как это устроено

          // Implicit: U = input integer, D = 13
JoU*2     // Create the range of integers [-1,U*2).
k0 kD     // Remove 0 and 13.
f@!Xs f4} // Filter out the items X where X.toString().match(/4/g) is not null, i.e. the numbers that contain a 4.
¯U ã      // Slice to the first U items, and generate all adjacent pairs of items.
f@Yv}     // Filter out the items where the index Y is odd. This discards every other pair.
w         // Reverse.
®q'\t}    // Join each item with tabs.
·         // Join the whole list with newlines.
          // Implicit: output last expression

3

Луа, 141 байт

n,s=1,'-1 1'function g()repeat n=n+1 until s.find(n,4)==z and n~=13 return n end for i=4,io.read(),2 do s=g()..' '..g().."\n"..s end print(s)

Ungolfed

n,s = 1,'-1'1' --n is the current floor number, S is the string to be printed
function g() --This function raises n to the next valid floor
    repeat --Same as while loop except it runs the following block before checking the expression
        n = n + 1 --Self-explanatory, increases n by one
    until --Checks the expression, if it is true, it breaks out of the loop
        s.find(n,4) == z --[[Strings have a member :find(X) where it finds the position of
                             X in the string (X can also be a pattern). However, calling it 
                             by .find(S,X) executes find on S with argument X. I can't 
                             directly do n:find(4) because n is a number. This is a "hack" 
                             (sort of) to cut down some bytes. Also, if X is not a string,
                             lua tries to (in this case, succeeds) cast X to a
                             string and then look for it. I check if this is equal to z
                             because z is nil (because it is undefined), and find returns
                             nil if X is not found in S.
                             TL;DR: Checks if 4 is not the last digit.]]
        and n ~= 13 --Self-explanatory, checks if n is not 13
        return n --Self-explanatory, returns n
end
for i = 4, io.read(), 2 do --[[Start at floor 3 (shows 4 because we're going by target
                               floor, not by starting floor), continue until we reach
                               floor io.read() (io.read returns user input), increment by
                               2 floors per iteration)]]
    s = g() .. ' ' .. g() .. "\n" .. s --[[Prepend the next floor, a space, the next floor,
                               and a newline to s]]
end
print(s) --Self-explanatory, output the string

Попробуйте онлайн (вам нужно нажать «выполнить» вверху, а затем нажать терминал внизу, прежде чем вводить ввод; я ищу лучший способ тестирования lua онлайн с помощью stdin и stdout)


3

05AB1E , 25 23 22 байта

-1 байт благодаря @ ASCII-only

·Ý<0K13Kʒ4å_}s£2ôR9çý»

Попробуйте онлайн!

объяснение

                           # Implicit input: integer n
·Ý<                        # Push list [-1,0,1,...,2n-1]
   0K                      # Remove 0 from [-1,0,1,...,2n-1]
     13K                   # Remove 13 from [-1,1,...,2n-1]
        ʒ4å_}              # Filter out every number containing a 4 from the list
             s£            # Pick out the n first element in the list
               2ôR         # Splice list into parts of length 2
                  9çý      # Join with tab character (ascii value 9)
                     »     # Join with newlines


Ах. Я знал, что есть способ сделать эту уродливую 0 13ªчасть немного лучше. Спасибо!
Вислав

Подождите. нет логичного а в 05AB1E? О_о
ASCII-только

1
Если 1 истинно, а 0 ложно, то умножение работает как логическое и
Вислав

-1 байт, изменив ʒ4å_}на 4мïê. PS: на основании вашего предыдущего комментария: 0 13ªмогло бы быть ¾13ªи так.
Кевин Круйссен

3

C ++ 11, 259 258 203 202 195 194 байта

Вырезал 1 байт, благодаря идее Конора О'Брайена использовать буквенную вкладку вместо \t.

UPD 2: сокращены 55 байтов с улучшенной логикой и злоупотреблением запятыми.

UPD 3: еще один байт, благодаря floorcat.

UPD 4: 7 байтов от потолочной кошки.

UPD 5: и еще один байт от потолочного кота.

Рад, что все включает в себя и по-прежнему побить решения C и C #.

#include<iostream>
#include<string>
int main(){std::string o="-1    1",c,b;int n,i=2,s=2;for(std::cin>>n;s<n;o=i==14|~c.find(52)?o:(++s&1?b=c,"":b+'    '+c+'\n')+o)c=std::to_string(i++);std::cout<<o;}

Ungolfed:

#include <iostream>
#include <string>

int main()
{
    std::string o = "-1 1", c, b;
    int n, i = 2, s = 2;
    for (std::cin >> n;
         s < n;
         o = i == 14 | ~c.find(52) ? o : (++s & 1 ? b = c, "" : b + '   ' + c + '\n') + o
    )
        c = std::to_string(i++);
    std::cout << o;
}

iostreamвключает в себя string, так что вы можете пропустить второе включение для большого уменьшения bytecount :)
movatica

@movatica Не в соответствии с cppreference.com, и компиляция в VS2019 завершится неудачно без него. Так что, если он компилируется где-то еще, это зависит от конкретной реализации стандартной библиотеки.
Александр Рево

хорошо, кажется, GCC вещь.
моватика


2

Java, 333 байта

import java.util.*;interface E{static void main(String[]a){byte i=-1;Stack<Byte>s=new Stack<>();while(s.size()<Byte.valueOf(a[0])){if(i==13|i==0|String.valueOf(i).contains("4")){i++;continue;}s.add(i);i++;}if(s.size()%2!=0){System.out.println(s.pop());}while(!s.isEmpty()){int r=s.pop();int l=s.pop();System.out.println(l+"\t"+r);}}}

Добавляет разрешенные номера этажей в стек, а затем отбрасывает их обратно, чтобы распечатать.

Я играл с использованием IntStream, но со всеми импортерами этот оказался меньше.



2

Python 3, 117 байт

n=int(input())
l=[-1]+[i for i in range(n*2)if(i!=13)*(not'4'in str(i))][1:n]
while l:x=l.pop();print(l.pop(),'\t',x)

Модифицированная версия поста Python 2 для соответствия спецификации Python 3.


2

PowerShell, 106 107 байт

$c=,-1+$(while($i+1-lt"$args"){if(++$c-notmatch'^13$|4'){$c;++$i}})
while($c){$a,$b,$c=$c;$s="$a    $b
$s"}$s

Ungolfed

# Calculate floors:
$c=,-1 # Array with one element
  +
  $( # Result of subexpression
    while($i+1-lt"$args"){ # Uninitialized $i is 0, +1 ensures loop start from 1
      if(
        ++$c-match'^13$|4' # Expression increments uninitialized $c (i.e. start from 1)
                           # and matches resulting number to regex.
      ){
        $c;++$i # Return $c and increment $i counter 
      }
    }
  )

# Print floors:
while($c){ # Loop until no more elements in $c
  $a,$b,$c=$c # Use PS's multiple assignment feature
              # $a - first element of $c array
              # $b - second element of $c array
              # $c - the rest of elements of $c array
  $s="$a    $b
$s" # Create string with tabs and newlines,
    # literal characters are used
}
$s # Output resulting string

пример

PS > .\Elevator.ps1 14
15  16
11  12
9   10
7   8
5   6
2   3
-1  1

2

Haskell 202 байта

t=(-1):[x|x<-[1..],x/=13,all (/='4')(show x)]
by2 []=[[]]
by2 [a]=[[a]]
by2 [a,b]=[[a,b]]
by2 (a:b:xs)=[a,b]:(by2 xs)
main=do
 n<-getLine
 putStr$unlines$map unwords$by2$map show$reverse$take(read n) t

Я начинающий на хэскелле ...

  • Сначала создайте бесконечный список значений. (т список)
  • Функция by2 группирует список в подсписки из 2 элементов.
  • Главное принять значение.
    • принимать значения элементов списка t
    • переверните список, чтобы сначала были элементы
    • функция отображения карты для преобразования списка int в список строк
    • сгруппировать элемент 2 по 2 с функцией by2
    • У нас есть список типа [["4", "5"], ["6", "7"]], преобразованный как ["4 5", "6 7"] с функцией unwords, отображенной в списке
    • выравнивает список (каждый элемент списка отделяется символом \ n)
    • закончите с putStrLn, чтобы написать строку на терминале.

Вы можете сохранить несколько байтов при определении by2, используя 1-символьное имя и переупорядочение: используйте последнюю строку как есть, а затем b x = [x]после.
ballesta25

2

Javascript ES6 114 байт

n=>[...Array(n)].map(_=>{while(/^13$|4|^0/.test(++i));return i;},i=-2).join`    `.match(/-?\d+  \d+/g).reverse().join`\n`

использование

f=n=>[...Array(n)].map(_=>{while(/^13$|4|^0/.test(++i));return i;},i=-2).join`  `.match(/-?\d+  \d+/g).reverse().join`\n`

F (100);


2

Perl 6 , 73 байта

{.join("    ").say for (-1,|grep {$_-13&!/4/},1..Inf)[^$_].rotor(2).reverse}

Предполагается четное количество этажей, поскольку в постановке задачи, по-видимому, это тоже предполагается, и, по крайней мере, еще одно предоставленное решение ломается на нечетное количество этажей. Просто добавьте ,:partialв качестве второго аргумента еще rotorдевять байтов для поддержки нечетного числа этажей.



2

Желе , 20 байт

ḟ13D_4Ȧµ#o-s2Ṛj€9Ọ¤Y

Попробуйте онлайн!

Как?

ḟ13D_4Ȧµ#o-s2Ṛj€9Ọ¤Y - Main Link: no arguments
        #            - start at n=0 and collect the first INPUT values which are truthy under:
       µ             -   the monad (i.e. f(n)):        e.g.:    0      3      4      13     42        813
ḟ13                  -     filter out thirteens                 [0]    [3]    [4]    []     [42]      [813]
   D                 -     convert to decimal lists             [[0]]  [[3]]  [[4]]  []     [[4,2]]   [[8,1,3]]
    _4               -     subtract four (vectorises)           [[-4]] [[-1]] [[0]]  []     [[0,-2]]  [[4,-3,-1]
      Ȧ              -     any & all?                           1      1      0      0      0         1
         o-          - logical OR with -1 (replace floor 0 with floor -1)
           s2        - split into twos
             Ṛ       - reverse
                  ¤  - nilad followed by link(s) as a nilad:
                9    -   literal nine
                 Ọ   -   to character (a tab)
              j€     - join €ach
                   Y - join with newlines
                     - implicit print

1

JavaScript (ES6), 151 146

alert([for(a of Array((n=+prompt(i=0))*2).keys())if((i+=t=/4/.test(a)||a==13,!t&&a<n+i))a].reduce((a,b,j,r)=>j%2-1?(b||-1)+`  ${r[j+1]}
`+a:a,''))

Сделал это до того, как понял, что edc65 уже сделал более короткий. Ну что ж!


1

R , 106 байт

n=scan();x=-1:n^2;x=x[-grep(4,x)][-14][-2][n:1];cat(paste0(matrix(x,2,n/2)[2:1,],c("	","\n"),collapse=""))

Попробуйте онлайн!

1n2n3n9c("\t","\n")\t

n=scan();                                        # read number of floors n
x=-1:n^2;                                        # initial vector of numbers
x=x[-grep(4,x)]                                  # remove floors with a 4
               [-14]                             # remove floor 13
                    [-2]                         # remove floor 0
                        [n:1];                   # keep lowest n remaining floors, highest to lowest
cat(paste0( 
  matrix(x,2,n/2)                                # split vector of floors into 2 rows
                 [2:1,],                         # take row 2 then row 1
                        c("   ","\n"),           # separate integers with alternating tabs and newlines (uses recycling)
                                    collapse=""))

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.