Um número próprio (também chamado de número colombiano ou Devlali) é um número natural x
, onde a equação n + <digit sum of n> = x
não tem soluções para nenhum número natural n
. Por exemplo, 21 não é um número próprio, pois n = 15
resulta em 15 + 1 + 5 = 21
. Por outro lado, 20 é um número próprio, pois não n
pode ser encontrado nenhum que satisfaça essa igualdade.
Como essa definição faz referência à soma dos dígitos, ela depende da base. Para os propósitos deste desafio, consideraremos apenas os números próprios da base 10, que são a sequência A003052 no OEIS. Os números próprios binários ( A010061 ) e base 100 ( A283002 ) também foram calculados.
O desafio
Dado um número inteiro positivo x
como entrada, x
emita um valor verdadeiro se for um número próprio na base 10 e, caso contrário, um valor falsey. Para esclarecimento dos valores de verdade e falsey, consulte este meta post sobre o assunto .
Você pode escrever um programa ou função completo, e entrada e saída podem ser fornecidas em qualquer um dos canais habituais. É claro que as brechas padrão são proibidas.
Isso é código-golfe , portanto, quanto menor a sua resposta (em bytes), melhor!
Casos de teste
Verdade:
1
3
5
7
9
20
31
86
154
525
Falsey:
2
4
6
8
10
15
21
50
100
500
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Respostas:
Oitava , 37 bytes
Porta da minha resposta MATL.
Experimente online!
fonte
Java (JDK 10) , 84 bytes
Experimente online!
Explicação
Créditos
fonte
n->{int i=n,r=0;for(;i-->0;)r=(""+i).chars().map(x->x-48).sum()+i==n?1:r;return r<1;}
i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}
05AB1E , 8 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
Braquilog , 12 bytes
Experimente online!
Explicação
fonte
false.
um valor verdadeiro por qualquer método objetivo de uma maneira quetrue.
não é? Eu pelo menos acho que não, e parece que isso seria apoiado pelo meta consenso #C (gcc) ,
706765 bytesExperimente online!
Para economizar mais 2 bytes, o valor de verdade retornado não é mais 1, mas o número em si.
fonte
Oitava ,
494744 bytesExperimente online!
Explicação:
Tentar executar a operação em um intervalo é complicado e longo, pois
num2str
retorna uma sequência com espaços como separadores se houver mais do que o número de entrada. Subtrair 48 daria, portanto, algo como:1 -16 -16 2 -16 -16 3 -16 -16 4
para um intervalo de entrada 1 ... 4 . Livrar-se de tudo isso-16
leva muitos bytes.Portanto, faremos isso com um loop usando
arrayfun
. Para cada um dos números k = 1 .. x , em que x é a entrada, adicionamosk
sua soma de dígitos e subtraímosx
. Isso retornará uma matriz de com o resultado dessa operação para cada um dos números em k . Se algum dos números da matriz for zero, o número não é um número próprio.Para entradas
20
e21
, as saídas são:Existem apenas elementos diferentes de zero para entrada
20
e pelo menos um elemento diferente de zero para entrada21
. Isso significa que20
é um número próprio e21
não é.O Octave trata uma matriz com pelo menos um zero como falso, como pode ser visto no link TIO.
fonte
MATL , 11 bytes
A saída é uma matriz não vazia, que é verdadeira se todas as suas entradas são diferentes de zero e falsas se contiver um ou mais zeros.
Experimente online! Ou verifique todos os casos de teste , incluindo teste de veracidade / falsidade.
Explicação
Considere a entrada
n = 10
como um exemplo.fonte
APL (Dyalog) , 14 bytes
Experimente online!
Quão?
fonte
+/⍎¨∘⍕
->#+.⍎⍕
Gelatina , 6 bytes
Para a entrada n , isso retorna [n] se n for um número próprio, [] se não.
Experimente online!
Como funciona
fonte
Pari / GP , 32 bytes
Experimente online!
fonte
Haskell , 46 bytes
Experimente online!
fonte
J ,
28, 24, 2221 bytes-1 byte graças a Conor O'Brien
-2 bytes graças a ngn
Experimente online!
Explicação:
i.
uma lista 0 .. n-1( )"+
para cada item da lista.,.&.":
converta-o em uma lista de dígitos,1#
encontre sua soma+
e adicione-o ao item$@-.
excluir a lista do argumento e encontrar a formafonte
"0 i.
pode ser"+i.
(-1 byte).-.@e.
->$@-.
[:(
)"+i.
->(
)"+@i.
Python 2,
7066 bytesEDIT: -4 graças a @ user56656
fonte
`i`
vez destr(i)
salvar 4 bytes.[
e]
dentro dosum
lambda x:[i for i in range(x)if i+sum(map(int,`i`))==x]==[]
lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
Pitão , 8 bytes
Suíte de teste.
Se a troca de valores verdadeiros / falsos for permitida, podemos
!
remover o e obter 7 bytes. Uma das sugestões de Sok me ajudou a obter 2 bytes de golfe.Explicação
fonte
.AmnQ+dsjdT
, não tinha ideia/
. Não uso Pyth corretamente há muito tempo! 1/
basicamente conta as ocorrências de um elemento em uma lista. Também posso usar}
, que testa se um objeto aparece em uma lista, mas acho que é a mesma contagem de bytes.S
não é necessário - a entrada será um número inteiro positivo, portanto, ter0
na lista de mapeamento não será um problema? Pelo menos, parece funcionar para os casos de teste fornecidos.+sjdT
adicionasjdT
ad
? Eu nunca vi nada assimPerl 6 ,
3933 bytesExperimente!
Um bloco vazio com parâmetro único implícito, chamado assim:
Desde então
n + digits(n) >= n
, podemos apenas calcular o número colombiano para todos os números até o valor da consulta e ver se algum deles corresponde. Portanto, isso calcula o número colombiano para uma determinada entrada:Que aplicamos a todos os valores até nossa meta:
Mas nós apenas nos importamos se algum deles corresponde, não quais são esses valores; portanto, como apontado por @nwellenhof, podemos grep:
O resto é apenas coerção para bool e empacotamento em um bloco.
39 bytes
Link de teste do TIO fornecido por @Emigna
@nwellenhof apontou que usar grep economizaria 6 bytes!
fonte
{!grep $_,map {$_+[+] .comb},^$_}
para 33 bytes.Python 3 ,
60,56,55, 54 bytesExperimente online!
-4 usando todo inverso em vez de
-1 mudando! = Para ^ por @ jonathan-allan
-1 usando conjuntos por @ovs
fonte
Japt
-d!
, 6 bytesTente
Original, 8 bytes
Retorna o número de entrada para verdade ou
0
para truthy falsey. Se apenas a matriz vazia fosse falsey em JavaScript, isso poderia ser de 7 bytes.Tente
Explicação
Alternativo
Tente
fonte
Retina , 55 bytes
Experimente online! O link inclui casos de teste. Explicação:
Converter entrada
x
para unário.Crie um intervalo de
x
baixo a1
.Sufixe o valor decimal de cada um
n
ao seu valor unário.Faça uma cópia de
x
.Converta cada dígito decimal de
n
em unário, adicionando os dígitos à cópia existente den
.Verifique se
x
aparece em algum dos resultados.Inverta o resultado.
fonte
JavaScript (ES6),
5251 bytesGuardado 1 byte graças a @ l4m2
Retorna 0 ou 1 .
Experimente online!
fonte
n=>(g=k=>k?n-eval([...k+'k'].join`+`)&&g(k-1):1)(n)
Haskell ,
6358 bytesExperimente online!
fonte
Perl 5
-a
, 34 bytesExperimente online!
fonte
Ruby , 38 bytes
Experimente online!
fonte
Retina , 24 bytes
Experimente online!
Poderia ter 18 bytes com a entrada dada em unário, mas a outra resposta da Retina também usa decimal, então imaginei que usar decimal faria uma comparação mais justa.
Explicação
Converta a entrada em unário, usando
_
como dígito unário.Em cada posição na string (isto é, começo, fim e entre cada par de caracteres), insira:,
$.`
o comprimento do prefixo (ou a posição indexada em zero da partida)¶
, um avanço de linha$`
, o próprio prefixo (ou seja, uma representação unária da posição indexada a zero). Por exemplo, se a entrada fosse3
e teríamos a representação unária___
, isso resultaria em:Em outras palavras, obtemos uma linha para cada número de 0 à entrada (inclusive), que mantém uma representação unária e decimal desse número.
Convertemos cada dígito em unário, o que efetivamente calcula a soma dos dígitos em cada linha e a adiciona ao número em si (todos em unário).
Desduplicar linhas. Na verdade, isso não exclui linhas duplicadas, mas apenas as limpa para linhas vazias. Portanto, se qualquer número de 0 à entrada mais sua soma de dígitos for igual à entrada, a última linha será limpa. Caso contrário, a última linha permanecerá no lugar.
Verifique se ainda há um personagem na última linha. Não podemos usar
$
, porque isso também corresponde à frente de um avanço de linha à direita (que é exatamente onde não queremos olhar).fonte
Bash + GNU Coreutils, 91 bytes
Retorna verdade ou falsidade.
fonte
Kotlin , 48 bytes
Experimente online!
Explicação:
fonte
Adicionar ++ , 27 bytes
Experimente online!
Como funciona
fonte
Elixir ,
6665 bytesExperimente online!
fonte
Stax , 8 bytes
Execute e depure
Explicação
Equivalente ASCII:
fcE+|+x=
é um programa Stax que gera todos os números cuja soma de dígitos adicionados a si mesma é igual à entrada. Por exemplo, para101
a saída seria91
e100
, cada um em uma linha separada.Execute e depure
fonte
Pyt , 7 bytes
Experimente online!
Se a troca de valores verdadeiros / falsos for permitida, então
¬
no final poderá ser eliminado por 6 bytes.Explicação:
fonte
J , 20 bytes
Experimente online!
fonte