sfondo
Nel gioco di Nim , i giocatori si alternano rimuovendo "pietre" da "pile": ad ogni turno, un giocatore deve rimuovere tra una e tutte le pietre da una singola pila. Lo scopo di Nim è prendere l'ultima pietra o, nella variante sbagliata, forzare il tuo avversario a farlo - tuttavia, risulta che le strategie sono quasi identiche.
Nim è un divertente gioco da bar. Puoi usare fiammiferi o monete per le "pietre" e le "pile" sono generalmente disposte in una linea. Di seguito è una configurazione classica con pile di 1, 3, 5 e 7:
Se non hai mai giocato a Nim prima, potresti provare a giocarci prima di provare questa sfida. Ecco una versione chiamata "Pearls Before Swine" .
Strategia
La strategia ottimale in Nim è abbastanza complicata da far perdere la maggior parte dei laici a un esperto, ma semplice da descrivere con l' aritmetica binaria .
Fare operazioni XOR binarie mentali, tuttavia, è difficile, quindi per fortuna c'è un modo equivalente di visualizzare la strategia corretta che è più facile da implementare in tempo reale, anche quando è ubriaco.
Ci sono solo tre passaggi:
- Raggruppa mentalmente le "pietre" in ogni riga in sottogruppi le cui dimensioni sono potenze di 2, a partire dalla dimensione più grande possibile: 8, 4, 2 e 1 sono sufficienti per la maggior parte dei giochi.
- Cerca di abbinare ogni gruppo con un gemello in un'altra linea, in modo che ogni gruppo abbia una coppia.
- Se ciò non è possibile, rimuovi le "pietre" non abbinate da un'unica riga (ciò sarà sempre possibile - vedi il link di Wikipedia per il motivo) in modo che il passaggio 2. diventi possibile.
Oppure, ha detto in un altro modo: "Rimuovi alcune pietre da una singola pila in modo tale che se poi raggruppi le pile in poteri di 2, tutti i gruppi possono essere accoppiati con un gruppo in un'altra pila." Con l'avvertenza che non puoi dividere i poteri più grandi di 2 in quelli più piccoli - ad esempio, non puoi raggruppare una linea con 8 pietre in due gruppi di 4.
Ad esempio, ecco come visualizzeresti la scheda sopra:
Questa tavola è perfettamente bilanciata, quindi vorresti che il tuo avversario si muovesse per primo.
La sfida
Dato un elenco di numeri interi positivi che rappresentano le dimensioni di "pile" di Nim, restituisce una visualizzazione in testo semplice della scheda Nim vista da un esperto.
Ciò che costituisce una visualizzazione valida è spiegato meglio con l'esempio, ma è necessario:
- Assegna un carattere distinto a ciascun "sottogruppo di potenza di 2" e alla sua coppia (i sottogruppi non accoppiati non si qualificano) e usa quel carattere per rappresentare le "pietre" sia nel sottogruppo che nella coppia.
- Rappresentare qualsiasi "pietre" spaiati (vale a dire, quelli un esperto avrebbe rimosso durante la riproduzione normale - non Misere - Nim) utilizzando un trattino:
-.
Esistono diversi modi per ottenere una visualizzazione valida e tutti sono validi. Analizziamo alcuni casi di test:
Casi test
Ingresso: 1, 3, 5, 7
Possibile uscita 1:
A
BBA
CCCCD
CCCCBBD
Opzionalmente puoi includere spazi tra i caratteri, nonché linee vuote tra le righe:
Possibile uscita 2:
A
B B A
C C C C D
C C C C B B D
Ingresso: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
L'ordine e la scelta dei personaggi può essere quello che ti piace:
Possibile uscita 1:
G
E E
E E G
C C C C
C C C C F
B B B B D D
B B B B D D F
H H I - - - - -
A A A A A A A A I
A A A A A A A A H H
Anche i simboli Unicode sono ok:
Possibile uscita 2:
◎
◈ ◈
◈ ◈ ◎
△ △ △ △
△ △ △ △ ◉
◐ ◐ ◐ ◐ ◀ ◀
◐ ◐ ◐ ◐ ◀ ◀ ◉
▽ ▽ ◒ - - - - -
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ◒
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ▽ ▽
Ingresso: 7
Dalle regole segue che ogni "pila singola" deve essere completamente rimossa.
Possibile uscita 1:
-------
Possibile uscita 2:
- - - - - - -
Ingresso: 5, 5
Uscita possibile:
A A A A B
A A A A B
Regole aggiuntive
- Questo è il golf del codice con regole standard. Il codice più corto vince.
- L'input è flessibile e può essere preso in qualunque forma di elenco sia conveniente per te.
- Anche l'output è flessibile, come illustrano gli esempi sopra. Saranno consentite le variazioni più ragionevoli. Chiedi se non sei sicuro di qualcosa.
["H","EE","EEH","CCCC","CCCCI","DDDDFF","DDDDFFI","AAAAAAAA","AAAAAAAA-","----------"]
AAAABBBBrealtà non è valido, e ABBnon lo è - ma rende l'output meno leggibile, quindi penso che solo la riduzione esplicita all'interno di una riga sia la migliore.

