Introdução
Dobble / SpotIt é um jogo de cartas, no qual as pessoas precisam identificar o mesmo símbolo no par de cartas no menor tempo possível, indicá-lo e passar para o próximo par. Cada cartão possui vários símbolos (8 na versão normal), mas exatamente um é comum entre cada par de cartões.
Exemplo da cópia física do jogo:
Desafio
Escreva um programa cujo conjunto de símbolos (caracteres simples ASCII) e o número de símbolos no cartão único produzirão cartões de listagem de saída com símbolos para cada cartão. Obviamente, existem muitas combinações equivalentes, seu programa apenas precisa escrever qualquer combinação que produza a maior quantidade de cartões para determinada entrada.
É um código de golfe, então, quanto mais curto o código, melhor.
Também seria ótimo se a computação terminasse antes da morte por calor do universo, para os casos mais complicados.
Entrada
Dois argumentos para funcionar / stdin (sua escolha)
O primeiro deles é a coleção de símbolos, algo como 'ABCDE "ou [' A ',' B ',' C ',' D ',' E '] - sua escolha de formato, seja string, conjunto, lista, fluxo ou o que for idiomático para o idioma de escolha. Os caracteres serão fornecidos no conjunto de [A-Za-z0-9], sem duplicatas (o tamanho máximo do conjunto de símbolos de entrada é 62). Eles não serão solicitados necessariamente em ( para que você possa obter "yX4i9A" também para caixa com 6 símbolos).
O segundo argumento é inteiro, indicando a quantidade de símbolos no cartão único. Será menor que o tamanho do conjunto de símbolos.
Resultado
Imprima várias linhas separadas por novas linhas, cada uma delas contendo símbolos para um único cartão.
Exemplos
ABC
2
>>>>
AB
BC
AC
Ou
ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF
Ou
ABCDE
4
>>>>
ABCD
Dicas
- O número de cartões produzidos não pode ser maior que a quantidade de símbolos distintos e, em muitas combinações, será consideravelmente menor
- Você pode ler alguns conhecimentos matemáticos se precisar de ajuda com o lado matemático do problema
Este é o meu primeiro desafio de golfe com código, por isso, perdoe possíveis problemas com formatação / estilo - tentarei corrigir erros se você os apontar nos comentários.
fonte
('abcdefghijklmnopqrstu', 5)
->['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']
ou alguma outra solução de trabalho com 21 placas. (Observe que este é o plano finito projetivo da ordem 4).Respostas:
Python 2 ,
192162 bytesEu tenho um argumento de que isso produz o conjunto máximo de cartões para cada cenário e lida com os 3 casos de teste.
Experimente online!
Algoritmo
Dado um alfabeto
a
e um tamanho de cartãos
, pegue todas as combinações des
elementosa
e chame-oC
, então:C
, chame-oC0
C0
C
que possuem uma união diferenteC0
de1
C
C
esteja vazioEm seguida, imprima os elementos salvos.
Argumento
Algum subconjunto não vazio de
C
é a nossa solução máximaK
,. Como ele contém pelo menos um elemento e quaisquer dois elementos são indistinguíveis, escolha um elemento arbitrárioC0
,C
para estarK
. Para qualquer elementoe
noK
, a cardinalidade dae
uniãox
é 1 parax != e
dentroK
; portanto, elimine todos os elementosC
cuja união comC0
não possui cardinalidade 1. Pelo mesmo raciocínio, escolha um novo elemento arbitrárioC
, inclua-oK
e reduza-oC
. Eventualmente,C
é o conjunto vazio eK
será a solução máxima, porque em nenhum momento escolhemos um elemento que fosse distinguível de qualquer outro elemento.Casos de teste
Esses casos de teste foram escritos antes que eu percebesse que a impressão era um requisito.
Atualizar
R
variávelK
variável, graças a @Leo !fonte
A for A in C if len(set(A)&set(C[0]))==1
) já remove os elementos escolhidos, a menos que s == 1 (neste caso len (set (C [0]) e set (C [0])) sejam 1). Você poderia jogar sua penúltima linha na:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Haskell,
175156 bytesMinha primeira tentativa no golfe, deixe-me saber se eu errei alguma coisa.
Experimente online!
Obrigado a @Paul Mutser pela melhoria e -19 bytes
Versão original
fonte
Perl 6 ,
88bytesExperimente online!
fonte