Generatore di carte Dobble / SpotIt


15

introduzione

Dobble / SpotÈ un gioco di carte, in cui le persone devono individuare lo stesso simbolo sulla coppia di carte nel minor tempo possibile, indicarlo e passare alla coppia successiva. Ogni carta ha più simboli (8 nella versione normale), ma esattamente uno è comune tra ogni coppia di carte.

Esempio dalla copia fisica del gioco: Carte con esempi di coppie

Sfida

Scrivere un programma che fornisca una serie di simboli (singoli caratteri ASCII) e il numero di simboli su una singola scheda produrrà schede di elenco di output con simboli per ogni carta. Esistono ovviamente molte combinazioni equivalenti, il tuo programma deve solo scrivere una qualsiasi delle combinazioni che produce il maggior numero di carte per un dato input.

È un codice-golf, quindi più breve il codice, meglio.

Sarebbe anche bello se il calcolo finisse prima della morte per calore dell'universo per il caso più complicato.

Ingresso

Due argomenti per function / stdin (la tua scelta)

  • Prima di tutto si tratta di una raccolta di simboli, qualcosa come 'ABCDE "o [' A ',' B ',' C ',' D ',' E '] - la tua scelta di formato, sia esso stringa, set, elenco, stream o qualsiasi altra cosa sia idiomatica per la lingua scelta. I caratteri saranno dati dall'insieme di [A-Za-z0-9], nessun duplicato (quindi la dimensione massima dell'insieme dei simboli di input è 62). Non saranno necessariamente ordinati in ( così puoi ottenere "yX4i9A" anche per la custodia a 6 simboli).

  • Il secondo argomento è un numero intero, che indica la quantità di simboli su una singola carta. Sarà <= della dimensione del set di simboli.

Produzione

Stampa più righe separate da newline, ognuna contenente simboli per singola scheda.

Esempi

ABC
2
>>>>
AB
BC
AC

O

ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF

O

ABCDE
4
>>>>
ABCD

suggerimenti

  • Il numero di carte prodotte non può essere maggiore della quantità di simboli distinti e in molte combinazioni sarà considerevolmente più piccolo
  • Potresti voler leggere Alcuni retroscena di matematica se hai bisogno di aiuto con il lato matematico del problema

Questa è la mia prima sfida per il golf del codice, quindi ti prego di perdonare possibili problemi con la formattazione / lo stile: cercherò di correggere gli errori se li punti nei commenti.



Caso di prova suggerito ('abcdefghijklmnopqrstu', 5)-> ['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']o qualche altra soluzione funzionante con 21 carte. (Notare che questo è il piano finito proiettivo di ordine 4).
Jonathan Allan,

Risposte:


5

Python 2 , 192 162 byte

Ho una discussione che questo produce il massimo set di carte per ogni scenario e gestisce i 3 casi di test.

from itertools import*
def m(a,s):
    C=["".join(x)for x in combinations(a,s)]
    while len(C):
        print C[0]
        C=list(set(A for A in C if len(set(A)&set(C[0]))==1<s))

Provalo online!

Algoritmo

Dato un alfabeto ae le dimensioni di una carta s, prendi tutte le combinazioni di selementi ae chiamalo C, quindi:

  • Prendi il primo elemento di C, chiamaloC0
  • Salva C0
  • Rimuovi tutti gli elementi Cche hanno un'unione con C0uguale a1
  • Ripetere con il secondo elemento di C
  • Continua fino a quando non Cè vuoto

Quindi stampare gli elementi salvati.

Discussione

Alcuni sottoinsieme non vuoto di Cè la nostra soluzione massimale, K. Poiché contiene almeno un elemento e due elementi qualsiasi sono indistinguibili, scegli un elemento arbitrario C0, di Cessere dentro K. Per ogni elemento ein K, la cardinalità edell'unione xè 1 per x != ein K; quindi elimina tutti gli elementi la Ccui unione con C0non ha cardinallità 1. Con lo stesso ragionamento, scegli un nuovo elemento arbitrario C, aggiungilo Ke riduci C. Alla fine Cè l'insieme vuoto e Ksarà la soluzione massima perché in nessun momento abbiamo scelto un elemento che fosse distinguibile da qualsiasi altro elemento.


Casi test

Questi casi di test sono stati scritti prima che mi rendessi conto che la stampa era un requisito.

a=["a","b","c"]
b=2
c=3
d=m(a,b)
print d,len(d)==c
>> ['bc', 'ab', 'ac'] True

a=["a","b","c","d","e","f","g"]
b=3
c=7
d=m(a,b)
print d,len(d)==c
>> ['aef', 'abc', 'bde', 'ceg', 'adg', 'cdf', 'bfg'] True

a=["a","b","c","d","e"]
b=4
c=1
d=m(a,b)
print d,len(d)==c
>> ['abcd'] True

Aggiornare

  • +9 [16-12-07] Adatta il requisito di stampa
  • -11 [16-12-07] Sconfitto la mia Rvariabile
  • -30 [16-12-09] Sconfitto la mia Kvariabile, grazie a @Leo !

1
Hai davvero bisogno di sottrarre il set K da C ad ogni passo? Penso che il filtro che fai ( A for A in C if len(set(A)&set(C[0]))==1) rimuova già gli elementi scelti, a meno che s == 1 (in questo caso len (set (C [0]) & set (C [0])) sarebbe 1). Puoi giocare a golf la tua penultima riga per:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Leo

Stavo scrivendo una sfida Dobble nella sandbox e Dom Hastings mi ha indicato questa domanda come un possibile duplicato (che potrebbe benissimo essere), tuttavia una cosa che ho notato è che è molto più difficile creare un mazzo Dobble completo di N * N + N + 1 carte (e simboli) con N + 1 simboli per carta con N che è una potenza primaria non primaria. Per N = 4 = 2 ^ 2 questo sarebbe un mazzo che usa 4 * 4 + 4 + 1 = 21 simboli e lo stesso numero di carte; tuttavia questa soluzione produce un mazzo di sole 13 carte , ma 21 è possibile .
Jonathan Allan

@JonathanAllan Ho appena aggiunto un link TIO. Ho eseguito la funzione con un alfabeto di 21 caratteri e con 5 caratteri per carta. Produce 21 carte. Penso che questo sia corretto se non ho frainteso.
NonlinearFruit

Hmm, scusa, devo aver fatto qualche errore eseguendolo localmente allora! ( Questo è un mazzo pieno di ordini Dobble 4. :) )
Jonathan Allan l'

2

Haskell, 175 156 byte

La mia prima esperienza al golf, fammi sapere se ho sbagliato qualcosa.

import Data.List
f 0_=[[]]
f n a=g$c n a
c n a=[a!!i:x|i<-[0..(length a)-1],x<-f(n-1)(drop(i+1)a)]
g[]=[]
g(x:t)=x:g(filter(\z->length(z`intersect`x)<= 1)t)

Provalo online!

Grazie a @ Paul Mutser per il miglioramento e -19 byte


Versione originale


1
Benvenuti in PPCG! Si noti che le importazioni contano ai fini del punteggio. Possibile miglioramento: 156 byte, inclusa l'importazione
Paul Mutser,

Grazie per il testa a testa, non ero sicuro che lo facessero!
bug

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.