Dilema de Disarium
Um Disarium é definido como um número cujo:
a soma de seus dígitos alimentados com sua respectiva posição é igual ao número original
Sua tarefa :
Você tem uma estranha obsessão por números classificados como desarticulados. A necessidade de seguir os caminhos do disarium é tão grande em você que você se recusa a ler páginas numeradas que não sejam do disarium em um determinado livro. Você tem dois grandes problemas:
- Seu professor acabou de lhe designar para ler seu livro de uma página
n
para outram
- Você bateu a cabeça com muita força na semana passada e parece que não consegue se lembrar de como determinar programaticamente se um número é considerado um disário.
O tempo é essencial; portanto, o código para determinar as páginas que você precisará ler precisa ser o mais curto possível.
Você precisa identificar todas as disarium dentro de uma gama abrangente de n
meio m
.
Exemplos de um disarium :
89 = 8 1 + 9 2
135 = 1 1 + 3 2 + 5 3
518 = 5 1 + 1 2 + 8 3
Isso é código-golfe, então o menor número de bytes vence!
Aqui está a sequência completa de A032799 .
n
em
? Existe um grande disário (12157692622039623539). As respostas devem ser capazes de identificá-lo?Respostas:
Perl 6 ,
4039 bytesExperimente online!
Como funciona
fonte
Python2,
98898884 bytesHorrível. Vai ficar mais curto.Começando a parecer melhorAqui está minha tentativa recursiva (86 bytes):
Obrigado a @Rod por salvar 4 bytes!
range
paraenumerate
e assim por diante.fonte
enumerate
, você pode usarint(n)
em vezint(`x`[p])
Perl, 43 bytes
Experimente online!
Regex é realmente poderoso, pessoal.
Explicação
A primeira coisa que o código faz é ler dois números inteiros como entrada via
<>
e cria um intervalo do primeiro ao segundo com..
. Em seguida, ele usa o padrãomap
função para percorrer esta faixa, e aplica-se o seguinte código para cada valor:say if$_==eval s/./+$&**$+[0]/gr
. Parece bobagem, e meio que é, mas aqui está o que realmente está acontecendo.map
armazena implicitamente seu valor atual na variável$_
. Muitas funções e operações perl usam esse valor quando nenhum é fornecido. Isso inclui expressões regulares, como os///
operador de substituição.Há quatro partes em uma regex de substituição:
=~
é usado para aplicar uma regex a uma string, mas se esse operador estiver ausente, a regex será aplicada à variável implícita$_
, que contém nosso número atual por meio damap
função.
. Na verdade, estamos capturando cada dígito individual.+
seguido por uma expressão matemática, misturada com algumas variáveis Perl mágicas que tornam tudo significativamente mais fácil.A variável escalar especial
$&
sempre contém a totalidade da última captura bem-sucedida de regex, que neste caso é um único dígito. A variável de matriz especial@+
sempre contém uma lista de deslocamentos pós-correspondência para a última correspondência bem-sucedida, ou seja, o índice do texto após a correspondência.$+[0]
é o índice$_
do texto imediatamente a seguir$&
. No caso de135
, capturamos o dígito1
e o índice135
do texto imediatamente depois (ou seja,35
) é 1, que é o nosso expoente. Então, queremos aumentar$&
(1) a potência de$+[0]
(1) e obter 1. Queremos aumentar 3 à potência de 2 e obter 9. Queremos aumentar 5 à potência de 3 e obter 125.Se a entrada foi
135
, a sequência resultante é+1**1+3**2+5**3
./g
e/r
./g
diz ao intérprete para continuar as substituições depois que a primeira for encontrada (caso contrário, acabaríamos com+1**135
)./r
diz ao intérprete para não modificar a sequência original e, em vez disso, retorne o que seria após a substituição. Isso é importante, porque, caso contrário, ele seria substituído$_
e precisamos dele para fins de comparação.Depois que toda a substituição é concluída, obtemos uma expressão matemática, que é avaliada com a
eval
função+1**1+3**2+5**3
é avaliado em1 + 9 + 125 = 135
, comparado com o número original135
. Como esses dois são iguais, o código imprime o número.fonte
map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
"@+"
é 1 byte mais curto do que$+[0]
:)JavaScript (ES7),
10591898883798281 bytesAgradecemos a Arnauld por salvar 20B e a ETHProductions por salvar 6B!
Uso
Atribua a função a uma variável e forneça o mínimo e o máximo como argumentos. Exemplo:
Saída
Golfe adicional
Isso parece muito bom, mas sempre há espaço para melhorias ... eu acho.
fonte
d**(e+1)
parad**-~e
salvar dois bytes.&
vez de&&
. Mais um byte para ir ...JavaScript (Firefox 52+), 68 bytes
Função recursiva que gera via
alert
. Funciona na Developer Edition do Firefox, que você pode baixar nesta página . As versões anteriores do Firefox não suportam o**
operador e nenhum outro navegador suporta a[for(a of b)c]
sintaxe.Snippet de teste
Isso usa em
.map
vez de uma compreensão de matriz e, emMath.pow
vez de**
, deve funcionar em todos os navegadores que oferecem suporte ao ES6.Mostrar snippet de código
fonte
05AB1E , 12 bytes
Economizou 2 bytes graças a Emigna
Experimente online!
fonte
ŸvygLySmOyQ—
deve funcionar para 12 bytes.Python 3, 100 bytes
Não é a abordagem mais curta, mas uma abordagem bem fofa. Existem muitos disários finitos; veja a página OEIS para uma boa prova. Estes são todos eles.
fonte
R, 100 bytes
Função sem nome que leva
n
em
. Como sempre em R, dividir números inteiros em um vetor de dígitos numéricos é entediante e consome muitos bytes. Isso torna a função relativamente lenta e funciona apenas para números inteiros de 32 bits.fonte
Gelatina , 11 bytes
Experimente online!
Isso diminuiu de 16 para 11, com a ajuda de @miles!
Explicação:
fonte
J
para obter índices. Um caminho mais curto pode serD*J$S⁼
para combinar seus dois links em umCJam , 23 bytes
Experimente online!
Explicação
fonte
05AB1E , 18 bytes
Experimente online!
fonte
Python 2.X, 92 bytes
fonte
(i+1)
, mas isso não é um problema, quando você se livra dos parênteses-~i
.list('k')
, o que eu não tenho. No entanto, você ainda pode remover o espaço em branco :)Python 2 , 84 bytes
Uma abordagem de programa completo, atualmente do mesmo tamanho que a solução lambda.
Experimente online!
fonte
input()
. Muito agradável! +1.Japonês, 15 bytes
Teste online! Essa foi uma colaboração entre @obarakon e eu.
Como funciona
Na versão mais recente do Japt,
x
aceita uma função como argumento, o que nos permite obter outro byte:Teste online!
fonte
Clojure, 107 bytes
A implementação da equação é terrivelmente longa.
fonte
(.pow(-(int v)48M)
TI-Básico, 85 bytes
fonte
int(log(
todos os números e, depois, fazer os poderes. Talvez isso seja mais curto, mas duvido.FUNC
modo e a janela deve ser configurada para incluir seu ponto de entrada. Não parece portátil o suficiente para mim.FUNC
modo, embora eu veja o que você está dizendo sobre a resolução de entrada. Mas, esse método é bastante comum no golfe. Você sempre poderia emPrompt X,Y
vez disso.Haskell, 61 bytes
Exemplo de uso
5 # 600
->[5,6,7,8,9,89,135,175,518,598]
.Verifique cada número
i
no intervalo[n..m]
. Os dígitos são extraídos transformandoi
- se em uma string (show
) e tornando cada caracter uma string de um elemento (pure
) que é transformada em um número inteiro novamente (read
). Feche esses elementos de números com[1..]
a função^
e pegue osum
.fonte
PHP,
929188 bytes3 bytes salvos graças @AlexHowansky
recebe entrada de argumentos de linha de comando; imprime uma vírgula à direita. Corra com
-r
.fonte
for([,$n,$m]=$argv;$n<=$m;
"$n"[index]
e"_$n"[index]
erros de produtos de análise durante"89"[index]
e$s="$n";$s[index]
são perfeitamente bem.("_$n")[index]
Mathematica, 59 bytes
Função sem nome, recebendo dois argumentos inteiros e retornando uma lista de números inteiros.
(d=IntegerDigits@#)^Range@Length@d
produz a lista de dígitos de um número para as potências apropriadas;Tr[...]==#
detecta se a soma desses dígitos é igual ao número original.fonte
MATLAB,
8873 bytesResposta original:
num2str(n)-'0'
divide umn
em um vetor de seus dígitos e1:floor(log10(n))+1
é um vetor que mantém um no número de dígitosn
. Graças a registrar o golfe em uma função anônima, economizando 15 bytes.fonte
Haskell ,
82 7675 bytesExperimente online! Uso:
5 ! 175
Isso verifica cada número no intervalo
n
param
saber se é um número de disarium e, portanto, é bastante lento para grandesm
.Versão mais rápida: (93 bytes)
Experimente online!
fonte
C (gcc) , 136 bytes
Cabeçalho que define pow no TIO porque, por algum motivo, ele não inclui automaticamente o pow. Meu computador funcionou, então eu vou continuar com isso.
Experimente online!
fonte
MATL , 16 bytes
Experimente online!
fonte
Lote, 115 bytes
O lote possui apenas aritmética de 32 bits, que não tem como comparar o último número do disarium, mas se você insistir em comparações de cadeias, terá 402 bytes:
fonte
Python 2, 100 bytes
Ainda não tive a chance de executar isso (fazendo isso no meu telefone).
fonte
sum
.i
está um Disarium. Não tenho idéia se isso é permitido, mas eu diria que não, pois a saída fica muito em branco.Scala,
132129 bytes129 editar: Alterar o nome da variável do loop for de
&
parai
três espaços salvos.Explicação
Para cada valor no intervalo de entrada:
+""
zipWithIndex
para produzir uma lista de tuplas contendo um caractere do dígito e seu índiceComentários
Finalmente comecei a aprender como
fold
ezipWithIndex
trabalhar. Estou descontente com asint
conversões, mas estou satisfeito com a sucessão defold
ezipWithIndex
.fonte
Oitava,
8887 bytesAgradecimentos a MattWH por salvar um byte (f (x) -48 vs f (x) - '0')
Para correr:
Explicação
fonte
C
175169 bytesVersão não destruída:
Pode ser reduzido de alguma forma, mas não vejo no momento.
@TuukkaX Obrigado por salvar 6 bytes.
fonte
n!=0
podem ser alterados paran
.Java
Explicação
fonte
Python 3: 131 bytes
Depois de criar esse código, tornou-se aparente que há um número limitado de desariums; portanto, pode ser mais viável checá-los explicitamente, em vez de usar tanta compreensão de lista que é difícil para grandes entradas nessa solução.
Experimente online!
fonte