Toma un número entero positivo X
. Este número es parte de la secuencia que nos interesa si la suma de todos los dígitos de X
es un divisor de X
, y si el producto de todos los dígitos de X
es un divisor de X
.
Por ejemplo, 135
es un número así porque 1 + 3 + 5 = 9
cuál divide 135 = 9 * 15
y 1 * 3 * 5 = 15
cuál también divide 135
.
Esta es la secuencia A038186 en el OEIS.
Su tarea: dado un número entero N
, genera el N
número entero positivo th con tales propiedades.
Entradas y salidas
Los números pueden estar
0
indexados o1
indexados; indique cuál usa su respuesta.La entrada puede tomarse
STDIN
, como un argumento de función, o algo similar.La salida puede imprimirse
STDOUT
, devolverse desde una función o algo similar.
Casos de prueba
Los siguientes casos de prueba están 1
indexados.
Input Output
1 1
5 5
10 12
20 312
42 6912
50 11313
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
fuente
0
.Respuestas:
05AB1E ,
1312 bytes¡Gracias a Emigna por guardar un byte!
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
µNNSONSP‚ÖP½
funciona bien, ¿no?Pyke, 14 bytes (no competitivo) (1 indexado)
Pruébalo aquí!
Dios mío, muchas características nuevas.
De los cuales no son competitivos
I
que solo verificaría si el primer elemento de la pila era verdaderodigits
- devolver una lista de dígitos en el número@
se usa para obtener el enésimo elemento de una lista infinitaDe los cuales fueron utilizados por primera vez:
Elimine los últimos 2 bytes para obtener todos estos números.
fuente
C #, 118 bytes
Programa completo con función no protegida y casos de prueba:
fuente
for(int x=0,c=0;;)
le ahorra 1 byte.Jalea , 13 bytes
Basado en 1.
TryItOnline!
¿Cómo?
fuente
Perl 6 , 44 bytes (indexado 0)
Explicación:
Infinitas listas ftw!
fuente
*
significaría más bytes.//0
en elgrep
bloque.//0
usé porque generalmente se acepta en codegolf para imprimir en stderr.//0
En realidad , 20 bytes
Implementación ingenua de la definición de secuencia. Sugerencias de golf bienvenidas! Pruébalo en línea!
Ungolfing
fuente
Medusa , 45 bytes
Pruébalo en línea!
Explicación
Este es, con mucho, el programa más elaborado (y también el más largo) que he escrito en Jellyfish hasta ahora. No tengo idea de si podré analizar esto de una manera comprensible, pero supongo que tendré que intentarlo.
Jellyfish proporciona un operador de iteración bastante general
\
, que ayuda mucho a "encontrar el enésimo algo ". Una de sus semánticas es "iterar una función en un valor hasta que una función de prueba separada proporcione algo verdadero" (de hecho, la función de prueba recibe tanto el elemento actual como el último, pero solo haremos que mire el elemento actual) . Podemos usar esto para implementar una función de "siguiente número válido". Otra sobrecarga de\
es "iterar una función en un valor inicial N veces". Podemos usar nuestra función anterior e iterarla en0
N veces, donde N es la entrada. Todo eso está configurado de manera bastante concisa con esta parte del código:(Las razones por las cuales
0
la entrada real a la función resultante está allí son un poco complicadas y no las abordaré aquí).El problema con todo esto es que no pasaremos el valor actual a la función de prueba manualmente. El
\
operador hará esto por nosotros. Así que ahora hemos construido una única función unaria (a través de composiciones, ganchos, tenedores y curry) que toma un número y nos dice si es un número válido (es decir, uno que se divide por su suma de dígitos y producto de dígitos). Esto es bastante trivial cuando no puede referirse al argumento. Siempre. Es esta belleza:El
(
es un unario gancho , lo que significa que llama a la función de abajo (f
) en su entrada (el valor actualx
) y, a continuación, pasa a ambos a la función de prueba a la derecha (g
), que es lo calculag(f(x), x)
.En nuestro caso,
f(x)
es otra función compuesta que obtiene un par con el producto de dígitos y la suma de dígitos dex
. Eso significag
que será una función que tiene los tres valores para verificar six
es válida.Comenzaremos observando cómo
f
calcula la suma de dígitos y el producto de dígitos. Esto esf
:&
también es composición (pero al revés).~
es curry, así que10~b
da una función que calcula los dígitos decimales de un número, y dado que lo estamos pasando&
desde la derecha, eso es lo primero que sucederá con la entradax
. El resto usa esta lista de dígitos para calcular su suma y producto.Para calcular una suma, podemos doblar la suma sobre ella, que es
/+
. Del mismo modo, para calcular el producto doblamos la multiplicación sobre él/*
. Para combinar ambos resultados en un par, utilizamos un par de ganchos(
y)
. La estructura de esto es:(Donde
f
yg
son producto y suma, respectivamente.) Tratemos de descubrir por qué esto nos da un par def(x)
yg(x)
. Tenga en cuenta que el gancho derecho)
solo tiene un argumento. En este caso, se supone que el otro argumento es el;
que envuelve sus argumentos en un par. Además, los ganchos también se pueden usar como funciones binarias (que será el caso aquí) en cuyo caso simplemente aplican la función interna solo a un argumento. Entonces, realmente)
en una sola funcióng
da una función que computa[x, g(y)]
. Usando esto en un gancho izquierdo, junto conf
, obtenemos[f(x), g(y)]
. Esto, a su vez, se usa en un contexto unario, lo que significa que en realidad se llama conx == y
y así terminamos[f(x), g(x)]
según sea necesario. Uf.Eso deja solo una cosa, que era nuestra función de prueba anterior
g
. Recuerde que se llamará comog([p, s], x)
dondex
sigue siendo el valor de entrada actual,p
es su producto de dígitos ys
es su suma de dígitos. Esto esg
:Para probar la divisibilidad, obviamente usaremos el módulo, que está
|
en Jellyfish. De manera algo inusual, toma su módulo de operando de la derecha a su operando de la izquierda, lo que significa que los argumentosg
ya están en el orden correcto (las funciones aritméticas como esta se enhebran automáticamente en las listas, por lo que esto calculará los dos módulos separados de forma gratuita) . Nuestro número es divisible tanto por el producto como por la suma, si el resultado es un par de ceros. Para verificar si ese es el caso, tratamos el par como una lista de dígitos de base-2 (d
). El resultado de esto es cero, solo cuando ambos elementos del par son cero, por lo que podemos negar el resultado de this (N
) para obtener un valor verdadero de si ambos valores dividen la entrada. Tenga en cuenta que|
,d
yN
simplemente están todos compuestos junto con un par de&
s.Desafortunadamente, esa no es la historia completa. ¿Qué pasa si el producto de dígitos es cero? La división y el módulo por cero devuelven cero en Jellyfish. Si bien esto puede parecer una convención un tanto extraña, en realidad resulta ser algo útil (porque no necesitamos verificar cero antes de hacer el módulo). Sin embargo, también significa que podemos obtener un falso positivo, si la suma de dígitos divide la entrada, pero el producto de dígitos es cero (por ejemplo, entrada
10
).Podemos solucionar esto multiplicando nuestro resultado de divisibilidad por el producto del dígito (por lo tanto, si el producto del dígito es cero, también convertirá nuestro valor verdadero en cero). Resulta más simple multiplicar el resultado de divisibilidad con el par de producto y suma, y extraer el resultado del producto después.
Para multiplicar el resultado con el par, necesitamos volver a un valor anterior (el par). Esto se hace con un tenedor (
]
). Los tenedores son como ganchos de esteroides. Si les da dos funcionesf
yg
, representan una función binaria que computaf(a, g(a, b))
. En nuestro caso,a
es el par producto / suma,b
es el valor de entrada actual,g
es nuestra prueba de divisibilidad yf
es la multiplicación. Entonces todo esto computa[p, s] * ([p, s] % x == [0, 0])
.Todo lo que queda ahora es extraer el primer valor de esto, que es el valor final de la función de prueba utilizada en el iterador. Esto es tan simple como componer (
&
) la bifurcación con la función head<
, que devuelve el primer valor de una lista.fuente
R,
132115bytesNueva versión gracias a los bonitos comentarios de @Billywob!
Sin golf:
Como R se comportó estrangulado conNA
s, ¡tuve que agregar toda laifelse(is.na(...))
parte!O usar
na.omit(...)
fuente
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
guarda algunos bytes: enel(...)
lugar de[[1]]
, usando enc(b,"")
lugar depaste(b)
, negando las expresiones lógicas en!
lugar de==0
y omitiendo los corchetes en laif
declaración. Supongo que debería haber una forma más fácil de manejar elNA
problema, pero no podría encontrar algo inteligente.0
a la expresión evaluada en elif
enunciado. Sin embargo, esto devuelve una advertencia cuando el producto no es 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(...)
!Brachylog , 22 bytes
Pruébalo en línea!
Explicación
fuente
JavaScript (ES6), 78
Menos golf
fuente
Pyth, 18 bytes
Pruébelo en línea: demostración
Explicación:
fuente
JavaScript (ES6), 72 bytes
Manifestación
Tiende a ser lento para valores más altos, así que lo estoy limitando a 20 aquí.
Mostrar fragmento de código
fuente
Haskell,
94857271 bytes1 indexado.
¡Gracias a @Zgarb por guardar 13 bytes!
¡Gracias a @nimi por guardar un byte!
fuente
(==)=<<map(gcd n)$[sum k,product k]
debería guardar algunos bytes.[sum k,product k]
puede sermap($read.pure<$>show n)[sum,product]
.([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
MATL , 21 bytes
Largo e ineficiente ...
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6), 70 bytes
Esto resultó bastante parecido a la respuesta de @ Arnauld, pero la recursión es aparentemente 2 bytes más corta. Funciona en Chrome, aunque es muy lento en entradas de más de 30 (50 tarda 6 segundos).
fuente
Python 2,
122110 Bytes1 indexado, debe usar un intérprete de Python con un límite de recursión bastante alto.
fuente
Maravilla, 33 bytes
Indexado a cero. Uso:
Explicación
Más legible:
Básicamente obtiene una lista infinita de números divisibles por su suma digital y producto al filtrar una lista infinita de números enteros a través de un predicado. Luego, el
n
elemento th simplemente se selecciona de la lista.fuente
Julia, 81 bytes
Esta es una función anónima que acepta un entero y devuelve un entero. Para llamarlo, dale un nombre. El enfoque es obvio: verifique cada número hasta que hayamos encontrado los
n
términos de la secuencia. Laall
verificación es necesaria para asegurar que no obtenemos unaDivisionError
de%
cuando el producto de los dígitos es 0.Sin golf:
Pruébalo en línea! (incluye todos los casos de prueba)
fuente
prod(d)
ap
o algo y volviendo a poner laall(d.>0)
conp>0
. Y puede guardar otro moviendoi%sum(d)
el otro lado del1
iep<1>i%sum(d)
.C89,
381226195170169 bytes1 indexado (las mismas respuestas exactas que en el desafío).
Asume 4 bytes (32 bits)
int
(arquitecturas más modernas) .Realmente creo que esto no puede ser más corto.
Función
int g (int)
pierde memoria y accede a la memoria no inicializada una vez por llamada, pero no falla por defecto y devuelve el número correcto.Programa completo que toma la entrada en unario (
./prog $(seq 1 10)
para 10) con sin golf (un poco):Vieja respuesta:
C99, 381 bytes
Esto probablemente se puede jugar más al golf.
Programa completo:
fuente
int
para todo, ya que es el tipo entero predeterminado.C, 110 bytes
Sin golf y uso:
fuente
Python3,
13480 bytesNueva versión gracias a Flp.Tkc
Nuevo código, recordé una forma de golf para hacer el factorialEl código en sí no es muy parecido al golf, más bien al campo de fuerza bruta.g (x) es una función que devuelve True si x cumple los criterios.
fuente
<1
lugar de==0
. No necesita elis True
, el punto de una declaración if es verificar si la condición es verdadera de todos modos. Puede usar el acceso directo de backtick de Python 2 para reducirstr/repr
algunos bytes. También hay muchos espacios en blanco innecesarios aquí.h+=g(str(k))
agrega 1 si es Verdadero, 0 si es Falso.x
(backtick) en Python 2 es lo mismorepr(x)
ostr(x)
en Python 3 :)PHP, 96 bytes
Toma
n
como argumento de línea de comando.Golfed
Sin golf
fuente
PowerShell v2 +, 84 bytes
Solución iterativa. Toma entrada
$n
y entra en unfor
bucle siempre que$n
no sea cero. En cada iteración, restamos del$n
resultado de una declaración booleana, que se desglosa a continuación:Por lo tanto, sólo si
$a%(sum)
y$a%(product)
son ambos igual a cero será la adición también ser cero, y por lo tanto el operador booleano-no será verdad y por lo tanto$n
se decrementa.Una vez que salimos del ciclo (es decir, tocamos el enésimo término), simplemente colocamos
$a
en la tubería y la salida es implícita.Ejemplos
Nota: Esto arroja un montón de errores "Intento de dividir por cero" a STDERR, que se ignora por defecto. He agregado explícitamente
2>$null
a al ejemplo a continuación para limpiar la salida. También es bastante lento una vez que llega aproximadamente30
, y50
toma alrededor de 45 segundos en mi máquina.fuente
BASH, 125 bytes
fuente