Nota: questa è una continuazione e revisione dell'altra mia risposta .
Problemi con la riduzione
Ricorda il problema decisionale:
Esiste una piastrellatura perfetta che copre una determinata griglia con tessere uniche?n( n + 1 ) × ( n + 2 )n
Quindi per una griglia , possiamo usare solo variabili.n( n + 1 ) × ( n + 2 )n
Ma:
- La nostra riduzione richiede molte variabili uniche, molto più di .O ( n )
- Inoltre, i nostri fili sono aperti, il che porta a:
- Come facciamo a sapere che possiamo affiancare le aree aperte?
Per risolvere il primo problema, ingrandiamo artificialmente il tabellone di gioco molto più grande; essenzialmente facciamo uguale al numero di variabili che effettivamente richiediamo, quindi creiamo una griglia di dimensioni e posizioniamo la nostra griglia nell'angolo in basso a sinistra. Ciò comporterà un esplosione quadratica.( n + 1 ) × ( n + 2 )n( n + 1 ) × ( n + 2 )
Per il secondo problema, dobbiamo ripensare un po 'i nostri gadget.
Può sembrare un po 'scoraggiante dimostrare che possiamo affiancare con successo il resto del tabellone secondo la regola. Quindi iniziamo con la stessa strategia che si userebbe per generare effettivamente schede di gioco di dimensioni :( n + 1 ) × ( n + 2 )
Innanzitutto generiamo un insieme di tutte le tessere possibili. Tutte queste tessere dovranno essere posizionate sul tabellone. Quindi rimuoviamo le tessere e lasciamo i loro quadrati.
Tuttavia, i nostri gadget non garantiscono il posizionamento di un determinato set di tessere; le tessere posizionate dipendono dallo stato. Quindi dobbiamo modificare attentamente i gadget per garantire che vengano rimosse tessere particolari, indipendentemente dallo stato scelto.
Esaminiamo quindi i nostri gadget.
Il filo e la clausola-gate sono problematici per due motivi.
- Non sappiamo che i quadrati che circondano un filo o una porta-clausola possano essere piastrellati correttamente; dopo tutto, alcuni fili possono essere spinti a sinistra, altri a destra e piastrellare i restanti quadrati dello spazio bianco diventa non banale. Faremo riferimento a questo problema come al problema "flusso".
- Non c'è modo di sapere quali tessere rimuovere dal set di tessere; in uno stato, un insieme di quadrati, nel filo o nella porta della clausola, sarà piastrellato, in un altro stato, verrà piastrellato un insieme completamente diverso di quadrati.
Per risolvere questi problemi:
- Innanzitutto, generiamo un insieme di tutte le tessere possibili. Tutte queste tessere dovranno essere posizionate sul tabellone; quando li posizioniamo sul tabellone, rimuoveremo la tessera dal set. Sebbene all'inizio potremmo non conoscere , poiché non abbiamo ancora descritto completamente la formulazione, possiamo aggiungere tutte le nuove possibilità di piastrelle man mano che incrementiamo , se necessario. Tutte le tessere che rimuoviamo da questo set devono essere posizionabili (almeno, devono essere garantite se la formula è soddisfacente). Chiamiamo la rimozione di una tessera dal set di tessere, per "scaricare" la tessera dal set di tessere, così come per adempiere al nostro obbligo di posizionarla sul tabellone.nnn
- Dobbiamo progettare con cura i gadget per garantire che determinate tessere vengano rimosse, indipendentemente dallo stato scelto.
- Dobbiamo chiudere i nostri gadget, in modo che non spingano le tessere in tutto il tabellone a seconda del loro stato; piuttosto tutti i loro stati devono occupare solo un'area particolare ben definita.
- In alternativa, tutti i loro stati devono essere garantiti per essere in grado di occupare un'area ben definita; ciò garantisce una piastrellatura soddisfacente, ma non garantisce che si verifichi una piastrellatura particolare. Questo è allo stesso modo in cui viene realizzato un gioco Dominosa:
- Innanzitutto le tessere vengono generate in un set;
- Quindi i riquadri vengono posizionati in una configurazione casuale,
- Quando viene posizionata, ogni tessera viene rimossa dal set di tessere.
- Quindi le tessere vengono rimosse dal tabellone, lasciando dietro di sé i loro quadrati.
- Ciò non garantisce che verrà scelta la configurazione prevista,
- Piuttosto, garantisce che è possibile scegliere la configurazione desiderata e quindi esiste una soluzione. Possiamo fare la stessa cosa qui.
- Dopo aver posizionato tutti i gadget della formulazione, invece di posizionare quadrati unici per impostazione predefinita, ovvero su tutti gli "spazi bianchi", ci assicuriamo che lo spazio bianco sia un'area rettangolare con una dimensione uniforme o suddividiamo lo spazio bianco in rettangoli con una dimensione uniforme e semplicemente piastrelliamo lo spazio bianco con le tessere rimanenti nel set di tessere.⋆
- Dopo aver posizionato tutte le tessere dal set, sappiamo che tutto è posizionabile.
- Alcune tessere saranno ovviamente posizionabili, come quelle nei muri, altre saranno posizionabili solo se la formula è soddisfacente, a causa della natura delle relazioni tra i gadget.
- Quindi rimuoviamo le tessere e lasciamo i loro quadrati.
Esaminiamo quindi i nostri gadget.
Forzare gadget
Possiamo creare un numero arbitrario di blocchi assicurandoci che non possano essere accoppiati con se stessi.
Ad esempio, supponiamo di voler forzare una tessera , in modo che possiamo usare come elemento costitutivo. (nota, è una variabile arbitraria, che vogliamo forzare come coppia a se stessa, non necessariamente un blocco predefinito poiché abbiamo usato il valore precedenza)1 ⋆ 1 ⋆ 1( 1 ⋆ , 1 ⋆ )1 ⋆1 ⋆1
Per garantire che le nostre riserve di -building-block , la posizioneremo contro la parete inferiore nella seguente configurazione: posizioneremo il numero riservato, chiamiamolo contro il muro come una virata (a forma di ); contro il muro e uno nella seconda fila nel mezzo. Quindi inseriremo altri due numeri, chiamiamoli e ; questi sono unici per questo gadget. Li posizioniamo in cima a sinistra e a destra .( 1 ⋆ , 1 ⋆ ) 1 ⋆ ⊥ 3 2 ⋆ 31 ⋆( 1 ⋆ , 1 ⋆ )1 ⋆⊥32 ⋆1 ⋆3 ⋆1 ⋆
Illustrato di seguito, il bordo nero condiviso è il fondo del tabellone, descrizione da sinistra a destra.
- Configurazione del gadget. Ogni e qui sono unici per questo gadget.3 ⋆2 ⋆3 ⋆
- I 3 possibili stati di piastrellatura del centro .1 ⋆
Dopo aver fatto ciò, possiamo garantire che il nostro gadget può essere piastrellato con un set specifico di tessere, garantendo allo stesso tempo che il nostro gadget deve forzare la coppia .( 1 ⋆ , 1 ⋆ )
- Sappiamo che deve verificarsi , poiché tutti e 3 i possibili stati di piastrellatura del medio inferiore , tile come , come illustrato nella figura a destra, sopra.1 ⋆ ( 1( 1 ⋆ , 1 ⋆ )1 ⋆( 1 ⋆ , 1 ⋆ )
- Le tessere rimanenti possono essere piastrellate come e , coprendo il gadget. Pertanto, possiamo rimuovere quelle tessere dal nostro set di tessere globale. Di seguito illustrato.( 1 ⋆ , 3 ⋆ )( 1 ⋆ , 2 ⋆ )( 1 ⋆ , 3 ⋆ )
Descrizione, da sinistra a destra:
- Sinistra, in alto: stato a sinistra, a sinistra, in basso: una piastrellatura valida dei quadrati rimanenti.
- Al centro, in alto: stato centrale, al centro, in basso: una piastrellatura valida dei quadrati rimanenti.
- A destra, in alto: a destra, a destra, in basso: una piastrellatura valida dei quadrati rimanenti.
Nota che la piastrellatura dei quadrati rimanenti non è forzata , poiché possono tessere con i vicini vicini invece di , ma poiché è una piastrellatura valida del tabellone in tutti gli stati , possiamo rimuoverli dal set di tessere e supporre che verranno piastrellati esattamente in questo modo. Poiché sappiamo che esiste una possibile piastrellatura valida, abbiamo almeno una piastrellatura possibile del tabellone, se la formula è soddisfacente. Sebbene non vi sia alcuna garanzia che vengano piastrellate in questo modo, esiste una garanzia che la piastrella verrà forzata.(1 ⋆( 1 ⋆ , 1 ⋆ )
Nota: se non sei soddisfatto di questo, o sei confuso dalla differenza di "essere in grado di affiancare" rispetto a "essere costretto a affiancare", puoi semplicemente posizionare un muro attorno al gadget , allo stesso modo creiamo un muro basso per il gadget clausola.3 × 23 × 2
Questo gadget non è chiuso, perché non è necessario (ma puoi farlo se lo desideri). Non è necessario, perché ha una configurazione fattibile, che possiamo rimuovere dal set di tessere. Sebbene sia possibile eseguire una configurazione diversa, ciò non influisce sulla soddisfacibilità del problema.
Le seguenti tessere devono essere piastrellate (quindi possono essere rimosse dal set di tessere): ( 1 ⋆ , 1 ⋆ )
Le piastrelle seguenti possono essere piastrellate (quindi possono essere rimosse dal set di piastrelle): ( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3 ⋆ )
Se scegli di chiudere questo gadget con un muro, anche sarà garantito per essere coperto.( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3 ⋆ )
Nuove porte Wire e Clause
A causa dei problemi di scorrimento e dello svuotamento del set di piastrelle, dobbiamo ridisegnare un po 'il filo.
Un modo per risolvere il problema del flusso è quello di trasformare il filo in un circuito, anziché semplici stati sinistra-destra; cioè, sarebbe circolare invece di una linea, e quindi se la parte superiore del cerchio viene spinta a destra, la parte inferiore verrà spinta a sinistra. Questo risolve il problema del flusso.
Seguendo questo percorso, possiamo cambiare il gate del cavo e della clausola per risolvere entrambi i problemi.
Prenotazione eFTF
Cerchiamo di introdurre due nuovi valori universali, e . Questi due valori sono universali; valori effettivi nella griglia, come i valori quadrati e (poiché per convenzione, abbiamo riservato come blocco predefinito per i muri), o qualunque cosa tu scelga. Rappresentano rispettivamente vero e falso.FTF3 1231
Riserviamo forzatamente le tessere , , , come segue; illustrazione in basso, descrizione da sinistra a destra:( T , T )( T, F)( T, T)( F, F)
- Usiamo lo stesso schema di forzare qualsiasi tessera , usando come . Ogni e qui sono unici per questo gadget.T 1 ⋆ 2( 1 ⋆ , 1 ⋆ )T1 ⋆3 ⋆2 ⋆3 ⋆
- Usiamo lo stesso schema di forzare qualsiasi tessera , usando come Ogni e qui sono unici per questo gadget.F 1 ⋆ 2 ⋆ 3 ⋆( 1 ⋆ , 1 ⋆ )F1 ⋆2 ⋆3 ⋆
- Usiamo lo stesso schema del forzare una tessera , usando come al centro e usando nelle altre posizioni dell'up-tack. Ciò forza a tessere. e sono in grado di tessere con , quindi le rimuoviamo dal set di tessere. Ogni e qui sono unici per questo gadget.F 1 ⋆ T ( F , T ) 2 ⋆ 3 ⋆ T 2 ⋆ 3 ⋆( 1 ⋆ , 1 ⋆ )F1 ⋆T( F, T)2 ⋆3 ⋆T2 ⋆3 ⋆
Filo
Ogni filo inizierà e finirà con un valore, chiamiamolo , che è unico per il filo. Per ogni clausola a cui partecipa il filo, il filo avrà due valori di filo, e , che sono univoci per ciascun filo e parteciperanno alla stessa clausola. Illustrazione sotto, con descrizione da sinistra a destra.x ⋆ x ′ ⋆A ⋆x ⋆X'⋆
- Un filo che partecipa a una clausola. Il filo ha un'altezza di e ha una lunghezza di , dove è il numero di clausole a cui partecipa il filo. Il filo è imbottito da due quadrati a sinistra e due a destra. Ovviamente è circondato da un muro su tutti i lati, indicato dal contorno blu. Nota che è unico per questo filo e verrà utilizzato solo nel filo e la clausola a cui partecipa.2 ∗ p + 3 p A ⋆22 ∗ p + 3pA ⋆1 ⋆
Di seguito sono illustrati i due stati, descrizioni da sinistra a destra.
- Un filo che partecipa a una clausola, nel vero stato. Il filo è considerato vero, quando i quadrati sono accoppiati con i quadrati e i quadrati sono accoppiati con i quadrati . È considerato falso nell'altro stato, in cui la piastrellatura è invertita. Nota come viene forzata la piastrellatura una volta selezionata la tessera : sono già forzate in precedenza, quindi il resto delle tessere deve essere orizzontale.T x ′ ⋆ F A ⋆ ( Tx ⋆TX'⋆FA ⋆( T, F)
- Lo stesso filo nel falso stato.
Quando partecipano a più clausole, ci sono più valore e , una coppia per ogni clausola a cui partecipa il filo. Si alternano in cima e in fondo, così come il quadrati e matematici che separano ciascuna coppia .x ′ ⋆ T F x ⋆ , x ′ ⋆x ⋆X'⋆TFx ⋆ , x'⋆
I due stati corrispondenti.
Questo gadget è chiuso , quindi non esiste un "problema di flusso".
Nota come in entrambi gli stati, raccogliamo le seguenti tessere, indipendentemente dallo stato: , , .( A ⋆ , T ) ( A ⋆ , F )( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)
Ci sono comunque alcune tessere di cui non siamo sicuri; in uno stato possiamo rimuovere dal set di tessere, mentre in un altro stato possiamo rimuovere dal set di tessere, quindi quali tessere possiamo effettivamente rimuovere? La risposta è: il gate della clausola ha lo stesso problema, ma con il set di tessere opposto. Raccoglierà sempre le tessere rimanenti, opposte e non raccolte, come vedremo nella prossima sezione. Poiché ciascuno di questi è associato a un gate di clausole, saremo in grado di rimuoverli entrambi.( 1 ⋆ , F ) , ( 1 ′ ⋆ , T ) , ( 2 ⋆ , F( 1 ⋆ , T) , ( 1'⋆ , F) , ( 2 ⋆ , T) , ( 2'⋆ , F) . . .( 1 ⋆ , F) , ( 1'⋆,T),(2⋆,F),(2′⋆,T)...
Clausola
Successivamente creeremo la prima iterazione del nuovo gate della clausola. Consiste in un gadget , racchiuso da muri. All'interno del gadget, posizioniamo una in alto al centro e due quadrati matematica negli angoli inferiori; uno in basso a sinistra e uno in basso a destra. I quadrati rimanenti saranno valori che rappresentano le variabili filo di tre fili diversi. Chiamiamoli e . La sarà forzata ad accoppiarsi con una delle variabili wire e le restanti variabili wire si accoppieranno con i valoriIllustrazioni in basso, descrizioni da sinistra a destra.F T a ⋆ , b ⋆ , c ⋆ F2×3FTa⋆,b⋆,c⋆FT
- A sinistra: la configurazione per la prima iterazione della nuova clausola-gate.
- Destra I tre possibili stati della piastrellatura .F
Questi tre stati portano a tre possibili massimali. Illustrazione sotto, descrizioni da sinistra a destra.
- A sinistra, in alto : piastrella a sinistra, a sinistra, in basso: piastrellatura dei quadrati rimanenti.F
- Al centro, in alto : piastrellato a destra, al centro, in basso: piastrellatura dei quadrati rimanenti.F
- A destra, in alto : piastrellato in basso, a destra, in basso: piastrellatura dei quadrati rimanenti.F
Poiché la sarà accoppiata con una delle variabili wire nella clausola , quella variabile wire non può più essere accoppiata con nel wire ; forzando così il filo a vero. Al contrario, le rimanenti variabili di filo che si tessono con saranno costrette a tessere con all'interno dei loro fili. Sono esattamente gli stessi vincoli di una clausola .F T F 1 -in- 3 - S A TFF TF1-in-3-SAT
Nota, e sono variabili variabili, ma ciascuna potrebbe riferirsi a un o un variabile filo; l'utilizzo di una sta essenzialmente negando la variabile filo.c ⋆ x ⋆ x ′ ⋆ x ′ ⋆un'⋆,b⋆,c⋆x⋆x′⋆x′⋆
Un'aggiunta: per adempiere all'obbligo di sapere quali tessere possono essere rimosse dal set di tessere, dobbiamo "raddoppiare e contrapporre" la clausola. Ciò che intendo con questo è creare un altro gadget , con variabili aggiuntive che rappresentano le negazioni di e . Chiamiamoli e . Questi devono essere i valori di filo variabile negati di e . Questo gadget è diverso, in quanto avrà una al centro e due3 a ⋆ , b ⋆ , c ⋆ a ′ ⋆ , b ′ ⋆ , c ′ ⋆ a ⋆ , b ⋆ , c3×23a ⋆ , b ⋆,c ⋆a′⋆,b′⋆ ,c′⋆a ⋆ , b ⋆ , 3 × 2 T F ( T , x ⋆ ) , ( T , x ′ ⋆ ) , ( F ,c ⋆3 × 2TF valori agli angoli; esattamente l'opposto del gadget della clausola descritto finora. "Raddoppiando" la clausola in questo modo, aggiungiamo nuovamente gli stessi vincoli del gadget sopra descritto. Tuttavia, scarichiamo anche tutte le combinazioni di dal set di tessere, per ogni variabile (e quindi per e , perché dopo tutto sono variabili wire). Di seguito, descrizioni da sinistra a destra. a ⋆ , b ⋆ , c ⋆(T, x ⋆ ) ,(T,x'⋆ ),(F, x ⋆ ) ,(F,x'⋆ )a ⋆ , b ⋆ ,c ⋆
- Una clausola "doppia e contrapposta". La sezione inferiore è la clausola sopra descritta; la sezione superiore è la clausola contrapositiva appena descritta. La nuova clausola ha esattamente gli stessi vincoli logici; è il contrappunto della clausola inferiore. Insieme, questi gadget combinati e il filo scaricano tutte le combinazioni di dal set di tessere, per ogni variabile filo che partecipa alla clausola.(T, x ⋆ ) ,(F, x ⋆ ) ,(T,x'⋆ ),(F,x'⋆ )
- La linea blu al centro della figura più a sinistra è lì per facilità di visione; in realtà può essere rimosso senza consentire altri stati.
Quindi, facciamo un esempio, per mostrare che tutte le tessere vengono scaricate come promesso. Di seguito, descrizione da sinistra a destra.
- Figura di un filo che partecipa a una singola clausola; viene scelto uno stato per la clausola. Qui stiamo usando , mentre e rappresentano altri valori-filo in questa clausola.a ⋆1 ⋆ = b ⋆a ⋆b ⋆
- Per lo stato determinato nella clausola, il valore è costretto ad essere accoppiato con la vicina .T1 ⋆T
- Questo fa sì che il filo sia forzato ad essere valutato in modo vero (si può dire come la variabile positiva del filo sia forzata ad accoppiarsi con la , e la variabile negativa sia forzata ad accoppiarsi con la , come spiegato sopra ).TF
- Questo impone nella clausola contrapositiva (la sezione superiore della clausola) di essere accoppiata con all'interno della clausola. Ora, se guardi il filo, ogni tessera all'interno del filo è garantita per essere scaricata: o scaricata nel filo stesso o nel corrispondente gadget-clausola. In questo stato, abbiamo le tessere, , , , , , e .T ( A ⋆ , A ⋆ )(1'⋆T( A ⋆ , A ⋆ )( A ⋆ , F ) ( 1 ⋆( A ⋆ , T)( A ⋆ , F)( 1 ⋆ , F ) ( 1 ′ ⋆ , F ) ( 1 ′ ⋆ , T( 1 ⋆ , T)( 1 ⋆ , F)( 1'⋆ , F)( 1'⋆ , T)
Provando l'altro stato, otteniamo l'illustrazione seguente, descrizione da sinistra a destra.
- La clausola si trova nell'altro stato, piastrellando in uno dei due modi.( 1 ⋆ , T
- Pertanto, è forzato sul filo,( 1 ⋆ , F
- Condurre il resto del filo a tessere corrispondentemente e valutare il filo come falso.
- Infine, nella sezione contrapposta / superiore del gadget-clausola, deve affiancare, perché è preso nella filo. In questo stato, abbiamo le tessere, , , , , , e . Queste sono le stesse tessere scaricate dell'altro stato .( 1 ′ ⋆ , T ) ( A ⋆ , A ⋆ ) ( A ⋆ , T ) ( A ⋆( 1'⋆ , F)( 1'⋆ , T)(A ⋆ , A ⋆ )( A ⋆ , T)( 1 ⋆ , T ) ( 1 ⋆ ,( A ⋆ , F)( 1 ⋆ , T)( 1 ′ ⋆ , F ) ( 1 ′ ⋆ , T )( 1 ⋆ , F)( 1'⋆ , F)( 1'⋆ , T)
Quindi in entrambi gli stati, scarichiamo le stesse tessere. Pertanto, il filo e la clausola scaricano insieme con successo piastrelle specifiche se esiste un compito soddisfacente.
Questo gadget è chiuso , quindi non ci saranno problemi di flusso.
Il gadget-clausola insieme al gadget di filo garantisce sempre di scaricare gli stessi valori di coppie di tessere , e quindi possiamo scaricarli anche se non sappiamo in che modo affiancherà.
Ora tutti i nostri gadget soddisfano i criteri.
Formulazione
Nella nostra formulazione finale, creiamo tre file di gadget, ciascuna separata da una parete orizzontale.
- Sul fondo, posizioniamo i gadget forzanti, che sono alti due tessere. Abbiamo bisogno di un gadget per forzare il blocco di costruzione, e per le combinazioni di e . Posizioniamo i gadget forzanti direttamente uno accanto all'altro.FTF
- Nella riga centrale, posizioniamo i gadget di filo, orizzontalmente, che sono alti due tessere. I gadget di filo devono essere separati l'uno dall'altro con una parete verticale.
- Nella riga superiore posizioniamo i gadget della clausola, che sono alti quattro caselle. I gadget della clausola devono essere separati l'uno dall'altro da un muro verticale.
Seguono illustrazioni, descrizioni sopra ogni figura. Fai clic sulle immagini per la risoluzione massima. Il codice sorgente per riprodurre / generare le immagini è elencato nella parte inferiore della pagina.
Usando la formula come esempio, abbiamo un soddisfacente soluzione come testimone.( ¬ x 1 , x 2 , x 3 , ¬ x 4 )Φ ( x ) = ( x1, ¬ x2, x3) ∧ ( x2, ¬x3,x4) ∧ ( x1,x2, ¬x4)( ¬ x1,x2,x3, ¬x4)
Innanzitutto iniziamo con le pareti orizzontali che separano le file di gadget. Mostriamo i quadrati e le coppie che sono costrette a tessere all'interno delle pareti.
Successivamente, mostriamo i gadget. Il contorno blu rappresenta i bordi dei gadget; tratteggiato in blu per i forzanti-gadget, poiché non saranno circondati da muri. Nota che la linea al centro del gadget della clausola non è circondata da un muro; è lì per facilità di visione; l'eliminazione della linea non consente ulteriori stati nella clausola, come spiegato sopra, ma mostriamo la linea blu per questa dimostrazione. Nota: che usiamo i nomi quadrati per dare ai numeri una leggibilità semantica, quando applicabile. Ogni nome rappresenta un valore numerico.
Qui riempiamo le pareti verticali.
Qui compiliamo la soluzione del testimone; cioè questa è la soluzione di piastrellatura se si utilizza la soluzione SAT per generarla.
Successivamente affianchiamo l'area di riempimento; il resto del tabellone, grande quanto necessario, per quanto sia necessario per tessere finora. Quindi scarichiamo le coppie rimanenti nel set di tessere. Le linee tratteggiate qui rappresentano una piastrellatura valida ma non forzata; potrebbe esserci un altro modo di affiancarli. Qui mostriamo l'angolo in basso a sinistra.n
Qui riempiamo i quadrati rimanenti con una piastrellatura banale valida.
Qui mostriamo l'angolo in basso a destra della griglia.
Qui mostriamo l'angolo in alto a destra della griglia. Nota come le tessere verticali non si adattano più; quindi, se necessario, affianchiamo la fila superiore in orizzontale.
E infine l'angolo in alto a sinistra.
La generazione dell'intera scheda di gioco in una sola volta tramite TeX non riesce con errori di memoria esaurita da pdflatex, quindi se vuoi vederlo, dovresti generare clip e correggerle insieme. Assicurati di controllare il visualizzatore di notebook .
Fonti TikZ
Generatore di giochi:
graphtex.py
Converte TeX in svg, usando pdflatex, pdfcairo (poppler) e rsvg-convert (libsvg)
dominosa.py
Contiene la logica di conversione, la verifica della soluzione di gioco e la logica di disegno
dominosa_demo.py
Una demo eseguibile che genera le immagini utilizzate nella risposta sopra. Scarica le immagini nella directory corrente-lavoro.
dominosa_demo.ipynb
Una demo di ipython che genera le immagini utilizzate nella risposta sopra.