คำไขว้บังคับ!


14

คริสผู้เสพติดปริศนาอักษรไขว้ที่มีความลับมีอัลกอริทึมที่กำหนดไว้สำหรับลำดับที่เขาแก้ไขได้

ป้อนคำอธิบายรูปภาพที่นี่

เราจะใช้ภาพด้านบนเป็นแนวทาง

  1. คริสมักจะเริ่มต้นด้วยเบาะแสแรกในกรณีนี้ 1 ข้าม คริสเป็นคนที่มีความสามารถในการไขว้กันดังนั้นจึงคิดว่าเขาจะรู้คำตอบสำหรับเบาะแสที่เขากำลังทำอยู่เสมอ
  2. เมื่อคริสทำเบาะแสได้สำเร็จเขาจะตรวจสอบเบาะแสทั้งหมดที่อยู่ติดกับที่เขาทำเสร็จแล้ว (ในกรณีแรกคือ 1 ลง, 2 ลงและ 3 ลง) จากนั้นกรอกข้อมูลให้ครบด้วยจำนวนที่น้อยที่สุด หากไม่มีเงื่อนงำที่อยู่ติดกันเขาจะไปที่ขั้นตอนที่ 3
  3. หากเบาะแสเป็นเช่นนั้นหมายเลขถัดไป (ตามที่อธิบายไว้ในขั้นตอนที่ 3) มีทั้งเงื่อนงำข้ามและเงื่อนงำลงเขาจะทำตามข้ามเงื่อนงำก่อน (แน่นอน 100% ขอบนี้บน OCD!)
  4. หากไม่มีเบาะแสที่อยู่ติดกันเขาจะไปที่เบาะแสต่อไปที่มีอยู่ถัดไปเป็นตัวเลข (ข้ามหรือลง)
  5. ทำซ้ำจากขั้นตอนที่ 2 จนกระทั่งเบาะแสทั้งหมดเสร็จสมบูรณ์

และนี่คือที่มาของคุณ coders ที่รัก คุณได้รับมอบหมายให้สร้างรหัสที่สามารถให้เทมเพลตไขว้เพื่อให้ได้ผลลัพธ์ที่อธิบายลำดับของเบาะแสตามอัลกอริทึมของ Chris ในการแก้ปัญหา

รหัสจะยอมรับการป้อนข้อมูลของแม่แบบปริศนาคำไขว้ในรูปแบบของการเป็น.ตัวแทนของสี่เหลี่ยมสีขาวและเป็น#ตัวแทนของสี่เหลี่ยมสีดำ

ตัวอย่าง :

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

อินพุตสามารถผ่าน: a) ไฟล์อ่านการเป็นตัวแทนของคำไขว้หรือ b) โดยการป้อนบรรทัดของแต่ละบรรทัดของคำไขว้ตามด้วย\nด้วยวินาที\nบ่งบอก EOF

จากนั้นจะกำหนดวิธีการที่ Chris จะแก้ปัญหาตามขั้นตอนวิธีด้านบนที่เขาอธิบายไว้

เอาต์พุตจะต้องอยู่ในรูปแบบของชุดคำสั่งที่คั่นด้วยเครื่องหมายจุลภาคในรูปแบบของn(A|D)ที่ซึ่งnเป็นหมายเลขเบาะแสตามมาด้วยAสำหรับข้ามหรือDลง

ดังนั้นในตัวอย่างด้านบน (ทั้งจากภาพและแม่แบบตัวอย่างซึ่งเป็นหนึ่งและเหมือนกัน) ผลลัพธ์จะเป็น:

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

รหัสที่สั้นที่สุดชนะ ...

การทดสอบ

คุณต้องให้รหัสการส่งจำนวนไบต์และหนึ่งในสี่กรณีทดสอบที่แสดงในรูปแบบ.และ#รูปแบบตลอดจนเอาต์พุตที่สร้างจากอินพุตนี้ มีสี่กรณีทดสอบสามกรณีด้านล่างและแม่แบบตัวอย่างด้านบน

ตัวอย่างกรณีทดสอบ:

กรณีทดสอบ 1

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

เอาท์พุท: 1A,1D,2D,3D,4A,5A,6A,7A

กรณีทดสอบ 2

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

เอาท์พุท: 1A,1D,2D,5A,4D,4A,3D,3A,7A,8A,6D,9A

กรณีทดสอบ 3

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

เอาท์พุท: 1A,2D,3D,4D,5D,7A,8A,9A,10A,11A,11D,12A,13A,6D,14D,15A,16A,17A

กรณีทดสอบ 4

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

เอาท์พุท: 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

โชคดี!


เพื่อให้แน่ใจว่า: ในภาพตัวอย่างของคุณหมายเลขใดเป็นเบาะแสที่ห้าที่ถูกเติมเต็ม (หลังจาก 1H, 1V, 2V, 3V)
Dr. belisarius

@belisarius ภาพสอดคล้องกับกรณีทดสอบที่สี่ ดังนั้นเบาะแสที่ห้าที่จะเติมจะเป็น 9 Across หรือตามที่คุณวางไว้ 9H :) เนื่องจากเบาะแสที่ติดกันหลังจากที่เบาะแสที่สี่เสร็จสมบูรณ์คือ 9 และ 10 ข้ามคริสจะถูกบังคับให้กรอกเบาะแสที่ต่ำที่สุดก่อน ...
WallyWest

มีการพิจารณาไบต์บนพื้นฐานของรหัสที่สร้างผลลัพธ์ที่ถูกต้องเท่านั้น IOW คุณถูกลงโทษในการรวม, C # namespace + class + Main และชอบเพื่อให้มันคอมไพล์หรือมันมีเหตุผลที่จะสมมติว่าถ้าฉันเขียนใน C # หรือคล้ายกันรหัสจำนวนน้อยที่สุดที่จะต้อง?
ChiefTwoPencils

1
@ BobDigital ดีนี่คือ code-golf ... ฉันหวังว่าถ้าคุณวางแผนที่จะเขียนมันใน C # คุณจะพยายามไม่ใช้ externals มากเกินไป ... คุณต้องนับพวกเขาฉันกลัว .. .
WallyWest

1
@WallyWest ฉันคิดว่าตัวอย่างที่สามของคุณตัดออก17Aไปในตอนท้าย นอกจากนี้ยังมีสี่ขวาหลังจาก4A 4D
โฮเวิร์ด

คำตอบ:


5

GolfScript, 154 ตัวอักษร

:^,,{.^=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;;]','*

ต้องป้อนข้อมูลใน STDIN ตัวอย่างให้ผลลัพธ์ต่อไปนี้ (ตรวจสอบออนไลน์ ):

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 รวบยอดอย่างน่าทึ่ง มันทำงานยังไง?
DavidC

ว้าวขอบคุณที่ทำให้ชัดเจนว่าฉันไม่ควรเสียเวลา ชัดเจนว่าจะต้องได้รับบนภาษาที่เหมาะสมกว่า votes++
ChiefTwoPencils

@ BobDigital ฉันหมายถึงไม่ดูหมิ่น C # เป็นภาษา verbose มาก ... มันอาจจะไม่ดีที่สุดสำหรับ code golf Code-bowling หรือการแข่งขันที่ได้รับความนิยมที่นี่ ... แต่ Code Golf เป็นกาต้มน้ำใหม่สำหรับปลา
WallyWest

+1 ที่นี่ด้วย ... อาจเป็นหนึ่งในรายการ GolfScript ที่ยาวกว่าที่ฉันเคยเห็น ... ทำได้ดีมาก
WallyWest

1
@ BobDigital: ตัวงานเองนั้นค่อนข้างน่าสนใจ ลองภาษาที่คุณคุ้นเคย ฉันคิดว่าคุณจะสนุกกับเกมไขปริศนามากเท่าที่ฉันทำ - สำรวจวิธีการต่าง ๆ ทั้งหมดเพื่อจัดการกับปริศนา มันเป็นเรื่องสนุกด้วยตัวเองแม้ว่าคุณจะไม่ได้ตัวละครที่มีจำนวนน้อยเท่าคำตอบนี้
Howard

3

Mathematica 806 477

(ดูเหมือนจะมีข้อผิดพลาดในการสั่งซื้อขั้นตอนการแก้ปัญหาฉันกำลังมองหาสิ่งนี้อยู่)

แข็งแรงเล่นกอล์ฟ

ฟังก์ชั่นqค้นหาลำดับของการแก้ปัญหาไขว้

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แสดงปริศนาอักษรไขว้ รหัสไม่รวมอยู่ในจำนวนตัวอักษร qมีการยืมฟังก์ชั่นย่อยหลายอย่างจากที่นี่

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"}


ฉันคิดว่าคุณมีปัญหากับรหัสของคุณ เช่นในตัวอย่างที่ 2 3Aไม่ควรจะถูกหลังจาก2Dเพราะยังไม่มีเงื่อนงำ นอกจากนี้โซลูชันอื่น ๆ ยังแสดงผลนี้
โฮเวิร์ด

ฮาวเวิร์ดฉันไม่เข้าใจประเด็นของคุณ จาก "4. หากไม่มีเงื่อนงำที่อยู่ติดกันเขาจะไปที่เบาะแสต่อไปที่มีอยู่ถัดไปเป็นตัวเลข (ข้ามหรือลง)" ปรากฏว่า 3A อาจอยู่หลัง 2D
DavidC

แต่เช่นมีเงื่อนงำและดังนั้นจึงควรได้รับการสนับสนุนมากกว่า5A 3A
Howard

คุณได้กำหนดชวเลขToStringสองครั้ง
Dr. belisarius

ฮาวเวิร์ดฉันเข้าใจประเด็นของคุณแล้ว ขอบคุณ จะแก้ไขในภายหลัง
DavidC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.