Facile comme solveur ABC

11

Easy As ABC, également connu sous le nom de "End View", est un casse-tête où vous obtenez une grille vide avec des lettres autour; vous devez remplir partiellement la grille de façon à ce qu’exactement une de chaque lettre soit dans chaque ligne et colonne; en outre, les lettres à la fin d'une ligne (ou colonne) doivent être la première lettre visible dans cette ligne (ou colonne) de cette direction. Votre objectif dans ce code de golf sera de résoudre un puzzle Easy As ABC.

Par exemple, voici un puzzle Easy As ABC du MIT Mystery Hunt de cette année utilisant les lettres MIC:

puzzle

La solution est:

Solution

(Désolé pour les artefacts sur les C; j'ai essayé de supprimer les informations non pertinentes du reste du puzzle.)

E / S

L'entrée sera un tableau de chaînes ou une chaîne éventuellement avec des délimiteurs. Il commencera dans le coin supérieur gauche et ira dans le sens des aiguilles d'une montre. Par exemple, le puzzle ci-dessus pourrait être saisi comme ceci:

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

La sortie doit être la grille résolue, avec ou sans bordure. Il peut s'agir d'un tableau de caractères, d'un tableau de chaînes ou de tout autre format pratique. Le même caractère "vide" doit être accepté en entrée et affiché en sortie, mais ce caractère vide peut être n'importe quoi. S'il s'agit de chaînes simples, l'entrée et la sortie doivent avoir le même séparateur (entre les côtés pour l'entrée et les lignes pour la sortie) ou pas de séparateur du tout.

Pour les puzzles insolubles, vous devez produire quelque chose qui ne peut pas être confondu avec une solution. Vous pouvez supposer qu'aucun puzzle n'a plus d'une solution.

Vous devez autoriser n'importe quel nombre de lettres et n'importe quelle grille de taille; toutes les lettres utilisées apparaîtront dans la bordure de la grille.

C'est le : comme d'habitude, le code le plus court gagne!

Cas de test

"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"
Deusovi
la source
2
pour être clair: l'alphabet entier est donné à la frontière? (c.-à-d. qu'aucune lettre n'apparaîtra à la frontière?)
quintopie
@quintopia: Oui. La bordure contiendra chaque lettre utilisée.
Deusovi

Réponses:

1

PHP, 1111 octets

moins les octets supprimant les sauts de ligne

La version en ligne ne fonctionne qu'avec les Testcases d'une longueur de 6

solution rapide

faire toutes les permutations

remplir 2 tableaux avec les permutations $ x $ y

changer entre deux fonctions si longtemps jusqu'à ce qu'une seule solution dans la ligne x pour chaque ligne existe

fonction i: trouver des intersections dans la grille et déposer des permutations

fonction c: vérifier les colonnes dans chaque tableau de caractères uniques et supprimer les permutations dans les autres lignes pour le tableau $ x et $ 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;}
Jörg Hülsermann
la source