Abergläubischer Hotelaufzug


54

Beschreibung

Hier ist ein sehr abergläubischer Hotelaufzug in Shanghai:

               Bildbeschreibung hier eingeben

Es vermeidet die Zahl 13, weil dreizehn in der westlichen Welt Pech haben, und es vermeidet die Ziffer 4, weil vier in Teilen Asiens Pech haben. Was wäre, wenn dieses Hotel größer wäre?

Lesen Sie eine positive gerade Ganzzahl naus STDIN, die die Anzahl der Stockwerke darstellt, und drucken Sie, wie das Schaltflächenlayout für STDOUT: aussehen würde -1, gefolgt von den nächsten n-1positiven Ganzzahlen, die ungleich 13 sind und keine Ziffer 4 enthalten. Ordnen Sie diese an Zahlen in zwei Spalten, wie im obigen Bild: Drucken Sie zwei Stockwerksnummern pro Zeile, die durch einen horizontalen Tabulator getrennt sind, so dass das Lesen der Zeilen in umgekehrter Reihenfolge von links nach rechts die Reihenfolge in aufsteigender Reihenfolge ergibt. (Optional können Sie auch ein abschließendes Zeilenumbruchzeichen drucken.)

Testfälle

Für die Eingabe 14sollte die Ausgabe wie im obigen Bild aussehen:

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

Dabei ist das Leerzeichen in jeder Zeile ein einzelnes horizontales Tabulatorzeichen.

Für die Eingabe 2sollten Sie drucken -1 1.

Für die Eingabe 100sollten Sie drucken:

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

Tor

Das ist . Kürzeste Antwort in Bytes gewinnt.


2
@ Mauris 6138, vielleicht nicht, aber 113? Ich denke, der Schlüssel wäre, ob Sie "dreizehn" sagen, wenn Sie die Nummer laut vorlesen.
Random832

12
@ Random832 Was Sie vorschlagen, sind effektiv willkürliche Änderungen an der Spezifikation. Die PPCG Etikette schreckt solche Änderungen nach Antworten gegeben worden sind, vor allem , wenn bestehende Antworten effektiv für ungültig erklärt werden, die sie in diesem Fall wären
Digitales Trauma

8
FWIW, 4 ist nicht unglücklich. 4 klingt in den verschiedenen chinesischen Dialekten / Sprachen nur sehr ähnlich wie "sterben" oder "Tod".
Slebetman

10
@slebetman: Na ja, deswegen hat 4 Pech. Es ist immer noch Aberglaube, was auch immer der Ursprung ist! Aber das wird ein bisschen unangebracht.
Lynn

13
Warten! Wenn ich die Knöpfe zähle, sehe ich, dass das Hotel genau 13 Stockwerke hat (ohne Keller). Ich bleibe auf keinen Fall dort!
Level River St

Antworten:


8

Pyth, 27 Bytes

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

Probieren Sie es hier online aus .

Ruft die .fersten Q-1Zahlen ab, die dem Filter entsprechen !=13und 4nicht in der Zeichenfolgendarstellung der Zahl enthalten sind. Dann geht es voran -1, schneidet in zwei Hälften , verbindet jedes durch Tabulatoren ( C9) und verbindet sich durch Zeilenumbrüche.


19

Bash + gemeinsame Utensilien, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq Generiert aufsteigende Ganzzahlen von 1 bis N mit einer zusätzlichen 9-stelligen voran - mehr als genug für eine 64-Bit-Ganzzahleingabe
  • sedfiltert die unglücklichen Böden und Einsätze -1vor Zeile 1 heraus
  • rs Formt in zwei durch Tabulatoren getrennte Spalten um
  • sed stoppt nach N / 2 Zeilen
  • tac Kehrt die Ausgabezeilenreihenfolge um

Ich kann 5 Bytes für Sie rasieren - ersetzen Sie das sed $[$1/2]qAfter rsmit dem sed $1qBefore. Ich denke, das macht es auch POSIX-Shell-kompatibel.
Toby Speight

1
Letztendlich wird das Vorhergehende 1nicht ausreichen, um zu kompensieren, dass nur 0,9 ^ n der Eingaben durchgelassen werden (Zahlen, die nicht 4get sparser und sparser enthalten, wenn die Anzahl der Ziffern zunimmt). Sobald Sie jedoch mehr als ein paar Hundert Millionen Stockwerke in Ihrem Hotel haben, haben Sie wahrscheinlich andere Probleme, wie z. B. die Klempnerarbeiten aufrechtzuerhalten und Personalwechsel zu organisieren.
Toby Speight

@TobySpeight Sie könnten auch einen Weltraum-Aufzug haben :)
Digital Trauma

@TobySpeight Sogar mit der 64-Bit-Ganzzahl mit Vorzeichen (9223372036854775807) als Eingabe ist das einfache Voranstellen einer 1 (fast) ausreichend - zumindest bei meiner rudimentären Berechnung der Basis 9. Der Rest der Antwort ist aufgrund der Shell- $[]Arithmetik ohnehin auf diesen Bereich beschränkt . Ich denke, dies ist eine vernünftige Einschränkung, da in der Frage keine explizite Erwähnung einer Arithmetik mit willkürlicher Genauigkeit erfolgt. Egal, ich stelle jetzt ein 9vor 1, nur um auf der sicheren Seite zu sein.
Digital Trauma

10

JavaScript ES6, 236 234 233 210 195 188 Bytes

Habe dank usandfriends eine Menge Bytes gespart!

Verwendet die function*für Generatoren. Wahrscheinlich ein kürzerer Weg, aber es hat Spaß gemacht. Viel Spaß. Ich wette, es kann Golf gespielt werden. Diese seltsamen Whitespace-Dinge sind Tabs.

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

@ usandfriends Danke! Ich habe die automatische Typkonvertierung vergessen.
Conor O'Brien

.joinMit Tabulator und ersetzen Sie Leerzeichen in /-?\d+ \d+/gmit Tabulator, entfernen .map(x=>x.replace(/ /,"\t"))(sollte 23 Bytes speichern)
Usandfriends

1
.filter(x=>x!=".0")==> .filter(x=>+x)(-5 Bytes)
Usandfriends

2
^ Scratch that , entferne einfach den ganzen .filter(..)Teil! Versuchen Sie l.push(a);==> +a&&l.push(a);(-15 Bytes)
usandfriends

7

C 282 Bytes

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

Formatiert:

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

Eigenschaften :

Es können bis zu 2095984 Stockwerke berechnet werden. Wenn jedes Stockwerk 19.5m(inkl. Decke) hoch ist, ist dieses Gebäude lang genug, um um den Äquator gewickelt zu werden! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
Gute Antwort, aber deine Geographie ist ein bisschen anders. Der Abstand vom Äquator zum Nordpol ist 10000km definitions en.wikipedia.org/wiki/Metre , die den Umfang des Äquators bedeutet , ist ein wenig über 40000km.
Level River St

1
Netter Kommentar, aber Ihre Definition des Zählers ist etwas veraltet. ;-)
Murphy

@steveverrill Ich habe gerade die erste Zahl verwendet, die ich von Google bekommen habe. Ich aktualisiere die Berechnung.
x13

Sie können ein paar Bytes sparen, indem Sie "int" von main entfernen. Sind Klammern um E wirklich notwendig? Erstens whilekann konvertiert werden forund dies ermöglicht es Ihnen, einige geschweifte Klammern fallen zu lassen. t/=10ist ein Byte kürzer als t=t/10. Addiere 1 zu c in deiner forSchleife, um ein paar Bytes zu speichern -> a[c+1]wird a[c], während alle anderen Zahlen die gleiche Länge haben. Ich würde auch zwei printfs in der Schleife miteinander kombinieren und wieder geschweifte Klammern fallen lassen.
Aragaer

Ich denke, Ihre Definition von "Bodenhöhe" ist vielleicht ein bisschen anders - ein typischer Boden ist ungefähr 3 m hoch, nicht 19,5 m.
Nneonneo

6

Julia, 134 132 Bytes

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

Das komische Leerzeichen darin ist eine wörtliche Lasche. Wie Conor O'Brien feststellte, ist dies ein Byte kürzer als dies der Fall ist \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 Bytes

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

Ich denke, Sie können i-13anstelle voni!=13
12Me21

6

JavaScript, 116 122

Bearbeiten Gespeichert 6 Bytes thx @Neil

Einfache Array-Lösung - nicht einmal mit ES6

Versuchen Sie es mit einem beliebigen Browser

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


Sie können 6 Bytes sparen, indem Sie verwenden !/4/.test(v).
Neil

Sie könnten ein einzelnes Byte speichern mit ' 'anstelle von '\t'(Literal Tab)
Mwr247

6

Python 2 , 94 Bytes

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

Probieren Sie es online!

Die Zeichenfolge enthält ein Tabulatorzeichen, das von SE nicht gerendert wird (danke an Sp3000 für den Vorschlag, es zu verwenden und ein Byte zu speichern).

Testet Böden cab dem Boden, -1bis die Quote nder Böden erreicht ist. Prüft für jede Etage, ob sie weder ein 4noch gleich 0oder enthält 13. In diesem Fall wird es dem Aufzugsstring vorangestellt sund das Kontingent verringert n.

Mit einem Trick bei der Formatierung von Zeichenfolgen werden die beiden Stockwerke pro Spalte in der richtigen Reihenfolge angezeigt, wenn sie vorangestellt werden. Jede neue Zeile wird wie folgt vorbereitet '%d\t%%d\n': Wenn zwei Etagen der Reihe nach ausgetauscht werden, befindet sich die erste links und die zweite rechts. Zum Beispiel,

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

Ziemlich cool, aber es sind tatsächlich 96 Bytes . Entfernen Sie wahrscheinlich das nachstehende Komma?
Movatica

2
@movatica Guter Fang für das nachgestellte Komma, da die Herausforderung angibt, dass nachgestellte Zeilenumbrüche in Ordnung sind. Der Unterschied von 1 Byte lag darin, dass der SE-Codeblock keine Registerkarten anzeigen kann \t. Ah, die Tage bevor TIO existierte.
Am

5

C # 296 Bytes

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

Verwendete Golf-Tricks:

  • i (der laufende Zähler) und j (die aktuell betrachtete Zahl) werden innerhalb des Ausdrucks im Schleifenkörper anstelle der for-Anweisung wie üblich dekrementiert bzw. inkrementiert
  • j+"" Anstatt von j.ToString()
  • Platzieren Sie alles darin, namespace System.Collections.Genericdamit wir nicht nur auf List<T>den Namespace zugreifen , sondern ihn implizit Systemohne weitere Qualifizierung verwenden können
  • Legen Sie die usinginnerhalb des Namespace , so dass wir schreiben können using Linq;stattusing System.Linq;
  • .Insert(0,j)ist kürzer als die Verwendung .Add(j)und spätere Anwendung.Reverse()

Es ist bedauerlich, dass das using Linq;notwendig ist, da es nur für .Zipdas Schreiben benötigt wird , aber es Linq.Enumerable.Zip()ist länger.


5

Ruby 2.3, 84 83 Zeichen

(82 Zeichen Code + 1 Zeichen Befehlszeilenoption)

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

Probelauf:

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 Zeichen

(91 Zeichen Code + 1 Zeichen Befehlszeilenoption)

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

Probelauf:

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 Bytes

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

Ziemlich einfach, stellen wir zuerst eine Tabelle zusammen, die mit allen Schaltflächenwerten gefüllt ist. Dann iterieren wir rückwärts und drucken jeweils zwei Werte oder nichts, wenn der zweite Wert nicht existiert.


4

Mathematica, 105 Bytes

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

Ersetzen Sie das \tdurch ein tatsächliches Tabulatorzeichen.


4

Brachylog , 105 Bytes

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

Wäre mit CLPFD-Unterstützung viel kürzer gewesen, hier muss ich iterativ ganze Zahlen im ersten Unterprädikat ausprobieren.

Die vorstehende neue Zeile "w,?bb:2&}ist obligatorisch. Dies ist die neue Zeile, die zwischen den einzelnen Zeilen gedruckt wird.


Nett! Eine Frage: Warum nicht alle ganzzahligen Arithmetiken in Brachylog automatisch CLP (FD) -Beschränkungen verwenden lassen? Dies wäre eine logische Erweiterung.
mat

@mat weil ich faul bin und ich nicht. Aber ich sollte!
Fatalize

Das wäre fantastisch! Integrierte implizite CLP (FD) -Einschränkungen für alle ganzzahligen Arithmetiken! Bereiten Sie die Zukunft der deklarativen Programmierung vor! "Und es muss Ihnen selig erscheinen, Ihre Hand auf Jahrtausende wie auf Wachs zu prägen. Selig, auf den Willen von Jahrtausenden wie auf Bronze zu schreiben - härter als Bronze, edler als Bronze. Nur der Edelste ist insgesamt hart."
Mat

@mat Könntest du mit mir in diesem Chatroom darüber diskutieren? Ich brauche Ratschläge von jemandem, der offensichtlich mehr Erfahrung mit Prolog hat als ich.
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++;}}

Dies ist nur eine Funktion. Ich bin neu in C #. Die Erhöhung sollte für 40-49 gültig sein und usings einschließen

Ungolfed als vollständiges Laufprogramm:

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

Erklärt

Ich erstelle zwei Listen und wechsle zwischen dem Drücken, Umkehren, Durchlaufen und Greifen der anderen nach Index.


Ich weiß nicht viel über C #, aber können Sie nicht ersetzen if(s==1)durch if(s)(automatische
Umwandlung

Nee, weil das übrige für s == 2 ist, obwohl ich das Flag 0 und 1 anstelle von 1 und 2 machen könnte. Das werde ich versuchen.
Gans

3

Python 3, 155 Bytes

Ich denke, das Auflisten, Umkehren und Selbstzippen des Flurnummerngenerators war s()vielleicht zu schlau für sich, aber andere haben bereits die Alternative gewählt (zwei Elemente gleichzeitig poppen ), ganz zu schweigen von der Verwendung von Python 2, mit dem Bytes gespart werden zu einigen wichtigen Punkten.

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)

Die kürzere, aber schon bessere Alternative benötigt 140 Bytes.

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)

Bei der zweiten Alternative (0!=n!=13)!=('4'in str(n))sind 5 Bytes kürzer als not(n in(0,13)or'4'in str(n)).
Movatica

3

Japt, 42 Bytes

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

Die vier Leerzeichen sollten ein tatsächliches Tabulatorzeichen sein. Probieren Sie es online!

Wie es funktioniert

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

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

Probieren Sie es online aus (Sie müssen oben auf "Ausführen" und dann unten auf das Terminal klicken, bevor Sie Eingaben eingeben. Ich suche nach einer besseren Möglichkeit, lua online mit stdin und stdout zu testen.)


3

05AB1E , 25 23 22 Bytes

-1 Byte dank nur @ ASCII

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

Probieren Sie es online!

Erläuterung

                           # 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


Ah. Ich wusste, dass es einen Weg gab, diesen hässlichen 0 13ªTeil ein bisschen besser zu machen. Vielen Dank!
Wisław

warten. es gibt keine logische und in 05AB1E? O_o
ASCII

1
Wenn 1 wahr und 0 falsch ist, funktioniert die Multiplikation als logisch und
Wisław

-1 Byte durch Ändern ʒ4å_}auf 4мïê. PS: basierend auf Ihrem früheren Kommentar: 0 13ªhätte es ¾13ªauch sein können.
Kevin Cruijssen

3

C ++ 11, 259 258 203 202 195 194 Bytes

1 Byte weniger, dank der Idee von Conor O'Brien, stattdessen die wörtliche Tabulatur zu verwenden \t.

UPD 2: 55 Bytes mit verbesserter Logik und Komma-Missbrauch gestrichen.

UPD 3: Ein weiteres Byte weniger dank ceilingcat.

UPD 4: 7 Bytes mit freundlicher Genehmigung von ceilingcat.

UPD 5: und ein weiteres Byte von ceilingcat.

Ich bin froh, alle Includes installiert zu haben UND die C- und C # -Lösungen noch zu übertreffen.

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

iostreamenthält string, so können Sie das zweite Include für einen großen Rückgang der Bytecount überspringen :)
Movatica

@movatica Nicht laut cppreference.com, und die Kompilierung in VS2019 schlägt ohne fehl. Wenn es also woanders kompiliert wird, ist es spezifisch für diese bestimmte Standard-Bibliotheksimplementierung.
Alexander Revo

ok, scheint eine gcc sache zu sein.
Movatica


2

Java, 333 Bytes

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

Fügt einem Stapel zulässige Bodennummern hinzu und entfernt sie dann wieder, um sie zu drucken.

Ich habe mit einem IntStream herumgespielt, aber mit all den Importen war dieser kleiner.


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

Dies ist offensichtlich die Scala'd-Down-Version.
CJ Dennis

2

Python 3, 117 Bytes

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)

Geänderte Version des Python 2-Posts, um der Python 3-Spezifikation zu entsprechen.


2

PowerShell, 106 107 Byte

$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

Beispiel

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

2

Haskell 202 Bytes

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

Ich bin haskell anfänger ...

  • erst die unendliche Liste der Werte erstellen. (t Liste)
  • function by2 gruppiert eine Liste in Unterlisten von 2 Elementen.
  • main nimm den Wert.
    • nimm Wertelemente von t Liste
    • kehren Sie die Liste um, um zuerst größere Elemente zu erhalten
    • Map-Show-Funktion zum Konvertieren der Int-Liste in die String-Liste
    • Gruppenelement 2 mal 2 mit Funktion by2
    • Wir haben eine Liste wie [["4", "5"], ["6", "7"], transformiert wie ["4 5", "6 7"] mit Unwords Funktion auf die Liste abgebildet ist
    • Hebt die Liste auf (jedes Element der Liste durch '\ n' getrennt)
    • Beenden Sie mit putStrLn, um einen String in das Terminal zu schreiben.

Sie können mehrere Bytes beim Definieren einsparen, by2indem Sie einen Namen mit 1 Zeichen verwenden und neu anordnen: Verwenden Sie die letzte Zeile wie sie ist und danach b x = [x].
ballesta25

2

Javascript ES6 114 Bytes

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

Verwendungszweck

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 Bytes

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

Nimmt eine gerade Anzahl von Stockwerken an, da die Problemstellung dies ebenfalls anzunehmen scheint und mindestens ein anderer Lösungsansatz für ungerade Anzahl von Stockwerken vorgesehen ist. Fügen Sie ,:partialals zweites Argument rotorneun weitere Bytes hinzu, um eine ungerade Anzahl von Stockwerken zu unterstützen.



2

Gelee , 20 Bytes

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

Probieren Sie es online!

Wie?

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

Hab das gemacht, bevor ich gemerkt habe, dass edc65 bereits ein kürzeres gemacht hat. Naja!


1

R , 106 Bytes

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

Probieren Sie es online!

-1n2n3n9 . Anschließend werden die unglücklichen Bodennummern (sowie Etage 0) entfernt, in eine Matrixform mit zwei Zeilen konvertiert und die Zeilen invertiert, um die Zahlen in der richtigen Reihenfolge zu erhalten. Anschließend werden die Zahlen im gewünschten Format ausgegeben und der Vektor erneut ausgegeben c("\t","\n"). Wie vorgeschlagen durch Conor O'Brien, eine wörtliche Registerkarte verwenden , anstatt \tfür -1 Byte.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.