Esta pergunta é baseada no quebra-cabeça de posicionamento numérico Towers (também conhecido como Arranha-céus), que você pode jogar online . Seu objetivo é pegar uma solução para o quebra-cabeça e determinar as pistas - o número de torres visíveis ao longo de cada linha e coluna. Isso é código de golfe, e o menor número de bytes vence.
Como funciona a Towers
A solução para um quebra-Towers é um quadrado latino - uma n*n
grade em que cada linha e coluna contém uma permutação dos números 1
através n
. Um exemplo para 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
Cada linha e coluna é rotulada com uma pista em cada extremidade, como:
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
Cada pista é um número de 1
até n
que informa quantas torres você "vê" olhando ao longo da linha / coluna dessa direção, se os números forem tratados como torres com essa altura. Cada torre bloqueia torres mais curtas atrás dela. Em outras palavras, as torres que você pode ver são as mais altas do que qualquer torre antes delas.
Por exemplo, vamos olhar para a primeira linha.
2 > 4 3 5 2 1 < 3
Tem uma pista da 2
esquerda, porque você pode ver o 4
e o 5
. O 4
bloqueia a 3
visão e 5
bloqueia tudo o resto. Da direita, você pode ver 3
torres: 1
, 2
, e 5
.
Requisitos do programa
Escreva um programa ou função que capte a grade de números e produza ou imprima as pistas, girando no sentido horário a partir do canto superior esquerdo.
Entrada
Um n*n
quadrado latino com 2<=n<=9
.
O formato é flexível. Você pode usar qualquer estrutura de dados que represente uma grade ou lista contendo números ou caracteres de dígitos. Você pode precisar de um separador entre as linhas ou nenhum separador. Algumas possibilidades são uma lista, uma lista de listas, uma matriz, uma sequência separada por token, como
43521 54132 15243 21354 32415,
ou uma string sem espaços.
Você não é dado n
como parte da entrada.
Saída
Retorne ou imprima as pistas começando no canto superior esquerdo e indo no sentido horário. Então, primeiro as pistas superiores lendo para a direita, depois as pistas certas lendo para baixo, depois as pistas inferiores lendo para a esquerda, e as pistas esquerdas para cima.
Isso seria 23145 34321 12222 33212
para o exemplo anterior
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
Assim como para a entrada, você pode usar uma lista, sequência ou qualquer estrutura ordenada. Os quatro "grupos" podem ser separados ou não, em uma estrutura aninhada ou plana. Mas, o formato deve ser o mesmo para cada grupo.
Exemplos de casos de teste:
(Seu formato de entrada / saída não precisa ser o mesmo que este.)
>> [[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]
Para sua conveniência, aqui estão os mesmos casos de teste em um formato de sequência simples.
>> 1221
21
12
21
12
>> 312231123
122
221
123
321
>> 4352154132152432135432415
23145
34321
12222
33212
>> 264137589729683145597461823618572934153926478375248691831794256942815367486359712
422333321
133222233
432123322
312433225
≢¨∪¨↓⌈\(⍉⍪⌽⍪⍉∘⌽∘⊖⍪⊖)