Betrachten Sie die folgenden 3x3-Blöcke, die der Marschquadrat-Algorithmus für jede Zelle identifizieren würde (mit 0-basierter beschrifteter ID):
0:
...
...
...
1:
...
...
\..
2:
...
...
../
3:
...
---
...
4:
..\
...
...
5:
/..
...
../
6:
.|.
.|.
.|.
7:
/..
...
...
8:
/..
...
...
9:
.|.
.|.
.|.
10:
..\
...
\..
11:
..\
...
...
12:
...
---
...
13:
...
...
../
14:
...
...
\..
15:
...
...
...
Das Ziel dieser Herausforderung ist es, eine 2D-Matrix von Block-IDs zu erhalten. Zeichnen Sie das vollständige Konturdiagramm, indem Sie diese kleineren Zellen zusammenkacheln. Beachten Sie, dass es einige wiederholte Fälle gibt (Beispiel: 0 und 15 sind visuell gleich)
Eingang
Ihr Programm / Ihre Funktion sollte eine rechteckige 2D-Matrix von Ganzzahlen im Bereich als Eingabe verwenden [0+a,15+a]
(wobei a
eine beliebige Ganzzahlverschiebung Ihrer Wahl vorliegt; dies ermöglicht Ihnen die Verwendung einer nullbasierten Indizierung oder einer 1-basierten Indizierung für die Blöcke). Dies kann von jeder gewünschten Quelle stammen (Standard, Funktionsparameter usw.).
Ausgabe
Ihr Programm / Ihre Funktion sollte eine einzelne Zeichenfolge ausgeben, die das vollständige Konturdiagramm darstellt. Es sollte kein zusätzliches Leerzeichen für führende / nachfolgende Zeilen geben, aber eine einzelne nachfolgende neue Zeile ist zulässig. Es sollte keine vertikale oder horizontale Trennung zwischen benachbarten Blöcken geben.
Beachten Sie, dass Sie für Blöcke, die einem "Sattel" zugeordnet sind, keine spezielle Behandlung durchführen müssen. Zeichnen Sie einfach den Block mit der angegebenen ID wie er ist.
Die Ausgabe kann an eine beliebige Senke erfolgen (Standardausgabe, Rückgabewert usw.)
Beispiele
Alle folgenden Beispiele verwenden 0-basierte Block-IDs.
case 1:
2 1
4 8
......
......
../\..
..\/..
......
......
case 2:
15 13 12 14 15
13 8 0 4 14
11 1 0 2 7
15 11 3 7 15
...............
......---......
...../...\.....
.../.......\...
...............
../.........\..
..\........./..
...............
...\......./...
.....\.../.....
......---......
...............
case 3:
12 12 12 8 4
0 0 0 0 2
0 0 0 2 7
0 2 3 7 15
........./....\
---------......
...............
...............
...............
............../
............/..
...............
.........../...
........./.....
......---......
...../.........
case 4:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
............
.........---
...\..../...
..\/...|./..
.......|....
...../.|....
/...|...\..\
....|.......
....|.\.....
............
---.........
...../\.....
case 5:
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 2 7 15 15
0 0 2 5 14 15 15
0 2 5 8 4 12 14
0 4 8 0 0 0 6
0 0 0 0 0 0 4
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
............/........
.....................
.........../.........
........./...........
.....................
......../../\........
....../../....\......
...............---...
...../../.........\..
.....\/............|.
...................|.
...................|.
....................\
.....................
.....................
Wertung
Das ist Code Golf; Der kürzeste Code in Bytes gewinnt. Es gelten Standardlücken.
Antworten:
Mathematica,
353326 BytesEingang
quelle
JavaScript (ES6), 195 Byte
Testfälle
Code-Snippet anzeigen
quelle
Mathematica, 173 Bytes
Probieren Sie es im Wolfram Sandkasten!
Das "
\n
" sollte durch eine tatsächliche neue Zeile ersetzt werden. Die Eingabe ist 1-indiziert - zum Beispiel wird der dritte Testfall{{13,13,13,9,5},{1,1,1,1,3},{1,1,1,3,8},{1,3,4,8,16}}
. Die Ausgabe ist eine Zeichenfolge.Die Idee ist im Grunde die gleiche wie die Antwort von Jenny_mathy - mache die sechzehn Quadrate, indem du ein 3x3-Gitter von
"."
s nimmst und einige der Zeichen ersetzst , dann die Quadrate zusammennähst - aber benutze etwas kürzere Funktionen, um dies zu tun. (Danke an alephalpha , dass du mich daran erinnert hast, dass esArrayFlatten
existiert!)Es ist möglich, dass dies in weniger Bytes durchgeführt werden kann, indem die Quadrate geschickt erstellt werden, anstatt sie im Grunde hart zu codieren, aber das würde viel mehr Aufwand erfordern…
quelle
{{16,14,13,15,16},{14,9,1,5,15},{12,2,1,3,8},{16,12,4,8,16}}
. Wenn Sie das versucht haben und es immer noch nicht funktioniert, können Sie mir dann sagen, welches Problem Sie bekommen?Netzhaut , 165 Bytes
Probieren Sie es online aus! Link enthält zweites Beispiel. Erläuterung: Die ersten beiden Stufen werden von dezimal in hexadezimal konvertiert, sodass die Leerzeichen gelöscht werden können. Die dritte Stufe verdreifacht dann jede Zeile und gibt jeder neuen Zeile einen separaten Marker. Diese Markierungen durchlaufen dann die hexadezimalen Ziffern und wandeln sie im Verlauf in das Konturdiagramm um, bis sie das Ende der Linie erreichen und an diesem Punkt gelöscht werden.
quelle
Python 2 , 247 Bytes
Probieren Sie es online aus!
-1 Byte dank LeakyNun
quelle
SOGL V0.12 ,
10689 BytesProbieren Sie es hier aus! (Das hat ein zusätzliches Byte
→
für eine einfache Eingabe. Andernfalls würde das Array bereits auf dem Stapel erwartet.)quelle
Python 2,
196191181176 BytesProbieren Sie es online aus!
Eine Funktion, die ein Array von Ints-Arrays verwendet und eine Zeichenfolge zurückgibt:
BEARBEITEN: 5 Bytes durch Zuweisen von J, N gespeichert; weitere 10 Bytes, weil ich vergessen habe, dass die Eingabe bereits als Array von Ints-Arrays angenommen wird; und dann weitere 5 Bytes, die durch intelligentes Schneiden eingespart wurden ...
Die verkettete Zeichenfolge aller 16 3x3-Zellen (144 Byte, ohne Zeilenumbrüche) wird in die 41-Byte-Zeichenfolge lauflängencodiert:
o!j1cSe!f1g1aAbAbAa1h1iAbAbAc!c!d!iSk1f!k
Dabei ist jedes RLE-Element
(cellType, length)
für das Zeichen codiertchr(32+16*cellType+length)
(es ist praktisch, dass der maximale Lauf 15 beträgt; und dasord(' ')==32
ist durch 16 teilbar). Beim Dekodieren nehmen wir'\/|-.'[cellType]
als druckbares Zeichen.Nichts besonders klug danach ...
quelle
05AB1E , 61 Bytes
Probieren Sie es online aus!
Die erste Hälfte des Musters kann wie folgt komprimiert werden:
Die zweite Hälfte müsste sein:
Wir können die erste Hälfte nur vertikal spiegeln und
binary 110 (1101110)
für die einfügen2111111125
.Als nächstes nehmen wir dieses Muster und teilen es auf fünf auf, dann füllen wir es mit denen auf:
Jetzt haben wir unsere Bausteine, die letzten Teile ersetzen einfach die Matrixeinträge durch die entsprechenden Bausteine, komprimieren die Zeilen und drucken sie mit ersetzten Symbolen an den Benutzer:
Kann formelle Betriebserklärungen posten, wenn jemand es will, danke.
quelle
Gelee , 64 Bytes
Probieren Sie es online aus!
Dies verwendet eine naive Komprimierung und könnte wahrscheinlich viele Bytes mit Lauflängencodierung sparen.
Wie es funktioniert
quelle