Diese Frage basiert auf dem Zahlenrätsel Towers (auch Wolkenkratzer genannt), das Sie online spielen können . Ihr Ziel ist es, eine Lösung für das Rätsel zu finden und die Hinweise zu ermitteln - die Anzahl der Türme, die in jeder Zeile und Spalte sichtbar sind. Dies ist Codegolf, so dass nur wenige Bytes gewinnen.
Wie funktioniert Towers?
Die Lösung für ein Türme-Puzzle ist ein lateinisches Quadrat - ein n*n
Raster, in dem jede Zeile und Spalte eine Permutation der 1
durchgehenden Zahlen enthält n
. Ein Beispiel für n=5
ist:
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
Jede Zeile und Spalte ist an jedem Ende mit einem Hinweis versehen:
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
Jeder Hinweis ist eine Zahl von 1
bis n
, die angibt, wie viele Türme Sie entlang der Reihe / Spalte aus dieser Richtung "sehen", wenn die Zahlen als Türme mit dieser Höhe behandelt werden. Jeder Turm blockiert kürzere Türme dahinter. Mit anderen Worten, die Türme, die Sie sehen können, sind höher als jeder Turm vor ihnen.
Schauen wir uns zum Beispiel die erste Reihe an.
2 > 4 3 5 2 1 < 3
Es hat einen Hinweis von 2
links, weil Sie das 4
und das sehen können 5
. Das 4
blockiert die 3
Sicht und das 5
blockiert alles andere. Von der rechten Seite können Sie sehen , 3
Türme: 1
, 2
, und 5
.
Programmanforderungen
Schreiben Sie ein Programm oder eine Funktion, die das Zahlenraster aufnimmt und die Hinweise ausgibt oder druckt, und zwar im Uhrzeigersinn von oben links.
Eingang
Ein n*n
lateinisches Quadrat mit 2<=n<=9
.
Das Format ist flexibel. Sie können eine beliebige Datenstruktur verwenden, die ein Raster oder eine Liste mit Zahlen oder Ziffern darstellt. Möglicherweise benötigen Sie ein Trennzeichen zwischen den Zeilen oder gar kein Trennzeichen. Einige Möglichkeiten sind eine Liste, eine Liste von Listen, eine Matrix, eine durch Token getrennte Zeichenfolge wie
43521 54132 15243 21354 32415,
oder eine Zeichenfolge ohne Leerzeichen.
Sie werden nicht n
als Teil der Eingabe angegeben.
Ausgabe
Geben Sie die Hinweise von links oben im Uhrzeigersinn zurück oder drucken Sie sie aus. Also, zuerst lesen die oberen Hinweise nach rechts, dann lesen die rechten Hinweise nach unten, dann lesen die unteren Hinweise nach links, die linken Hinweise nach oben.
Dies wäre 23145 34321 12222 33212
für das vorherige Beispiel
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
Ebenso wie für die Eingabe können Sie eine Liste, eine Zeichenfolge oder eine beliebige geordnete Struktur verwenden. Die vier "Gruppen" können in einer verschachtelten oder flachen Struktur getrennt sein oder nicht. Das Format muss jedoch für jede Gruppe gleich sein.
Beispiel Testfälle:
(Ihr Eingabe- / Ausgabeformat muss nicht mit diesen identisch sein.)
>> [[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]
Der Einfachheit halber finden Sie hier dieselben Testfälle im Flat-String-Format.
>> 1221
21
12
21
12
>> 312231123
122
221
123
321
>> 4352154132152432135432415
23145
34321
12222
33212
>> 264137589729683145597461823618572934153926478375248691831794256942815367486359712
422333321
133222233
432123322
312433225
≢¨∪¨↓⌈\(⍉⍪⌽⍪⍉∘⌽∘⊖⍪⊖)