Bulmaca Zorlamaları!


14

Şifreli bir bulmaca bağımlısı olan Chris, bunları çözme sırası için belirlenmiş bir algoritmaya sahiptir.

resim açıklamasını buraya girin

Yukarıdaki resmi bir rehber olarak kullanacağız.

  1. Chris her zaman ilk ipucu ile başlar, bu durumda 1 Across. Chris yetenekli bir bulmaca tutkunu, bu yüzden üzerinde çalıştığı ipucunun cevabını her zaman bileceği varsayılıyor.
  2. Chris bir ipucunu tamamladığında, tamamladığı ipuçlarına (ilk durumda, 1 Aşağı, 2 Aşağı ve 3 Aşağı) bitişik tüm ipuçlarını kontrol eder ve ardından ipucunu en düşük numarayla tamamlar. Bitişik bir ipucu yoksa, 3. adıma gider.
  3. İpucu, bir sonraki sayının (Adım 3'te açıklandığı gibi) hem bir hem de bir aşağı ipucuna sahip olacağı şekilde ise, ilk önce ipucunu tamamlayacaktır (% 100 kesinlik, OKB'de bu sınırlar!)
  4. Bitişik bir ipucu yoksa, bir sonraki mevcut ipucuna (karşısına veya aşağıya) gidecektir.
  5. Tüm ipuçları tamamlanana kadar Adım 2'den itibaren tekrarlayın.

Ve burası size geliyor, sevgili kodlayıcılar. Bir bulmaca şablonu sağlandığında, Chris'in çözümü için algoritmaya dayalı ipuçlarının sırasını açıklayan çıktı sağlayabilecek bir kod oluşturmakla görevlendirildiniz.

Kod, .beyaz bir kareyi #temsil eden ve siyah bir kareyi temsil eden bir bulmaca şablonunun girişini kabul edecektir .

Örnek :

.....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....

Girdi şu şekillerde olabilir: a) bulmacanın temsilini okuyan bir dosya veya b) bulmacanın her satırının satır girişi ve ardından \nikinci bir \nEOF göstermesi ile.

Ve sonra Chris'in tanımladığı yukarıdaki algoritmaya göre bunu çözeceği yöntemi belirleyecek.

Çıkış şeklinde talimatları virgülle ayrılmış bir dizi biçimde olmalıdır n(A|D), nardından ipucu sayıdır Aüzerinden veya için Daşağı için.

Dolayısıyla yukarıdaki örnekte (hem görüntüden hem de bir ve aynı olan örnek şablondan) çıktı:

1A,1D,2D,3D,9A,10A,4D,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

En kısa kod kazanır ...

Test yapmak

Gönderinizde kodu, bir bayt sayısını ve .ve #biçiminde temsil edilen dört test durumundan birini ve bu girişten üretilen çıktıyı sağlamalısınız . Dört test durumu vardır, aşağıdaki üç örnek ve yukarıdaki örnek şablon.

Örnek test örnekleri:

Test Durumu 1

.....#
.#.#.#
...#..
.#.#.#
.....#
##.#..

Çıktı: 1A,1D,2D,3D,4A,5A,6A,7A

Test Durumu 2

.....#..
.#.##..#
.#....#.
...##.#.
.####...
......##

Çıktı: 1A,1D,2D,5A,4D,4A,3D,3A,7A,8A,6D,9A

Test Durumu 3

.........#
#.#.#.#.#.
....#...#.
#...#.#.#.
..###.#.#.
.#....#...
.#####...#
.....###..

Çıktı: 1A,2D,3D,4D,5D,7A,8A,9A,10A,11A,11D,12A,13A,6D,14D,15A,16A,17A

Test Durumu 4

.....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....

Çıktı: 1A,1D,2D,3D,9A,10A,4D,4A,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

İyi şanslar!


Sadece emin olmak için: Örnek resminizde, hangi sayı zorunlu olarak doldurulacak beşinci ipucudur? (1H, 1V, 2V,
3V'den

@belisarius Görüntü dördüncü test senaryosuna karşılık gelir. Doldurulması gereken beş ipucu 9 Across ya da 9H :) olacaktır. Dördüncü ipucu tamamlandıktan sonra sadece bitişik ipuçları 9 ve 10'dur, Chris önce en düşük ipucunu doldurmaya zorlanacak ...
WallyWest

Baytlar yalnızca doğru çıktıyı üreten koda dayanarak değerlendirilir. IOW, derlenebilir, C # ad alanı + sınıf + Main ve benzerleri hakkında cezalandırılıyor musunuz veya C # veya benzeri bir şekilde yazarsam, bu minimum miktarda kodun gerekli olacağını varsaymak mantıklı mıdır?
ChiefTwoPencils

1
@BobbyDigital Eh, bu kod golf ... Umarım C # ile yazmayı planlasaydınız, çok fazla harici kullanmamaya çalışırsınız ... Onları saymak zorundasınız ki korkarım .. .
WallyWest

1
@WallyWest Üçüncü örneğinizin 17Asonunda bir atlamak olduğunu düşünüyorum . Ayrıca dördüncü 4Asağdan sonra 4D.
Howard

Yanıtlar:


5

GolfScript, 154 karakter

:^,,{.^=46<{;-1}*)}%[.^n?)/zip[0]*]{1,%{,1>},}%:H"AD"1/]zip{~`{1$0=H{{0=}/}%.&$?)\+[\]}+/}%(2/\{0=)[\~\]}$+[]{1${1=1$&},.!{;1$1<}*1<:F~~@|@F-\1$}do;;]','*

Giriş STDIN'de sağlanmalıdır. Örnekler aşağıdaki sonuçları verir ( çevrimiçi kontrol edin ):

1A,1D,2D,3D,4A,5A,6A,7A

1A,1D,2D,5A,4D,4A,3D,3A,7A,8A,6D,9A

1A,2D,3D,4D,5D,7A,8D,9A,10A,11A,11D,12A,13A,6D,14D,15A,16A,17A

1A,1D,2D,3D,9A,10A,4D,4A,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

+1 Oldukça özlü. O nasıl çalışır?
DavidC

Vay canına, zamanımı bile harcamamam gerektiğini netleştirdiğin için teşekkürler. Açıkçası daha uygun bir dilin üstesinden gelmek zorunda kalacaksınız. votes++
ChiefTwoPencils

@BobbyDigital Saygısızlık demek istemedim. C # çok ayrıntılı bir dildir ... muhtemelen kod golf için en iyisi değildir. Kod bowling veya popülerlik yarışmaları için ... ama Code Golf yepyeni bir balık su ısıtıcısı.
WallyWest

Burada da + 1'leyin ... Muhtemelen gördüğüm daha uzun GolfScript girişlerinden biri ... İyi iş çıkardın.
WallyWest

1
@BobbyDigital: Görevin kendisi oldukça ilginç. Bildiğiniz bir dilde deneyin. Yaptığım kadar yapbozun tadını çıkaracağınızı düşünüyorum - bulmacayı çözmek için tüm farklı yaklaşımları araştırın. Bu cevap kadar düşük bir karakter sayısına ulaşmasanız bile eğlencelidir.
Howard

3

Mathematica 806 477

(Çözüm adımlarının sıralamasında bir aksaklık var gibi görünüyor. Buna bakıyorum.)

golfed

İşlev q, bulmaca çözümlerinin sırasını bulur.

i = Dimensions; v = MemberQ; u = Position; y = ToString; k = Select;
q@t_ :=
 (g@p_ := Characters@StringSplit[p, "\n"];
  w = g@t;
  a[{r_, c_}, z_] := (c != i[z][[2]]) \[And] 
    v[u[z, "."], {r, c + 1}] \[And] ((c == 1) \[Or] 
      v[u[z, "#"], {r, c - 1}]);
  b@z_ := k[u[z, "."], a[#, z] &];
  d[{r_, c_}, z_] := (r != i[z][[2]]) \[And] 
    v[u[z, "."], {r + 1, c}] \[And] ((r == 1) \[Or] 
      v[u[z, "#"], {r - 1, c}]);
  e@z_ := k[u[z, "."], d[#, z] &];
  Cases[Flatten[{
       If[v[b[w], #[[1]]], y[#[[2]]] <> "A"],
       If[v[e[w], #[[1]]], y[#[[2]]] <> "D"]} & /@ (MapIndexed[List, 
        b[w] \[Union] e[w]] /. {{r_, c_}, {i_}} :> ({r, c} -> i))], 
   Except[Null]])

Ungolfed

q[t7_]:=
Module[{d,acrossSquareQ,acrossSquares,downSquareQ,downSquares,m,numberedCells},
(*w=g[t7];*)
g[p2_]:=Characters@StringSplit[p2,"\n"];
w=g[t7];
acrossSquareQ[{r_,c_},z_]:=(c!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r,c+1}] \[And]((c==1)\[Or]MemberQ[Position[z,"#"],{r,c-1}]);
acrossSquares[z_]:=Select[Position[z,"."],acrossSquareQ[#,z]&];
downSquareQ[{r_,c_},z_]:=(r!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r+1,c}] \[And]((r==1)\[Or]MemberQ[Position[z,"#"],{r-1,c}]);
downSquares[z_]:=Select[Position[z,"."],downSquareQ[#,z]&];
numberedCells[z_]:=acrossSquares[z]\[Union]downSquares[z];
m=MapIndexed[List,numberedCells[w]]/.{{r_?IntegerQ,c_?IntegerQ},{i_?IntegerQ}}:> ({r,c}-> i);
Cases[Flatten[{
If[MemberQ[acrossSquares[w],#[[1]]],ToString[#[[2]]]<>"A"],
If[MemberQ[downSquares[w],#[[1]]],ToString[#[[2]]]<>"D"]}&/@m],Except[Null]]]

boardçapraz bulmaca görüntüler. Kod, karakter sayısına dahil edilmez. qBuradan birçok alt fonksiyon ödünç alınmıştır.

board[p_]:=
Module[{q,g,w,downSquareQ,downSquares,acrossSquareQ,acrossSquares,numberedCells,m},
downSquareQ[{r_,c_},z_]:=(r!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r+1,c}] \[And]((r==1)\[Or]MemberQ[Position[z,"#"],{r-1,c}]);
downSquares[z_]:=Select[Position[z,"."],downSquareQ[#,z]&];
acrossSquareQ[{r_,c_},z_]:=(c!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r,c+1}] \[And]((c==1)\[Or]MemberQ[Position[z,"#"],{r,c-1}]);
acrossSquares[z_]:=Select[Position[z,"."],acrossSquareQ[#,z]&];
numberedCells[z_]:=acrossSquares[z]\[Union]downSquares[z];
g[p2_]:=Characters@StringSplit[p2,"\n"];
w=g[p];
m=MapIndexed[List,numberedCells[w]]/.{{r_?IntegerQ,c_?IntegerQ},{i_?IntegerQ}}:> ({r,c}-> i);
Grid[ReplacePart[w,m],Dividers->All,Background->{None,None,(#-> Black)&/@Position[w,"#"]}]]

testcases

1

t1=".....#
.#.#.#
...#..
.#.#.#
.....#
##.#..";
board[t1]
q[t1]

t1

{"1A", "1D", "2D", "3D", "4A", "5A", "6A", "7A"}


2

t2=".....#..
.#.##..#
.#....#.
...##.#.
.####...
......##";

board[t2]
q[t2]

t2

{"1A", "1D", "2D", "3A", "3D", "4A", "4D", "5A", "6D", "7A", "8A", "9A"}


3

t3=".........#
#.#.#.#.#.
....#...#.
#...#.#.#.
..###.#.#.
.#....#...
.#####...#
.....###..";

board[t3]

q[t3]

t3

{"1A", "2D", "3D", "4D", "5D", "6D", "7A", "8D", "9A", "10A", "11A", "11D", " 12A "," 13A "," 14D "," 15A "," 16A "," 17A "}


4

t4=".....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....";

board[t4]


q[t4]

t4

{"1A", "1D", "2D", "3D", "4A", "4D", "5D", "6D", "7D", "8D", "9A", "10A", " 11A "," 12A "," 13A "," 14D "," 15A "," 15D "," 16A "," 17A "," 18D "," 19D "," 20A "," 21D "," 22D " , "23A", "24A", "25D", "26D", "27A", "28A", "29A", "30A", "31A"}


Kodunuzla ilgili bir sorununuz olduğunu düşünüyorum. Örneğin 2. örnekte henüz bir ipucu bulunmadığından 3Ahemen sonra olmamalıdır 2D. Ayrıca diğer çözümler de bu etkiyi göstermektedir.
Howard

Howard, ne demek istediğini anlamıyorum. "4. Bitişik bir ipucu yoksa, bir sonraki sayıya (mevcut veya aşağı) gelecek ipucuna gidecektir", 3A'nın 2D'den sonra olabileceği anlaşılıyor.
DavidC

Ancak örneğin 5Abir ipucu vardır ve bu nedenle tercih edilmelidir 3A.
Howard

ToStringİki kez bir steno tanımladınız
Dr.Belisarius

Howard, Şimdi anlıyorum. Teşekkürler. Daha sonra düzeltir.
DavidC
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.