Кросворди!


14

Кріс, прихильний кросворд, має набір алгоритму для того, в якому порядку він їх вирішує.

введіть тут опис зображення

Ми будемо використовувати вищезазначене зображення в якості керівництва.

  1. Кріс завжди починається з першої поперечної підказки, в цьому випадку 1 Поперек. Кріс - здібний ентузіаст кросвордів, тому передбачається, що він завжди буде знати відповідь на підказку, над якою працює.
  2. Після того, як Кріс заповнить підказку, він перевірить всі підказки, що прилягають до тих, які він завершив (у першому випадку 1 Вниз, 2 Вниз та 3 Вниз), а потім заповнить підказку з найменшим числом. Якщо немає сусідніх підказок, він перейде до кроку 3.
  3. Якщо підказка така, що наступне число (як описано в кроці 3) має як поперечний, так і низхідний, він спочатку заповнить поперечний ключ (100% визначеність, це межує з OCD!)
  4. Якщо немає сусідніх підказок, він перейде до наступної наявної підказки, наступної за кількістю (впоперек або вниз)
  5. Повторіть з кроку 2, поки всі докази не будуть завершені.

І ось це зводиться до вас, дорогі кодери. Ви отримали завдання створити код, який, надаючи шаблон кросворду, може надати вихід, що описує порядок підказки на основі алгоритму Кріса для його вирішення.

Код прийме введення шаблону кросворду у вигляді .білого квадрата та а# чорного квадрата.

Приклад :

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

Введення може бути через: a) файл, прочитаний із подання кросворду, або b) рядковий введення кожного рядка кросворду, а потім \nдругий\n зазначає EOF.

І тоді він визначить метод, за допомогою якого Кріс вирішив би його за описаним вище алгоритмом.

Вихідні дані повинні бути у форматі серії інструкцій, розділених комами, у формі 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)
доктор belisarius,

@belisarius Зображення відповідає четвертому тестовому випадку. Отже, п'ята підказка, яку слід заповнити, буде 9 Поперек, або, як би ви сказали, 9 год. :) Оскільки єдині суміжні підказки після завершення четвертої підказки - це 9 та 10 Попереду, Кріс буде змушений спочатку заповнити найнижчу підказку. ...
WallyWest

Чи розглядаються байти лише на основі коду, який дає правильний вихід. IOW, на вас накладається штраф, включає в себе простір імен C # + клас + Main і тому подібне для того, щоб він був компільований або обґрунтовано припускати, що якщо я напишу його в C # або подібному, потрібна мінімальна кількість коду?
ChiefTwoPencils

1
@BobbyDigital Ну, це код-гольф ... Я би сподівався, що якби ти планував писати це на C #, ти спробуєш не використовувати занадто багато зовнішніх ... Вам доведеться порахувати їх, боюся .. .
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

@BobbyDigital Я не мав на увазі неповаги. C # - дуже багатослівна мова ... це, мабуть, не найкраще для кодового гольфу. Код-боулінг або популярні змагання тут ... але Code Golf - це зовсім новий чайник з рибою.
WallyWest

+1 також тут ... Напевно, одна з довших записів GolfScript, яку я бачив ... Чудово зроблено.
WallyWest

1
@BobbyDigital: Саме завдання досить цікаве. Спробуйте спробувати мову, якою ви знайомі. Думаю, вам сподобається загадка так само, як і мені - вивчіть всі різні підходи до вирішення головоломки. Це само по собі весело, навіть якщо ви не досягнете такої низької кількості персонажів, як ця відповідь.
Говард

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]])

Безумовно

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,"#"]}]]

Тест-справи

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.
Говард

Ви ToStringдвічі визначили стенографію
доктор Белісаріус

Говард, тепер я розумію вашу думку. Спасибі. Виправить пізніше.
DavidC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.