Ascensore dell'hotel superstizioso


54

Descrizione

Ecco un ascensore per hotel molto superstizioso a Shanghai:

               inserisci qui la descrizione dell'immagine

Evita il numero 13, perché tredici è sfortunato nel mondo occidentale ed evita la cifra 4, perché quattro è sfortunato in alcune parti dell'Asia. E se questo hotel fosse più alto?

Leggi un numero intero pari positivo nda STDIN, che rappresenta il numero di piani, e stampa come sarebbe il layout del pulsante a STDOUT:, -1seguito dai successivi n-1numeri interi positivi che non sono uguali a 13 e non contengono la cifra 4. Disponi questi numeri in due colonne come nell'immagine sopra: stampa due numeri di piano per riga, separati da una scheda orizzontale, in modo che la lettura delle righe in ordine inverso da sinistra a destra dia la sequenza in ordine crescente. (Opzionalmente puoi anche stampare un carattere di nuova riga finale.)

Casi test

Per l'input 14, l'output dovrebbe essere come nell'immagine sopra:

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

dove lo spazio bianco in ogni riga è un singolo carattere di tabulazione orizzontale.

Per l'input 2, è necessario stampare -1 1.

Per l'input 100, è necessario stampare:

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

Obbiettivo

Questo è . Vince la risposta più breve in byte.


2
@Mauris 6138, forse no, ma 113? Penso che la chiave sarebbe se dici "tredici" quando leggi il numero ad alta voce.
Casuale 832

12
@ Random832 Quello che suggerisci sono effettivamente modifiche arbitrarie alla specifica. L'etichetta PPCG scoraggia tali cambiamenti dopo che le risposte sono state fornite, specialmente se le risposte esistenti sono effettivamente invalidate, come sarebbero in questo caso
Digital Trauma

8
FWIW, 4 non è sfortunato. 4 sembra molto simile a "morire" o "morte" nei vari dialetti / lingue cinesi.
Slebetman,

10
@slebetman: Beh, sì, ecco perché 4 è sfortunato. È ancora superstizione, qualunque sia l'origine! Ma questo sta diventando un po 'fuori tema.
Lynn

13
Aspettare! Contando i pulsanti vedo che l'hotel ha esattamente 13 piani (escluso il seminterrato). Non c'è modo che io rimanga lì!
Level River St

Risposte:


8

Pyth, 27 byte

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

Provalo online qui .

Ottiene .first Q-1numeri che corrispondono al filtro !=13e 4non è nella rappresentazione stringa del numero. Quindi si antepone -1, taglia a metà, unisce ciascuno di tabs ( C9) e si unisce di newline.


19

Bash + utils comuni, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq genera numeri interi ascendenti da 1 a N con una cifra aggiuntiva di 9 cifre davanti, più che sufficiente per l'input di numeri interi a 64 bit
  • sedfiltra i pavimenti sfortunati e inserisce -1prima della linea 1
  • rs rimodella in due colonne separate da tabulazioni
  • sed si ferma dopo N / 2 righe
  • tac inverte l'ordine delle linee di uscita

Posso radere 5 byte per te - sostituisci il sed $[$1/2]qdopo rscon sed $1qprima. Penso che lo renda compatibile anche con POSIX-shell.
Toby Speight,

1
Alla fine, il precedente 1non sarà sufficiente per compensare il passaggio di soli 0,9 ^ n degli input (i numeri che non contengono 4diventano più sparsi e più sparsi all'aumentare del numero di cifre). Ma una volta che hai più di qualche centinaio di milioni di piani nel tuo hotel, probabilmente hai altri problemi, come far funzionare l'impianto idraulico e organizzare i turni del personale.
Toby Speight,

@TobySpeight potresti anche avere un ascensore spaziale :)
Digital Trauma

@TobySpeight Anche con il numero intero a 64 bit con segno massimo come input (9223372036854775807), semplicemente prefissare un 1 è (quasi) abbastanza - almeno con il mio calcolo rudimentale di base 9. Il resto della risposta è comunque limitato a questo intervallo a causa $[]dell'aritmetica della shell . Penso che questa sia una ragionevole limitazione in assenza della menzione esplicita dell'aritmetica di precisione arbitraria nella domanda. Indipendentemente da ciò, ora sto prefisso un 9invece di 1, solo per essere al sicuro.
Trauma digitale

10

JavaScript ES6, 236 234 233 210 195 188 byte

Ho salvato un bel po 'di byte grazie a noi amici!

Utilizza il function*per generatori. Probabilmente un modo più breve per farlo, ma è stato divertente. Molto divertente. Scommetto che un po 'di golf può essere fatto. Quelle strane cose degli spazi bianchi sono schede.

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 Grazie! Ho dimenticato la conversione automatica del tipo.
Conor O'Brien,

.joincon tab e sostituisci spazio /-?\d+ \d+/gcon tab, rimuovi .map(x=>x.replace(/ /,"\t"))(dovrebbe salvare 23 byte)
usandfriends

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

2
^ Grattalo , basta rimuovere l'intera .filter(..)parte! Prova l.push(a);==> +a&&l.push(a);(-15 byte)
usandfriends

7

C, 282 byte

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

Formattato:

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

Caratteristiche :

Può calcolare fino a 2095984 piani, se ogni piano è 19.5malto (incl. Soffitto), questo edificio è abbastanza lungo da essere avvolto attorno all'equatore! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
Bella risposta, ma la tua geografia è un po 'fuori. La distanza dall'equatore al polo nord è di 10000 km per definizione en.wikipedia.org/wiki/Metre, il che significa che la circonferenza dell'equatore è di poco superiore ai 40000 km.
Level River St

1
Bel commento, ma la tua definizione del contatore è un po 'datata. ;-)
murphy

@steveverrill Ho appena usato il primo numero che ho ricevuto da Google, aggiornerò il calcolo.
x13,

È possibile salvare alcuni byte rilasciando "int" dalla schermata principale. Le parentesi graffe intorno a E sono davvero necessarie? In primo luogo whilepuò essere convertito in fore questo ti consente di eliminare alcune parentesi graffe. t/=10è un byte più corto di t=t/10. Aggiungi 1 a c nel tuo forciclo per salvare un paio di byte -> a[c+1]diventa a[c], mentre tutti gli altri numeri hanno la stessa lunghezza. Unirei anche due printfs nel loop e lascerei cadere di nuovo le parentesi graffe.
Aragaer,

Penso che la tua definizione di "altezza del pavimento" potrebbe essere leggermente diversa: un pavimento tipico è alto circa 3 m, non alto 19,5 m.
nneonneo,

6

Julia, 134 132 byte

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

Quel divertente spazio bianco lì dentro è una scheda letterale. Come ha osservato Conor O'Brien, questo è un byte più breve del fare \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 byte

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

Penso che puoi usare i-13invece dii!=13
12Me21

6

JavaScript, 116 122

Modifica Salvato 6 byte thx @Neil

Semplice soluzione array - nemmeno usando ES6

Prova con qualsiasi 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>


È possibile salvare 6 byte utilizzando !/4/.test(v).
Neil,

È possibile salvare un singolo byte con ' 'anziché '\t'(scheda letterale)
Mwr247

6

Python 2 , 94 byte

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

Provalo online!

C'è un carattere di tabulazione nella stringa che SE non visualizza (grazie a Sp3000 per aver suggerito di usarlo, salvando un byte).

Verifica i piani a cpartire dal piano -1fino a raggiungere la quota ndei piani. Per ogni piano, verifica che non contenga un 4né uguale 0o 13. In tal caso, lo antepone alla stringa dell'elevatore se diminuisce la quota n.

Un trucco con la formattazione delle stringhe viene utilizzato per far apparire i due piani per colonna nell'ordine corretto quando vengono anteposti. Ogni nuova linea viene preparata come '%d\t%%d\n', in modo che quando due piani vengono sostituiti in ordine, il primo è a sinistra e il secondo a destra. Per esempio,

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

Abbastanza bello, ma in realtà è di 96 byte . Probabilmente rimuovere la virgola finale?
movatica

2
@movatica Buona cattura della virgola finale, poiché la sfida specifica che la nuova riga finale sia OK. La differenza di 1 byte era perché il blocco di codice SE non può visualizzare le schede, quindi ho inserito un \t. Ah, i giorni prima dell'esistenza di TIO.
xnor

5

C #, 296 byte

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

Trucchi da golf usati:

  • i (il contatore corrente) e j (il numero corrente in esame) sono decrementati / incrementati, rispettivamente, all'interno dell'espressione nel corpo del ciclo invece dell'istruzione for come normale
  • j+"" invece di j.ToString()
  • Inserisci tutto all'interno namespace System.Collections.Genericnon solo per consentirci di accedere List<T>, ma anche implicitamente utilizzare lo spazio dei nomi Systemsenza ulteriori qualifiche
  • Posiziona l' usinginterno del namespace in modo che possiamo scrivere using Linq;invece diusing System.Linq;
  • .Insert(0,j)è più breve dell'uso .Add(j)e dell'applicazione successiva.Reverse()

È un peccato che using Linq;sia necessario, poiché è necessario solo per .Zip, ma scrivendolo come Linq.Enumerable.Zip()è più lungo.


5

Ruby 2.3, 84 83 caratteri

(Codice 82 caratteri + opzione riga comandi 1 carattere)

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

Esecuzione di esempio:

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

Rubino, 93 92 caratteri

(Codice di 91 caratteri + opzione riga di comando di 1 carattere)

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

Esecuzione di esempio:

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 byte

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

Abbastanza semplice, prima assembliamo una tabella riempita con tutti i valori dei pulsanti. Quindi eseguiamo l'iterazione all'indietro, stampando due valori alla volta o nulla se il secondo valore non esiste.


4

Mathematica, 105 byte

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

Sostituisci \tcon un carattere di tabulazione reale.


4

Brachylog , 105 byte

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

Sarebbe stato molto più breve con il supporto CLPFD, qui devo provare iterativamente numeri interi nel primo sub-predicato.

La nuova riga precedente "w,?bb:2&}è obbligatoria, questa è la nuova riga stampata tra ogni riga.


Bello! Una domanda: perché non fare in modo che tutta l' aritmetica dei numeri interi in Brachylog utilizzi automaticamente i vincoli CLP (FD)? Questa sarebbe un'estensione logica naturale.
mat

@mat perché sono pigro e non l'ho fatto. Ma dovrei!
Fatalizza il

Sarebbe fantastico! Vincoli impliciti CLP (FD) incorporati per tutta l'aritmetica dei numeri interi! Prepara il futuro della programmazione dichiarativa! "E ti deve sembrare la benedizione di impressionare la tua mano su millenni come su cera. Benedizione scrivere sulla volontà di millenni come sul bronzo - più dura del bronzo, più nobile del bronzo. Solo il più nobile è del tutto duro."
mat

@mat Potresti unirti a me in questa chat room per discuterne? Ho bisogno del consiglio di qualcuno ovviamente più esperto di Prolog di me.
Fatalizza il

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

Questa è solo una funzione. Sono nuovo di C #. L'aumento doveva essere valido per 40-49 e per l'inclusione di usings

Ungolfed, come programma completo in esecuzione:

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

spiegato

Creo due elenchi e si alternano spingendoli verso di loro, invertirli, scorrere uno attraverso l'altro e afferrare l'altro per indice.


Non so molto su C # ma non puoi sostituirlo if(s==1)con if(s)(cast automatico da int a booleano?)
Fatalizzare l'

No, perché l'altro è per s == 2, anche se potrei rendere la bandiera 0 e 1 invece di 1 e 2. Ci proverò.
Oca

3

Python 3, 155 byte

Penso che elencare, invertire e auto-zippare il generatore di numeri di piano s()potrebbe essere stato troppo intelligente per il suo bene, ma altri hanno già fatto l'alternativa (facendo scoppiare due elementi alla volta), per non parlare dell'utilizzo di Python 2 che consente di risparmiare byte su alcuni punti chiave.

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)

L'alternativa più breve, ma già pronta, richiede 140 byte.

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)

Per la seconda alternativa, (0!=n!=13)!=('4'in str(n))è 5 byte più corto di not(n in(0,13)or'4'in str(n)).
movatica

3

Japt, 42 byte

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

I quattro spazi dovrebbero essere un vero carattere tab. Provalo online!

Come funziona

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

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

Provalo online (devi fare clic su 'esegui' in alto e quindi fare clic sul terminale in basso prima di digitare input; sto cercando un modo migliore per testare lua online con stdin e stdout)


3

05AB1E , 25 23 22 byte

-1 byte grazie solo a @ ASCII

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

Provalo online!

Spiegazione

                           # 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. Sapevo che c'era un modo per 0 13ªmigliorare un po ' quella brutta parte. Grazie!
Wisław,

aspettare. non c'è logica e in 05AB1E? O_o
ASCII il

1
Se 1 è vero e 0 è falso, la moltiplicazione funziona come logica e
Wisław il

-1 byte cambiando ʒ4å_}in 4мïê. PS: basato sul tuo commento precedente: 0 13ªavrebbe potuto essere ¾13ªanche lui.
Kevin Cruijssen,

3

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

Tagliato via 1 byte, grazie all'idea di Conor O'Brien di usare la scheda letterale invece di \t.

UPD 2: eliminato 55 byte con logica migliorata e abuso di virgola.

UPD 3: un altro byte disattivato grazie a ceilingcat.

UPD 4: 7 byte di sconto per gentile concessione di ceilingcat.

UPD 5: e un altro byte disattivato da ceilingcat.

Felice di avere tutte le inclusioni in atto E ancora battere le soluzioni C e 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;
}

iostreaminclude string, in modo da poter saltare la seconda inclusione per una forte riduzione del byte :)
movatica

@movatica Non secondo cppreference.com, e la compilazione in VS2019 fallisce senza di essa. Quindi, se viene compilato altrove, è specifico per l'implementazione di determinate librerie standard.
Alexander Revo

ok, sembra essere una cosa gcc.
movatica,


2

Java, 333 byte

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

Aggiunge i numeri di piano consentiti a una pila, quindi li rimuove per stamparli.

Ho giocato con un IntStream, ma con tutte le importazioni questo è finito per essere più piccolo.


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

Questa è ovviamente la versione down di Scala.
CJ Dennis,

2

Python 3, 117 byte

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)

Versione modificata del post di Python 2 per adattarsi alle specifiche di Python 3.


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

Esempio

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

2

Haskell 202 byte

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

Sono un principiante di haskell ...

  • creare innanzitutto l'elenco infinito di valori. (lista t)
  • function by2 raggruppa un elenco in liste secondarie di 2 elementi.
  • principale prende il valore.
    • accetta elementi di valore dell'elenco t
    • inverti l'elenco per avere prima gli elementi Greaters
    • funzione map show per convertire l'elenco int in elenco stringhe
    • raggruppa l'elemento 2 per 2 con la funzione by2
    • Abbiamo un elenco come [["4", "5"], ["6", "7"]] trasformato come ["4 5", "6 7"] con la funzione unwords mappata nell'elenco
    • annulla la lista (ogni elemento della lista separato da '\ n')
    • termina con putStrLn per scrivere la stringa sul terminale.

È possibile salvare diversi byte nella definizione by2utilizzando un nome di 1 carattere e riordinando: utilizzare l'ultima riga così com'è, quindi b x = [x]dopo.
ballesta25,

2

Javascript ES6 114 byte

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

uso

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 byte

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

Presuppone un numero pari di piani, poiché la dichiarazione del problema sembra assumerlo anche e almeno un'altra soluzione fornita si rompe per un numero dispari di piani. Basta aggiungere ,:partialcome secondo argomento a rotor, per altri nove byte, per supportare numeri dispari di piani.



2

Gelatina , 20 byte

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

Provalo online!

Come?

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

L'ho fatto prima che mi rendessi conto che edc65 ne aveva già fatto uno più corto. Oh bene!


1

R , 106 byte

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.