Кроссворд Принуждения!


14

Крис, загадочный наркоман кроссвордов, имеет алгоритм задания порядка, в котором он их решает.

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

Мы будем использовать вышеуказанное изображение в качестве руководства.

  1. Крис всегда начинает с первой подсказки, в данном случае 1 через. Крис - способный кроссворд, поэтому предполагается, что он всегда будет знать ответ на ключ, над которым он работает.
  2. Как только Крис завершит разгадку, он проверит все подсказки, примыкающие к тем, которые он завершил (в первом случае: 1 Вниз, 2 Вниз и 3 Вниз), а затем завершит разгадку с наименьшим числом. Если нет смежных улик, он перейдет к шагу 3.
  3. Если подсказка такова, что у следующего числа (как описано в шаге 3) есть как подсказка, так и подсказка, он сначала завершит подсказку (100% уверенность, это граничит с ОКР!)
  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 Изображение соответствует четвертому контрольному примеру. Таким образом, пятый ключ, который должен быть заполнен, будет 9 через, или, как вы бы сказали, 9Н :) Поскольку единственные смежные подсказки после того, как четвертый ключ завершен, это 9 и 10 через, Крис будет вынужден сначала заполнить самый низкий ключ. ...
WallyWest

Рассматриваются ли байты только на основе кода, который выдает правильный вывод. Итак, вы оштрафованы на включения, пространство имен C # + класс + Main и т. П., Чтобы сделать его компилируемым, или разумно предположить, что, если я напишу его в C # или аналогичном, потребуется минимальный объем кода?
ChiefTwoPencils

1
@BobbyDigital Ну, это код-гольф ... Я надеюсь, что если бы вы планировали написать его на C #, вы бы постарались не использовать слишком много внешних элементов ... Боюсь, вам придется их посчитать .. .
Уолли Уэст

1
@WallWest Я думаю, что ваш третий пример опускает 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

(Похоже, в порядке упорядочения шагов решения проблемы. Я смотрю на это.)

Golfed

Функция 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", " 12А "," 13А "," 14D "," 15А "," 16А "," 17А "}


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.