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 Xes un divisor de X, y si el producto de todos los dígitos de Xes un divisor de X.
Por ejemplo, 135es un número así porque 1 + 3 + 5 = 9cuál divide 135 = 9 * 15y 1 * 3 * 5 = 15cuál también divide 135.
Esta es la secuencia A038186 en el OEIS.
Su tarea: dado un número entero N, genera el Nnúmero entero positivo th con tales propiedades.
Entradas y salidas
Los números pueden estar
0indexados o1indexados; 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 1indexados.
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
Ique 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.//0en elgrepbloque.//0usé porque generalmente se acepta en codegolf para imprimir en stderr.//0En 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 en0N 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
0la 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 significagque será una función que tiene los tres valores para verificar sixes válida.Comenzaremos observando cómo
fcalcula 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~bda 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
fygson 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óngda 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 == yy 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)dondexsigue siendo el valor de entrada actual,pes su producto de dígitos yses 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 argumentosgya 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|,dyNsimplemente 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 funcionesfyg, representan una función binaria que computaf(a, g(a, b)). En nuestro caso,aes el par producto / suma,bes el valor de entrada actual,ges nuestra prueba de divisibilidad yfes 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 conNAs, ¡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};bguarda algunos bytes: enel(...)lugar de[[1]], usando enc(b,"")lugar depaste(b), negando las expresiones lógicas en!lugar de==0y omitiendo los corchetes en laifdeclaración. Supongo que debería haber una forma más fácil de manejar elNAproblema, pero no podría encontrar algo inteligente.0a la expresión evaluada en elifenunciado. 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};bel(...)!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
nelemento 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
ntérminos de la secuencia. Laallverificación es necesaria para asegurar que no obtenemos unaDivisionErrorde%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)apo algo y volviendo a poner laall(d.>0)conp>0. Y puede guardar otro moviendoi%sum(d)el otro lado del1iep<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
intpara 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
<1lugar 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/repralgunos 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
ncomo argumento de línea de comando.Golfed
Sin golf
fuente
PowerShell v2 +, 84 bytes
Solución iterativa. Toma entrada
$ny entra en unforbucle siempre que$nno sea cero. En cada iteración, restamos del$nresultado 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$nse decrementa.Una vez que salimos del ciclo (es decir, tocamos el enésimo término), simplemente colocamos
$aen 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>$nulla al ejemplo a continuación para limpiar la salida. También es bastante lento una vez que llega aproximadamente30, y50toma alrededor de 45 segundos en mi máquina.fuente
BASH, 125 bytes
fuente