像ABC解算器一样容易


11

Easy As ABC,也称为“ End View”,是一个难题,您将得到一个带有字母的空白网格;您必须部分填写表格,以便每个字母和每行中的每个字母正好位于其中;此外,行(或列)末尾的字母必须是从该方向在该行(或列)中可见的第一个字母。您在此代码高尔夫球中的目标将是解决“简单作为ABC”难题。

例如,这是今年MIT Mystery Hunt的Easy As ABC拼图使用字母MIC:

难题

解决方案是:

解

(很抱歉,C上的工件;我试图从其余的难题中删除不相关的信息。)

输入输出

输入将是字符串数组或可能带有定界符的字符串。它将从左上角开始,然后顺时针旋转。例如,上面的难题可以这样输入:

".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:是的。边框将包含所有使用的字母。
Deusovi '16

Answers:


1

PHP,1111字节

减去字节,删除换行符

在线版本仅与测试用例可与6长度

短期解决方法

进行所有排列

用排列$ x $ y填充2个数组

在两个函数之间切换,直到在x数组foreach行中仅存在1个解

功能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;}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.