Mi amigo y yo estábamos trabajando en un laboratorio en nuestra clase de informática AP y decidimos codificar uno de los problemas ya que todavía teníamos la mitad de la clase libre después de terminar. Aquí está la pregunta:
Dado un número n, ¿es n divisible por cada uno de sus dígitos?
Por ejemplo, 128 pasará esta prueba, es divisible por 1,2 y 8. Cualquier número con un cero descalifica automáticamente el número. Si bien puede usar otros idiomas y publicar soluciones con ellos si lo desea, estamos más interesados en ver cómo las personas compactas pueden hacer el programa en Java, ya que ese es el lenguaje que usamos en la clase. Hasta ahora, ambos tenemos 51. Aquí está mi código actual:
public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters
// Breakdown:
// for(int p=n; Saves one semicolon to put declaration into for loop
// n%10>0;) Basic check-for-zero
// n/= Pretty simple, discarding one number off of n at a time
// p%(n%10)>0? If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10; Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1 If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.
Requisitos
La firma del método puede ser lo que quieras. Solo cuenta el cuerpo de la función. Sin embargo, asegúrese de que el método devuelva un valor booleano y solo pase un parámetro numérico (no una cadena).
El código debe poder pasar todos estos casos (para mantenerse fiel a las instrucciones de la pregunta original, solo los valores booleanos de verdadero y falso cuentan si el idioma admite booleanos. Si y solo si su idioma no tiene variables booleanas usted puede representar falso con 0 y verdadero con cualquier número entero distinto de cero (preferiblemente 1 o -1):
128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false
Además, no contamos los espacios en blanco, así que siéntete libre de hacer lo mismo, a menos que el espacio en blanco es esencial para el funcionamiento del programa (por lo que los saltos de línea en Java no cuentan, pero un solo espacio entre int
y x=1
hace el recuento.) Buena suerte !
true
yfalse
o son Truthy / Falsy valores bien así? 3. Lajava
etiqueta realmente no se aplica aquí, ya que el desafío en sí no está relacionado con Java.0
dígitos que es un múltiplo de cada uno de ellos), imagino que la mayoría de las respuestas se alargarían de una manera poco interesante para incluir un cheque. Así que me gusta más el problema que plantea el título (divisible por sus dígitos, en lugar de ser un múltiplo de sus dígitos, lo que excluye 0).Respuestas:
Perl 6, 13
Utiliza la variable implícita
$_
-$_ %% .comb.all
es equivalente a$_ %% all($_.comb)
.%%
es el operador "es divisible" ycomb
sin argumento adicional devuelve una lista de los caracteres en una cadena. Como ejemplo, si el argumento es 123, entonces la función evalúacual es
el enhebrado automático lo hace
cual es
lo cual es falso en el contexto booleano porque es una unión "total" y claramente no todos sus elementos son verdaderos.
Debería ser posible forzar el valor de retorno
Bool
y ocultar la unión de los llamadores haciendo la firma de la funciónsub golf($_ --> Bool())
, pero las coacciones en las firmas de la función aún no funcionan en Rakudo. El valor de retorno sigue siendo correctamente verdadero o falso, simplemente no esTrue
oFalse
.fuente
Bool
simplemente agregueso
al frente del códigoso$_%%.comb.all
.C # y System.Linq - 26/40
Según las reglas, sin contar la declaración del método en sí.
Mostrando eso una vez más, C # es la mejor opción cuando Java está bajo consideración ... ¡Bromeo, bromeo!
Desafortunadamente, esta función (y muchas en otras respuestas) no producirá resultados correctos para la entrada negativa. Podemos solucionar esto, pero la solución pierde mucho de su encanto (y crece hasta 46 caracteres de longitud):
Editar : afeitó a un personaje con la sugerencia de Tim.
Editar : con la introducción de miembros con cuerpo de expresión en C # 6, podemos reducir esto aún más cortando el
return
:para un total de 26 caracteres (en mi opinión,
=>
no se deben incluir más de lo que se incluirían los corchetes). La versión que maneja números negativos puede acortarse de manera similar.fuente
.0
? No hay necesidad de nada más que un módulo entero.i % 0
coni
un número entero que da unDivideByZeroException
.48d
es lo mismo que48.0
, pero un carácter menos (d para doble).&
, precisamente porque&
no hace un cortocircuito: obtendrá una excepción dividir por cero en el%
. Podemos arreglar eso convirtiéndolo en un doble (cond
), pero luego hemos perdido un personaje nuevamente.APL (
(aparentemente los corchetes no cuentan)1311)Explicación:
⍎¨⍕⍵
: evalúa cada carácter en la representación de cadena de⍵
⍵|⍨
: para cada uno de ellos, encuentre el módulo del mismo y⍵
0∧.=
: ver si todos son iguales a0
Casos de prueba:
fuente
X%0
? sin tirar?0|X
daX
.(0∧.=⍎¨∘⍕|⊢)
Python 2: 43 caracteres
Comprueba si el número tiene algún resto distinto de cero módulo sus dígitos, y genera la negación de eso. Los dígitos cero se manejan de manera extraña: dado que la informática
%0
causa un error, los dígitos de0
se reemplazan con.3
, lo que parece dar siempre un resultado distinto de cero debido a imprecisiones de coma flotante.El cuerpo de la función es de 32 caracteres.
fuente
Perl - 27 bytes
Sin contar la firma de la función, como se indica.
Uso de muestra:
Salida de muestra:
Abordar la especificación del problema: "Solo los valores booleanos de verdadero y falso cuentan. Los valores de verdad / falsey no cuentan".
Salidas:
'Verdadero' y 'Falso' se definen como
1
y""
.Errata:
Como Brad Gilbert señala correctamente , Perl define verdadero como un escalar que es tanto el entero
1
como la cadena"1"
simultáneamente, y falso como un escalar que es tanto el entero0
como la cadena""
simultáneamente.fuente
$_
:pop=~s///ger<1
. No sé si el OP aceptará eso1
y""
serán resultados válidos. Si no, entonces se puede arreglar con dos bytes más: solo agregue|0
.perl -pe'$_=s/./!$&||$_%$&/ger<1|0'
es de 26 bytes incluyendo la bandera|0
y-p
. No tienes que usar una función.dualvar(1,'1')
ydualvar(0,'')
.SVIV
(int),SVNV
(double) ySVPV
(string).'abc'
como número (suponiendo que hayause warnings;
habilitado)CJam,
1110 bytesEsto define una función llamada
F
y descarta el bloque de la pila.Pruébalo en línea.
Casos de prueba
Cómo funciona
fuente
JavaScript ES6,
393228 bytesGracias core1024 por la sugerencia de reemplazar
(""+v).split("")
con[...""+v]
, y openorclose por sugerir el uso deevery
la función.La respuesta actualmente no contiene un bit de mi código: O
Solución previa
==""
no es una forma válida de verificar si una matriz está vacía, ya que[""]==""
devuelvetrue
, pero se garantiza que la matriz contiene cadenas no vacías, por lo que funciona aquí.El resto son conversiones de tipo abreviado bastante estándar en JavaScript.
fuente
(""+v).split("")
con[...""+v]
.every
método?v=>[...""+v].every(x=>v%x<1)
;v=>![...""+v].some(x=>v%x)
v%0
devuelveNaN
yNaN == false
, por lo tanto, en su caso, los números que contienen 0, como10
, pueden regresartrue
.Java 8, 46 Bytes (cuerpo del método)
Usando la conversión de Jeroen Mostert al doble truco.
fuente
Pyth, 12 bytes
Esto filtra los caracteres en la cadena por ser cero (
!vT
) o no dividir la entrada (%vzvT
), luego toma el no lógico de la lista resultante.Pruébalo aquí
fuente
Ruby, 44 bytes (cuerpo de la función: 37)
Probablemente tiene potencial para jugar más al golf.
Entrada tomada a través de la función
f
. Ejemplo de uso:fuente
.to_i
a.hex
, ya que los números de un solo dígito son iguales en la base 16, y pueden cambiar==0
a<1
.Python -
59504947 bytesEstoy seguro de que hay una manera más rápida ... oh, bueno.
Editar - Gracias a FryAmTheEggman por los consejos de golf.
Edición 2 : FryAmTheEggman también podría haber escrito esto en este momento, ¡vaya!
Edición 3 : manos arriba si ni siquiera sabías que los genexps eran una cosa. ...¿Solo yo?
fuente
f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])
. Y no hay problema :)all
método.1>n%int(c)
?all(c>'0'and 0==n%int(c)for c in`n`)
hace exactamente lo mismo, con 2 caracteres menos e incluso guardando la asignación de la lista.Pyth 11
Esto combina las respuestas de @ isaacg y @ xnor . Filtra los dígitos de la entrada al verificar el valor de
input % (eval(current_digit) or .3)
. Luego comprueba si la cadena resultante está vacía o no.Encontré otras dos variantes de la misma longitud:
Pruébalo en línea.
fuente
Bash + coreutils, 44 bytes
La definición de la función completa es:
No estoy seguro de cómo calificar esto, ya que normalmente las funciones de shell usan un solo conjunto de
{}
o()
para contener el cuerpo de la función. Encontré aquí que también podría usar el doble(())
para contener el cuerpo de la función que causa una expansión aritmética, que es lo que necesito aquí. Así que por ahora estoy contando solo un par de esos corchetes; cualquier discusión adicional sobre esto es bienvenida.Salida:
fuente
true
/false
?J - 14 char
El cuerpo de la función es la porción después de
=:
. Si queremos minimizar el recuento de caracteres para toda la función, esos son los 15 caracteres*/@(0=,.&.":|])
.,.&.":
es la forma más corta en J de expandirse como número en una lista de sus dígitos decimales: convertir en cadena, separar los dígitos y convertir cada dígito nuevamente en un número.,.&.":|]
toma el número de entrada (]
) módulo (|
) esos dígitos.0*/@:=
devuelve verdadero si todos los resultados fueron 0, de lo contrario da un falso.fuente
Java -
121102977978 bytesSolo sé que esto será golpeado más tarde. Oh bien.
Vuelvo enseguida.
fuente
Haskell -
1005438Aún aprendiendo, las críticas apreciadas
fuente
length
mensajes, son innecesarios. 2) Reemplazart
por su definición. 3)elem y s
es innecesario. 4)/='0'
se puede mover al filtro izquierdo, en lugar deelem y s
. 5) En este caso,/='0'
es equivalente a>'0'
, ya que cada letra es un dígito. 6) Ponermod
backticks, por lo que se convierte en infijo. 7) Pon todo en una sola línea.s==filter(...)s
debes usarall(...)s
. ahora, debido a ques
solo aparece una vez en la expresión, puede reemplazarla con su definición y soltarlawhere
. Además, en lugar de==0
usted podría usar<1
.all(\y->...)$show x
porand[...|y<-show x]
.CJam, 15 bytes
Este es un bloque, lo más parecido a una función en CJam. Solo estoy contando el cuerpo (es decir, omitiendo las llaves). Puede usarlo de la siguiente manera:
O si desea probar una serie de entradas, puede hacer
El bloque sale
0
(falso) o1
(verdadero) en la pila para indicar el resultado. (CJam no tiene un tipo booleano).Pruébalo aquí.
Explicación:
Alternativa, también 15 bytes
Explicación
fuente
CJam, 15 bytes
{}
es lo más parecido a una función en CJam. Solo estoy contando el cuerpo de la funciónÚselo así:
Para obtener
1
(si el número es divisible) o0
(si el número no es divisible por sus dígitos).Pruébalo en línea aquí
Explicación
fuente
Ab
dividen los dígitos? Parece simplemente convertirlo a la base 10. Además, ¿cómo sabe% modificar el número, y no solo el siguiente dígito, ya que parece que el siguiente dígito sería el siguiente en la pila?128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
%
simplemente tome los dos últimos números (en este caso) y calcule el mod. Los dos últimos números aquí son el número real y el dígito (siempre)C89, 43 bytes
C89 no tiene un tipo booleano. Espero que funcione. También usé un segundo parámetro para pasar una copia del número original a través de la pila, pero la definición puede ser cualquier cosa. Para obtener el resultado correcto solo tiene que llamar a la función con el mismo valor para ambos parámetros (
d(128, 128)
).EDITAR: ediciones sugeridas aplicadas por un usuario anónimo
fuente
C11 - 44 Bytes en el cuerpo de la función
Otra versión en C, no recursiva y sin una excepción de coma flotante.
Esto también funcionará en C ++, Java y la mayoría de los otros lenguajes tipo C.
Editado para incluir la mejora del comentario de primo.
fuente
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;
un byte más corto que el código del OP.Julia
322523Mejorado usando dígitos
También corrige problemas con números negativos
Método antiguo
Todos los dígitos se dividen si la suma de todos los restos es 0. Al igual que otros, tiene un problema con los números negativos.
Salida
El método mejorado también maneja BigInt
sin embargo
porque
fuente
C / C ++, 58 bytes (44 en el cuerpo)
Invoca comportamientos indefinidos (ver comentarios)
true
yfalse
son 1 y 0, pero puede agregar un carácter a la firma para devolver abool
.Y por diversión, una versión recursiva que es más pequeña si permite llamadas del formulario
r(128,128)
Editar : Ahora no permitido por las reglas:
C / C ++, 53 bytes (33 en el cuerpo)
fuente
R:
726765La función
Gracias a @AlexA y @plannapus por los ahorros
Prueba de funcionamiento
fuente
d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))
. :)paste(a)
lugar detoString(a)
da el mismo resultado.GNU Awk: 53 caracteres
La parte contada:
Toda la función:
Como Awk no tiene valores booleanos, devuelve 1 tor verdadero y 0 para falso.
fuente
JavaScript (ES6) 30
Función con un parámetro numérico. Usando% y sustracción, no es necesario poner el caso especial '0' porque 0% 0 es NaN en JavaScript.
Editar Guardado 1 char thx DocMax
Solo por diversión, abusando de la regla de no contar la firma de la función, 4
Prueba en la consola FireFox / FireBug
Salida
fuente
of(t=n+'')
soloof t=n+''
para ahorrar 1.PHP: 85 bytes (64 bytes en el cuerpo)
Para que esta función funcione, simplemente pase una cadena o un número.
0
correctamente devolverá falso.El código:
¡Por favor, NO CONFIGURE EL 2º PARÁMETRO!
Javascript: 76 bytes (61 bytes en el cuerpo)
Esta es una reescritura de la función anterior.
No ha cambiado mucho entre ambas versiones.
Aquí está el código:
Políglota: Javascript + PHP 187
217bytes (7684 bytes sin repetitivo):¿Por qué lo hice?
¡Por razones y tal vez porque puedo!
Simplemente ignore el error en PHP: ¡funciona de todos modos!Ya no es necesario, esto se solucionó eliminando 3 bytes.
Aquí está la obra maestra:
¡Puede ejecutar este código tanto en su consola como en un intérprete PHP!
Versión antigua:
fuente
Octava, 33 (39 incluyendo configuración de funciones)
Usando la conversión numérica a matriz:
Divida el número por elemento por la matriz X, donde X se forma al convertir el número en una cadena y restar 48 para pasar de los valores ASCII a los números nuevamente. Tome el módulo 1 para obtener la parte decimal de cada división, confirme que todos estos son cero (si alguno es NaN debido a / 0, la suma será NaN y, por lo tanto, no será cero).
Entrada de muestra usando www.octave-online.net:
Salida:
fuente
f(123)
, que es divisible por 1, 2 y 3). Pero funciona para los casos de prueba proporcionados.MATLAB - 39 caracteres
fuente
BASH - 117 caracteres
pruebas
fuente
PHP -
747164 caracteresGolfizado:
Menos golfizado:
Resultados de la prueba:
(Código)
(Salida)
fuente