Легко, як ABC Solver


11

Easy As ABC, також відомий як "Кінцевий вигляд", - це пазл, де вам дають порожню сітку з літерами навколо неї; ви повинні частково заповнити сітку так, щоб рівно по одній букві знаходився в кожному рядку та стовпці; крім того, букви в кінці рядка (або стовпця) повинні бути першими літерами, видимими в цьому рядку (або стовпці) з цього напрямку. Вашою метою в цьому гольф-коді буде вирішення головоломки Easy As ABC.

Наприклад, ось проста головоломка Easy As ABC із цьогорічного MITtery Hunt за допомогою букв MIC:

пазл

Рішення таке:

рішення

(Вибачте за артефакти на Cs; я намагався відредагувати невідповідну інформацію з решти головоломки.)

I / O

Введенням буде масив рядків або рядка, можливо, з роздільниками. Він розпочнеться у верхньому лівому куті та піде за годинниковою стрілкою. Наприклад, вищевказану головоломку можна ввести так:

".CMM.M|....IM|.....I|C.ICI."

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

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

Ви повинні дозволити будь-яку кількість літер та будь-яку сітку розміру; всі вживані літери з’являться на межі сітки.

Це : як завжди, найкоротший виграш коду!

Випробування

"T.AA..|.T.TSS|..TST.|A...SS"
"R.RU..|B.B..B|.UR.UB|UR..B."
"N...NK|E.NK.K|..KK..|....EK"
"CA..DBD|.B..CC.|.D.DEB.|DB.A..A"
"...DDEBE|DC..EBBD|BA..ABF.|E..FECDE"

2
щоб було зрозуміло: весь алфавіт вказаний на межі? (тобто не з’явиться лист, який не знаходиться на кордоні?)
квінтопія

@quintopia: Так. Кордон міститиме кожен використаний лист.
Деусови

Відповіді:


1

PHP, 1111 байт

мінус байти, видаляючи нові рядки

Інтернет - версія працює тільки з Testcases довжиною 6

коротке вирішення

зробити всі перестановки

заповніть 2 масиви перестановками $ x $ y

змінюватись між двома функціями настільки довго, поки існує лише 1 рішення в рядку foreach x масиву

функція i: знаходити перетини в сітці та переставляти падіння

функція c: перевірити стовпці в кожному масиві унікальних діаграм і видалити перестановки в інших рядках для масиву $ x і $ y

$p=[];p(array_pad(($s="str_split")(substr(count_chars($a=$argn,3),1,-1)),$l=(strlen($a)-3)/4," "));
$e=explode("|",$a);$e[3]=strrev($e[3]);$e[2]=strrev($e[2]);
$x=$y=array_fill(0,$l,$p);$g="preg_grep";$c="array_column";$o="join";
foreach($q=range(0,$l-1)as$i){
$e[0][$i]=="."?:$y[$i]=$g("#^\s*{$e[0][$i]}#",$y[$i]);
$e[2][$i]=="."?:$y[$i]=$g("#{$e[2][$i]}\s*$#",$y[$i]);
$e[3][$i]=="."?:$x[$i]=$g("#^\s*{$e[3][$i]}#",$x[$i]);
$e[1][$i]=="."?:$x[$i]=$g("#{$e[1][$i]}\s*$#",$x[$i]);}
for(;array_sum(($m="array_map")("count",$x))>$l;){
foreach($q as$i)foreach($q as$j){
$k=array_intersect($c($m($s,$x[$i]),$j),$c($m($s,$y[$j]),$i));
$y[$j]=$g("#^.{{$i}}(".$o("|",$k).")#",$y[$j]);
$x[$i]=$g("#^.{{$j}}(".$o("|",$k).")#",$x[$i]);
foreach(["x","y"]as$z){
$u=array_unique($c($m($s,${"$z"}[$i]),$j));
if(count($u)==1&&end($u)!=" "){$w=end($u);
foreach($q as$h){
if($i!=$h)${"$z"}[$h]=$g("#^.{{$j}}{$w}#",${"$z"}[$h],1);}}
}}}
echo$o("\n",$m($o,$x));
function p($c,$b=[]){global$p;
if(($c)){$n=[];while($c){
$e=array_pop($c);
p(($m="array_merge")($c,$n),$m($b,[$e]));
$n[]=$e;
}}else in_array($b=join($b),$p)?:$p[]=$b;}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.