Elevador de hotel supersticioso


54

Descripción

Aquí hay un ascensor de hotel muy supersticioso en Shanghai:

               ingrese la descripción de la imagen aquí

Evita el número 13, porque trece no tiene suerte en el mundo occidental, y evita el dígito 4, porque cuatro tiene mala suerte en partes de Asia. ¿Y si este hotel fuera más alto?

Lea un entero par positivo nde STDIN, que representa el número de pisos, e imprima cómo se vería el diseño del botón para STDOUT:, -1seguido de los siguientes n-1enteros positivos que no son iguales a 13 y no contienen el dígito 4. Organice estos números en dos columnas, como en la imagen de arriba: imprima dos números de piso por línea, separados por una pestaña horizontal, de modo que leer las líneas en orden inverso de izquierda a derecha produce la secuencia en orden ascendente. (Opcionalmente, también puede imprimir un carácter de nueva línea al final).

Casos de prueba

Para la entrada 14, la salida debe ser como en la imagen de arriba:

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

donde el espacio en blanco en cada línea es un solo carácter de tabulación horizontal.

Para la entrada 2, debe imprimir -1 1.

Para la entrada 100, debe imprimir:

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

Gol

Este es el . La respuesta más corta en bytes gana.


2
@Mauris 6138, tal vez no, pero ¿113? Creo que la clave sería si dices "trece" cuando lees el número en voz alta.
Random832

12
@ Random832 Lo que sugiere son cambios efectivamente arbitrarios en la especificación. La etiqueta PPCG desalienta tales cambios después de que se hayan dado las respuestas, especialmente si las respuestas existentes se invalidan efectivamente, lo que serían en este caso
Trauma digital

8
FWIW, 4 no es desafortunado. 4 simplemente suena muy similar a "morir" o "morir" en los diversos dialectos / idiomas chinos.
slebetman

10
@Slebetman: Bueno, sí, por eso 4 tiene mala suerte. ¡Todavía es superstición, sea cual sea el origen! Pero eso está un poco fuera de tema.
Lynn el

13
¡Espere! Contando los botones, veo que el hotel tiene exactamente 13 pisos (excluyendo el sótano). ¡No hay forma de que me quede allí!
Level River St el

Respuestas:


8

Pyth, 27 bytes

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

Pruébelo en línea aquí .

Obtiene los .fprimeros Q-1números que coinciden con el filtro !=13y 4no está en la representación de cadena del número. Luego se antepone -1, se corta por la mitad, se une a cada uno mediante pestañas ( C9) y se une mediante nuevas líneas.


19

Bash + utilidades comunes, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq genera enteros ascendentes de 1 a N con 9 dígitos adicionales al frente, más que suficiente para la entrada de enteros de 64 bits
  • sedfiltra los pisos desafortunados e inserta -1antes de la línea 1
  • rs se reforma en dos columnas separadas por tabuladores
  • sed se detiene después de N / 2 líneas
  • tac invierte el orden de la línea de salida

Puedo recortar 5 bytes por usted, reemplace el sed $[$1/2]qafter rscon el sed $1qanterior. Creo que eso también lo hace compatible con POSIX-shell.
Toby Speight

1
Finalmente, lo anterior 1no será suficiente para compensar el paso de solo 0.9 ^ n de las entradas (los números que no contienen se 4vuelven más dispersos y más dispersos a medida que aumenta el número de dígitos). Pero una vez que tenga más de unos pocos cientos de millones de pisos en su hotel, es probable que tenga otros problemas, como mantener funcionando la plomería y organizar las rotaciones del personal.
Toby Speight

@TobySpeight también podría tener un ascensor espacial :)
Digital Trauma

@TobySpeight Incluso con el entero de 64 bits con signo máximo como entrada (9223372036854775807), simplemente prefijar un 1 es (casi) suficiente, al menos con mi cálculo rudimentario de base 9. El resto de la respuesta se limita a este rango de todos modos debido a la $[]aritmética del shell . Creo que esta es una limitación razonable en ausencia de una mención explícita de la aritmética de precisión arbitraria en la pregunta. De todos modos, ahora prefiero un en 9lugar de 1, solo para estar seguro.
Trauma digital

10

JavaScript ES6, 236 234 233 210 195 188 bytes

¡Ahorré un montón 'a bytes gracias a usandfriends!

Utiliza function*para generadores. Probablemente una forma más corta de hacer esto, pero fue divertido. Muy divertido. Apuesto a que se puede jugar al golf. Esas cosas extrañas en el espacio en blanco son pestañas.

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 Gracias! Olvidé la conversión automática de tipos.
Conor O'Brien

.joincon tabulador y reemplazar el espacio /-?\d+ \d+/gcon tabulador, eliminar .map(x=>x.replace(/ /,"\t"))(debería ahorrar 23 bytes)
usandfriends

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

2
^ Rasca eso , ¡solo quita toda la .filter(..)parte! Prueba 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);}

Formateado:

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

Caracteristicas :

Puede calcular hasta 2095984 pisos, si cada piso es 19.5malto (incluido el techo), ¡este edificio es lo suficientemente largo como para envolverse alrededor del ecuador! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
Buena respuesta, pero tu geografía está un poco apagada. La distancia desde el ecuador hasta el polo norte es de 10000 km por definición en.wikipedia.org/wiki/Metre, lo que significa que la circunferencia del ecuador es un poco más de 40000 km.
Level River St el

1
Buen comentario, pero su definición del medidor está un poco desactualizada. ;-)
murphy

@steveverrill acabo de usar el primer número que obtuve de google, actualizaré el cálculo.
x13

Puede guardar algunos bytes colocando "int" desde main. ¿Son realmente necesarios los frenos alrededor de E? Primero whilese puede convertir fory esto le permite soltar algunas llaves. t/=10es un byte más corto que t=t/10. Agregue 1 a c en su forbucle para guardar un par de bytes -> se a[c+1]convierte a[c], mientras que todos los demás números tienen la misma longitud. También combinaría dos printfs en el bucle y soltaba llaves nuevamente.
aragaer

Creo que su definición de "altura del piso" podría estar un poco fuera de lugar: un piso típico mide aproximadamente 3 m de alto, no 19.5 m de alto.
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

Ese espacio en blanco divertido allí es una pestaña literal. Como señaló Conor O'Brien, este es un byte más corto que hacerlo \t.

Sin golf:

# 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

Creo que puedes usar en i-13lugar dei!=13
12Me21

6

JavaScript, 116 122

Editar guardado 6 bytes thx @Neil

Solución de matriz simple: ni siquiera usando ES6

Probar con cualquier navegador

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


Puede guardar 6 bytes usando !/4/.test(v).
Neil

Podría guardar un solo byte con en ' 'lugar de '\t'(pestaña literal)
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

Pruébalo en línea!

Hay un carácter de tabulación en la cadena que SE no representa (gracias a Sp3000 por sugerir usarlo, guardar un byte).

Prueba los pisos cdesde el piso -1hasta que nse alcanza la cuota de pisos. Para cada piso, comprueba que no contiene a 4ni igual 0o 13. Si es así, lo antepone a la cadena del elevador sy disminuye la cuota n.

Se utiliza un truco con formato de cadena para que los dos pisos por columna aparezcan en el orden correcto cuando se anteponen. Cada nueva línea se prepara como '%d\t%%d\n', de modo que cuando se sustituyen dos pisos en orden, el primero está a la izquierda y el segundo a la derecha. Por ejemplo,

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

Bastante bueno, pero en realidad son 96 bytes . ¿Probablemente elimine la coma final?
movatica

2
@movatica Buena captura de la coma final, ya que el desafío especifica que la nueva línea final está bien. La diferencia de 1 byte fue porque el bloque de código SE no puede mostrar pestañas, así que puse un \t. Ah, los días antes de que existiera TIO.
xnor

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

Sin golf:

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

Trucos de golf utilizados:

  • i (el contador en ejecución) yj (el número actual en consideración) se disminuyen / incrementan, respectivamente, dentro de la expresión en el cuerpo del bucle en lugar de la instrucción for como es normal
  • j+"" en lugar de j.ToString()
  • Coloque todo dentro namespace System.Collections.Genericno solo para que podamos acceder List<T>, sino que también use implícitamente el espacio de nombres Systemsin calificación adicional
  • Coloque el usinginterior del espacio de nombres para que podamos escribir en using Linq;lugar deusing System.Linq;
  • .Insert(0,j)es más corto que usar .Add(j)y luego aplicar.Reverse()

Es desafortunado que using Linq;sea ​​necesario, ya que es necesario solo para .Zip, pero escribirlo Linq.Enumerable.Zip()es más largo.


5

Ruby 2.3, 84 83 caracteres

(Código de 82 caracteres + opción de línea de comando de 1 carácter)

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

Ejecución de muestra:

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 caracteres

(Código de 91 caracteres + opción de línea de comando de 1 carácter)

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

Ejecución de muestra:

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

Bastante sencillo, primero armamos una tabla llena con todos los valores de los botones. Luego lo iteramos hacia atrás, imprimiendo dos valores a la vez, o nada si el segundo valor no existe.


4

Mathematica, 105 bytes

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

Reemplace el \tcon un carácter de tabulación real.


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

Hubiera sido mucho más corto con el soporte CLPFD, aquí tengo que probar iterativamente enteros en el primer sub-predicado.

La nueva línea anterior "w,?bb:2&}es obligatoria, esta es la nueva línea que se imprime entre cada fila.


¡Agradable! Una pregunta: ¿por qué no hacer que toda la aritmética de enteros en Brachylog use restricciones CLP (FD) automáticamente? Esta sería una extensión lógica natural.
mat

@mat porque soy flojo y no lo hice. Pero debería!
Fatalize

¡Que sería increíble! ¡Restricciones implícitas de CLP (FD) para toda la aritmética de enteros! ¡Pavimenta el futuro de la programación declarativa! "Y debe parecer una bendición para ti imprimir tu mano en milenios como en cera. Bendición de escribir sobre la voluntad de milenios como en bronce - más duro que el bronce, más noble que el bronce. Solo el más noble es completamente duro".
mat

@mat ¿Podrías unirte a mí en esta sala de chat para discutir esto? Necesito el consejo de alguien obviamente más experimentado con Prolog que yo.
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++;}}

Esto es solo una función. Soy nuevo en C #. El aumento debía ser válido para 40-49, y para incluir usings

Ungolfed, como un programa completo en ejecución:

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

Explicado

Creo dos listas y alterno entre presionarlas, invertirlas, recorrer una y tomar la otra por índice.


No sé mucho sobre C #, pero ¿no puedes reemplazarlo if(s==1)por if(s)(
conversión

No, porque lo demás es para s == 2, aunque podría hacer que la bandera sea 0 y 1 en lugar de 1 y 2. Lo intentaré.
Ganso

3

Python 3, 155 bytes

Creo que enumerar, invertir y autocomprimir el generador de números de piso s()puede haber sido demasiado inteligente por su propio bien, pero otros ya han hecho la alternativa (reventar dos elementos a la vez), sin mencionar el uso de Python 2 que ahorra bytes en algunos puntos clave

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)

La alternativa más corta, pero ya hecha, toma 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)

Para la segunda alternativa, (0!=n!=13)!=('4'in str(n))es 5 bytes más corto que 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'    } ·

Los cuatro espacios deben ser un tabulador real. Pruébalo en línea!

Cómo funciona

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

Sin golf

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

Pruébelo en línea (debe hacer clic en 'ejecutar' en la parte superior y luego hacer clic en el terminal en la parte inferior antes de escribir input; estoy buscando una mejor manera de probar lua en línea con stdin y stdout)


3

05AB1E , 25 23 22 bytes

-1 byte gracias a @ ASCII-only

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

Pruébalo en línea!

Explicación

                           # 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 Sabía que había una manera de mejorar 0 13ªun poco esa parte fea . ¡Gracias!
Wisław

Espere. No hay lógica y en 05AB1E? O_o
solo ASCII

1
Si 1 es verdadero y 0 es falso, entonces la multiplicación funciona como lógica y
Wisław

-1 byte cambiando ʒ4å_}a 4мïê. PD: según tu comentario anterior: 0 13ªpodría haber sido ¾13ªasí.
Kevin Cruijssen

3

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

Recortó 1 byte, gracias a la idea de Conor O'Brien de usar la pestaña literal en lugar de \t.

UPD 2: recortó 55 bytes con lógica mejorada y abuso de comas.

UPD 3: otro byte desactivado gracias a ceilingcat.

UPD 4: 7 bytes de cortesía de ceilingcat.

UPD 5: y otro byte desactivado por ceilingcat.

Feliz de tener todo incluido y aún superar las soluciones C y 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;}

Sin golf:

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

iostreamincluye string, por lo que puede omitir la segunda inclusión para una gran disminución en el bytecount :)
movatica

@movatica No según cppreference.com, y la compilación en VS2019 falla sin ella. Entonces, si se compila en otro lugar, es específico para esa implementación de biblioteca estándar determinada.
Alexander Revo

ok, parece ser una cosa de gcc.
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);}}}

Agrega los números de piso permitidos a una pila y luego los retira para imprimirlos.

Jugué usando un IntStream, pero con todas las importaciones, este terminó siendo más pequeño.


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

Obviamente, esta es la versión baja de Scala'd.
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)

Versión modificada de la publicación de Python 2 para ajustarse a la especificación de Python 3.


2

PowerShell, 106107 bytes

$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

Sin golf

# 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

Ejemplo

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

Soy un principiante haskell ...

  • Primero cree la lista infinita de valores. (lista t)
  • La función by2 agrupa una lista en sublistas de 2 elementos.
  • Principal toma el valor.
    • tomar elementos de valor de la lista t
    • invertir la lista para tener elementos más grandes primero
    • función de mostrar mapa para convertir la lista int a la lista de cadenas
    • Agrupe el elemento 2 por 2 con la función by2
    • Tenemos una lista como [["4", "5"], ["6", "7"]] transformada como ["4 5", "6 7"] con la función de unwords asignada en la lista
    • desmarca la lista (cada elemento de la lista está separado por '\ n')
    • terminar con putStrLn para escribir una cadena en la terminal.

Puede guardar varios bytes en la definición by2utilizando un nombre de 1 carácter y reordenando: use su última línea tal cual, luego 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`

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 bytes

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

Asume un número par de pisos, ya que la declaración del problema parece asumirlo también y al menos otra solución proporcionada se rompe para un número impar de pisos. Simplemente agregue ,:partialcomo segundo argumento rotor, para nueve bytes más, para admitir números impares de pisos.



2

Jalea , 20 bytes

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

Pruébalo en línea!

¿Cómo?

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

Hice esto antes de darme cuenta de que edc65 ya había hecho uno más corto. ¡Oh bien!


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

Pruébalo en línea!

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.