Zeichnen Sie die Konturen einer rechteckigen Erhebungsmatrix.
Aufgabe
Zwei Elemente x
und y
befinden sich auf derselben Konturebene, wenn floor(x/10) == floor(y/10)
. Zum Beispiel 52
und 58
befinden sich auf derselben Konturebene, aber 58
und 64
nicht.
Das Zeichnen von Konturen wird wie folgt definiert: e
Ersetzen Sie jedes Element durch eine Zeichenfolge mit zwei Zeichen, die wie folgt ausgewählt wird:
- Das erste Zeichen ist,
" "
wenn sich das Element daruntere
auf derselben Konturebene befindet wiee
oder wenn sich kein Element darunter befindet,e
und"_"
ansonsten - das zweite Zeichen ist ,
" "
wenn das Element auf der rechten Seite dere
auf der gleichen Konturebene ist wiee
oder es ist kein Element auf der rechtene
und"|"
sonst
Die Elemente innerhalb der Zeilen werden zusammengefügt, dann werden die Zeilen mit Zeilenumbrüchen zusammengefügt.
Beispiel
Nehmen wir an, die Eingabe wird [[5,20],[3,6]]
visualisiert als
5 20
3 6
Wir schauen uns zuerst an 5
. Da 3
sich auf derselben Konturebene wie befindet 5
, ist das erste Zeichen " "
. Da 20
sich nicht auf derselben Konturebene wie befindet 5
, ist das zweite Zeichen "|"
.
Nun schauen wir uns an 20
. Da 6
sich nicht auf derselben Konturebene wie befindet 20
, ist das erste Zeichen "_"
. Da rechts von kein Element vorhanden ist 20
, ist das zweite Zeichen " "
.
Nun schauen wir uns an 3
. Da es unten kein Element gibt, ist 3
das erste Zeichen " "
. Da 6
sich auf derselben Konturebene wie befindet 3
, ist das zweite Zeichen " "
.
Nun schauen wir uns an 6
. Da es unten kein Element gibt, ist 6
das erste Zeichen " "
. Da rechts von kein Element vorhanden ist 6
, ist das zweite Zeichen " "
.
Basierend auf diesen zwei Zeichenfolgen machen wir Ersatz, um zu bekommen [[" |","_ "],[" "," "]]
. Wenn wir diese zusammenfügen, erhalten wir eine Ausgabe von
|_
Regeln
- Die Eingabematrix ist immer rechteckig und besteht aus positiven ganzen Zahlen.
- Nachgestellte Leerzeichen oder Zeilenumbrüche können beliebig sein (einschließlich 0) und müssen in keiner Weise konsistent sein.
- Sie müssen nicht denselben Algorithmus anwenden, solange Sie dieselben Ergebnisse erzielen.
- Ihr Programm oder Ihre Funktion gibt möglicherweise eine durch Zeilenumbrüche getrennte Zeichenfolge, eine Liste von Zeichenfolgen oder eine Entsprechung aus.
- Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Testfälle
input
output
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
_ _
| |
|_ _|
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
|_|_|_|_|_|_|_|_|_
|_ |_ _|_ _|_ _
|_ |_ _ |_
|_ |_ _
|_
|_
|_
|_
|_
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
_ _ _ _ _ _ _ _ _
| |
| _ _ _ _ _ |
| | | |
| | _ | |
| | |_| | |
| | | |
| |_ _ _ _ _| |
| |
|_ _ _ _ _ _ _ _ _|
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
_| |_
_| _ _ _ _ _ |_
_| |_
| _ _ _ |
| | | |
| | | |
| |_ _ _| |
|_ _|
_ |_ _ _ _ _| _
|_ _|
| |
Antworten:
Perl 6 , 135 Bytes (131 Zeichen)
Probieren Sie es online!
Leicht ungolfed:
Erklärung : Zuerst definieren wir eine Variable
$n
(Zeile 2) und eine Funktionw
(Zeile 3). Diese Funktion gibt ein Leerzeichen zurück, wenn sich die beiden Argumente auf derselben "Höhe" befinden, und$n
ansonsten den Inhalt der Variablen . Anstatt durch 10 und Flooring zu teilen, missbrauchen wir die Tatsache, dass intsCool
wie Strings behandelt werden und verwendenchop
, um das letzte Zeichen (= Ziffer) zu entfernen. Dann subtrahieren wir sie ruhig und zwingen sie erneut zu Zahlen: -).Danach (Zeile 4) erstellen wir eine Funktion
q
, die eine Liste aufnimmt und diese Liste zurückgibt, wobei das erste Element entfernt und das letzte Element dupliziert wird.Auf den nächsten drei Zeilen werden wir zwei weitere Matrizen aus der Eingangsmatrix machen: die erste hat die erste Zeile fehlt und die letzte Zeile dupliziert (die gerade ist
.&q
- mit.&
, können Sie eine Funktion auf etwas rufen , als ob es eine Methode - das Ding vor dem Punkt ist dann das erste Argument), bei der anderen fehlt die erste Spalte und die letzte Spalte ist doppelt vorhanden (das ist.map(*.&q)
).Zuerst (Zeile 4) nehmen wir die ursprüngliche Matrix
$_
, "überlagern" sie mit der Matrix "verschobene Zeilen" und verwenden die Funktionw
als binären Operator (das ist der[&w]
) für die übereinstimmenden Elemente. Dieser setzt ein,_
wo immer sich die passenden Elemente auf den verschiedenen Höhen befinden, und einanderes. Wir erhalten also die Hälfte des Ergebnisses (nur die "ersten Zeichen").
In Zeile 6 machen wir dasselbe, aber zuerst wechseln wir
$n
zu|
und "überlagern" nun die ursprüngliche Matrix mit der Matrix mit verschobenen Spalten. Das Ergebnis hat eine|
unterschiedliche unddie gleiche Höhe. Dies sind die "zweiten Zeichen".
Jetzt kombinieren wir sie einfach miteinander. Wir zippen die Arrays mit einem Zip mit einem Concat (yeah ...), was zu einer Matrix der ursprünglichen Form führt, deren jedes Element die 2 übereinstimmenden Elemente der verketteten "Halblösungen" sind. Schließlich ordnen wir nur diese Matrix zu (die wirklich eine Liste von Listen ist). Jede dieser Listen wird abgeflacht und dann
say
mit einem Zeilenumbruch versehen. Dasay
beliebig viele Argumente verwendet werden können und alle ohne Trennzeichen gedruckt werden, wird die neue Zeile erst am Ende eingefügt, und das gewünschte Bild wird auf stdout ausgegeben. (Und der Block gibt eine Liste vonTrue
s zurück (jedersay
gibt eine zurückTrue
), aber wen interessiert das?)quelle
but who cares
Jelly ,
25 2322 Bytes-1 Byte dank Meilen (
I
Vektorisierungen)Ein volles Programm druckt das Ergebnis aus. Als monadischer Link nimmt er eine Liste von Nummernlisten, die Höhen und gibt Listenlisten zurück. Diese "Zeilen" bestehen jedoch aus Listen mit zwei "Zeichenpaaren" - wenn dies in Ordnung ist, kann 1 Byte durch Entfernen gespeichert werden
Y
.Probieren Sie es online!
Wie?
quelle
⁵
spart dir eins auf Anhieb ...:⁵I;€0ao⁶
anstelle des Hauptlinks verwendenZç”_Zż"ç”|$Y
I
mir vor, dass ich so nicht vektorisieren würde.I
vektorisiert in Tiefe 1 und beidea
undo
vektorisiert in Tiefe 0Python 2 ,
199186157155 BytesProbieren Sie es online!
quelle
Gelee , 24 Bytes
Probieren Sie es online!
Erläuterung
-2 Bytes dank Jonathan Allan
quelle
Y
- sie gibt eine Liste von Zeichenlisten zurück, die ich für OK halte (während meine Paare in den "Zeilen" hat).Python 2 , 226 Bytes
Probieren Sie es online!
Puh, das war ein Trottel, um die Logik herauszufinden. Ich sehe jetzt Hyper-Neutrino-Ninja mit einer kürzeren Antwort, aber ich habe zu viel daran gearbeitet, um es nicht zu posten. : P
Ich kann auch sagen, dass dies eine großartige Möglichkeit ist, ASCII-Kunst zu erstellen. Entschuldigen Sie, während ich mehr davon herstelle.
quelle
enumerate
anstatt den vollständigen Namen zweimal zu verwenden.enumerate
(obs, ich musste einige Eingaben entfernen, um es hier verknüpfen zu können)J, 58 Bytes
Probieren Sie es online!
Eine anonyme Funktion, die eine Matrix verwendet und die Konturen ausgibt.
Hier gibt es viel Raum für Verbesserungen. Ich hatte keine Zeit, alle Testfälle zu testen. Lassen Sie mich wissen, wenn es Probleme gibt. Werde versuchen mehr zu golfen und später erklären.
(Schnelle) Erklärung
Hilfsfunktion: Indiziert eine Zeichenfolge der Länge 2 basierend darauf, ob das erste Element eines Arrays der Länge 2 gleich dem zweiten ist. Wenn es gleich ist, indiziert es in das nullte Element, wenn es ungleich ist, indiziert es in das erste. Ein Array mit einer Länge von 1 indiziert immer das nullte Element der Zeichenfolge.
Hauptfunktion
1:+<.@%&10
Fußböden jedes Element durch 10 geteilt und addiert 1 (so werden wir nie 0 bekommen - dies ist wichtig für die Hilfsfunktion).2 2((' _'f{."1),' |'f{.);.3
Schneidet die Matrix in 2 x 2 Segmente, wenn dies möglich ist (andernfalls wird in der Nähe der Kanten ein 2 x 1, 1 x 2 oder 1 x 1 Segment erstellt) und wendet die Funktion an, mitf
der das linke obere Element mit dem oberen Element verglichen wird rechts und das obere linke Element links unten.(,/"2)
verflacht das ergebnis in die gewünschte form. Ich habe wirklich das Gefühl, ich sollte es vermeiden können, dies zu benutzen (und viele andere Dinge, aber ich schweife ab).quelle
J ,
46-45BytesProbieren Sie es online!
quelle
JavaScript (ES6),
120 bis118 ByteWobei
\n
das wörtliche Zeilenumbruchzeichen darstellt. Bearbeiten: 2 Bytes dank @ Bálint gespeichert.quelle
(a[i] || [])[j]
Konstrukte an(a[i] || 0)[j]
join`\n`
das\n
Teil entfernen und durch ein aktuelles Newline ersetzena=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`
\n
Teil zu tun ; Ich teste in einer REPL, damit wörtliche Zeilenumbrüche im Weg sind.Proton , 202 Bytes
Probieren Sie es online!
-2 Bytes dank Jonathan Frech
-15 Bytes durch Umstellung auf Proton anstelle von Python 2
quelle
len
mitL
und definierenL=len;
.Java 8,
200170169 BytesErläuterung:
Probieren Sie es hier aus.
Beachten Sie, dass die Ganzzahldivision in Java automatisch Fußböden bildet.
quelle
R, 159 Bytes
Mit Zeilenumbrüchen und Einrückungen:
Misst die Ganzzahldivision der Matrix die zeilenweisen und spaltenweisen Unterschiede und ersetzt sie, wenn sie nicht null ist, durch
|
und_
jeweils dann fügen beide (schmerzlos dank R Vektorisierung) und Ausgänge.Testfälle:
quelle
Perl 5 ,
130126 Bytes124 Byte Code + 2 für
-ap
FlagsProbieren Sie es online!
Das Eingabeformat ist ein 2-D-Raster mit durch Leerzeichen getrennten Zahlen.
Erläuterung
Dies ist aus einer früheren Iteration des Codes.
quelle