Przesądna winda hotelowa


54

Opis

Oto bardzo przesądna winda hotelowa w Szanghaju:

               wprowadź opis zdjęcia tutaj

Unika liczby 13, ponieważ trzynaście nie ma szczęścia w świecie zachodnim, a unika cyfry 4, ponieważ cztery mają pecha w niektórych częściach Azji. Co jeśli ten hotel był wyższy?

Przeczytaj dodatnią liczbę całkowitą dodatnią nze STDIN, reprezentującą liczbę pięter, i wydrukuj, jak wyglądałby układ przycisku STDOUT:, -1a następnie kolejne n-1dodatnie liczby całkowite, które nie są równe 13 i nie zawierają cyfry 4. Ułóż je liczby w dwóch kolumnach, jak na powyższym obrazku: wydrukuj dwie liczby pięter w linii, oddzielone poziomą tabulacją, tak że czytanie linii w odwrotnej kolejności od lewej do prawej daje sekwencję rosnącą. (Opcjonalnie możesz również wydrukować końcowy znak nowego wiersza).

Przypadki testowe

Dane wejściowe 14powinny wyglądać jak na powyższym obrazku:

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

gdzie biały znak w każdej linii jest pojedynczym poziomym znakiem tabulacji.

Jako dane wejściowe 2powinieneś wydrukować -1 1.

Jako dane wejściowe 100należy wydrukować:

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

Cel

To jest . Najkrótsza odpowiedź w bajtach wygrywa.


2
@ Mauris 6138, może nie, ale 113? Myślę, że kluczem będzie to, czy powiesz „trzynaście”, kiedy przeczytasz numer na głos.
Random832

12
@ Random832 Sugerujesz, że są to skutecznie arbitralne zmiany specyfikacji. Etykieta PPCG odradza takie zmiany po udzieleniu odpowiedzi, zwłaszcza jeśli istniejące odpowiedzi zostaną skutecznie unieważnione, co byłoby w tym przypadku
Digital Trauma

8
FWIW, 4 to nie pech. 4 po prostu brzmi bardzo podobnie do „umrzeć” lub „śmierć” w różnych chińskich dialektach / językach.
slebetman

10
@slebetman: Cóż, tak, dlatego 4 ma pecha. To wciąż przesąd, bez względu na pochodzenie! Ale to robi się trochę nie na temat.
Lynn

13
Czekać! Licząc przyciski, widzę, że hotel ma dokładnie 13 pięter (z wyjątkiem piwnicy.) Nie ma mowy, żebym się tam
Level River St

Odpowiedzi:


8

Pyth, 27 bajtów

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

Wypróbuj online tutaj .

Pobiera .first Q-1numery, które pasują do filtra !=13i 4nie znajduje się w ciąg znaków numeru. Następnie -1łączy, przecina na pół, łączy każdy za pomocą tabs ( C9) i łączy za pomocą nowego wiersza.


19

Bash + wspólne narzędzia, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq generuje rosnące liczby całkowite od 1 do N z dodatkowymi 9 cyframi z przodu - więcej niż wystarcza na wejście 64-bitowe liczby całkowite
  • sedodfiltrowuje pechowe podłogi i wstawki -1przed linią 1
  • rs przekształca się w dwie kolumny oddzielone tabulatorami
  • sed zatrzymuje się po linii N / 2
  • tac odwraca kolejność linii wyjściowych

Mogę golić 5 bajtów dla ciebie - wymienić sed $[$1/2]qpo rsz sed $1qprzed nim. Myślę, że dzięki temu jest również kompatybilny z powłoką POSIX.
Toby Speight

1
Ostatecznie powyższe 1nie wystarczy, aby zrekompensować przekazanie tylko 0,9 ^ n danych wejściowych (liczby nie zawierające 4get sparser i sparser wraz ze wzrostem liczby cyfr). Ale kiedy już będziesz mieć w hotelu ponad kilkaset milionów pięter, prawdopodobnie będziesz mieć inne problemy, takie jak utrzymanie pracy kanalizacji i organizacja rotas dla personelu.
Toby Speight

@TobySpeight możesz mieć też windę kosmiczną :)
Digital Trauma

@TobySpeight Nawet z maksymalną liczbą całkowitą ze znakiem 64-bitową jako wejściem (9223372036854775807), zwykłe prefiksowanie 1 jest (prawie) wystarczające - przynajmniej z moją podstawową kalkulacją 9. Reszta odpowiedzi i tak jest ograniczona do tego zakresu ze względu na $[]arytmetykę powłoki . Myślę, że jest to rozsądne ograniczenie w przypadku braku wyraźnej wzmianki o arytmetyki arbitralnej precyzji w pytaniu. Niezależnie od tego, teraz prefiksuję 9zamiast 1, żeby być po bezpiecznej stronie.
Cyfrowa trauma

10

JavaScript ES6, 236 234 233 210 195 188 bajtów

Zaoszczędziliśmy całą masę bajtów dzięki usandfriends!

Wykorzystuje function*generatory. Prawdopodobnie jest to krótszy sposób, ale było fajnie. Dobra zabawa. Założę się, że można grać w golfa. Te dziwne białe znaki to zakładki.

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 bajt)
usandfriends

@usandfriends Dziękujemy! Zapomniałem o automatycznej konwersji typu.
Conor O'Brien

.jointabulatorem i zamień spację /-?\d+ \d+/gtabulatorem, usuń .map(x=>x.replace(/ /,"\t"))(powinien zaoszczędzić 23 bajty)
usandfriends

1
.filter(x=>x!=".0")==> .filter(x=>+x), (-5 bajtów)
usandfriends

2
^ Zarysuj to , po prostu usuń całą .filter(..)część! Spróbuj l.push(a);==> +a&&l.push(a);(-15 bajtów)
usandfriends

7

C, 282 bajtów

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

Sformatowany:

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

Cechy :

Może obliczyć do 2095984 pięter, jeśli każde piętro jest 19.5mwysokie ( łącznie z sufitem), wówczas ten budynek jest wystarczająco długi, aby można go było owinąć wokół równika! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
Dobra odpowiedź, ale twoja geografia jest trochę zła. Odległość od równika do bieguna północnego wynosi z definicji 10000 km en.wikipedia.org/wiki/Metre, co oznacza, że ​​obwód równika wynosi nieco ponad 40000 km.
Level River St

1
Miły komentarz, ale twoja definicja miernika jest nieco nieaktualna. ;-)
murphy

@steveverrill właśnie użyłem pierwszego numeru, który wylogowałem się z Google'a, zaktualizuję obliczenia.
x13

Możesz zapisać kilka bajtów, upuszczając „int” z main. Czy aparat ortodontyczny wokół E jest naprawdę potrzebny? Najpierw whilemożna przekonwertować, fora to pozwala upuścić kilka nawiasów klamrowych. t/=10jest bajtem krótszym niż t=t/10. Dodaj 1 do c w swojej forpętli, aby zapisać kilka bajtów -> a[c+1]staje się a[c], podczas gdy wszystkie inne liczby mają tę samą długość. Połączyłem też dwa printfs razem w pętli i ponownie upuściłem kręcone szelki.
aragaer

Myślę, że twoja definicja „wysokości podłogi” może być nieco odbiegająca od normy - typowa podłoga ma około 3 m wysokości, a nie 19,5 m wysokości.
nneonneo

6

Julia, 134 132 bajty

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

Ta śmieszna biała spacja to dosłowna zakładka. Jak zauważył Conor O'Brien, jest to bajt krótszy niż działanie \t.

Nie golfowany:

# 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 bajtów

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

Myślę, że możesz użyć i-13zamiasti!=13
12Me21

6

JavaScript, 116 122

Edytuj Zapisane 6 bajtów dzięki @Neil

Proste rozwiązanie tablicowe - nawet bez użycia ES6

Spróbuj w dowolnej przeglądarce

/* 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>


Za pomocą można zapisać 6 bajtów !/4/.test(v).
Neil

Możesz zapisać pojedynczy bajt ' 'zamiast '\t'(literał)
Mwr247,

6

Python 2 , 94 bajty

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

Wypróbuj online!

W ciągu znajduje się znak tabulacji, którego SE nie renderuje (dzięki Sp3000 za sugerowane użycie go, zapisanie bajtu).

Testuje podłogi, czaczynając od podłogi -1aż do osiągnięcia limitu npięter. Dla każdego piętra należy sprawdzić, czy nie zawiera on 4ani równa się, 0ani 13. Jeśli tak, dołącza go do ciągu windy si zmniejsza limit n.

Trik z formatowaniem ciągów jest używany, aby dwa piętra w kolumnie pojawiały się w odpowiedniej kolejności po dodaniu. Każda nowa linia jest przygotowana w '%d\t%%d\n'taki sposób, aby po zmianie dwóch pięter w kolejności pierwsza znajdowała się po lewej, a druga po prawej. Na przykład,

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

Całkiem fajnie, ale tak naprawdę to 96 bajtów . Prawdopodobnie usunąć przecinek końcowy?
movatica

2
@movatica Dobry chwyt na przecinku końcowym, ponieważ wyzwanie określa, że ​​końcowy znak nowej linii jest OK. Różnica 1 bajtu była spowodowana tym, że blok kodu SE nie może wyświetlać tabulatorów, więc wstawiłem \t. Ach, dni przed istnieniem TIO.
xnor

5

C #, 296 bajtów

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

Nie golfowany:

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

Zastosowane sztuczki golfowe:

  • i (licznik bieżący) i j (bieżąca liczba, o której mowa) są odpowiednio zmniejszane / zwiększane wewnątrz wyrażenia w treści pętli zamiast instrukcji for, co jest normalne
  • j+"" zamiast j.ToString()
  • Umieść wszystko w środku namespace System.Collections.Genericnie tylko, abyśmy mieli dostęp List<T>, ale także domyślnie użyj przestrzeni nazw Systembez dalszych kwalifikacji
  • Umieść usingwnętrze przestrzeni nazw, abyśmy mogli pisać using Linq;zamiastusing System.Linq;
  • .Insert(0,j)jest krótszy niż użycie, .Add(j)a później zastosowanie.Reverse()

Szkoda, że using Linq;jest to konieczne, ponieważ jest potrzebne tylko do .Zippisania, ale Linq.Enumerable.Zip()jest dłuższe.


5

Ruby 2.3, 84 83 znaków

(Kod 82 znaków + opcja wiersza poleceń 1 znak)

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

Przykładowy przebieg:

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

Ruby, 93 92 znaków

(Kod 91 znaków + opcja wiersza poleceń 1 znak)

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

Przykładowy przebieg:

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

Lua, 169 bajtów

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

Dość prosto, najpierw montujemy tabelę wypełnioną wszystkimi wartościami przycisków. Następnie iterujemy ją wstecz, wypisując dwie wartości na raz, lub nic, jeśli druga wartość nie istnieje.


4

Mathematica, 105 bajtów

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

Zamień na \trzeczywisty znak tabulacji.


4

Brachylog , 105 bajtów

,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&}

Byłoby o wiele krótsze z obsługą CLPFD, tutaj muszę iteracyjnie wypróbować liczby całkowite w pierwszym predykacie podrzędnym.

Nowa wcześniejsza linia "w,?bb:2&}jest obowiązkowa, jest to nowa linia drukowana między każdym rzędem.


Miły! Jedno pytanie: dlaczego nie sprawić, aby wszystkie liczby całkowite w Brachylog korzystały automatycznie z ograniczeń CLP (FD)? To byłoby naturalne logiczne rozszerzenie.
mat

@mat, bo jestem leniwy, a ja nie. Ale powinienem!
Fatalize

To byłoby niesamowite! Wbudowane niejawne ograniczenia CLP (FD) dla całej arytmetyki liczb całkowitych! Utoruj przyszłość deklaratywnego programowania! „I musicie wydawać się wam błogosławieństwem, aby odcisnąć rękę na tysiącleciach jak na wosku. Błogosławieństwo pisać na woli tysiącleci jak na brązie - twardsze niż brąz, szlachetniejsze niż brąz. Tylko najszlachetniejszy jest całkowicie twardy”.
mat

@mat Czy możesz dołączyć do mnie na tym czacie, aby to omówić? Potrzebuję porady od kogoś, kto jest bardziej doświadczony w Prologu niż ja.
Fatalize

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

Jest to tylko funkcja. Jestem nowy w C #. Zwiększenie miało obowiązywać dla 40-49 i dla włączenia usings

Ungolfed, jako kompletny uruchomiony program:

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

Wyjaśniono

Tworzę dwie listy i na przemian pcham do nich, odwracam je, przeglądam jedną i chwytam drugą za pomocą indeksu.


Nie wiem dużo o C #, ale nie można zastąpić if(s==1)przez if(s)(automatyczne obsadą od int do boolean?)
Fatalize

Nie, ponieważ reszta jest dla s == 2, chociaż mógłbym zrobić flagi 0 i 1 zamiast 1 i 2. Spróbuję tego.
Goose

3

Python 3, 155 bajtów

Myślę, że listowanie, cofanie i samozamykanie generatora numerów podłogowych s()może być zbyt sprytne dla własnego dobra, ale inni już zrobili alternatywę (wyskakiwanie dwóch elementów jednocześnie), nie wspominając już o użyciu Pythona 2, który oszczędza bajty w niektórych kluczowych punktach.

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)

Krótsza, ale już zrobiona, lepsza alternatywa zajmuje 140 bajtów.

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)

Dla drugiej alternatywy (0!=n!=13)!=('4'in str(n))jest 5 bajtów krótszy niż not(n in(0,13)or'4'in str(n)).
movatica

3

Japt, 42 bajty

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

Cztery spacje powinny być rzeczywistym znakiem tabulacji. Wypróbuj online!

Jak to działa

          // 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

Lua, 141 bajtów

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)

Nie golfił

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

Wypróbuj online (musisz wpisać „wykonaj” u góry, a następnie kliknij terminal u dołu przed wpisaniem danych wejściowych; Szukam lepszego sposobu na przetestowanie lua online za pomocą stdin i stdout)


3

05AB1E , 25 23 22 bajtów

-1 bajt dzięki tylko @ ASCII

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

Wypróbuj online!

Wyjaśnienie

                           # 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


Ach Wiedziałem, że istnieje sposób, aby tę brzydką 0 13ªczęść uczynić nieco lepszą. Dzięki!
Wisław

czekać. nie ma logiki, a w 05AB1E? O_o
tylko

1
Jeśli 1 jest prawdą, a 0 jest fałszem, mnożenie działa jak logiczne i
Wisław

-1 bajt, zmieniając ʒ4å_}na 4мïê. PS: na podstawie twojego wcześniejszego komentarza: 0 13ªmogło być ¾13ªrównież.
Kevin Cruijssen

3

C ++ 11, 259 258 203 202 195 194 bajtów

Zmniejszono 1 bajt, dzięki pomysłowi Conora O'Briena, aby zamiast liter używać tabulacji dosłownej \t.

UPD 2: zmniejszono 55 bajtów z ulepszoną logiką i nadużywaniem przecinków.

UPD 3: kolejny bajt wyłączony dzięki ceilingcat.

UPD 4: 7 bajtów dzięki uprzejmości pułapu kota.

UPD 5: i kolejny bajt wyłączony przez ceilingcat.

Cieszę się, że wszystko zawiera w miejscu ORAZ wciąż pokonuję rozwiązania C i 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;}

Nie golfowany:

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

iostreamzawiera string, więc możesz pominąć drugą opcję, aby znacznie zmniejszyć liczbę bajtów :)
movatica

@movatica Nie według cppreference.com, a kompilacja w VS2019 kończy się niepowodzeniem. Więc jeśli kompiluje się gdzie indziej, jest specyficzne dla tej standardowej implementacji biblioteki.
Alexander Revo

ok, wydaje się być gcc.
movatica


2

Java, 333 bajtów

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

Dodaje dozwolone numery pięter do stosu, a następnie odsuwa je, aby je wydrukować.

Bawiłem się za pomocą IntStream, ale przy wszystkich importach ten okazał się mniejszy.


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

Jest to oczywiście wersja w dół Scala'd.
CJ Dennis

2

Python 3, 117 bajtów

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)

Zmodyfikowana wersja postu python 2, aby pasowała do specyfikacji python 3.


2

PowerShell, 106 107 bajtów

$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

Nie golfił

# 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

Przykład

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

2

Haskell 202 bajty

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

Jestem początkującym haskell…

  • najpierw utwórz nieskończoną listę wartości. (lista t)
  • funkcja by2 grupuje listę w listy podrzędne z 2 elementów.
  • główna weź wartość.
    • weź elementy wartości z listy t
    • odwróć listę, aby najpierw mieć elementy greaters
    • funkcja map show do konwersji listy int na listę ciągów
    • grupuj element 2 na 2 z funkcją by2
    • Mamy listę taką jak [[„4”, „5”], [„6”, „7”]] przekształconą jak [„4 5”, „6 7”] z funkcją nieoznaczonych mapowanych na liście
    • usuwa znaki z listy (każdy element listy oddzielony jest przez „\ n”)
    • zakończ z putStrLn, aby zapisać ciąg znaków na terminalu.

Możesz zapisać kilka bajtów podczas definiowania by2, używając nazwy 1-znakowej i zmiany kolejności: użyj ostatniego wiersza bez zmian, a potem b x = [x]po.
ballesta25

2

JavaScript ES6 114 bajtów

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

Stosowanie

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 bajtów

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

Zakłada parzystą liczbę pięter, ponieważ wydaje się, że opis problemu również ją zakłada i co najmniej jedno inne dostarczone rozwiązanie psuje się dla nieparzystej liczby pięter. Po prostu dodaj ,:partialjako drugi argument do jeszcze rotordziewięciu bajtów, aby obsługiwać nieparzystą liczbę pięter.



2

Galaretka , 20 bajtów

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

Wypróbuj online!

W jaki sposób?

ḟ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,''))

Zrobiłem to, zanim zdałem sobie sprawę, że edc65 jest już krótszy. No cóż!


1

R , 106 bajtów

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=""))

Wypróbuj online!

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=""))

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.