O título é composto, a partir de 'Sequence Index Digit Not'.
Desafio:
Dado um número inteiro n
que é >= 0
, produza o n
'número th da seguinte sequência.
Aqui estão os 50 primeiros itens, com o índice (indexado 0) acima:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1 0 3 2 5 4 7 6 9 8 22 20 30 24 23 26 25 28 27 32 11 33 10 14 13 16 15 18 17 31 12 29 19 21 50 40 41 42 44 45 35 36 37 51 38 39 52 53 55 56 34
Como essa sequência funciona?
O número no índice n
deve ser o primeiro na ordem em que não há nenhum dígito em comum n
e ainda não ocorreu nos índices anteriores. Então, quando olhamos para uma sequência normal como esta em 0-60
:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
Definimos os n
'th th values assim:
0
: O primeiro número (0
) contém o mesmo dígito, portanto, procuramos o próximo (1
), que não contém o mesmo dígito. Entãon=0
saídas1
.1
: O primeiro número (0
) não contém o mesmo dígito, entãon=1
gera0
.2
: Já encontramos0
e1
, e o próximo dígito (2
) contém o mesmo dígito, procuramos o próximo (3
), que não contém o mesmo dígito. Entãon=2
saídas3
.- ...
10
: Já encontramos0-9
, então o próximo da fila é10
.10-19
contém o dígito correspondente1
,20
contém o dígito correspondente0
,21
contém o dígito correspondente1
novamente,22
é válido, portanto, én=10
emitido22
.- etc.
Regras do desafio:
- Se o seu idioma estiver indexado em 1 (ou você optar por), você poderá iniciar a sequência em
3 2 5 4 7 ...
(pulando1
atn=0
e0
atn=1
). - O maior índice mínimo que você deve oferecer suporte é
25,000
. NOTA: A sequência para no índice1,023,456,788
, porque o próximo índice na linha contém todos os 10 dígitos. - Você também tem permissão para produzir / retornar uma matriz / lista de toda a sequência, incluindo o índice,
n
se desejar.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
Essa sequência realmente criou pares em relação ao índice e às saídas. Se o índice n
gerar o
, o índice o
gera n
. Assim, você pode inserir a esquerda ou a direita e a saída será do outro lado:
0 <-> 1 (this test case is optional)
2 <-> 3
10 <-> 22
12 <-> 30
34 <-> 50
89 <-> 100
111 <-> 200
112 <-> 300
199 <-> 322
2231 <-> 4456
9605 <-> 11118
19235 <-> 46000
23451 <-> 60668
25000 <-> 13674
Aqui está uma pasta dos primeiros 25.001 casos de teste, se você quiser experimentar outros.
Respostas:
Pitão , 18 bytes
Experimente aqui! ou Verifique mais casos de teste!
Observe que isso retorna a sequência inteira até o índice N , mas o link retorna apenas o último número, acrescentando um
e
(final). Se você deseja ver o valor bruto retornado por este programa, basta removê-lo .Como funciona
fonte
Python 2 ,
92918988 bytesExperimente online!
Imprime uma lista dos primeiros
n+1
númerosAbordagem diferente, que é muito mais rápida:
Python 2 , 96 bytes
Experimente online!
fonte
Haskell,
8069 bytesExperimente online!
Muito lento para grandes
n
.Edit: @Laikoni salvou 10 bytes. Obrigado!
fonte
APL (Dyalog) , 39 bytes
Usos
⎕IO←0
.Experimente online!
Quão?
Recursão.
0=⍵:1
- Adivinhe.~⍺∊0∇¨⍳⍵
- arg esquerdo (acumulador) ainda não está em resultados anteriores∧⊃∧/≠/⍕¨⍺⍵
- e a representação em cadeia do acumulador en
são diferentes:⍺
- depois devolva o acumulador.⍵∇⍨⍺+1
- caso contrário, incremente o acumulador e recorra.fonte
n=10
atinge o tempo limite no TIO ..: S Essa deve ser uma operação com desempenho muito pesado que você está fazendo lá. É a recursão que causa isso ou algo mais é o gargalo?Python 3 , 92 bytes
Experimente online!
Tudo isso imprime os termos até o N º um. Agradecimentos a Dennis por
-4-5 bytes!fonte
Java (OpenJDK 8) ,
218217213210202200172171170168 168167 bytesNão acredito que não voltei
k
todo esse tempo ...Experimente online!
fonte
for(char f:(""+k).toCharArray())
defor(int f:(""+k).getBytes())
,r.substring(-~r.trim().lastIndexOf(32));
er.substring(r.lastIndexOf(32)-1)
.Go ,
217205 bytesVersão alternativa (programa em vez de um pacote): Experimente online!
Melhorias:
for
, usando várias atribuições parai,k
"fmt";
+fmt.Print
é mais curto queos.Stdout.WriteString
(package main
permanência de quando os.Args era necessário)fonte
25000
caso de teste. :) Portanto, não apenas uma solução válida, mas também com desempenho relativamente bom. +1 de mim! (PS: Na sua TIO-link é o argumento utilizado, a entrada pode ser removido / não é usado.)JavaScript (ES6),
103 8881Edit Revised incluindo muitas idéias inteligentes por @Neil
Ponto de partida
Ideia básica: um loop de 0 a n, e um loop interno que verifica os valores ainda não utilizados
Versão atual mais legível
Teste
fonte
~s.search(d)
pelos.match(d)
trabalho?0
paraj++
, removendo o++
oj
que estava antes e depois iniciandoj
em0
vez de-1
.n=>eval("for(r=[j=i='0'];i<=n;)r[j]|[...''+j].some(d=>i.match(d))?j++:(i=++i+'',r[k=j]=1,j=0);k")
Oitava , 114 bytes
Experimente online!
Agradecimentos a Kevin Cruijssen e Dlosc pela comparação de personagens no golfe.
Ungolfed
Explicação básica:
i
e outro para adicionar valorj
Para cada um
i
, continue a incrementarj
se um dos seguintes itens for atendido:j
já foi usado antes10
torna-se[1 0]
) usandoint2str
. Em seguida, compare os dois números usandoismember
(por exemplo,[1 0]
e[2 1]
retornaria[1 0]
) e depoisnnz
para ver se alguma coluna corresponde.Se nenhuma das opções acima for atendida, você terá o próximo número! Anexar a
o
, matriz de saídafonte
-'0'
. Mas, se houver algum caso crítico em que ambos não tenhamos pensado,-48
seria uma alternativa mais curta. Além disso, ambossprintf('%d',...)
podem serint2str(...)
.Perl 5 , 60 bytes
Código de 59 bytes + 1 para
-p
.Experimente online! (Inclui
-l
para fins visuais e$-=0;
para redefinir cada iteração)fonte
Pip , 30 bytes
29 bytes de código, +1 para
-p
sinalizador.Experimente online!
Mostra a lista inteira. Aviso: altamente ineficiente; a
2231
estojo de entrada está em execução há mais de 35 minutos no meu laptop e ainda não terminou.Explicação
fonte
Visual Basic .NET (.NET 4.5) ,
260259 bytes-1 byte graças a Kevin Cruijssen
Faz um loop, gerando termos anteriores na sequência para comparar posteriormente. Em seguida, itera o número como uma string procurando correspondências.
Abusa do sistema de digitação do VB.NET. Por exemplo,
j
é uma sequência, mas adicionar uma se converte em um número inteiro para mim. Os números inteiros são convertidos em booleanos, onde0
estáFalse
e o restante éTrue
.Experimente online!
fonte
If Not p.Contains(j)Then
mesma forma que você fezIf j.Contains(c)Then g=0
abaixo. Além disso,If Not p.Contains(j)Then \n g=1 \n For Each c In i.ToString \n If j.Contains(c)Then g=0 \n Next \n If g Then Exit While \n End If
pode ser reduzido, removendog
e usandoExit While
diretamente no loop for:,If Not p.Contains(j)Then \n For Each c In i.ToString \n If j.Contains(c)Then Exit While \n Next \n End If
que se tornará 241 bytes pela aparência.Contains(c)Then
, eu apenas perdi. Gosto do que você está pensando, mas estou usandog
como sentinela para ver se a string contém o número ou não. Seu link fornece respostas erradas, mas vou ver se consigo refazer parte da lógica interna ao longo do que você está pensando.Gelatina , 20 bytes
Pyth vence Jelly. Vá, Sr. Xcoder!
Um programa completo, com entrada do STDIN e saída no formato de lista, usando a representação de lista do Jelly *. Usa a indexação baseada em 0 padrão.
* as listas de elementos únicos não têm ambiente
[]
, portanto as0
saídas1
, enquanto as1
saídas[1, 0]
etc.Experimente online!
Quão?
fonte