Introducción
Dobble / SpotIt es un juego de cartas, donde las personas deben detectar el mismo símbolo en un par de cartas en el menor tiempo posible, indicarlo y pasar al siguiente par. Cada tarjeta tiene múltiples símbolos (8 en la versión normal), pero exactamente uno es común entre cada par de tarjetas.
Ejemplo de copia física del juego:
Desafío
Escriba un programa, que dado el conjunto de símbolos (caracteres ascii individuales) y el número de símbolos en una sola tarjeta producirá tarjetas de listado de salida con símbolos para cada tarjeta. Obviamente, hay muchas combinaciones equivalentes, su programa solo tiene que escribir cualquiera de las combinaciones que produzca la mayor cantidad de tarjetas para la entrada dada.
Es un código de golf, así que más corto el código, mejor.
También sería genial si el cálculo terminara antes de la muerte por calor del universo para el caso más complicado.
Entrada
Dos argumentos para funcionar / stdin (su elección)
El primero de ellos es la colección de símbolos, algo así como 'ABCDE "o [' A ',' B ',' C ',' D ',' E ']: su elección de formato, ya sea cadena, conjunto, lista, secuencia , o lo que sea idiomático para el idioma de elección. Los caracteres se darán del conjunto de [A-Za-z0-9], sin duplicados (por lo que el tamaño máximo del conjunto de símbolos de entrada es 62). No se ordenarán necesariamente en ( para que pueda obtener "yX4i9A" también para el caso de 6 símbolos).
El segundo argumento es un número entero, que indica la cantidad de símbolos en una sola tarjeta. Será <= que el tamaño del conjunto de símbolos.
Salida
Imprima varias líneas separadas por nuevas líneas, cada una de las cuales contiene símbolos para una sola tarjeta.
Ejemplos
ABC
2
>>>>
AB
BC
AC
O
ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF
O
ABCDE
4
>>>>
ABCD
Consejos
- El número de cartas producidas no puede ser mayor que la cantidad de símbolos distintos y en muchas combinaciones será considerablemente menor
- Es posible que desee leer algunos antecedentes matemáticos si necesita ayuda con el lado matemático del problema
Este es mi primer desafío de código de golf, así que perdone posibles problemas con el formato / estilo. Intentaré corregir los errores si los señala en los comentarios.
fuente
('abcdefghijklmnopqrstu', 5)
->['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']
o alguna otra solución de trabajo de 21 tarjetas. (Tenga en cuenta que este es el plano finito proyectivo de orden 4).Respuestas:
Python 2 ,
192162 bytesTengo el argumento de que esto produce el conjunto máximo de tarjetas para cada escenario y maneja los 3 casos de prueba.
Pruébalo en línea!
Algoritmo
Dado un alfabeto
a
y un tamaño de tarjetas
, tome todas las combinaciones des
elementosa
y llámeloC
, luego:C
, llámaloC0
C0
C
que tengan una uniónC0
no igual a1
C
C
esté vacíoLuego imprima los elementos guardados.
Argumento
Un subconjunto no vacío de
C
es nuestra solución máxima,K
. Dado que contiene al menos un elemento y cualquiera de los dos elementos no se puede distinguir, elija un elemento arbitrarioC0
, deC
estar enK
. Para cualquier elementoe
en elK
, la cardinalidad de lae
uniónx
es 1 parax != e
adentroK
; elimine todos los elementos enC
cuya unión conC0
no tiene cardinalidad 1. Por el mismo razonamiento, elija un nuevo elemento arbitrarioC
, agrégueloK
y reduzcaC
. EventualmenteC
es el conjunto vacío yK
será la solución máxima porque en ningún momento elegimos un elemento que fuera distinguible de cualquier otro elemento.Casos de prueba
Estos casos de prueba fueron escritos antes de darme cuenta de que la impresión era un requisito.
Actualizar
R
variableK
variable, ¡Gracias a @Leo !fuente
A for A in C if len(set(A)&set(C[0]))==1
) ya elimina los elementos elegidos, a menos que s == 1 (en este caso, len (set (C [0]) & set (C [0])) sería 1). Puede jugar golf desde la penúltima línea hasta:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Haskell,
175156 bytesMi primera experiencia en el golf, avísame si he estropeado algo.
Pruébalo en línea!
Gracias a @Paul Mutser por su mejora y -19 bytes
Versión original
fuente
Perl 6 ,
8877 bytesPruébalo en línea!
fuente