Этот вопрос основан на головоломке «Башни с номерами» (также известной как «Небоскребы»), в которую можно играть онлайн . Ваша цель - найти решение головоломки и определить подсказки - количество башен, видимых вдоль каждого ряда и столбца. Это код гольф, поэтому побеждает меньше байтов.
Как работает Towers
Решением головоломки Towers является латинский квадрат - n*n
сетка, в которой каждая строка и столбец содержит перестановку чисел, 1
проходящих через n
. Пример для n=5
:
4 3 5 2 1
5 4 1 3 2
1 5 2 4 3
2 1 3 5 4
3 2 4 1 5
Каждая строка и столбец помечены подсказкой на каждом конце, как:
2 3 1 4 5
v v v v v
2 > 4 3 5 2 1 < 3
1 > 5 4 1 3 2 < 4
2 > 1 5 2 4 3 < 3
3 > 2 1 3 5 4 < 2
3 > 3 2 4 1 5 < 1
^ ^ ^ ^ ^
2 2 2 2 1
Каждый ключ представляет собой число от 1
до , n
который говорит вам , сколько башен вы «видите» , глядя вдоль строки / столбца из этого направления, если эти номера рассматриваются как башни с этой высотой. Каждая башня блокирует более короткие башни позади нее. Другими словами, башни, которые вы можете видеть, - это те, которые выше, чем любая башня до них.
Например, давайте посмотрим на первый ряд.
2 > 4 3 5 2 1 < 3
Он имеет подсказку 2
слева, потому что вы можете увидеть 4
и 5
. В 4
преграждает 3
из поля зрения и 5
блокирует все остальное. Справа вы можете увидеть 3
башни: 1
, 2
и 5
.
Требования к программе
Напишите программу или функцию, которая принимает сетку чисел и выводит или печатает подсказки, двигаясь по часовой стрелке сверху слева.
вход
n*n
Latin-квадрат с 2<=n<=9
.
Формат гибкий. Вы можете использовать любую структуру данных, которая представляет собой сетку или список, содержащий цифры или цифры. Вам может потребоваться разделитель между строками или вообще без разделителя. Некоторые возможности - это список, список списков, матрица, разделенная токеном строка, например
43521 54132 15243 21354 32415,
или строка без пробелов.
Вы не даны n
как часть ввода.
Выход
Верните или распечатайте подсказки, начиная сверху слева и по часовой стрелке. Итак, сначала верхние подсказки читаются вправо, затем правые подсказки читаются вниз, затем нижние подсказки читаются влево, левые подсказки читаются вверх.
Это было бы 23145 34321 12222 33212
для предыдущего примера
2 3 1 4 5
v v v v v
2 > 4 3 5 2 1 < 3
1 > 5 4 1 3 2 < 4
2 > 1 5 2 4 3 < 3
3 > 2 1 3 5 4 < 2
3 > 3 2 4 1 5 < 1
^ ^ ^ ^ ^
2 2 2 2 1
Как и для ввода, вы можете использовать список, строку или любую упорядоченную структуру. Четыре «группы» могут быть разделены или нет, во вложенной или плоской структуре. Но формат должен быть одинаковым для каждой группы.
Пример тестовых случаев:
(Ваш формат ввода / вывода не должен быть таким же, как эти.)
>> [[1 2] [2 1]]
[2 1]
[1 2]
[2 1]
[1 2]
>> [[3 1 2] [2 3 1] [1 2 3]]
[1 2 2]
[2 2 1]
[1 2 3]
[3 2 1]
>> [[4 3 5 2 1] [5 4 1 3 2] [1 5 2 4 3] [2 1 3 5 4] [3 2 4 1 5]]
[2 3 1 4 5]
[3 4 3 2 1]
[1 2 2 2 2]
[3 3 2 1 2]
>> [[2 6 4 1 3 7 5 8 9] [7 2 9 6 8 3 1 4 5] [5 9 7 4 6 1 8 2 3] [6 1 8 5 7 2 9 3 4] [1 5 3 9 2 6 4 7 8] [3 7 5 2 4 8 6 9 1] [8 3 1 7 9 4 2 5 6] [9 4 2 8 1 5 3 6 7] [4 8 6 3 5 9 7 1 2]]
[4 2 2 3 3 3 3 2 1]
[1 3 3 2 2 2 2 3 3]
[4 3 2 1 2 3 3 2 2]
[3 1 2 4 3 3 2 2 5]
Для вашего удобства вот те же тесты в формате плоской строки.
>> 1221
21
12
21
12
>> 312231123
122
221
123
321
>> 4352154132152432135432415
23145
34321
12222
33212
>> 264137589729683145597461823618572934153926478375248691831794256942815367486359712
422333321
133222233
432123322
312433225
≢¨∪¨↓⌈\(⍉⍪⌽⍪⍉∘⌽∘⊖⍪⊖)