Facile come risolutore ABC


11

Easy As ABC, noto anche come "End View", è un puzzle in cui ti viene fornita una griglia vuota con lettere attorno; devi riempire parzialmente la griglia in modo che esattamente una di ogni lettera sia in ogni riga e colonna; inoltre, le lettere alla fine di una riga (o colonna) devono essere la prima lettera visibile in quella riga (o colonna) da quella direzione. Il tuo obiettivo in questo codice golf sarà risolvere un puzzle Easy As ABC.

Ad esempio, ecco un puzzle Easy As ABC del MIT Mystery Hunt di quest'anno usando le lettere MIC:

puzzle

La soluzione è:

soluzione

(Mi dispiace per i manufatti sulla Cs; ho provato a modificare le informazioni irrilevanti dal resto del puzzle.)

I / O

L'input sarà una matrice di stringhe o una stringa possibilmente con delimitatori. Inizierà nell'angolo in alto a sinistra e procederà in senso orario. Ad esempio, il puzzle sopra potrebbe essere inserito in questo modo:

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

L'output dovrebbe essere la griglia risolta, con o senza bordo. Può essere una matrice di caratteri, una matrice di stringhe o qualsiasi altro formato conveniente. Lo stesso carattere "vuoto" deve essere accettato come input e visualizzato come output, ma quel carattere vuoto può essere qualsiasi cosa. Se sono stringhe singole, sia l'input che l'output devono avere lo stesso separatore (tra i lati per l'input e le righe per l'output) o nessun separatore.

Per i puzzle irrisolvibili, è necessario produrre qualcosa che non sia scambiabile per una soluzione. Puoi presumere che nessun puzzle abbia più di una soluzione.

È necessario consentire qualsiasi numero di lettere e qualsiasi griglia di dimensioni; tutte le lettere usate appariranno sul bordo della griglia.

Questo è : come al solito, vince il codice più corto!

Casi 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"

2
per essere chiari: l'intero alfabeto è dato sul bordo? (cioè nessuna lettera apparirà che non si trova sul confine?)
quintopia,

@quintopia: Sì. Il bordo conterrà ogni lettera usata.
Deusovi,

Risposte:


1

PHP, 1111 byte

meno i byte che rimuovono le nuove righe

La versione online funziona solo con i Testcase con una lunghezza di 6

breve soluzione alternativa

fare tutte le permutazioni

riempire 2 matrici con le permutazioni $ x $ y

cambia tra due funzioni così a lungo fino a quando esiste solo 1 soluzione nella riga foreach di x array

funzione i: trova intersezioni nella griglia e rilascia permutazioni

funzione c: controlla le colonne in ogni array di caratteri univoci e rimuove le permutazioni nelle altre righe per l'array $ xe $ 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;}
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.