Introducción y crédito
Todos conocemos y amamos nuestras increíbles reglas para probar si un número es divisible por 11 o 3, que es solo una suma inteligente sobre los dígitos del número. Ahora, este desafío lleva esto a un nuevo nivel, al exigirle que calcule la suma de los dígitos y luego verifique si el resultado es un cuadrado entero perfecto, ninguna de las cuales operaciones generalmente se pueden hacer muy cortas. Como esta propiedad también es muy difícil de ver cuando se mira un número, queremos que esto se haga para listas completas de números para que podamos ahorrar trabajo humano. ¡Así que este es tu desafío ahora!
Esta fue una tarea en el curso de programación funcional de mi universidad. Esta tarea ahora está cerrada y se ha discutido en clase y tengo el permiso de mi profesor para publicarla aquí (pregunté explícitamente).
Especificación
Entrada
Su entrada es una lista de enteros no negativos, en cualquier formato de E / S estándar.
Puede elegir el formato de lista según lo necesite su idioma
Salida
La salida es una lista de enteros, en cualquier formato de E / S estándar.
¿Qué hacer?
Filtre todos los enteros de la lista de entrada para los cuales la suma de los dígitos no es un cuadrado (de un entero).
El orden de los elementos no se puede cambiar, por ejemplo, si se obtiene [1,5,9]
puede no volver[9,1]
Posibles casos de esquina
0 es un número entero no negativo y, por lo tanto, una entrada válida y 0 también es una raíz entera válida, por ejemplo, 0 cuenta como un cuadrado entero.
La lista vacía es una entrada y salida válida también.
¿Quién gana?
Este es el código de golf, por lo que gana la respuesta más corta en bytes.
Se aplican reglas estándar, por supuesto.
Casos de prueba
[1,4,9,16,25,1111] -> [1,4,9,1111]
[1431,2,0,22,999999999] -> [1431,0,22,999999999]
[22228,4,113125,22345] -> [22228,4,22345]
[] -> []
[421337,99,123456789,1133557799] -> []
Ejemplo paso a paso
Example input: [1337,4444]
Handling first number:
Sum of the digits of 1337: 1+3+3+7=14
14 is not an integer square, thus will be dropped!
Handling second number:
Sum of the digits of 4444: 4+4+4+4=16
16 is an integer square because 4*4=16, can get into the output list!
Example output: [4444]
Respuestas:
Pyke, 6 bytes
Pruébalo aquí!
fuente
Mathematica,
3936 bytesUna función anónima:
LLlAMnYP guardó un byte. ¡Gracias!
Martin Ender salvó tres más al reemplazar
IntegerQ
conAtomQ
. ¡Inteligente! (El resultado de√
será exacto, por lo que devuelve una expresión compuesta comoSqrt[5]
si su argumento no fuera un cuadrado).fuente
...Digits@#&
lugar de...Digits[#]&
Jalea,
87 bytes1 byte gracias a @ Sp3000 .
Banco de pruebas.
Explicación
fuente
Brachylog v2, 8 bytes
Pruébalo en línea!
Explicación
Esto
&
significa que los elementos de salida son los mismos que los de la lista de entrada, pero seℤ
producirá un error si la entrada del bloque no es un número cuadrado, por lo que obtenemos la lista de entrada con elementos con sumas de dígitos no cuadrados descartados.Tenga en cuenta que al principio puede parecer que hay un problema de inexactitud de coma flotante aquí (algunos enteros no cuadrados muy grandes tienen raíces cuadradas enteras debido al redondeo). Sin embargo, Brachylog admite aritmética bignum, y en realidad tiene este comportamiento factorizado en su implementación de
√
: un número que es un cuadrado perfecto tendrá su raíz cuadrada informada como un entero, mientras que un número que no es un cuadrado perfecto (pero lo suficientemente cerca como para que sea raíz cuadrada es integral) tendrá su raíz cuadrada informada como flotante con un valor integral. Convenientemente,ℤ
solo permite el primer tipo de valor de retorno, dando una falla de aserción para el segundo.fuente
Pyth, 10 bytes
Banco de pruebas.
Explicación
fuente
CJam, 14 bytes
¡Gracias a @FryAmTheEggman por guardar un byte!
Pruébalo en línea!
Este es un bloque sin nombre que espera la lista de entrada en la pila y deja la lista filtrada en ella.
Explicación
fuente
Haskell -
706059 bytesUso:
Bastante sencillo; calcula la suma de dígitos y comprueba si floor (sqrt (y)) ^ 2 == y
Editar: Robó la idea de verificar la lista de cuadrados de C. Quilley
fuente
f=
se requiera para esta respuesta.05AB1E,
1910 bytesExplicación
Pruébalo en línea
Editar: guardado 9 bytes gracias a @Adnan
fuente
vySO
y verificar de inmediato si es cuadrado o no. Tengo esta a 5:tDï->
. También hay una construcción especial que se imprimey
cuando es igual a1
, que es (—
). Entonces, eso seríavySOtDï->—
.R ,
5755 bytesUso
Filter
en el vector. Asume enteros de 32 bits, por lo que 10 dígitos como máximo.Casos de esquina: devuelve
NULL
para el vector vacío ynumeric(0)
para un vector sin números válidos. Ambos tienen una longitud cero, por lo que deberían ser aceptables.-2 gracias a @Giuseppe
Pruébalo en línea!
fuente
PowerShell ,
6454 bytesPruébalo en línea!
-10 bytes gracias a mazzy
Toma datos como argumentos de línea de comandos (ver ejemplos a continuación), que se procesan en PowerShell en la matriz
$args
. Lo canalizamos a?
un alias paraWhere-Object
(funciones similares afilter
) para seleccionar nuestra salida. Nuestra selección se basa en la llamada .NET[math]::Sqrt()
de la suma de dígitos del número con el que es un entero!(...%1)
. Los enteros resultarán en 0, que cuandonot
ed se convierteTrue
en raíces no enterasFalse
.Como se mencionó en otra parte "devolver" una matriz vacía no tiene sentido, ya que se convierte
$null
tan pronto como deja el alcance, por lo que la salida para una entrada vacía no es nada.Ejemplos
fuente
$n%1
comprueba si solo int$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
Python 2, 76 bytes
Pruébalo aquí!
Algunos abusos de eval para verificar un número cuadrado, el resto es bastante espectacular.
La sentencia eval se evalúa como
sum(map(int,
n))**.5==int(sum(map(int,
n))**.5)
fuente
Oracle SQL 11.2, 213 bytes
Sin golf
fuente
Brachylog , 26 bytes
Ejemplo:
Explicación
Esta es una situación en la que algo funciona demasiado bien ... la
~^[X:2]
parte es cierta tanto para positivo como para negativoX
, por lo que para evitar duplicados tengo que especificar esoX > 0
.La
;.0
parte está aquí debido a un error (enumerar no funciona en el entero 0).Predicado principal
Predicado 1
fuente
Python 2, 53 bytes
Pruébalo en Ideone .
fuente
f([1111111111111111])
, parece querepr(n)
contiene un'L'
yint('L')
arroja unValueError
. Siento que necesitasstr(n)
aquí?J,
3327 bytes6 bytes gracias a @miles .
En intérpretes en línea,
inv
no está guardado. Cambia eso a su^:_1
lugar.Uso
¿Dónde
>>
está STDIN y<<
es STDOUT.Ligeramente no golfista
Versión anterior de 33 bytes
Uso
Donde
>>
es STDIN y<<
es STDOUT.Ligeramente no golfista
fuente
f&.g
para aplicarg
, luegof
, y luego el inverso deg
acortar*:@<.@%:
para<.&.%:
guardar 2 bytes. Puede reorganizarlo y usar solo el piso para obtener#~[:(=<.)@%:+/"1@(10&#.inv)
27 bytes dondeinv
está^:_1
y ya está definido.Javascript 66 bytes
Gracias por SergioFC por guardar 7 bytes
fuente
c+d
lugar dec-+-d
? Además, puede usarn%1==0
para probar si el resultado es un int, por lo que tal vez pueda guardar algunos bytes usandob=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)
para filtrarPerl 5, 42 bytes
41, más 1 para
-pe
lugar de-e
Explicación:
-p
obtiene cada entero de entrada en una nueva línea y asigna$_
a esa cadena.my$s
inicializa la variable$s
a nada, de nuevo para cada entero de entrada.map$s+=$_,/./g
toma cada carácter numérico y lo agrega numéricamente a$s
. (La nueva línea se convierte en 0 cuando se numera).sqrt$s==~~sqrt$s
prueba si$s
tiene una raíz cuadrada no integral, y$_ x=
convierte$_
en sí mismo o en la cadena vacía dependiendo de esa prueba.-p
huellas dactilares$_
Gracias a Brad Gilbert b2gills por guardar tres bytes.
También 41 más 1:
s/./$s+=$&/ger
agrega cada carácter numérico a$s
(y la nueva línea es 0 como arriba)fuente
JavaScript (Node.js) , 48 bytes
Pruébalo en línea!
Explicación
fuente
MATL,
161413 bytesPruébalo en línea!
Explicación
fuente
Julia - 38 bytes
Es bastante fácil ver qué hace esto.
digits
convierte un número en una lista de sus dígitos,sum
así calcula la suma de dígitos,√
luego producirá un número entero si el número es un cuadrado, de lo contrario habrá una parte fraccionaria.%1
devolverá solo la parte fraccionaria, y si es cero (==0
),filter
mantendrá en la lista, de lo contrario se filtrará.Usado como
![22228,4,113125,22345]
fuente
Jolf, 8 bytes
Pruébalo aquí!
Explicación
fuente
MATLAB,
524342 bytesCrea una función anónima llamada
ans
que se puede llamar con una serie como entrada:ans([22228,4,113125,22345])
.Demo en línea . La demostración en línea está en Octave, que no funciona para la entrada vacía, pero MATLAB sí.
Explicación
Convertimos cada elemento en la matriz de entrada a base 10, lo que producirá una matriz de caracteres 2D donde cada fila contiene los dígitos de un número en la matriz. Para convertir estos caracteres en números, restamos 48 (ASCII para
'0'
). Luego sumamos a través de las filas, sacamos la raíz cuadrada y determinamos si cada valor es un cuadrado perfecto~mod 1
. Luego usamos este booleano para filtrar la matriz de entrada.fuente
Clojure, 110 bytes
Calcula la suma de dígitos numéricos y luego filtra aquellos para los cuales no existe un número que al cuadrado sea igual a la suma.
Puede ver el resultado aquí: https://ideone.com/ciKOje
fuente
Perl 6 ,
3835 bytesPrueba:
fuente
C,
143141 bytesIntente sin golf en línea
fuente
Retina , 69
Porque prueba de cuadrados perfectos en la retina. Esto puede ser modificar para el cálculo generalizado de raíz cuadrada entera .
La entrada es una lista separada por una nueva línea.
Pruébalo en línea.
a
a
unario expresado comob
s, separado con espaciosfuente
%
configuración\G
y las referencias directas . Siéntase libre de tomarlo: retina.tryitonline.net/… :)Python, 50 bytes
Si n es la lista de entrada de números
fuente
Ruby , 39 bytes
Pruébalo en línea!
fuente
K (oK) ,
191713 bytesSolución:
Pruébalo en línea!
Explicación:
Notas:
fuente
func#list
) ?MathGolf ,
54 bytesPruébalo en línea!
Explicación:
MathGolf todavía está en desarrollo,
por lo que supongo que pronto llegará una entrada implícita para eliminar ese primer byte.¡Hurra!fuente