ง่ายเหมือน ABC Solver


11

Easy As ABC หรือที่เรียกว่า "End View" เป็นปริศนาที่คุณจะได้รับกริดว่างเปล่าพร้อมตัวอักษรล้อมรอบ คุณต้องกรอกข้อมูลลงในตารางบางส่วนเพื่อให้ตัวอักษรหนึ่งตัวอยู่ในทุกแถวและคอลัมน์ นอกจากนี้ตัวอักษรที่ท้ายแถว (หรือคอลัมน์) จะต้องเป็นตัวอักษรตัวแรกที่มองเห็นได้ในแถวนั้น (หรือคอลัมน์) จากทิศทางนั้น เป้าหมายของคุณในกอล์ฟรหัสนี้คือการแก้ปริศนาตัวต่อ ABC อย่างง่าย

ตัวอย่างเช่นนี่คือปริศนาตัวต่อ ABC อย่างง่ายจาก MIT Mystery Hunt ในปีนี้โดยใช้ตัวอักษร MIC:

ปริศนา

ทางออกคือ:

วิธีการแก้

(ขออภัยเกี่ยวกับสิ่งประดิษฐ์ใน 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 ไบต์

ลบการลบบรรทัดใหม่ของไบต์

เวอร์ชั่นออนไลน์ใช้งานได้เฉพาะกับ Testcases มีความยาว 6

วิธีแก้ปัญหาสั้น ๆ

ทำการเรียงสับเปลี่ยนทั้งหมด

เติม 2 อาร์เรย์ด้วยวิธีเรียงสับเปลี่ยน $ x $ y

เปลี่ยนระหว่างสองฟังก์ชั่นจนกระทั่งมีเพียง 1 โซลูชันในแถว x แถวหน้าของแต่ละอัน

ฟังก์ชั่น i: ค้นหาจุดตัดในตารางและเรียงสับเปลี่ยน

ฟังก์ชั่น c: ตรวจสอบ colums ในแต่ละแถวของ charcters ที่ไม่ซ้ำกันและลบการเรียงสับเปลี่ยนในบรรทัดอื่นสำหรับอาร์เรย์ $ 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.