Estaba buscando en la web y encontré este Google Code Jam Puzzle. Realmente me gustó, así que decidí publicarlo aquí.
Nuevo juego de lotería
¡La lotería está cambiando! La Lotería solía tener una máquina para generar un número ganador aleatorio. Pero debido a problemas de trampa, la Lotería ha decidido agregar otra máquina. El nuevo número ganador será el resultado de la operación bit-AND entre los dos números aleatorios generados por las dos máquinas.
Para encontrar el bit-AND de X e Y , escríbalos en binario; entonces un bit en el resultado en binario tiene un 1 si los bits correspondientes de X e Y eran ambos 1, y un 0 en caso contrario. En la mayoría de los lenguajes de programación, el AND bit a bit de X e Y se escribe X&Y .
Por ejemplo: la máquina anterior genera el número 7 = 0111 . La nueva máquina genera el número 11 = 1011 . El número ganador será (7 Y 11) = (0111 Y 1011) = 0011 = 3 .
Con esta medida, la Lotería espera reducir los casos de reclamos fraudulentos, pero desafortunadamente un empleado de la compañía de la Lotería ha filtrado la siguiente información: la máquina vieja siempre generará un número entero no negativo menor que A y la nueva siempre generará un entero no negativo menor que B .
Catalina quiere ganar esta lotería y para darle una oportunidad se decidió a comprar todos los enteros no negativos menor que K .
Dado A , B y K , a Catalina le gustaría saber de cuántas maneras diferentes las máquinas pueden generar un par de números que la convertirán en una ganadora.
¿Podrías ayudarla?
EntradaLa primera línea de la entrada da el número de casos de prueba, las líneas T. T siguen, cada línea con tres números AB K.
SalidaPara cada caso de prueba, envíe una línea que contenga "Caso #x: y", donde x es el número de caso de prueba (a partir de 1) e y es el número de pares posibles que las máquinas pueden generar para que Catalina sea una ganadora.
Límites1 ≤ T ≤ 100. Conjunto de datos pequeño
1 ≤ A ≤ 1000. 1 ≤ B ≤ 1000. 1 ≤ K ≤ 1000. Gran conjunto de datos
1 ≤ A ≤ 109. 1 ≤ B ≤ 109. 1 ≤ K ≤ 109. Muestra
Input Output 5 Case #1: 10 3 4 2 Case #2: 16 4 5 2 Case #3: 52 7 8 5 Case #4: 2411 45 56 35 Case #5: 14377 103 143 88
En el primer caso de prueba, estos son los 10 pares posibles generados por la máquina antigua y la nueva, respectivamente, que la convertirán en una ganadora: <0,0>, <0,1>, <0,2>, <0,3> , <1,0>, <1,1>, <1,2>, <1,3>, <2,0> y <2,1>. Observe que <0,1> no es lo mismo que <1,0>. Además, aunque el par <2, 2> podría ser generado por las máquinas, Catalina no ganaría ya que (2 Y 2) = 2 y ella solo compró los números 0 y 1.
Aquí está el enlace para el problema real: https://code.google.com/codejam/contest/2994486/dashboard#s=p1
Este es el código de golf, por lo que gana el código más corto. Buena suerte
Respuestas:
Ruby, 107
Esperaba que este fuera un programa mucho más corto.
Explicación
$.
es el último número de línea leído.[*0...x]
es una forma rápida de convertir elRange
en unArray
. Utiliza el operador splat (*
). Tenga en cuenta queRange
es exclusivo (en...
lugar de..
).Array#count
toma un bloque. Solo contará los elementos para los cuales el bloque devuelve un valor verdadero.fuente
$<.map{...}
?APL (63)
Es la E / S la que cuesta mucho.
Explicación:
{
...}¨⍳⎕
: lea un número N desde el teclado y ejecute la siguiente función para cada número del 1 al N.a b k←¯1+⍳¨⎕
: Leer tres números desde el teclado, generar una lista de 0..n-1 para cada uno, y almacenar estos ena
,b
, yk
.a∘.{
...}b
: para cada combinación de valores dea
yb
:⍺⍵⊤⍨10/2
: obtenga la representación binaria de 10 bits para ambos valores (esto es suficiente dados los límites)∧/
: y juntos todos los pares de bits2⊤
: convertirlo de nuevo en un númerok∊⍨
: para cada uno de estos valores, pruebe si está enk
+/
: suma el resultado'Case #',(⍕⍵),': ',⍕
: genera la cadena de salida para este caso↑
: convierte el resultado en una matriz, por lo que cada cadena termina en una línea separada.Prueba:
fuente
Golfscript -
7464Aquí está mi solución Golfscript (probablemente podría mejorarse):
Aquí está el pseudocódigo que utilicé para esto:
Asume una entrada válida.
fuente
CJam - 62
Probablemente podría mejorarse; este es solo un puerto de mi respuesta Golfscript.
fuente
Rubí - 145
Todavía estoy aprendiendo Ruby, así que probablemente haya una forma más corta de hacerlo.
Sin golf :
fuente
#map
es un carácter más corto que con#each
. No necesita recorrer en bucle0...k
, simplemente puede verificar si el binario es inferior ak
. Cuando solo está llamando a un método sin argumentos en un bloque, puede usarSymbol#to_proc
(x.map &:to_i
).J, 90 (70)
E / S a stdin / stdout, funciona como un script ( 90 ).
Entrada en stdin, salida implícita en REPL (similar a APL, creo) ( 70 ).
Ergh, J no es bueno en los requisitos de E / S como estos.
Para los curiosos, la parte que hace el trabajo pesado es
+/@,@(>`(17 b./&i.)/@|.)&.".
, lo que resuelve una sola línea del problema (tomar y devolver una cadena).fuente
CJAM - 57
Creo que esto se puede jugar más golf.
Salida:
fuente