Dado un entero positivo como entrada, su tarea es generar un valor verdadero si el número es divisible por el doble de la suma de sus dígitos, y un valor falso de lo contrario ( OEIS A134516 ). En otras palabras:
(sum_of_digits)*2 | number
En lugar de los valores de verdad / falsedad para los casos verdadero y falso, puede especificar cualquier conjunto finito de valores para el caso verdadero / falso y su complemento a los otros valores. Para un ejemplo simple, puede usar
0
para el caso verdadero y todos los demás números para el caso falso (o viceversa, si lo desea).Se aplican las reglas estándar de entrada y salida. Las lagunas predeterminadas también se aplican.
Puede tomar la entrada como un entero o como la representación de cadena de ese entero.
Este es el código de golf , por lo tanto, gana el código más corto en bytes.
Soy nuevo en PPCG, por lo que me gustaría que publique una explicación si es posible.
Casos de prueba
Entrada - Salida - (Motivo) 80 - Verdad - (16 divide 80) 100 - Verdad - (2 divide 100) 60 - Verdad - (12 divide 60) 18 - Verdad - (18 divide 18) 12 - Verdad - (6 divide 12) 4 - Falsy - (8 no divide 4) 8 - Falsy - (16 no divide 8) 16 - Falsy - (14 no divide 16) 21 - Falsy - (6 no divide 21) 78 - Falsy - (30 no divide 78) 110 - Falsy - (4 no dide 110) 111 - Falsy - (6 no divide 111) 390 - Falsy - (24 no divide 390)
Respuestas:
Neim , 3 bytes
Explicación:
Pruébalo en línea!
Versión detallada
fuente
JavaScript (ES6),
312927 bytesToma la entrada como una cadena. Devuelve cero para la verdad y no cero para la falsedad.
Comentado
Casos de prueba
Mostrar fragmento de código
fuente
C #, 46 bytes
Versión completa / formateada:
fuente
Retina ,
3827 bytes-11 bytes y reparó un error con el código gracias a @MartinEnder
Pruébalo en línea!
Imprime 1 si es divisible, 0 de lo contrario
Explicación (espero haberlo hecho bien)
Agrega toda la entrada, más una nueva línea, más la entrada nuevamente
Convierte cada coincidencia en unario (ya sea la segunda línea completa, que es la entrada original, o cada dígito en la primera línea)
Verifique si la primera línea (la suma de dos dígitos) es un divisor de la segunda línea
fuente
MATL , 7 bytes
Salidas
0
si es divisible, entero positivo de lo contrario. Específicamente, genera el resto de dividir el número por el doble de la suma de sus dígitos.Pruébalo en línea!
Explicación
fuente
05AB1E ,
54 bytes-1 byte gracias a Okx
Pruébalo en línea!
También puede eliminar el último Ö para obtener 0 para veracidad y algo más para falsedad, lo que resulta en solo 3 bytes, pero para mí eso no parece encajar adecuadamente en la definición.
Explicación
fuente
%_
conÖ
.Código de máquina x86-64, 24 bytes
El código anterior define una función en el código de máquina x86 de 64 bits que determina si el valor de entrada es divisible por el doble de la suma de sus dígitos. La función se ajusta a la convención de llamadas System V AMD64, por lo que se puede llamar desde prácticamente cualquier lenguaje, como si fuera una función C.
Toma un solo parámetro como entrada a través del
EDI
registro, según la convención de llamada, que es el número entero para probar. (Se supone que este es un número entero positivo , consistente con las reglas de desafío, y se requiere para que laCDQ
instrucción que usemos funcione correctamente).Devuelve su resultado en el
EAX
registro, nuevamente, según la convención de llamada. El resultado será 0 si el valor de entrada fue divisible por la suma de sus dígitos, y de lo contrario no será cero. (Básicamente, un booleano inverso, exactamente como el ejemplo dado en las reglas de desafío).Su prototipo C sería:
Aquí están las instrucciones de lenguaje ensamblador no escritas, anotadas con una breve explicación del propósito de cada instrucción:
En el primer bloque, hacemos una inicialización preliminar de registros:
PUSH
LasPOP
instrucciones + se usan como una forma lenta pero corta de inicializarESI
a 10. Esto es necesario porque laDIV
instrucción en x86 requiere un operando de registro. (No existe una forma que se divida por un valor inmediato de, digamos, 10.)XOR
se usa como una forma corta y rápida de borrar elECX
registro. Este registro servirá como el "acumulador" dentro del próximo ciclo.EDI
) y se almacena en ellaEAX
, que se registrará a medida que avancemos por el bucle.Luego, comenzamos a recorrer y sumar los dígitos en el valor de entrada. Esto se basa en la
DIV
instrucción x86 , que se divideEDX:EAX
por su operando, y devuelve el cocienteEAX
y el resto enEDX
. Lo que haremos aquí es dividir el valor de entrada por 10, de modo que el resto sea el dígito en el último lugar (que agregaremos a nuestro registro de acumuladorECX
), y el cociente son los dígitos restantes.CDQ
instrucción es una forma corta de establecerEDX
a 0. En realidad, firma-extiende el valorEAX
aEDX:EAX
, que es lo que seDIV
usa como dividendo. En realidad, no necesitamos la extensión de signo aquí, porque el valor de entrada no está firmado, peroCDQ
es de 1 byte, en lugar de usarXOR
para borrarEDX
, que sería de 2 bytes.DIV
ideEDX:EAX
porESI
(10).EDX
) se agrega al acumulador (ECX
).EAX
registro (el cociente) se prueba para ver si es igual a 0. Si es así, hemos superado todos los dígitos y hemos caído. Si no, todavía tenemos más dígitos para sumar, así que volvemos a la parte superior del ciclo.Finalmente, una vez finalizado el ciclo, implementamos
number % ((sum_of_digits)*2)
:La
LEA
instrucción se utiliza como una forma corta de multiplicarECX
por 2 (o, equivalentemente, sumarECX
a sí mismo) y almacenar el resultado en un registro diferente (en este casoEAX
).(También podríamos haber hecho
add ecx, ecx
+xchg ecx, eax
; ambos son 3 bytes, pero laLEA
instrucción es más rápida y más típica).CDQ
vez para prepararnos para la división. ComoEAX
será positivo (es decir, sin signo), esto tiene el efecto de poner a ceroEDX
, como antes.EDX:EAX
por el valor de entrada (una copia no molestada de la cual aún resideEDI
). Esto es equivalente al módulo, con el resto adentroEDX
. (El cociente también se incluyeEAX
, pero no lo necesitamos).XCHG
(intercambiamos) los contenidos deEAX
yEDX
. Normalmente, harías unMOV
aquí, peroXCHG
es solo 1 byte (aunque más lento). Debido a queEDX
contiene el resto después de la división, será 0 si el valor era igualmente divisible o distinto de cero. Por lo tanto, cuandoRET
urnamos,EAX
(el resultado) es 0 si el valor de entrada era divisible por el doble de la suma de sus dígitos, o de lo contrario no sería cero.Esperemos que eso sea suficiente para una explicación.
Esta no es la entrada más corta, pero bueno, ¡parece que supera a casi todos los idiomas que no son de golf! :-)
fuente
Japt ,
74 bytesToma la entrada como una cadena. Salidas
0
paratrue
o un número mayor que0
parafalse
, que, desde otras soluciones, parecerían ser válidas. Si no, házmelo saber y retrocederé.Pruébalo
Explicación
Entrada implícita de cadena
U
."390"
Repite
U
dos veces."390390"
Dividir en una matriz de caracteres individuales.
["3","9","0","3","9","0"]
Reduzca sumando, convirtiendo automáticamente cada personaje en un entero en el proceso.
24
Obtenga el resto de la división
U
por el resultado, también se convierte automáticamenteU
a un número entero en el proceso. Salida implícita del entero resultante.6 (=false)
fuente
C89,
5553 bytes(¡Gracias a Steadybox!
Se necesita una sola entrada
x
, que es el valor a probar. Devuelve 0 six
es divisible por el doble de la suma de sus dígitos, o si no es cero.Pruébalo en línea!
Sin golf:
Como puede ver, esto aprovecha las reglas implícitas de C89. Las variables globales
s
yt
se declaran implícitamente comoint
s. (También se inicializan implícitamente a 0 porque son globales, pero no podemos aprovechar esto si queremos que la función se pueda llamar varias veces).Del mismo modo, la función,
f
toma un único parámetro,x,
que es implícitamente unint
, y devuelve unint
.El código dentro de la función es bastante sencillo, aunque el
for
bucle se verá terriblemente extraño si no está familiarizado con la sintaxis. Básicamente, unfor
encabezado de bucle en C contiene tres partes:En la sección "inicialización", hemos inicializado nuestras variables globales. Esto se ejecutará una vez, antes de ingresar el ciclo.
En la sección "condición del bucle", hemos especificado en qué condición debe continuar el bucle. Esto debería ser obvio.
En la sección "incremento", básicamente hemos puesto código arbitrario, ya que esto se ejecutará al final de cada ciclo.
El propósito más grande del ciclo es iterar a través de cada dígito en el valor de entrada, agregándolos a
s
. Finalmente, después de que el ciclo ha terminado,s
se duplica y se toma un módulox
para ver si es divisible de manera uniforme. (Una explicación mejor y más detallada de la lógica aquí se puede encontrar en mi otra respuesta , en la que se basa esta).Versión legible para humanos:
fuente
t
lugar det>0
como condición de bucle .Brachylog , 8 bytes
Pruébalo en línea!
Explicación
fuente
Python 2 ,
3432 bytes-2 bytes gracias a @Rod
Pruébalo en línea!
fuente
<1
.Mathematica, 26 bytes
No tengo idea de por qué
∣
tiene mayor prioridad que la multiplicación ...fuente
PHP , 41 bytes
imprime cero si es divisible, entero positivo de lo contrario.
Pruébalo en línea!
fuente
$a=10
, pero olvidó contar eso para su recuento de bytes$argn
está disponible con-F
(en este caso) u-R
opción-F
. Pero eso no se refleja en su TIO (¿admite eco de STDIN?).-F
opción en lugar de-R
php.net/manual/en/features.commandline.options.php Si encuentra una mejor manera de hacer lo mismo en tio como en el comando línea hágamelo saberExcel, 63 bytes
Sumar dígitos es el bit largo.
fuente
Perl 6 , 19 bytes
Pruébalo en línea!
fuente
Cáscara ,
98 bytesGracias a Leo por guardar 1 byte.
Pruébalo en línea!
Explicación
fuente
Haskell ,
383742 bytesGracias a Zgarb por jugar golf en 1 byte
Pruébalo en línea!
Toma la entrada como una cadena; devuelve 0 si es divisible y distinto de cero.
fuente
(:[])
puede serpure
.Python 3, 35 bytes
fuente
=
y después de la)
enint(c)
. Además, dado quesum
puede tomar un generador como argumento, puede eliminar el[..]
interior. Si tiene alguna pregunta adicional, no dude en enviarme un ping.int(c)for c in a
También podría sermap(int,a)
, para guardar unos pocos bytes.lambda a:not a%(sum(map(int,str(a)))*2)
TI-BASIC,
272621 bytes-5 gracias a @Oki
Esto se hace más complicado por el hecho de que no hay una forma concisa de sumar dígitos enteros en TI-BASIC . Devuelve
0
paraTrue
y un número diferente paraFalse
.Explicación:
fuente
10^-randIntNoRep(1,1+int(log(Ans
hace lo mismo queseq(10^(~A-1),A,0,log(Ans
en menos bytes ya que el orden no importa (asumiendo la versión 2.55MP)Braingolf ,
1312 bytesPruébalo en línea!
Salidas 0 para verdad, cualquier otro número para falsey.
Explicación
fuente
Japt , 7 bytes
Devoluciones
1
paratrue
,0
parafalse
Pruébalo en línea!
Explicación
fuente
Haskell , 49 bytes
Uso
Pruébalo en línea!
fuente
Java , 66 bytes
-1 byte gracias a Olivier
Sin golfos y explicación:
fuente
int
lugar debyte
guardar ... un byte.a%i*2
que se analiza(a%i)*2
ya que el módulo y la multiplicación tienen el mismo orden.J, 15 bytes
0 indica verdad, no cero indica falsedad.
Explicación
fuente
@
o[:
!|~2*1#.,.&.":
por 13 bytes.Ohm , 5 bytes
Pruébalo en línea!
fuente
tcl, 45
manifestación
fuente
0==
con1>
.Haskell ,
3534 bytesPruébalo en línea!
Devuelve '0' en el caso verdadero, el resto de lo contrario.
Haskell , edición sin puntos por nimi, 34 bytes
Pruébalo en línea!
fuente
mod<*>(2*).sum.map(read.pure).show
PHP, 44 bytes
Corre así:
Explicación
Itera sobre los dígitos para calcular el total, luego genera el módulo como la mayoría de las respuestas.
fuente
Java (OpenJDK 8) ,
5553 bytesPruébalo en línea!
Un valor de retorno de
0
significa verdad, cualquier otra cosa significa falsedad.Como mi comentario en la respuesta de Okx no hizo ondas, lo eliminé y lo publiqué como esta respuesta, jugando golf aún un poco más.
Más golf gracias a @KrzysztofCichocki y @Laikoni que me mostraron con razón que no necesito responder un valor verdadero / falso, sino cualquier valor siempre que describa el resultado.
fuente
true
.Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values.
.Mini-Flak,
296292 bytesPruébalo en línea!
El enlace TIO tiene más comentarios míos, por lo que es parcialmente más fácil de leer.
Verdad / Falsey: Verdad (divisible) si el segundo número es igual al tercer número, falso de lo contrario. Entonces, tanto el conjunto de verdad como el de falsedad son infinitos, pero supongo que eso debería permitirse. +10 byte si no es así.
Nota: Las líneas nuevas / finales / espacios en blanco iniciales no se permiten en la entrada.
fuente