Elevador supersticioso do hotel


54

Descrição

Aqui está um elevador de hotel muito supersticioso em Xangai:

               insira a descrição da imagem aqui

Evita o número 13, porque treze é azarado no mundo ocidental e evita o dígito 4, porque quatro é azarado em partes da Ásia. E se este hotel fosse mais alto?

Leia um número inteiro positivo mesmo nde STDIN, representando o número de andares, e imprima como seria o layout de botão STDOUT:, -1seguido pelos próximos n-1números inteiros positivos que não são iguais a 13 e não contêm o dígito 4. Organize-os números em duas colunas, como na imagem acima: imprima dois números de piso por linha, separados por uma guia horizontal, para que a leitura das linhas na ordem inversa da esquerda para a direita produza a sequência em ordem crescente. (Opcionalmente, você também pode imprimir um caractere de nova linha à direita.)

Casos de teste

Para a entrada 14, a saída deve ser como na imagem acima:

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

onde o espaço em branco em cada linha é um único caractere de tabulação horizontal.

Para a entrada 2, você deve imprimir -1 1.

Para a entrada 100, você deve 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

Objetivo

Isso é . A resposta mais curta em bytes vence.


2
@Mauris 6138, talvez não, mas 113? Eu acho que a chave seria se você diz "treze" quando lê o número em voz alta.
usar o seguinte comando

12
@ Random832 O que você sugere são mudanças arbitrárias nas especificações. A etiqueta PPCG desencoraja tais mudanças após respostas foram dadas, especialmente se as respostas existentes são efetivamente invalidado, que seria neste caso
Digital Trauma

8
FWIW, 4 não tem azar. 4 parece muito semelhante a "morrer" ou "morte" nos vários dialetos / idiomas chineses.
slebetman

10
@slebetman: Bem, sim, é por isso que 4 é azarado. Ainda é superstição, seja qual for a origem! Mas isso está ficando um pouco fora de tópico.
Lynn

13
Esperar! Contando os botões, vejo que o hotel tem exatamente 13 andares (exceto o porão.) Não há como ficar lá!
Level River St

Respostas:


8

Pitão, 27 bytes

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

Experimente online aqui .

Obtém os .fprimeiros Q-1números que correspondem ao filtro !=13e 4não estão na representação de seqüência do número. Em seguida, ele anexa -1, divide pela metade, une cada uma por tabs ( C9) e une por novas linhas.


19

Bash + utils comuns, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq gera números inteiros ascendentes de 1 a N com 9 dígitos extras na frente - mais do que suficiente para entrada inteira de 64 bits
  • sedfiltra os pisos infelizes e insere -1antes da linha 1
  • rs remodela em duas colunas separadas por tabulação
  • sed para após N / 2 linhas
  • tac inverte a ordem da linha de saída

Posso depilar 5 bytes para você - substitua o sed $[$1/2]qdepois rspor sed $1qantes. Eu acho que também o torna compatível com o POSIX-shell.
Toby Speight

11
Eventualmente, o anterior 1não será suficiente para compensar a passagem de apenas 0,9 ^ n das entradas (os números que não contêm 4ficam cada vez mais escassos à medida que o número de dígitos aumenta). Porém, depois de ter mais de algumas centenas de milhões de andares em seu hotel, você provavelmente terá outros problemas, como manter o encanamento funcionando e organizar rotas da equipe.
Toby Speight

@TobySpeight você pode ter um elevador espacial também :)
Digital Trauma

@TobySpeight Mesmo com o número máximo de 64 bits assinado como entrada (9223372036854775807), basta prefixar um 1 (é quase) o suficiente - pelo menos com meu cálculo rudimentar da base 9. O restante da resposta está limitado a esse intervalo devido à $[]aritmética do shell . Eu acho que essa é uma limitação razoável na ausência de menção explícita da aritmética de precisão arbitrária na questão. Independentemente disso, agora estou prefixando um em 9vez de 1, apenas para estar do lado seguro.
Digital Trauma

10

JavaScript ES6, 236 234 233 210 195 188 bytes

Economizei um monte de bytes graças a usandfriends!

Usa o function*para geradores. Provavelmente, é uma maneira mais curta de fazer isso, mas foi divertido. Muito divertido. Aposto que um pouco de golfe pode ser feito. Essas coisas esquisitas de espaço em branco são guias.

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 Obrigado! Esqueci a conversão automática de tipo.
Conor O'Brien

.joincom guia e substituir o espaço em /-?\d+ \d+/gcom guia, remova .map(x=>x.replace(/ /,"\t"))(deve salvar 23 bytes)
usandfriends

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

2
^ Risque isso , basta remover a .filter(..)parte inteira ! Tente 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);}

Formatado:

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

Recursos :

Ele pode calcular até 2095984 andares, se cada andar for 19.5malto (incluindo teto), esse edifício será longo o suficiente para ser enrolado no equador! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


11
Boa resposta, mas sua geografia está um pouco fora. A distância do equador ao pólo norte é de 10000 km, por definição en.wikipedia.org/wiki/Metre, o que significa que a circunferência do equador é um pouco acima de 40000 km.
Level River St

11
Bom comentário, mas sua definição do medidor está um pouco desatualizada. ;-)
murphy

@steveverrill Acabei de usar o primeiro número que saí do google, atualizo o cálculo.
x13

Você pode salvar alguns bytes soltando "int" do main. Os aparelhos ao redor de E são realmente necessários? O primeiro whilepode ser convertido em fore isso permite que você largue algumas chaves. t/=10é um byte menor que t=t/10. Adicione 1 a c no forloop para salvar alguns bytes -> a[c+1]torna-se a[c], enquanto todos os outros números têm o mesmo comprimento. Eu também combinaria dois printfs no loop e soltaria o aparelho novamente.
Aragaer

Acho que sua definição de "altura do piso" pode ser um pouco errada - um piso típico tem cerca de 3m de altura e não 19,5m de altura.
precisa saber é

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

Esse espaço em branco engraçado existe uma guia literal. Como Conor O'Brien observou, este é um byte mais curto que o normal \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

Eu acho que você pode usar em i-13vez dei!=13
12Me21 18/01

6

JavaScript, 116 122

Editar 6 bytes salvos thx @Neil

Solução de matriz simples - nem mesmo usando o ES6

Tente com qualquer 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>


Você pode salvar 6 bytes usando !/4/.test(v).
Neil

Você pode economizar um único byte com ' 'em vez de '\t'(guia 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

Experimente online!

Há um caractere de tabulação na string que o SE não processa (obrigado ao Sp3000 pela sugestão de usá-lo, salvando um byte).

Testa pisos ccomeçando do piso -1até que a cota nde pisos seja atingida. Para cada andar, testa se não contém a 4nem é igual a 0ou 13. Nesse caso, o anexa à sequência do elevador se diminui a cota n.

Um truque com formatação de string é usado para fazer com que os dois andares por coluna apareçam na ordem correta quando anexados. Cada nova linha é preparada de '%d\t%%d\n'maneira que, quando dois andares são substituídos em ordem, o primeiro fica à esquerda e o segundo à direita. Por exemplo,

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

Muito legal, mas na verdade são 96 bytes . Provavelmente remover a vírgula à direita?
movatica

2
@movatica Boa captura da vírgula à direita, pois o desafio especifica a nova linha à direita é OK. A diferença de 1 byte foi porque o bloco de código SE não pode exibir guias, então eu coloquei um \t. Ah, dias antes do TIO existir.
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)));}}}

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

Truques de golfe usados:

  • i (o contador de execução) ej (o número atual em consideração) são decrementados / incrementados, respectivamente, dentro da expressão no corpo do loop em vez da instrução for, como é normal
  • j+"" ao invés de j.ToString()
  • Coloque tudo dentro namespace System.Collections.Genericnão apenas para que possamos acessar List<T>, mas também use implicitamente o espaço para nome Systemsem qualificação adicional
  • Coloque o usinginterior do espaço para nome para que possamos escrever em using Linq;vez deusing System.Linq;
  • .Insert(0,j)é mais curto do que usar .Add(j)e aplicar mais tarde.Reverse()

É lamentável que isso using Linq;seja necessário, pois é necessário apenas para .Zip, mas escrevê-lo como Linq.Enumerable.Zip()é mais longo.


5

Ruby 2.3, 84 83 caracteres

(Código de 82 caracteres + opção de linha de comando de 1 caractere)

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

Exemplo de execução:

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 + opção de linha de comando de 1 caractere)

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

Exemplo de execução:

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 direto, primeiro montamos uma tabela preenchida com todos os valores dos botões. Em seguida, repetimos o processo, imprimindo dois valores por vez ou nada se o segundo valor não existir.


4

Mathematica, 105 bytes

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

Substitua \tpor um caractere de tabulação real.


4

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

Teria sido muito mais curto com o suporte ao CLPFD, aqui eu tenho que tentar iterativamente números inteiros no primeiro sub-predicado.

A nova linha anterior "w,?bb:2&}é obrigatória, é a nova linha impressa entre todas as linhas.


Agradável! Uma pergunta: por que não fazer com que todos os aritméticos inteiros no Brachylog usem as restrições CLP (FD) automaticamente? Isso seria uma extensão lógica natural.
18716

@mat porque sou preguiçoso e não o fiz. Mas eu deveria!
Fatalize

Isso seria demais! Restrições implícitas de CLP (FD) implícitas para toda aritmética de número inteiro! Pavimentar o futuro da programação declarativa! "E deve parecer bem-aventurança para você imprimir sua mão em milênios como em cera. Abençoada escrever sobre a vontade de milênios como em bronze - mais dura que o bronze, mais nobre que o bronze. Somente o mais nobre é completamente difícil".
mat

@mat Você pode se juntar a mim nesta sala de bate-papo para discutir isso? Preciso de conselhos de alguém obviamente mais experiente com Prolog do que eu.
Fatalize 14/01

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

Isso é apenas uma função. Eu sou novo em c #. O aumento foi validar para 40-49 e incluir usings

Ungolfed, como um programa completo de execução:

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

Crio duas listas e alterno entre pressioná-las, invertê-las, percorrer uma e agarrar a outra pelo índice.


Eu não sei muito sobre C #, mas você não pode substituir if(s==1)por if(s)(cast automático de int para boolean?)
Fatalize

Não, porque o resto é para s == 2, embora eu possa fazer a bandeira 0 e 1 em vez de 1 e 2. Vou tentar isso.
Ganso

3

Python 3, 155 bytes

Eu acho que ouvir, reverter e fechar automaticamente o gerador de números de piso s()pode ter sido muito inteligente para o seu próprio bem, mas outros já fizeram a alternativa (aparecendo dois itens por vez), sem mencionar o uso do Python 2, que economiza bytes em alguns pontos-chave.

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)

A alternativa mais curta, mas já melhorada, leva 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 a segunda alternativa, (0!=n!=13)!=('4'in str(n))é 5 bytes menor que not(n in(0,13)or'4'in str(n)).
movatica

3

Japonês, 42 bytes

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

Os quatro espaços devem ser um caractere de tabulação real. Experimente online!

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

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

Experimente online (você precisa clicar em 'executar' na parte superior e, em seguida, clicar no terminal na parte inferior antes de digitar input; estou procurando uma maneira melhor de testar a lua online com stdin e stdout)


3

05AB1E , 25 23 22 bytes

-1 byte graças a @ ASCII-only

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

Experimente online!

Explicação

                           # 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 Eu sabia que havia uma maneira de tornar essa 0 13ªparte feia um pouco melhor. Obrigado!
Wisław 19/01

esperar. não há lógica e em 05AB1E? O_o
somente ASCII

11
Se 1 é verdadeiro e 0 é falso, a multiplicação funciona como lógica e
Wisław 19/01

-1 byte, alterando ʒ4å_}para 4мïê. PS: com base no seu comentário anterior: 0 13ªpoderia ter sido ¾13ªtambém.
Kevin Cruijssen

3

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

Cortou 1 byte, graças à idéia de Conor O'Brien de usar a guia literal em vez de \t.

UPD 2: reduziu 55 bytes com lógica aprimorada e abuso de vírgula.

UPD 3: outro byte desligado graças ao ceilingcat.

UPD 4: 7 bytes de desconto, cortesia de ceilingcat.

UPD 5: e outro byte desativado pelo tetocat.

É um prazer ter todas as inclusões implementadas E ainda vencer as soluções 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;
}

iostreaminclui string, para que você possa pular a segunda inclusão para uma grande diminuição no número de bytes :)
movatica

@movatica Não de acordo com cppreference.com, e a compilação no VS2019 falha sem ele. Portanto, se compilar em outro lugar, será específico para essa implementação de biblioteca padrão.
Alexander Revo

ok, parece ser uma coisa do 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);}}}

Adiciona números de andar permitidos a uma pilha e os retira para imprimi-los.

Eu brinquei usando um IntStream, mas com todas as importações, essa acabou sendo menor.


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

Esta é obviamente a versão descendente do 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)

Versão modificada da postagem do python 2 para atender à especificação do python 3.


2

PowerShell, 106 107 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

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

Exemplo

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

Sou iniciante em haskell…

  • primeiro crie a lista infinita de valores. (lista t)
  • função by2 agrupa uma lista em sublistas de 2 elementos.
  • principal pegue o valor.
    • obter elementos de valor da lista t
    • inverta a lista para ter elementos maiores
    • função show de mapa para converter lista int em lista de strings
    • agrupe o elemento 2 por 2 com a função by2
    • Temos uma lista como [["4", "5"], ["6", "7"]] transformada como ["4 5", "6 7"] com a função unwords mapeada na lista
    • anula a lista (cada elemento da lista é separado por '\ n')
    • finalize com putStrLn para escrever uma string no terminal.

Você pode salvar vários bytes na definição by2usando um nome de 1 caractere e reordenando: use sua última linha como está e b x = [x]depois.
usar o seguinte comando

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}

Assume um número par de andares, já que a declaração do problema parece assumi-lo também e pelo menos uma outra solução fornecida é interrompida por números ímpares de andares. Basta adicionar ,:partialcomo segundo argumento rotor, por mais nove bytes, para suportar números ímpares de andares.



2

Gelatina , 20 bytes

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

Experimente online!

Quão?

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

Fiz isso antes de eu perceber que o edc65 já havia feito um menor. Ah bem!


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.