Un número propio (también llamado número colombiano o Devlali) es un número natural x
, donde la ecuación n + <digit sum of n> = x
no tiene soluciones para ningún número natural n
. Por ejemplo, 21 no es un número propio, como n = 15
resultado 15 + 1 + 5 = 21
. Por otro lado, 20 es un número propio, ya que no n
se puede encontrar uno que satisfaga tal igualdad.
Como esta definición hace referencia a la suma de dígitos, depende de la base. Para los propósitos de este desafío, solo consideraremos los números propios de base 10, que son la secuencia A003052 en el OEIS. Los números propios binarios ( A010061 ) y base 100 ( A283002 ) también se han catalogado.
El reto
Dado un entero positivo x
como entrada, genera un valor verdadero si x
es un número propio en base 10, y un valor falso de lo contrario. Para aclarar los valores de verdad y falsey, consulte esta meta publicación sobre el tema .
Puede escribir un programa o función completa, y la entrada y la salida se pueden proporcionar en cualquiera de los canales habituales. Las lagunas estándar están, por supuesto, prohibidas.
Este es el código de golf , ¡así que cuanto más corta sea su respuesta (en bytes), mejor!
Casos de prueba
Verdad:
1
3
5
7
9
20
31
86
154
525
Falsey
2
4
6
8
10
15
21
50
100
500
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Respuestas:
Octava , 37 bytes
Puerto de mi respuesta MATL.
Pruébalo en línea!
fuente
Java (JDK 10) , 84 bytes
Pruébalo en línea!
Explicación
Créditos
fuente
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
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
Brachylog , 12 bytes
Pruébalo en línea!
Explicación
fuente
false.
un valor verdadero por algún método objetivo de una manera quetrue.
no lo es? Por mi parte, no lo creo, y parece que eso estaría respaldado por el meta consensoC (gcc) ,
706765 bytesPruébalo en línea!
Para eliminar otros 2 bytes, el valor de verdad devuelto ya no es 1, sino el número en sí.
fuente
Octava ,
494744 bytesPruébalo en línea!
Explicación:
Intentar hacer la operación en un rango es engorroso y largo, ya que
num2str
devuelve una cadena con espacios como separadores si hay más que el número de entrada. Restar 48, por lo tanto, daría algo como:1 -16 -16 2 -16 -16 3 -16 -16 4
para un rango de entrada 1 ... 4 . Deshacerse de todo-16
toma muchos bytes.Por lo tanto, haremos esto con un bucle usando
arrayfun
. Para cada uno de los números k = 1 .. x , donde x es la entrada, sumamosk
y su suma de dígitos, y restamosx
. Esto devolverá una matriz con el resultado de esa operación para cada uno de los números en k . Si alguno de los números en la matriz es un cero, el número no es un número propio.Para las entradas
20
y21
, las salidas son:Solo hay elementos distintos de cero para la entrada
20
y al menos un elemento distinto de cero para la entrada21
. Eso significa que20
es un número propio y21
no lo es.Octave trata una matriz con al menos un cero como falso, como se puede ver en el enlace TIO.
fuente
MATL , 11 bytes
La salida es una matriz no vacía, que es verdadera si todas sus entradas son distintas de cero, y falsa si contiene uno o más ceros.
Pruébalo en línea! O verifique todos los casos de prueba , incluida la prueba de veracidad / falsedad.
Explicación
Considere la entrada
n = 10
como un ejemplo.fuente
APL (Dyalog) , 14 bytes
Pruébalo en línea!
¿Cómo?
fuente
+/⍎¨∘⍕
->#+.⍎⍕
Jalea , 6 bytes
Para la entrada n , esto devuelve [n] si n es un número propio, [] si no.
Pruébalo en línea!
Cómo funciona
fuente
Pari / GP , 32 bytes
Pruébalo en línea!
fuente
Haskell , 46 bytes
Pruébalo en línea!
fuente
J ,
28, 24, 2221 bytes-1 byte gracias a Conor O'Brien
-2 byts gracias a ngn
Pruébalo en línea!
Explicación:
i.
una lista 0 .. n-1( )"+
para cada artículo en la lista.,.&.":
convertirlo a una lista de dígitos,1#
encontrar su suma+
y agregarlo al artículo$@-.
excluir la lista del argumento y encontrar la formafuente
"0 i.
puede ser"+i.
(-1 byte).-.@e.
->$@-.
[:(
)"+i.
->(
)"+@i.
Python 2,
7066 bytesEDITAR: -4 gracias a @ user56656
fuente
`i`
lugar destr(i)
guardar 4 bytes.[
y]
dentro delsum
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))
Pyth , 8 bytes
Banco de pruebas.
Si se permite el intercambio de valores de verdad / falsedad, entonces podemos eliminar
!
y obtener 7 bytes en su lugar. Una de las sugerencias de Sok me ayudó a jugar golf 2 bytes.Explicación
fuente
.AmnQ+dsjdT
, no tenía ni idea/
. ¡No he usado Pyth correctamente en mucho tiempo parece! +1/
básicamente cuenta las ocurrencias de un elemento en una lista. También puedo usar}
, que prueba si un objeto aparece en una lista, pero creo que es el mismo número de bytes.S
no se requiere: la entrada será un número entero positivo, por lo que tener0
en la lista de mapeo no será un problema. Al menos, parece funcionar para los casos de prueba dados.+sjdT
agregasjdT
ad
? Nunca he visto algo asíPerl 6 ,
3933 bytes¡Pruébalo!
Un bloque desnudo con parámetro único implícito, llamado así:
Desde entonces
n + digits(n) >= n
, podemos calcular el número colombiano para todos los números hasta nuestro valor de consulta y ver si alguno de ellos coincide. Entonces esto calcula el número colombiano para una entrada dada:Lo que aplicamos a todos los valores hasta nuestro objetivo:
Pero solo nos importa si alguno de ellos coincide, no cuáles son esos valores, por lo que, como señaló @nwellenhof, podemos grep:
El resto es solo coerción para bool y envolver en un bloque.
39 bytes
Enlace de prueba TIO proporcionado por @Emigna
¡@nwellenhof señaló que usar grep ahorraría 6 bytes!
fuente
{!grep $_,map {$_+[+] .comb},^$_}
por 33 bytes.Python 3 ,
60,56,55, 54 bytesPruébalo en línea!
-4 usando todo inverso en lugar de cualquier
-1 cambiando! = A ^ por @ jonathan-allan
-1 usando conjuntos por @ovs
fuente
Japt
-d!
, 6 bytesIntentalo
Original, 8 bytes
Devuelve el número de entrada para verdadero o
0
para falso. Si solo la matriz vacía fuera falsey en JavaScript, esto podría ser de 7 bytes.Intentalo
Explicación
Alternativa
Intentalo
fuente
Retina , 55 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Convierta la entrada
x
a unario.Crea un rango de
x
abajo a1
.Sufije el valor decimal de cada uno
n
a su valor unario.Haz una copia de
x
.Convierta cada dígito decimal de
n
a unario, agregando así los dígitos a la copia existente den
.Comprueba si
x
aparece en alguno de los resultados.Invierte el resultado.
fuente
JavaScript (ES6),
5251 bytesGuardado 1 byte gracias a @ l4m2
Devuelve 0 o 1 .
Pruébalo en línea!
fuente
n=>(g=k=>k?n-eval([...k+'k'].join`+`)&&g(k-1):1)(n)
Haskell ,
6358 bytesPruébalo en línea!
fuente
Perl 5
-a
, 34 bytesPruébalo en línea!
fuente
Rubí , 38 bytes.
Pruébalo en línea!
fuente
Retina , 24 bytes
Pruébalo en línea!
Podría ser de 18 bytes con entrada dada en unario, pero la otra respuesta de Retina también usa decimal, así que pensé que usar decimal haría una comparación más justa.
Explicación
Convierta la entrada a unario, utilizando
_
como dígito unario.En cada posición de la cadena (es decir, principio, final y entre cada par de caracteres), inserte:
$.`
la longitud del prefijo (o la posición de coincidencia indexada a cero)¶
, un salto de línea$`
, el prefijo en sí (es decir una representación unaria de la posición indexada a cero). Por ejemplo, si la entrada fue3
y tendríamos la representación unaria___
, esto resultaría en:En otras palabras, obtenemos una línea para cada número desde 0 hasta la entrada (inclusive), que contiene una representación unaria y decimal de ese número.
Convertimos cada dígito a unario, que efectivamente calcula la suma de dígitos en cada línea y la agrega al número mismo (todo en unario).
Líneas deduplicadas. En realidad, esto no elimina líneas duplicadas, solo las borra para dejarlas vacías. Entonces, si cualquier número de 0 a la entrada más su suma de dígitos es igual a la entrada, la última línea se borrará. De lo contrario, la última línea permanece en su lugar.
Comprueba si todavía hay un personaje en la última línea. No podemos usar
$
, porque eso también coincide frente a un salto de línea final (que es exactamente donde no queremos mirar).fuente
Bash + GNU Coreutils, 91 Bytes
Devuelve verdad o falsedad.
fuente
Kotlin , 48 bytes
Pruébalo en línea!
Explicación:
fuente
Agregar ++ , 27 bytes
Pruébalo en línea!
Cómo funciona
fuente
Elixir ,
6665 bytesPruébalo en línea!
fuente
Stax , 8 bytes
Ejecutar y depurarlo
Explicación
ASCII equivalente:
fcE+|+x=
es un programa Stax que genera todos los números cuya suma de dígitos agregados es igual a la entrada. Por ejemplo, para101
la salida sería91
y100
, cada uno en una línea separada.Ejecutar y depurarlo
fuente
Pyt , 7 bytes
Pruébalo en línea!
Si se permite intercambiar valores de verdad / falsedad, entonces
¬
al final se puede descartar por 6 bytes.Explicación:
fuente
J , 20 bytes
Pruébalo en línea!
fuente