Побудуйте розв'язувальник фрі-клітин


54

У грі Freecell вам покладено завдання скласти чотири фундаментні палі в костюмі від туза до короля, на макеті, де ви будуєте низ в чергуванні кольорів. Однак ви можете створювати лише одну карту за один раз, тому вам надається чотири "вільних комірки", кожна з яких може містити одну карту, щоб допомогти вам перемістити цілі послідовності. Ідея полягає в тому, що ви вплітаєте окремі картки з вільних комірок і з них, як потрібно, щоб допомогти вам вирішити гру.

Ваше завдання - створити програму, яка вирішить ці ігри в найменші можливі кроки.

Ваша програма прийме як вхід послідовність із 52 карт у наступному форматі:

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

Які будуть розглядатися в початковому макеті в такому порядку:

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

І поверніть список рухів, щоб вирішити гру. Кожен хід буде у такому форматі:

  • Число, що представляє номер стопки ( 1наскрізь 8) або вільну клітинку ( AдоD ), що представляє собою вихідну купу.
  • Ще одне число або літера, що представляє цільову купу або вільну клітинку, або Fдля основи цього костюма.

Вихід буде виглядати приблизно так:

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

Після того, як картка поміщена у фундамент, її неможливо вийняти. Оскільки одночасно переміщується лише одна картка, для переміщення послідовності з 3 карт потрібно 5 ходів, а послідовність з 5 карт вимагає 9 ходів.

Якщо гра нерозв’язна, ваша програма повинна вказати як таку. Однак ваша програма повинна вміти вирішувати будь-яку вирішувану гру.

Вашу програму оцінюватимуть за 32 768 угод, знайденими в оригінальній програмі Microsoft FreeCell. Для того, щоб бути дійсною, ваша програма повинна успішно вирішувати кожну угоду, крім угоди №11982 , яка є нерозв’язною. Ваш рахунок буде загальною кількістю кроків, необхідних для вирішення цих 32 767 угод, причому коротший код є тай-брейком.


Файл із усіма колодами у форматі, який вимагається вищевказаною специфікацією, можна завантажити тут (файл 5,00 МБ): https://github.com/joezeng/pcg-se-files/raw/master/freecell_decks


1
Тепер мені просто потрібно запустити генератор випадкових чисел, який вони використовували для створення цих 32 768 ігор. : S
Joe Z.

3

1
Це хороший момент. Як би ви вирішили справу, коли, скажімо, дві картки одного кольору та кількості (наприклад, 7C та 7S) знаходяться у вільних клітинках? Тоді якщо ви перейдете з "C" на чорну 8, це може бути будь-яка з цих двох карт.
Джо З.

2
Можливо, ви зможете отримати відповіді, знявши обмеження, що всі вирішальні угоди повинні вирішуватися поданням. Потім оцінюйте на основі кількості укладених угод, а потім за найменшими рухами.
mbomb007

1
чи можуть картки бути 0-індексованими?
тускіоми

Відповіді:


22

C 64 643 байти, Оцінка: ~ 6,5 мільйона

Наступний фрагмент стека (надано Mego) видає весь код у вигляді одного окремого файлу C:

Завантажте оригінальне джерело тут . Скористайтеся GCC та запустіть makeпотім, використовуючи вказівки у readme.

Моє форматування погано (всі різні файли знаходяться в одному кодовому блоці), і це могло б бути в гольфі більше (12 к байт тхо). Будь-яка допомога буде любити!

Частина коду не моя. Я використовував його з джерела, не захищеного авторським правом. Однак я встановив, що метод введення / виведення є вирішальним завданням (тривале завдання, оскільки я жахливий на C (5 годин). Мені також довелося переписати велику частину коду і налагодити все. Величезне спасибі моєму татові за те, що він допомагав і був гумовою качкою (і вказував на мої помилки в управлінні пам’яттю), а також усім, хто в ТНБ, хто мав справу з моїми розлюченими злодіями щодо segfault та C.


Ви можете скористатися цим способом, щоб подолати обмеження довжини відповіді та мати весь код у відповіді, а не потребувати зовнішнього завантаження.
Mego

@ Мего, я маю на увазі, але це є в декількох файлах
Крістофер

Поєднувати декілька файлів С в один.
Мего

Ось фрагмент стека, який показує код, об'єднаний в один файл.
Mego

@mego Ви можете це відредагувати? На мобільному
Крістофер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.