Pegue um número inteiro positivo X
. Esse número faz parte da sequência na qual estamos interessados se a soma de todos os dígitos de X
for um divisor de X
, e se o produto de todos os dígitos de X
for um divisor de X
.
Por exemplo, 135
é esse número porque 1 + 3 + 5 = 9
que divide 135 = 9 * 15
e 1 * 3 * 5 = 15
que também divide 135
.
Esta é a sequência A038186 no OEIS.
Sua tarefa: dado um número inteiro N
, imprima o N
número inteiro positivo th com essas propriedades.
Entradas e saídas
Os números podem ser
0
-indexed ou1
-indexed; indique qual delas sua resposta usa.A entrada pode ser analisada
STDIN
, como argumento de função, ou qualquer coisa semelhante.A saída pode ser impressa
STDOUT
, retornada de uma função ou qualquer coisa semelhante.
Casos de teste
Os casos de teste abaixo são 1
indexados.
Input Output
1 1
5 5
10 12
20 312
42 6912
50 11313
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
fonte
0
.Respostas:
05AB1E ,
1312 bytesAgradecemos a Emigna por salvar um byte!
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
µNNSONSP‚ÖP½
funciona tão bem, não é?Pyke, 14 bytes (não competitivo) (1 indexado)
Experimente aqui!
Meu Deus, que muitas novidades.
Dos quais não competitivos
I
que apenas verificaria se o primeiro item da pilha era verdadeirodigits
- retorna uma lista de dígitos no número@
usado para obter o enésimo item de uma lista infinitaDos quais estavam sendo usados pela primeira vez:
Remova os 2 últimos bytes para obter todos esses números.
fonte
C #, 118 bytes
Programa completo com funções não testadas e casos de teste:
fonte
for(int x=0,c=0;;)
economiza 1 byte.Gelatina , 13 bytes
Baseado em 1.
TryItOnline!
Quão?
fonte
Perl 6 , 44 bytes (indexado 0)
Explicação:
Listas infinitas ftw!
fonte
*
significaria mais bytes.//0
nogrep
bloco.//0
porque geralmente é aceito no codegolf para imprimir em stderr.//0
Na verdade , 20 bytes
Implementação ingênua da definição de sequência. Sugestões de golfe são bem-vindas! Experimente online!
Ungolfing
fonte
Água-viva , 45 bytes
Experimente online!
Explicação
Este é de longe o programa mais elaborado (e também o mais longo) que escrevi na Jellyfish até agora. Não tenho idéia se vou conseguir resolver isso de uma maneira compreensível, mas acho que vou ter que tentar.
O Jellyfish fornece um operador de iteração bastante geral
\
, que ajuda muito a "encontrar o enésimo item ". Uma de suas semânticas é "iterar uma função em um valor até que uma função de teste separada forneça algo verdadeiro" (de fato, a função de teste recebe o elemento atual e o último, mas só faremos com que ela olhe para o elemento atual) . Podemos usar isso para implementar uma função "próximo número válido". Outra sobrecarga de\
"itera uma função em um valor inicial N vezes". Podemos usar nossa função anterior e iterá-la em0
N vezes, onde N é a entrada. Tudo isso é configurado de forma bastante concisa com esta parte do código:(As razões pelas quais
0
a entrada real da função resultante é mais complicada e eu não irei abordá-las aqui.)O problema de tudo isso é que não passaremos o valor atual para a função de teste manualmente. O
\
operador fará isso por nós. Então, agora construímos uma única função unária (por meio de composições, ganchos, garfos e curry) que pega um número e nos diz se é um número válido (isto é, um número dividido pela soma dos dígitos e pelo produto de dígitos). Isso é bastante trivial quando você não pode se referir ao argumento. Sempre. É essa beleza:O
(
é um gancho unário , o que significa que ele chama a função abaixo (f
) em sua entrada (o valor atualx
) e passa os dois para a função de teste à direita (g
), ou seja, calculag(f(x), x)
.No nosso caso,
f(x)
é outra função composta que obtém um par com o produto de dígitos e a soma de dígitos dex
. Isso significag
que será uma função que possui todos os três valores para verificar sex
é válido.Começaremos analisando como
f
calcula a soma e o dígito do produto. Isto éf
:&
também é composição (mas o contrário).~
está currying, portanto,10~b
fornece uma função que calcula os dígitos decimais de um número e, como estamos passando isso para&
a direita, essa é a primeira coisa que acontecerá com a entradax
. O restante usa essa lista de dígitos para calcular sua soma e produto.Para calcular uma soma, podemos dobrar a adição sobre ela, o que é
/+
. Da mesma forma, para calcular o produto, dobramos a multiplicação sobre ele/*
. Para combinar esses dois resultados em um par, usamos um par de ganchos,(
e)
. A estrutura disso é:(Onde
f
e queg
são produto e soma, respectivamente.) Vamos tentar descobrir por que isso nos dá um par def(x)
eg(x)
. Observe que o gancho certo)
tem apenas um argumento. Nesse caso, o outro argumento está implícito em ser o;
que agrupa seus argumentos em um par. Além disso, os ganchos também podem ser usados como funções binárias (o que será o caso aqui), caso em que simplesmente aplicam a função interna apenas a um argumento. Então,)
na verdade, uma única funçãog
fornece uma função que calcula[x, g(y)]
. Usando isso no gancho esquerdo, junto comf
, obtemos[f(x), g(y)]
. Isso, por sua vez, é usado em um contexto unário, o que significa que na verdade é chamado comx == y
e, portanto, terminamos com[f(x), g(x)]
o necessário. Ufa.Isso deixa apenas uma coisa, que foi nossa função de teste anterior
g
. Lembre-se de que ele será chamado comog([p, s], x)
ondex
ainda é o valor de entrada atual,p
é seu produto de dígitos es
sua soma de dígitos. Isto ég
:Para testar a divisibilidade, obviamente usaremos o módulo, que está
|
no Jellyfish. De maneira um tanto incomum, ele usa seu operando do lado direito e seu operando do lado esquerdo, o que significa que os argumentosg
já estão na ordem correta (funções aritméticas como essa encadeiam automaticamente as listas, portanto, ele calculará os dois módulos separados gratuitamente) . Nosso número é divisível pelo produto e pela soma, se o resultado for um par de zeros. Para verificar se é esse o caso, tratamos o par como uma lista de dígitos da base 2 (d
). O resultado disso é zero, somente quando os dois elementos do par são zero, portanto, podemos negar o resultado disso (N
) para obter um valor verdadeiro para se ambos os valores dividem a entrada. Note-se que|
,d
eN
são simplesmente todos compostos em conjunto com um par de&
s.Infelizmente, essa não é a história completa. E se o produto com dígitos for zero? Divisão e módulo por zero retornam zero na água-viva. Embora isso possa parecer uma convenção um tanto estranha, na verdade acaba sendo útil (porque não precisamos verificar o zero antes de fazer o módulo). No entanto, também significa que podemos obter um falso positivo, se a soma dos dígitos dividir a entrada, mas o produto do dígito for zero (por exemplo, entrada
10
).Podemos corrigir isso multiplicando nosso resultado de divisibilidade pelo produto de dígito (portanto, se o produto de dígito for zero, ele também transformará nosso valor de verdade em zero). É mais simples multiplicar o resultado da divisibilidade pelo par de produto e soma e extrair o resultado do produto posteriormente.
Para multiplicar o resultado pelo par, precisamos voltar a um valor anterior (o par). Isso é feito com um garfo (
]
). Garfos são como ganchos com esteróides. Se você lhes der duas funçõesf
eg
, elas representam uma função binária que calculaf(a, g(a, b))
. No nosso caso,a
é o par produto / soma,b
é o valor de entrada atual,g
é o nosso teste de divisibilidade ef
é a multiplicação. Então, tudo isso calcula[p, s] * ([p, s] % x == [0, 0])
.Tudo o que resta agora é extrair o primeiro valor disso, que é o valor final da função de teste usada no iterador. Isso é tão simples quanto compor (
&
) o fork com a função head<
, que retorna o primeiro valor de uma lista.fonte
R,
132115 bytesNova versão graças aos bons comentários do @Billywob!
Ungolfed:
Como R se comporta de maneira estranha comNA
s, eu tive que adicionar aifelse(is.na(...))
parte inteira !Ou use
na.omit(...)
fonte
n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(!b%%sum(d)&ifelse(is.na((p=!b%%prod(d))),F,p))i=i+1};b
salva alguns bytes por: emel(...)
vez de[[1]]
, usando emc(b,"")
vez depaste(b)
, negando as expressões lógicas em!
vez de==0
e pulando os colchetes naif
instrução. Meu palpite é que deveria haver uma maneira mais fácil de lidar com oNA
problema, mas não consegui descobrir algo inteligente.0
a à expressão avaliada naif
declaração. No entanto, isso retorna um aviso quando o produto não é igual a0
.n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b
el(...)
!Braquilog , 22 bytes
Experimente online!
Explicação
fonte
JavaScript (ES6), 78
Menos golfe
fonte
Pitão, 18 bytes
Experimente online: Demonstração
Explicação:
fonte
JavaScript (ES6), 72 bytes
Demo
Tende a ser lento para valores mais altos, então estou limitando-o a 20 aqui.
Mostrar snippet de código
fonte
Haskell,
94857271 bytes1 indexado.
Obrigado ao @Zgarb por salvar 13 bytes!
Agradecemos a @nimi por salvar um byte!
fonte
(==)=<<map(gcd n)$[sum k,product k]
deve salvar alguns bytes.[sum k,product k]
pode sermap($read.pure<$>show n)[sum,product]
.([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
MATL , 21 bytes
Longo e ineficiente ...
Experimente online!
Como funciona
fonte
JavaScript (ES6), 70 bytes
Isso ficou um pouco parecido com a resposta de @ Arnauld, mas a recursão é aparentemente 2 bytes mais curta. Funciona no Chrome, embora seja muito lento em entradas maiores que 30 ou mais (50 leva 6 segundos).
fonte
Python 2,
122110 bytes1 indexado, você precisa usar um interpretador Python com um limite de recursão bastante alto.
fonte
Maravilha, 33 bytes
Indexado a zero. Uso:
Explicação
Mais legível:
Basicamente, obtém uma lista infinita de números divisíveis por sua soma e produto digital, filtrando uma lista infinita de números inteiros por meio de um predicado. Em seguida, o
n
item é simplesmente retirado da lista.fonte
Julia, 81 bytes
Esta é uma função anônima que aceita um número inteiro e retorna um número inteiro. Para chamá-lo, dê um nome. A abordagem é óbvia: verifique todos os números até encontrarmos os
n
termos da sequência. Aall
verificação é necessária para garantir que não recebemos aDivisionError
partir de%
quando o produto dos dígitos for 0.Ungolfed:
Experimente online! (inclui todos os casos de teste)
fonte
prod(d)
ap
ou algo assim e substituindo oall(d.>0)
porp>0
. E você pode salvar outro movendo oi%sum(d)
para o outro lado do1
iep<1>i%sum(d)
.C89,
381226195170169 bytes1 indexado (mesmas respostas exatas que no desafio).
Supõe 4 bytes (32 bits)
int
(arquiteturas mais modernas) .Eu realmente acredito que isso não pode ser mais curto.
A função
int g (int)
vaza memória e acessa a memória não inicializada uma vez por chamada, mas não falha automaticamente e retorna o número certo.Programa completo que recebe entrada em unário (
./prog $(seq 1 10)
por 10) com não-golfado (tipo):Resposta antiga:
C99, 381 bytes
Provavelmente isso pode ser jogado mais.
Programa completo:
fonte
int
para tudo, já que é o tipo inteiro padrão.C, 110 bytes
Ungolfed e uso:
fonte
Python3,
13480 bytesNova versão graças ao Flp.Tkc
Novo código, lembrei-me de uma maneira de fazer o fatorial no golfeO código em si não é muito parecido com o golfe, mais como o golfe de força brutag (x) é uma função que retorna True se x se encaixa nos critérios.
fonte
<1
vez de==0
. Você não precisa dois True
, o objetivo de uma instrução if é verificar se a condição é verdadeira de qualquer maneira. Você pode usar o atalho de bastão do Python 2str/repr
para raspar alguns bytes. Também há muitos espaços em branco desnecessários aqui.h+=g(str(k))
adiciona 1 se True, 0 se False.x
(crase) em Python 2 é o mesmo érepr(x)
oustr(x)
em Python 3 :)PHP, 96 bytes
Toma
n
como um argumento de linha de comando.Golfe
Ungolfed
fonte
PowerShell v2 +, 84 bytes
Solução iterativa. Recebe entrada
$n
e entra em umfor
loop desde que$n
não seja zero. Cada iteração, subtraímos do$n
resultado de uma instrução booleana, dividida abaixo:Assim, apenas se
$a%(sum)
e$a%(product)
são ambos iguais a zero será a adição também ser zero e, portanto, o booleana-não será verdadeira e, por conseguinte,$n
é decrementado.Quando saímos do loop (ou seja, atingimos o enésimo termo), simplesmente colocamos
$a
no pipeline e a saída é implícita.Exemplos
Nota: Isso lança um monte de erros "Tentativa de dividir por zero" para STDERR, que é ignorado por padrão. Eu adicionei explicitamente um
2>$null
ao exemplo abaixo para limpar a saída. Também é muito lento uma vez que fica a cerca de30
mais ou menos, e50
leva cerca de 45 segundos em minha máquina.fonte
BASH, 125 bytes
fonte