Questa domanda si basa sulle torri puzzle di posizionamento dei numeri (note anche come grattacieli), che puoi giocare online . Il tuo obiettivo è quello di prendere una soluzione al puzzle e determinare gli indizi: il numero di torri visibili lungo ogni riga e colonna. Questo è il golf del codice, quindi vince meno byte.
Come funzionano le torri
La soluzione di un puzzle di Torri è un quadrato latino - una n*n
griglia in cui ogni riga e colonna contiene una permutazione dei numeri 1
attraverso n
. Un esempio per 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
Ogni riga e colonna è etichettata con un indizio a ciascuna estremità come:
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
Ogni indizio è un numero da 1
a n
che indica quante torri "vedi" guardando lungo la riga / colonna da quella direzione, se i numeri sono trattati come torri con quell'altezza. Ogni torre blocca torri più brevi dietro di essa. In altre parole, le torri che puoi vedere sono quelle che sono più alte di qualsiasi torre prima di loro.
Ad esempio, diamo un'occhiata alla prima riga.
2 > 4 3 5 2 1 < 3
Ha un indizio 2
da sinistra perché puoi vedere il 4
e il 5
. I 4
blocchi della 3
dalla vista e la 5
blocca tutto il resto. Da destra, è possibile vedere 3
le torri: 1
, 2
, e 5
.
Requisiti del programma
Scrivi un programma o una funzione che accetta la griglia di numeri e genera o stampa gli indizi, procedendo in senso orario dall'angolo in alto a sinistra.
Ingresso
Una n*n
piazza latina con 2<=n<=9
.
Il formato è flessibile È possibile utilizzare qualsiasi struttura di dati che rappresenti una griglia o un elenco contenente numeri o caratteri numerici. Potrebbe essere necessario un separatore tra le righe o nessun separatore. Alcune possibilità sono un elenco, un elenco di elenchi, una matrice, una stringa separata da token come
43521 54132 15243 21354 32415,
o una stringa senza spazi.
Non ti viene dato n
come parte dell'input.
Produzione
Ritorna o stampa gli indizi partendo dall'angolo in alto a sinistra e procedendo in senso orario. Quindi, prima gli indizi superiori leggono verso destra, poi gli indizi destra leggono verso il basso, quindi gli indizi inferiori leggono verso sinistra, gli indizi sinistri leggono verso l'alto.
Questo sarebbe 23145 34321 12222 33212
per l'esempio precedente
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
Proprio come per l'input, è possibile utilizzare un elenco, una stringa o qualsiasi struttura ordinata. I quattro "gruppi" possono essere separati o meno, in una struttura nidificata o piatta. Tuttavia, il formato deve essere lo stesso per ciascun gruppo.
Esempi di test:
(Il formato di input / output non deve essere lo stesso di questi.)
>> [[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]
Per comodità, ecco gli stessi casi di test in formato stringa piatta.
>> 1221
21
12
21
12
>> 312231123
122
221
123
321
>> 4352154132152432135432415
23145
34321
12222
33212
>> 264137589729683145597461823618572934153926478375248691831794256942815367486359712
422333321
133222233
432123322
312433225
≢¨∪¨↓⌈\(⍉⍪⌽⍪⍉∘⌽∘⊖⍪⊖)