ABC Çözücü kadar kolay


11

Kolay "Uç Görünüm" olarak da bilinen ABC, etrafındaki harflerle boş bir ızgara verildiği bir bilmecedir; ızgarayı kısmen doldurmanız gerekir, böylece her harften tam olarak her satır ve sütunda yer alır; ek olarak, bir satırın (veya sütunun) sonundaki harfler o satırda (veya sütunda) o yönden görünen ilk harf olmalıdır. Bu kod golf hedefiniz ABC olarak kolay bir bulmaca çözmek olacaktır.

Örneğin, bu yılın MIT Mystery Hunt'tan MIC harflerini kullanarak bir Easy As ABC bulmacası :

bulmaca

Çözüm şudur:

çözüm

(Cs üzerindeki eserler için üzgünüm; ilgisiz bilgileri bulmacanın geri kalanından düzenlemeye çalıştım.)

I / O

Girdi, bir dizgi dizisi veya muhtemelen sınırlayıcılı bir dize olacaktır. Sol üst köşeden başlayacak ve saat yönünde gidecektir. Örneğin, yukarıdaki bulmaca şu şekilde girilebilir:

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

Çıktı, kenarlıklı veya kenarlıksız çözülmüş ızgara olmalıdır. Karakter dizisi, dize dizisi veya başka bir uygun biçim olabilir. Aynı "boş" karakter giriş olarak kabul edilmeli ve çıktı olarak görüntülenmelidir, ancak bu boş karakter herhangi bir şey olabilir. Bunlar tek dizgiyse, hem giriş hem de çıkış aynı ayırıcıya (giriş kenarları ile çıktı satırları arasında) sahip olmalı veya hiç ayırıcı olmamalıdır.

Çözülemez bulmacalar için, bir çözüm için yanlış olmayan bir şey çıkarmalısınız. Hiçbir bulmacanın birden fazla çözümü olmadığını varsayabilirsiniz.

İstediğiniz sayıda harfe ve boyut ızgarasına izin vermelisiniz; kullanılan tüm harfler ızgaranın kenarlığında görünür.

Bu : her zamanki gibi en kısa kod kazanır!

Test Durumları

"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
açıklamak için: tüm alfabe sınırda verilir? (yani sınırda olmayan bir mektup görünmeyecek mi?)
quintopia

@quintopia: Evet. Kenarlık kullanılan her harfi içerecektir.
Deusovi

Yanıtlar:


1

PHP, 1111 Bayt

eksi Baytlar yeni satırları kaldırıyor

Online versiyonu 6 uzunluğunda testcases çalışır

kısa çözüm

tüm permütasyonları yap

2 diziyi $ x $ y permütasyonlarıyla doldur

x dizisi foreach satırında yalnızca 1 çözüm bulunana kadar iki işlev arasında geçiş yapın

fonksiyon i: ızgaradaki kesişimleri bulma ve bırakma permütasyonları

fonksiyon c: her benzersiz karakter dizisindeki sütunları kontrol edin ve diğer satırlardaki permütasyonları $ x ve $ y dizisi için kaldırın

$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;}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.