Ми любимо наші дивні загадки, ми, британці


16

У кількох британських газетах є гра, відома як Hidato . Він дещо схожий на судоку , хоч замість того, щоб мати 1-9 у рядку та блоці, йдеться про розміщення чисел таким чином, що вони з'єднуються у порядку від 01усієї до найвищої, тому всі вони торкаються горизонтально, діагонально чи вертикально .

Вхідні дані містять кілька рядків, розділених між собою \n, містять блоки, розділені пробілом, які можна вважати шириною двох символів. Кожен блок буде числом, порожнім пробілом, який потрібно заповнити (позначається --), або стіною, яка не може мати цифри в ( XX).

Вихід повинен відповідати наданому, хоча й порожнім блокам із цифрами. Зауважте, що не може бути унікального або навіть існування рішення - деякі можуть отримати декілька через свою неоднозначність, подібно до судоку, а деякі можуть бути буквально нерозв’язними, і в цьому випадку вам слід дати фальсифікацію , але ви Можна припустити, що входи форматовані нижче.

Використовуйте стандартний заголовок Language: XX bytes. Щасливого гольфу!

Приклади

Входи 01 XX 03, 01 -- 04, 01 --і т.д. все повинні повернути що - то falsey .

Вхід:

01 -- --
-- XX 05

Вихід:

01 03 04
02 XX 05

Вхід:

-- 33 35 -- -- XX XX XX    
-- -- 24 22 -- XX XX XX      
-- -- -- 21 -- -- XX XX
-- 26 -- 13 40 11 XX XX
27 -- -- -- 09 -- 01 XX
XX XX -- -- 18 -- -- XX
XX XX XX XX -- 07 -- --
XX XX XX XX XX XX 05 --

Вихід:

32 33 35 36 37 XX XX XX
31 34 24 22 38 XX XX XX
30 25 23 21 12 39 XX XX
29 26 20 13 40 11 XX XX
27 28 14 19 09 10 01 XX
XX XX 15 16 18 08 02 XX
XX XX XX XX 17 07 06 03
XX XX XX XX XX XX 05 04

Вхід:

XX XX XX XX -- 53 XX XX XX XX
XX XX XX XX -- -- XX XX XX XX
XX XX 56 -- -- -- 30 -- XX XX
XX XX -- -- -- -- -- -- XX XX
XX -- -- 20 22 -- -- -- -- XX
XX 13 -- 23 47 -- 41 -- 34 XX
-- -- 11 18 -- -- -- 42 35 37
-- -- -- -- 05 03 01 -- -- --
XX XX XX XX -- -- XX XX XX XX
XX XX XX XX 07 -- XX XX XX XX

Вихід:

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

Переконуючись, що я розумію: Давши сітку з деякими клітинами, що не можуть проходити, знайти гамільтонів шлях, який відповідає попередньо заповненим клітинам?
Геобіц

@AmiRuse Нічого собі Це виглядає хитро. (Звичайно, це походить від людини, яка ненавидить редагування фотографій.) Як би приємно знати когось іншого, хто має логотип VG як їх логотип. : O
kirbyfan64sos

Чи можемо ми побачити рішення на прикладі? Також буде корисним більше прикладів.
Кейд

Блискуче :). Пізніше ви також можете випробувати генератор
Beta Decay

3
Чи можна спростити метод введення? Можливо, використовуйте 2D масив цілих чисел і маєте -1бути стіною та 0бути порожнім? Це полегшило б зосередитись на справжній задачі головоломки, і тоді немає складності вкладення чисел із нулями чи розбіжкою рядків.
mbomb007

Відповіді:


1

JavaScript (Node.js) , 482 байти

Це жорстоке рішення, воно починається з 01та перевіряє кожну сусідню комірку, перевіряючи наявність порожніх комірок ( --) або потрібного номера та слідуючи шляху до завершення чи неможливості. Якщо потрібне число існує і не є сусідом, це скорочення цього рішення. Для найбільшої сітки потрібно кілька секунд.

Це, мабуть, не особливо цікаво, але я подумав, що спробую зробити своє рішення, перш ніж переглянути відповіді, пов'язані з Кодексом Розетти, і мені сподобалося вирішити трохи складніше завдання!

Знаходить усі рішення, коли їх існує багато . Тіло - це функція, яка приймає двовимірний масив, і колонтитул обробляє вхід у потрібний формат, а також повертає результат у потрібний формат. Раді надати більше інформації (і менш гольову реалізацію, якщо є інтерес).

f=a=>{F=(D,n,j)=>[Z=[].concat(...D),z=Z.indexOf(j),z>-1&&[x=z%w,y=z/w|0],z>-1&&[[x-1,y-1],[x,y-1],[x+1,y-1],[x-1,y],[x+1,y],[x-1,y+1],[x,y+1],[x+1,y+1]]][n];C=q=>q.map(Q=>Q.slice());w=a[0][L='length'];l=F(a,0).filter(c=>c!='XX')[L];R=[];r=(s,d)=>{let n=`0${+s+1}`.slice(-2);N=F(d,2,n);n>l?R.push(C(d)):~F(d,1,s)?(p=F(d,3,s),p.filter(P=>P==N+'')[L]?r(n,C(d)):!~F(d,1,n)?p.map(I=>{[x,y]=I,(x<0||x>w-1||y<0||y>d[L]-1)||d[y][x]=='--'&&(D=C(d),r(D[y][x]=n,D))}):0):0};r('01',a);return R}

Спробуйте в Інтернеті!

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