ABCソルバーとして簡単


11

「エンドビュー」としても知られるEasy As ABCは、周りに文字が入った空のグリッドが表示されるパズルです。各文字の正確に1文字がすべての行と列に含まれるように、グリッドを部分的に埋める必要があります。さらに、行(または列)の最後の文字は、その行(または列)でその方向から見える最初の文字でなければなりません。このコードゴルフの目標は、Easy As ABCパズルを解くことです。

たとえば、MICの文字を使用した今年のMITミステリーハントの Easy As ABCパズルは次のとおりです。

パズル

解決策は次のとおりです。

解決

(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

@quintopia:はい。境界線には、使用済みのすべての文字が含まれます。
デウソビ

回答:


1

PHP、1111バイト

改行を削除するバイトを引いた

オンライン版は、 6の長さとテストケースでのみ動作します

短い回避策

すべての順列を作る

2つの配列を置換$ x $ yで埋めます

x配列のforeach行に1つの解のみが存在するまで、2つの関数間の変更

関数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;}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.