ABC 솔버처럼 쉬움


11

Easy End ABC는 "End View"라고도하며 글자 주위에 빈 격자가있는 퍼즐입니다. 각 문자 중 정확히 하나가 모든 행과 열에 있도록 그리드를 부분적으로 채워야합니다. 또한 행 (또는 열) 끝에있는 문자는 해당 방향에서 해당 행 (또는 열)에 표시되는 첫 번째 문자 여야합니다. 이 코드 골프의 목표는 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 : 그렇습니다. 테두리에는 사용 된 모든 문자가 포함됩니다.
Deusovi

답변:


1

PHP, 1111 바이트

줄 바꿈을 제거하는 바이트 빼기

온라인 버전 6의 길이로 테스트 케이스에서만 작동

짧은 해결 방법

모든 순열을하다

순열로 2 개의 배열 채우기 $ x $ y

각 행에 대해 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;}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.