En los Nuevos Tiempos Modernos , cuando Charlie Chaplin se encuentra con una computadora, está empleado en el patio de clasificación, como un validador para determinar si los trabajadores están clasificando correctamente los elementos. Los artículos en cuestión son paquetes de canicas. Los paquetes con un número impar de canicas se apilan en la canasta roja y los paquetes con un número par de canicas se apilan en la canasta azul.
Se supone que Charlie Chaplin golpea el programa que se validaría si hay alguna anomalía en el procedimiento de clasificación. Mack Swain, su jefe inmediato, comparte un algoritmo que necesita codificar.
Algoritmo
L = List of Marble packets that's already sorted
L_ODD = List of packets with Odd Number of Marbles
L_EVEN = List of packets with Even Number of Marbles
Check_Digit = √(ΣL_ODD² + ΣL_EVEN²)
Su trabajo es determinar el Check_Digit y relacionarlo con el valor que calcula su jefe.
Charlie Chaplin, durante sus horas de almuerzo, pudo escabullirse al cajón de Mack Swain y determinar que su cajón tiene una sola tarjeta con golpes en las primeras 46 32 columnas (lo que significa que Mack pudo escribir un programa con solo 46 32 caracteres).
Charlie Chaplin ahora necesitaría la ayuda de todos los códigos ninja para escribir un programa con la menor cantidad de líneas posible. También anuncia una bonificación de 50 puntos, si alguien puede idear un programa que sea más corto que su Jefe.
Resumen
Dada una lista / matriz / vector de números positivos (pares e impares), debe escribir una función que acepte array(int [])/vector<int>/list
y calcule la raíz de la suma de los cuadrados de las sumas de números impares y pares en la lista.
El tamaño del programa es el tamaño del cuerpo de la función, es decir, excluyendo el tamaño de la firma de la función.
Ejemplo
List = [20, 9, 4, 5, 5, 5, 15, 17, 20, 9]
Odd = [9, 5, 5, 5, 15, 17, 9]
Even = [20, 4, 20]
Check_Digit = √(ΣOdd² + ΣEven²) = 78.49203781276162
Tenga en cuenta que la salida real puede variar según la precisión de coma flotante de la implementación.
Puntuación
La puntuación se calcula como La puntuación se calcula como Σ(Characters in your Program) - 46
. Σ(Characters in your Program) - 32
. Además de la votación regular de la comunidad, el puntaje negativo más bajo recibiría una bonificación adicional de 50 puntos.
Editar
- La compensación que se usó para calcular el puntaje se cambió de 46 a 32. Tenga en cuenta que esto no afectaría la elegibilidad de la tabla de clasificación / recompensa ni invalidaría ninguna solución.
Veredicto
Después de un horrible duelo entre los Ninjas, el Sr. Chaplin recibió algunas respuestas maravillosas. Lamentablemente, pocas de las respuestas intentaron aprovechar indebidamente la regla y no fueron muy útiles. En realidad, quería un duelo justo y las respuestas donde la lógica estaba codificada dentro de las firmas de funciones eventualmente significarían que la firma de funciones es una parte integral de la solución. Finalmente, Ninja FireFly fue el claro ganador y le otorgó el bono que se merece. Tabla de clasificación (actualizada todos los días)
╒══════╤═════════════════╤══════════════╤═════════╤════════╤═══════╕
├ Rank │ Ninja │ Dialect │ Punches │ Scores │ Votes ┤
╞══════╪═════════════════╪══════════════╪═════════╪════════╪═══════╡
│ 0 │ FireFly │ J │ 17 │ -15 │ 6 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 1 │ tmartin │ Kona │ 22 │ -10 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 2 │ Sven Hohenstein │ R │ 24 │ -8 │ 7 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 3 │ Ben Reich │ GolfScript │ 30 │ -2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 4 │ mollmerx │ k │ 31 │ -1 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 5 │ David Carraher │ Mathematica │ 31 │ -1 │ 3 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 6 │ tmartin │ Q │ 34 │ 2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 7 │ daniero │ dc │ 35 │ 3 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 8 │ psion5mx │ Python │ 38 │ 6 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 9 │ O-I │ Ruby │ 39 │ 7 │ 5 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 10 │ gggg │ Julia │ 40 │ 8 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 11 │ FakeRainBrigand │ LiveScript │ 50 │ 18 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 12 │ Sylwester │ Perl5 │ 50 │ 18 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 13 │ daniero │ Ruby │ 55 │ 23 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 14 │ vasuakeel │ Coffeescript │ 57 │ 25 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 15 │ dirkk │ XQuery │ 63 │ 31 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 16 │ crazedgremlin │ Haskell │ 64 │ 32 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 17 │ Uri Agassi │ Ruby │ 66 │ 34 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 18 │ Sumedh │ JAVA │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 19 │ Danny │ Javascript │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 20 │ deroby │ c# │ 69 │ 37 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 21 │ Adam Speight │ VB │ 70 │ 38 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 22 │ Andrakis │ Erlang │ 82 │ 50 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 23 │ Sp0T │ PHP │ 85 │ 53 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 24 │ brendanb │ Clojure │ 87 │ 55 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 25 │ Merin Nakarmi │ C# │ 174 │ 142 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 26 │ Boopathi │ JAVA │ 517 │ 485 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 27 │ Noyo │ ES6 │ ? │ ? │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 28 │ shiona │ Haskell │ ? │ ? │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 29 │ Vivek │ int │ ? │ ? │ 0 │
└──────┴─────────────────┴──────────────┴─────────┴────────┴───────┘
Respuestas:
J,
1817 caracteres - 32 = ⁻15(Como "cuerpo de función"; debe estar entre paréntesis o vinculado a un nombre).
Explicación
Traté de hacer una vista detallada de lo que hace cada pieza, como lo hace Tobia en las respuestas de APL.
+/&.:*:
podría reemplazarse|@j./
haciendo uso del complejo truco de magnitud de OI para salvar otros dos caracteres.Ejemplo
fuente
ES6,
(48-32) = 16(1-32) = -31Versión original:
La definición de la función completa es de 53 caracteres, el cuerpo solo tiene 48.
Versión actualizada, aprovechando al máximo la definición del problema y moviendo casi todo fuera del cuerpo a la firma:
La nueva definición de la función ahora es de 63 "golpes" en total, pero la función CUERPO ahora es solo SOLO UN CARÁCTER MALDITO DE LARGO. Además, ¡ya no corrompe el espacio de nombres global! :RE
Uso:
fuente
R, (24-32) = −8
El cuerpo de la función consta de 24 caracteres.
Uso:
fuente
sqrt(sum(by(x,x%%2,sum)^2))
Solo que no he optimizado el sqrt ... maldición :-) +1 :-) PD: es interesante cómoby
parece estar fuera al principio debido al formato de salida de mierda, pero cuando lo pasas porsum
encima es fijo ;-)by
devuelve una matriz unidimensional. No se debe juzgar la función por el resultado de laprint.by
función.by
no devuelve una matriz (por cierto, ¿qué quieres decir con "matriz"? No hay ninguno en R. Probablemente quisiste decir un vector), ni un vector.by
devuelve objeto de claseby
.?array
. Además,is.array(by(1,1,I))
vuelveTRUE
.Ruby 2.1+ - (39 caracteres en total - 7 sin cuerpo - 32 desplazamiento = 0)
Enfoque ligeramente diferente. Creo un número complejo
a+b*i
tal quea
yb
son las sumas de los números pares e impares enlist
, respectivamente. Entonces solo tomo el valor absoluto.Mi solución anterior, que tiene 5 caracteres más pero funciona en 1.9.3+:
En una nota final, si se permitieran Rails + Ruby 2.1+, podemos usar
Array#sum
para reducir el cuerpo a solo 25 caracteres:fuente
Python 2.7: 45, no: 40, no: 38 - 32 = 6
Nada muy nuevo aquí, solo una combinación del truco de números complejos que vi en el reciente desafío de Pitágoras, lambda para la compacidad y minimización de sintaxis / paréntesis:
Actualización: guardado algunos caracteres. Gracias a @DSM por el truco de elevar el componente complejo a 0/1.
Ok, leer la pregunta y reconocer la regla de conteo del 'cuerpo de la función' ahorra otros 2 caracteres:
Prueba de iPython:
fuente
abs
números complejosAPL (27-46 = -19)
p.ej:
fuente
Mathematica 31-32 = -1
GatherBy[#,OddQ]
produce las listas de paquetes pares e impares.El interno
Tr
encuentra los totales, los cuales son al cuadrado y luego se suman (por el exteriorTr
).N
convierte de un número irracional (la raíz cuadrada de un entero) a una aproximación decimal.Ejemplo
Si
f[n_]:=
no se incluye en el recuento, se puede guardar un personaje adicional.Ejemplo
fuente
Kona, 22-32 = -10
fuente
Perl5: (50-32 = 18)
fuente
say
lugar deprint
y en<>
lugar de@ARGV
(mientras suministra los argumentos en el STDIN en lugar de en la línea de comandos)say
requiere unuse
? cambiar de una matriz de argumentos a<>
requeriría un adicionalsplit/ /,
.dc 3 (35-32)
Usando matrices, como lo sugiere @Tomas. Esto ahorra algunos caracteres porque puedo calcular la paridad de cada número y usarlo como índice, en lugar de ajustarlo con paridad como método de ramificación y poner los valores correctos en los registros correctos. También resulta que las matrices le darán un 0 incluso si la matriz / índice no se ha utilizado, por lo que no tiene que inicializar nada.
Asume que los números ya están en la pila y deja el resultado como el único valor que queda cuando se hace.
Prueba:
dc 16 (48-32)
Primera versión usando los registros o y e para almacenar los números pares e impares.
fuente
sose
;-) tal vez podría obtener un resultado más corto utilizando los comandos de matriz de CC ?Python, 9 (55-46)
El uso de una función lambda ahorra algunos bytes en líneas nuevas, pestañas y
return
.Ejemplo:
fuente
Rubí (66-32 = 34)
prueba:
fuente
Math.hypot *a.partition(&:odd?).map{|x|eval x*?+}
afeita algunos caracteresRubí, 55 - 46 = 9
Prueba:
fuente
h
:f=->a{h=[0,0];a.map{|v|h[v%2]+=v};e,o=h;(e*e+o*o)**0.5}
Q, 34-32 = 2
.
fuente
Julia, 40-46 = -6
Implementación
Salida
fuente
Coffeescript, (57 - 32 = 25)
Implementacion
fuente
+=
y cambiar0.5
a.5
GolfScript 30
¡No creo que GolfScript tenga muchas posibilidades en este caso!
fuente
c #: 69-32 = 37
Código completo:
PD: Solo por diversión, esto también funciona, lamentablemente no cambia la cantidad de caracteres necesarios:
fuente
Prólogo (73 - 32 = 41)
Aquí contamos todo después de ': -' como el cuerpo de la función.
Llame a la función así:
fuente
Matlab (44-46 = -2)
El cuerpo de la función tiene 44 caracteres:
Función total de la siguiente manera:
Pruebas de la función:
fuente
Python 2.7 - 64-46 = 18
Esto podría ser más corto usando algo de
zip
magia, pero por ahora:Para completar, resulta que puedes hacer magia mágica, pero te cuesta más (por unos pocos caracteres), por lo que se destaca lo anterior, a menos que alguien pueda mejorar cualquiera de estos:
fuente
abs(sum(1j**(i%2)*i for i in x))
.!s%2
? Eso es al menos un cambio incremental que puedes aceptarC # 174
Legible
fuente
Clojure = 87 - 46 = 41
Aunque apenas idiomático.
fuente
Haskell, 64C - 46 = 18
No es muy difícil de leer. Ejemplo de ejecución:
fuente
int e=0,o=0;for(int i :n){if(i%2==0)e+=i;else o+=i;}System.out.println(Math.sqrt(e*e+o*o));
Método real en código java
fuente
PHP 85-32 = 53
$a=$b=0;foreach($x as $q){if(($q%2)==0)$a=$a+$q;else$b=$b+$q;}echo sqrt($a*$a+$b*$b);
Esto es lo mejor que se me ocurre ser un novato. Estoy seguro de que también debe haber algunas versiones más cortas.
EDITAR:
Una versión reducida del código podría ser:
Esta versión solo tiene 64 caracteres (21 menos que la respuesta original).
Dicho así, 64-32 = 32
fuente
foreach($l as$m)$m%2?$o+=$m:$e+=$m;echo sqrt($o*$o+$e*$e);
VB.net (81c - 11c = 70) - 32 = 38
Mediante el uso liberal del término Escribir una función
fuente
XQuery, (63 - 32 = 31)
Implementación
Salida
BaseX se utilizó como procesador XQuery.
fuente
Erlang: 82C - 32 = 50
Erlang no es genial para esto. La mayoría de los atajos terminan siendo más personajes (tuplas, etc.)
Las únicas cosas reales de nota:
{lists,sum}
es una referencia de función alists:sum
y se puede llamar--
( restar lista ) la lista de números impares de la lista completaPuede llamar usando:
Salida:
78.49203781276162
fuente
Haskell
57-32 = 25
La optimización directa de cgreedgremlins responde:
Optimizaciones:
read$show
es más corto quefromIntegral
- 3 caracteress=sum\n
y doss
tiene una longitud total de 8 caracteres, dossum
son solo 6 caracteres. - 2 caracteresTambién intenté agregar más cosas al operador, pero terminó siendo igual de largo:
fuente