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
ay un tamaño de tarjetas, tome todas las combinaciones deselementosay llámeloC, luego:C, llámaloC0C0Cque tengan una uniónC0no igual a1CCesté vacíoLuego imprima los elementos guardados.
Argumento
Un subconjunto no vacío de
Ces 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, deCestar enK. Para cualquier elementoeen elK, la cardinalidad de laeuniónxes 1 parax != eadentroK; elimine todos los elementos enCcuya unión conC0no tiene cardinalidad 1. Por el mismo razonamiento, elija un nuevo elemento arbitrarioC, agrégueloKy reduzcaC. EventualmenteCes el conjunto vacío yKserá 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
RvariableKvariable, ¡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