Inspirado por este CMC
Dado um número inteiro positivo maior que 0, execute a seguinte operação nele:
- Se todos os dez dígitos únicos (
1234567890
) estiverem no número pelo menos uma vez, faça a contagem e saia do programa - Caso contrário, dobre o número e repita, incrementando a contagem.
A contagem começa em 0 e é o número de vezes que a entrada foi duplicada. Por exemplo, se a entrada fosse 617283945, ela precisaria ser duplicada uma vez porque 1234567890 possui todos os 10 dígitos.
Este é um código de golfe, portanto o código mais curto vence. A entrada pode ser tomada como uma sequência, se você desejar.
Casos de teste
input => output
617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55
n
, exista algok
quenk
seja pandigital? Eu adoraria ver uma prova.Respostas:
Python 3 , 39 bytes
Experimente online!
Saídas
False
para0
.fonte
J ,
2423 bytesExperimente online!
Explicação
fonte
05AB1E ,
1110 bytes-1 byte graças ao scottinet
Experimente online! ou como um conjunto de testes
fonte
use x
mas são 10 também ... Ótima resposta. O pensamentox
se livrariaD
, mas é a mesma ideia.Perl 6 ,
3128 bytes (27 caracteres)-3 bytes graças a @Joshua
Experimente online!
Explicação: Ainda é a mesma construção para gerar recursivamente listas. O primeiro elemento é o número fornecido (
$_
), cada elemento seguinte é 2 vezes o anterior (2×*
- usamos ×, porque, embora com caracteres de 2 bytes, ainda seja 1 byte mais barato que2 * *
), fazemos isso até que a condição final de*.comb.unique>9
seja satisfeita , ou seja, quando houver mais de 9 caracteres únicos no número. (Tecnicamente, dividimos a string em uma lista de caracteres com.comb
, forçamos um conjunto com.Set
(é claro que Sets contêm cada elemento apenas uma vez) e comparamos com 9, que força o conjunto ao contexto numérico, o que, por sua vez, fornece seu número de elementos.)Por fim, subtraímos 1 desta lista. Novamente, a lista é forçada ao contexto numérico; portanto, o que retornamos é 1 menor que o comprimento dessa lista.
fonte
.Set
vez de.unique
salvar 3 bytes.JavaScript (ES6) + big.js ,
84747370 bytesObrigado @ ConorO'Brien por salvar 10 bytes, sugerindo big.js em vez de bignumber.js
Agradecimentos a Rick Hitchcock por -1 byte
Agradecimentos a @Shaggy por -3 bytes
Recebe entrada como string; suporta até cerca de 2 69 devido à conversão automática de notação científica que ocorre além desse ponto.
Snippet de teste
Alcance infinito,
106888784 bytesUsando a opção de configuração para desativar efetivamente a notação científica ao converter números em strings, podemos ter um alcance quase infinito.
Mostrar snippet de código
fonte
BigNumber
bit usando big.js ?new
é opcional nesse. Vai atualizar, obrigado!f=n=>[..."0123456789"].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))
."4"+2**29
: tio.run/##BcGxDkAwEADQb2GQO41LNBZDbX7AKgbhKkSu0jZSX1/…Gelatina ,
12, 11 bytesExperimente online!
Explicação:
fonte
Haskell , 46 bytes
Experimente online!
fonte
J , 43 bytes
Experimente online!
Define uma função anônima. Coleta os resultados de maneira subótima. Confira a resposta superior das milhas aqui!
fonte
^:a:
:1#@}.+:^:(10>#@~.@":)^:a:
Haskell, 44 bytes
fonte
Clojure,
1158982 bytes-26 bytes usando apenas uma string para representar a lista de caracteres (duh, em retrospecto) e alterando o uso de recursão para
loop
, o que me permitiu fazer algumas otimizações.-7 bytes, livrando-se da chamada para
bigint
. Aparentemente, precisamos apenas manipular entradas que não causem um estouro.Pré -olfo:
fonte
every?
vez deempty? (remove …
:#(loop[n % c 0](if(every?(set(str n))"1234567890")c(recur(* 2 n)(inc c)))))
Retina , 85 bytes
Experimente online! O link inclui casos de teste. Ligeiramente otimizado para o tempo de execução. Explicação:
Duplique o número de entrada.
Desduplique os dígitos na primeira cópia.
Se restarem 10 dígitos, exclua os dois números, caso contrário, exclua a primeira cópia. Observe que excluir os dois números faz com que o restante do loop fique no-op.
Coloque um
#
antes de dígitos grandes.Dobre cada dígito.
Adicione os carregamentos.
Lidar com uma transportadora líder.
Acrescente um
@
loop até que todos os 10 dígitos sejam encontrados.Imprima o número de
@
s adicionados.fonte
APL (Dyalog Unicode) , 19 + 2 = 21 bytes
Experimente online!
Este é um dyadic
Dfn
( d espirre f unctio n ), tendo 0, quando o seu argumento esquerda e o número inteiro como a direita. Como a entrada deveria ser apenas o número inteiro, adicionei 2 bytes para o argumento0∘
à contagem de bytes.f←
não está incluído na contagem de bytes, pois não é necessário . Isso facilita a criação dos casos de teste.Como funciona:
Os cabeçalhos: removi os da contagem de bytes após algumas conversas na sala da APL, pois a função faz o que deveria fazer e os resultados estão incorretos apenas devido às configurações padrão do REPL da APL.
⎕FR←1287
Define o F loat R ePresentation para 128 bits decimal (7 é o código para decimal em REPL da APL).⎕PP←34
Define a recisão P rint P para 34 dígitos. Ambos são necessários, uma vez que a representação padrão da APL para grandes números os transforma em notação científica (por exemplo, 3.14159265359E15), o que atrapalha muito o código.fonte
Java 8,
1321108774 bytes-57 bytes graças a @ OlivierGrégoire .
Explicação:
Experimente aqui. (Nota: o caso de teste para
2
está desativado porque deve parar em 2 68 , mas o tamanho delong
é limitado a 2 63 -1.)Resposta antiga de 132 bytes usando uma
String
entrada e uma expressão regular:Experimente aqui. (Nota: o caso de teste para
2
está desativado porque causa uma StackOverflowException devido à recursão um pouco demais.)A regex total para verificar se a String contém todos os 9 dígitos se torna
^(?=.*0)(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5)(?=.*6)(?=.*7)(?=.*8)(?=.*9).*$
, o que usa uma observação positiva para toda a String.fonte
2^68
o primeiro número pandigital, mas os longos em Java são limitados a2^63-1
.reduce
\ o /(?:.*?(\d)(?!.*\1)){10}
Casca , 10 bytes
Experimente online!
Explicação
fonte
Mathematica,
5948474638 bytes-9 bytes graças a Jenny_mathy.
Experimente online usando a matemática!
fonte
a
funcionará, mas 'a' não.Print/@f/@{617283945,2,66833,1234567890,100,42}
R , 74 bytes
Experimente online! Observe que R dará a resposta errada
f(2)
devido a limitações de como o idioma armazena números inteiros grandes.Explicação: Para o teste de pandigitalidade, a entrada é coagida a um vetor de caracteres juntando-se a uma sequência vazia e depois dividida em dígitos individuais. Em seguida, verificamos se todos os 0: 9 estão presentes no vetor resultante; caso contrário, incrementamos o contador, duplicamos a entrada e repetimos.
O contador usa F, que é inicializado como FALSE. Para garantir que seja coagido a numérico, multiplicamos por um antes de retornar.
fonte
c(x,"")
é um truque parael(strsplit(...))
PowerShell ,
7069 bytesExperimente online!
(Quase o dobro do tempo que o Python responder: - \)
Recebe entrada
$args[0]
, lança como a[bigint]
, salva para$n
. Insere umfor
loop. A cada iteração, verificamos se o$n
umber convertido em uma string e depois em umchar
array, quandoGroup-Object
juntos, possui um.count
-l
ess que oue
qual9
. Ou seja, a única maneira de ser igual a 10 é se pelo menos um dígito de cada número1234567890
estiver presente. Se sim, saímos do loop. Caso contrário, nós$n*=2
e continuamos. A cada iteração dentro do loop, estamos simplesmente incrementando$i
. Quando saímos do loop, simplesmente saímos$i
.Observe que para entradas como
1234567890
onde todos os dígitos já são contabilizados, isso não produzirá nada, que é um valor falsey no PowerShell e equivalente a0
quando convertido como um[int]
. Se não estiver certo, podemos simplesmente colocar um+
na frente da saída$i
para convertê-la explicitamente como um número inteiro.Guardou um byte graças a Roland Heath.
fonte
Pitão , 11 bytes
Conjunto de teste .
Primeiro número natural
T
ondeinput << T
atende ao requisito.fonte
Perl 5 , 52 + 1 (-p) = 53 bytes
Experimente online!
fonte
Perl, 43 + 1 bytes
Usando a
-p
bandeira. Isso se baseia na solução fornecida pelo Xcali acima.fonte
Swift 4 , 111 bytes
Nota: Não funcionará para x = 2, devido ao estouro.
Explicação - A entrada x é primeiro convertida para string. Então Set () remove os caracteres repetidos. Em seguida, é classificado para corresponder ao resultado. Se não corresponder, x é o dobro e o contador é incrementado.
fonte
Rubi,
46.4539.38 bytesExperimente online!
Atualizações:
def f n;
vez dedef f(n);
.…[9]
vez de….size==10
fonte
Japonês , 15 bytes
Tente
Explicação
Entrada implícita de número inteiro
U
.Crie uma matriz de números inteiros de
0
para99
e passe cada um deles por uma função em queX
está o elemento atual.U
multiplicado por 2 elevado à potência deX
.Obtenha o índice do primeiro elemento que retorna true quando passado pela função a seguir.
Divida em uma matriz de dígitos e remova as duplicatas.
Obtenha o comprimento da matriz e verifique a igualdade com
10
.Alternativa, 15 bytes
Tente
Explicação
Entrada implícita de número inteiro
U
.Começando com
0
, retorne o primeiro número que retorna true quando passado pela função a seguir,X
sendo o número atual.Como acima, multiplique
U
por 2 à potência deX
.Divida em uma matriz de dígitos, remova duplicatas e junte-se a um número inteiro.
Converta em uma string, obtenha o comprimento e converta novamente em um número inteiro.
Verifique a igualdade com
10
.fonte
QBIC , 48 bytes, nc
Isso deve funcionar, em teoria. No entanto, na prática, isso falha porque o QBasic lança números de dez dígitos (pelo menos necessário para obter todos os dígitos) para notação científica ... Marquei-o como não concorrente por causa disso.
Explicação
fonte
GNU dc, 61 bytes
A entrada é copiada da parte superior da pilha (que deve estar vazia); a saída é empurrada para o topo da pilha.
Explicação
Usamos a variável de matriz
a
, armazenando 1 ina[d]
se o dígitod
estiver presente, caso contrário, retornamos a 0 lá. Usamos a extensão GNU~
para obter quociente e restante em um único comando.Como bônus, isso funcionará em bases arbitrárias de números (não apenas decimais): simplesmente defina o raio de entrada conforme necessário (a constante
11
na definição def
será lida usando essa base numérica, portanto, é automaticamente correta).Teste
fonte
REXX, 57 bytes
fonte
q / kdb + , 33 bytes
Solução:
Exemplos:
Explicação:
Todos os bytes estão na igualdade, podem ser capazes de jogar este abaixo um pouco mais. Utiliza o
scan
advérbio de q :Notas:
Se cairmos para o
k
prompt, podemos ter uma solução de 25 bytes. Converte o número em uma lista de caracteres:fonte