Dễ dàng như Bộ giải ABC


11

Easy As ABC, còn được gọi là "End View", là một câu đố trong đó bạn được cung cấp một lưới trống với các chữ cái xung quanh nó; bạn phải điền một phần vào lưới sao cho chính xác một trong mỗi chữ cái ở mỗi hàng và cột; Ngoài ra, các chữ cái ở cuối một hàng (hoặc cột) phải là chữ cái đầu tiên hiển thị trong hàng đó (hoặc cột) từ hướng đó. Mục tiêu của bạn trong môn đánh gôn này sẽ là giải một câu đố Easy As ABC.

Ví dụ, đây là một câu đố Easy As ABC từ MIT Mystery Hunt năm nay bằng cách sử dụng các chữ cái MIC:

câu đố

Giải pháp là:

giải pháp

(Xin lỗi về các hiện vật trên Cs; tôi đã cố gắng chỉnh sửa các thông tin không liên quan từ phần còn lại của câu đố.)

Tôi / O

Đầu vào sẽ là một chuỗi các chuỗi hoặc một chuỗi có thể có dấu phân cách. Nó sẽ bắt đầu ở góc trên cùng bên trái và đi theo chiều kim đồng hồ. Chẳng hạn, câu đố trên có thể là đầu vào như thế này:

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

Đầu ra phải là lưới được giải, có hoặc không có viền. Nó có thể là một mảng ký tự, mảng chuỗi hoặc bất kỳ định dạng thuận tiện nào khác. Ký tự "trống" tương tự phải được chấp nhận làm đầu vào và hiển thị dưới dạng đầu ra, nhưng ký tự trống đó có thể là bất cứ thứ gì. Nếu chúng là các chuỗi đơn, cả đầu vào và đầu ra phải có cùng một dấu phân cách (giữa các mặt cho đầu vào và các hàng cho đầu ra) hoặc không có dấu phân cách nào cả.

Đối với các câu đố không thể giải được, bạn phải xuất ra một cái gì đó không thể nhầm lẫn cho một giải pháp. Bạn có thể cho rằng không có câu đố nào có nhiều hơn một giải pháp.

Bạn phải cho phép bất kỳ số lượng chữ cái và bất kỳ lưới kích thước; tất cả các chữ cái được sử dụng sẽ xuất hiện trong đường viền của lưới.

Đây là : như thường lệ, đoạn mã ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm

"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
để rõ ràng: toàn bộ bảng chữ cái được đưa ra trên biên giới? (tức là sẽ không có chữ nào xuất hiện ở biên giới?)
quintopia

@quintopia: Vâng. Đường viền sẽ chứa mọi chữ cái được sử dụng.
Deusovi

Câu trả lời:


1

PHP, 1111 byte

trừ đi byte loại bỏ dòng mới

Các phiên bản trực tuyến chỉ làm việc với các testcases với chiều dài 6

cách giải quyết ngắn

làm cho tất cả hoán vị

điền 2 mảng với hoán vị $ x $ y

thay đổi giữa hai hàm quá lâu cho đến khi chỉ tồn tại 1 giải pháp trong dòng foreach mảng x

chức năng i: tìm giao điểm trong lưới và thả hoán vị

Hàm c: kiểm tra các colums trong mỗi mảng của các charcters duy nhất và loại bỏ các hoán vị trong các dòng khác cho mảng $ x và $ 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;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.