Забобонний ліфт готелю


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? Я думаю, що ключовим буде те, чи ти скажеш "тринадцять", коли читаєш номер вголос.
Випадково832

12
@ Random832 Що ви пропонуєте - це фактично довільні зміни специфікації. Етикет PPCG відлякує такі зміни після надання відповідей, особливо якщо існуючі відповіді фактично недійсні, що було б у цьому випадку
Digital Trauma

8
FWIW, 4 не пощастило. 4 просто звучить дуже схоже на "померти" або "смерть" у різних китайських діалектах / мовах.
slebetman

10
@slebetman: Ну так, саме тому 4 не пощастило. Це все ще забобони, незалежно від походження! Але це стає трохи поза темою.
Лінн

13
Зачекайте! Перераховуючи кнопки, я бачу, що в готелі рівно 13 поверхів (виключаючи підвал.) Я не можу залишитися там!
Рівень річки Св.

Відповіді:


8

Піт, 27 байт

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

Спробуйте його онлайн тут .

Отримує .fIRST Q-1номер, відповідний фільтр !=13і 4НЕ входить в строковому поданні числа. Потім він попередньо -1, розрізається навпіл, приєднується до кожного за допомогою вкладок ( 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-оболонку сумісною.
Toby Speight

1
Зрештою, попереднього 1не буде достатньо, щоб компенсувати пропуск лише 0,9 ^ n входів через (цифри, що не містять, 4стають меншими і меншими, оскільки кількість цифр збільшується). Але як тільки у вас є кілька сотень мільйонів поверхів у вашому готелі, напевно, у вас є інші проблеми, такі як підтримка роботи сантехніки та організація ротації персоналу.
Toby Speight

@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 Дякую! Я забув про автоматичне перетворення типів.
Conor O'Brien

.joinз вкладкою та замініть пробіл на /-?\d+ \d+/gвкладку, видаліть .map(x=>x.replace(/ /,"\t"))(має заощадити 23 байти)
usandfriends

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

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
Приємний коментар, але ваше визначення лічильника трохи застаріло. ;-)
murphy

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

Ви можете зберегти кілька байтів, скинувши "int" з основного. Чи справді потрібні брекети навколо E? Спочатку whileможна перетворитись, forі це дозволяє скинути кілька фігурних брекетів. t/=10- байт коротший, ніж t=t/10. Додайте 1 до c у forциклі, щоб зберегти пару байтів -> a[c+1]стає a[c], тоді як усі інші числа мають однакову довжину. Я також об'єднав би два printfs у циклі разом і знову скинув фігурні дужки.
араґер

Я думаю, що ваше визначення "висоти підлоги" може бути трохи відхиленим - типова підлога - близько 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.

Безголівки:

# 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 байт . Можливо, видаліть трему кому?
movatica

2
@movatica Хороший улов на кінцевій комі, оскільки виклик визначає, що трейлінг нового рядка в порядку. Різниця в 1 байті полягала в тому, що блок коду SE не може відображати вкладки, тому я поставив в \t. Ах, дні до існування ТІО.
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)));}}}

Безголівки:

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

Рубін 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

Математика, 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&}є обов'язковим, це новий рядок, який друкується між кожним рядком.


Приємно! Одне запитання: чому б не зробити всі цілі арифметики в Брахілогу автоматично використовувати обмеження CLP (FD)? Це було б природним логічним продовженням.
мат

@mat, тому що я лінивий, і я цього не зробив. Але я повинен!
Фаталізувати

Це було б чудово! Вбудовані неявні обмеження CLP (FD) для всієї цілої арифметики! Прокладіть майбутнє декларативного програмування! "І вам повинно здатися благословенням вражати руку тисячоліттями, як на воску. Благословення писати на волю тисячоліть, як на бронзі - твердіше бронзи, благородніше бронзи. Тільки найблагородніший взагалі важкий".
мат

@mat Чи можете ви приєднатись до мене в цій кімнаті чату, щоб обговорити це? Мені потрібна порада від когось, очевидно, досвідченого з Prolog, ніж я.
Фаталізувати

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, і для включення usings

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)(автоматичний
ролик

Ні, тому що інше призначено для 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)).
movatica

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)

Безумовно

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

·Ý<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? O_o
лише для ASCII,

1
Якщо 1 відповідає дійсності, а 0 - помилковим, то множення працює як логічне і
Wisław

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

3

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

Зрізав 1 байт, завдяки ідеї Конора О'Браєна використовувати буквальну вкладку замість \t.

UPD 2: зменшив 55 байт із покращеною логікою та зловживанням комами.

UPD 3: черговий байт від слів.

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;}

Безголівки:

#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, так що ви можете пропустити другий включати для великого зменшення кількості рахунків :)
movatica

@movatica Не відповідно до cppreference.com, і компіляція у VS2019 не проходить без неї. Отже, якщо він компілюється десь ще, це характерно для певної стандартної реалізації бібліотеки.
Олександр Рево

ок, здається, річ gcc.
movatica


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

Scala 147

val n=io.StdIn.readInt;(-1 to 4*n).filter(i=>i!=0&&i!=13&&(!(i+"").contains(52))).take(n).reverse.grouped(2).toList.map{i=>println(i(1)+"\t"+i(0))}

Очевидно, це версія Scala'd.
CJ Dennis

2

Пітон 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

Безумовно

# 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

Я початківець Haskell ...

  • спочатку створіть нескінченний список значень. (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.