Costruisci un risolutore di freecell con il minor numero di mosse


54

Nel gioco di Freecell, ti viene assegnato il compito di costruire quattro pile di basi in seme dall'asso al re, in un layout in cui costruisci verso il basso con colori alternati. Tuttavia, puoi costruire solo una carta alla volta, quindi ti vengono date quattro "celle libere" ciascuna delle quali può contenere una carta per aiutarti a spostare intere sequenze. L'idea è di tessere singole carte dentro e fuori dalle celle libere come richiesto per aiutarti a risolvere il gioco.

Il tuo compito è costruire un programma che risolva questi giochi con il minor numero di mosse possibili.

Il tuo programma prenderà come input una sequenza di 52 carte, nel seguente formato:

2S 9H 10C 6H 4H 7S 2D QD KD QC 10S AC ...

Che verrà trattato nel layout iniziale in questo ordine:

01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52

E restituisci un elenco di mosse per risolvere il gioco. Ogni mossa sarà in questo formato:

  • Un numero che rappresenta il numero di pila ( 1attraverso 8) o una cella libera ( Aa D), che rappresenta la pila di origine.
  • Un altro numero o lettera che rappresenta la pila di destinazione o la cella libera o Fper la fondazione di quel seme.

L'output sarà simile al seguente:

18 28 3A 8B 8C 85 B5 35 4F etc.

Una volta che una carta viene messa nella fondazione, non può essere rimossa. Poiché viene mossa una sola carta alla volta, per spostare una sequenza di 3 carte sono necessarie 5 mosse e una sequenza di 5 carte richiede 9 mosse.

Se un gioco è irrisolvibile, il programma dovrebbe indicare come tale. Tuttavia, il tuo programma deve essere in grado di risolvere qualsiasi gioco risolvibile.

Il tuo programma verrà valutato in base alle 32.768 offerte trovate nel programma Microsoft FreeCell originale. Per essere valido, il tuo programma deve risolvere con successo ogni affare tranne l' affare # 11.982 , che è irrisolvibile. Il tuo punteggio sarà il numero totale di mosse necessarie per risolvere queste 32.767 offerte, con un codice più corto che è un pareggio.


Un file con tutti i deck nel formato richiesto dalla specifica sopra è disponibile per il download qui (file 5.00 MB): https://github.com/joezeng/pcg-se-files/raw/master/freecell_decks


1
Ora ho solo bisogno di prendere il generatore di numeri casuali che hanno usato per generare quei 32.768 giochi. : S
Joe Z.


1
È un buon punto. Come affronteresti il ​​caso in cui, per esempio, due carte dello stesso colore e numero (come 7C e 7S) sono entrambe in celle libere? Quindi se passi da "C" a un 8 nero, potrebbe essere una di quelle due carte.
Joe Z.

2
È possibile che si ottengano alcune risposte rimuovendo la restrizione secondo cui tutti gli accordi risolvibili devono essere risolti dall'invio. Quindi, segna in base al numero di operazioni risolte, quindi con il minor numero di mosse.
mbomb007,

1
le carte possono essere indicizzate 0?
tuskiomi,

Risposte:


22

64.643 byte C, punteggio: ~ 6,5 milioni

Il seguente frammento di stack (per gentile concessione di Mego) genera tutto il codice come un singolo file C autonomo:

Scarica la fonte originale qui . Utilizzare GCC ed eseguire makequindi utilizzando le linee guida nel file Leggimi.

La mia formattazione è errata (tutti i diversi file sono in un blocco di codice) e questo potrebbe essere golfato di più (12k byte). Qualsiasi aiuto sarebbe amato!

Parte del codice non è mio. L'ho usato da una fonte non protetta da copyright. Tuttavia, ho corretto il metodo di input / output per far parte della sfida (un compito lungo poiché sono orribile a C (5 ore)). Ho anche dovuto riscrivere gran parte del codice ed eseguire il debug di tutto. Mille grazie a mio padre per l'aiuto e l'essere un'anatra di gomma (e per aver segnalato i miei errori di gestione della memoria) e per tutti quelli su TNB che hanno affrontato le mie rabbia infastidite su segfaults e C.


Si può essere in grado di utilizzare questo per aggirare la limitazione di lunghezza risposta e hanno tutto il codice all'interno della risposta, piuttosto che necessitano di una scarica esterna.
Mego

@Mego intendo sì, ma è in diversi file
Christopher

È facile combinare più file C in uno solo.
Mego

Ecco uno snippet di stack che mostra il codice combinato in un singolo file.
Mego

@mego puoi modificarlo in? Sul cellulare
Christopher,
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.