aussehen! Es ist ein ASCII-Labyrinth! Also Coolzors, Amazing Balls und so.
+-+-----+---+
| | | |
| | ++ | |
| | ++ +-+ |
| | |
+-------+ | |
| | |
+---------+-+
Aber, aber, aber ... es ist eine Qual herauszufinden, in welche Richtung alle Teile des Labyrinths gehen. Ich möchte nur das Layout zeichnen und das Labyrinth sooper kul machen, ohne viel Zeit.
Was wäre, wenn ich das einfach einzeichnen könnte ...
#############
# # # #
# # ## # #
# # ## ### #
# # #
######### # #
# # #
#############
Das wäre sooo süß!
Die Regeln (weil Regeln cool sind):
- Schreiben Sie Code, um eine Zeichenfolge in ein ASCII-Labyrinth zu konvertieren und das Ergebnis auszugeben.
- Jedes Nicht-Leerzeichen wird als Wand gelesen.
- Jeder Wandcharakter entscheidet anhand seiner Nachbarn, welcher Charakter verwendet werden soll (nur in Nord-, Süd-, Ost- und Westrichtung).
- Wenn ein Zeichen keine Nachbarn ohne Leerzeichen hat, ist dies ein Pluszeichen (+).
- Wenn ein Zeichen Nachbarn in vertikaler (Nord-Süd) und horizontaler (Ost-West) Richtung hat, ist dies ein Pluszeichen (+).
- Wenn ein Zeichen nur in vertikaler Richtung (Nord-Süd) Nachbarn hat, ist dies ein Pipe-Symbol (|).
- Wenn ein Zeichen nur in horizontaler (Ost-West-) Richtung Nachbarn hat, ist dies ein Minuszeichen (-).
- Die Eingabe kann eine einzelne Zeichenfolge sein (mit durch Zeilenumbrüche getrennten Zeilen oder ein Array von Zeichenfolgen).
- Alle eingegebenen Zeichen sind druckbare ASCII-Zeichen. Erweiterte Zeichensätze sind nicht erforderlich.
- Verwenden Sie eine beliebige alte Sprache.
- Befindet sich vor einer Zeile ein Leerraum, sollte dieser in jeder Zeile gleich groß sein. Alle Leerzeichen nach jeder Ausgabezeile sind in Ordnung.
- Versuchen Sie es mit der kleinsten Anzahl von Bytes zu lösen.
Testfälle:
1: Frame
Eingang:
##########
# #
# #
# #
##########
Ausgabe:
+--------+
| |
| |
| |
+--------+
2: Klassisches Labyrinth
Eingang:
#################
# #
# ##### # ##### #
# # # # # #
# # # # ##### # #
# # # # #
### # ####### # #
# # # # # #
# ### # ## # ##
# # ## #
#################
Ausgabe:
--------+-------+
| |
| --+-+ | ----+ |
| | | | | |
| + | | +---- | |
| | | | |
+-- | +----+- | |
| | | | | |
| --+ | ++ | -+
| | ++ |
+-----+-++----+--
3: Grüne Eier, Mann.
Eingang:
I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!
Ausgabe:
| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++
4: Eiszapfen
Eingang:
Word Icicle!
Word Icicle
Word cicle
ord cicle
ord icle
ord i le
or i le
or i l
or l
or
r
Ausgabe:
++++ ++++++-
++++ ++++++
++++ +++++
+++ +++++
+++ ++++
+++ | ++
++ | ++
++ | |
++ |
++
|
---
?-
s haben oder warum das klassische Labyrinth keine vier+
s in der unteren Reihe hat.smallest number of characters
nicht Bytes?+
in der Mitte der 1. Reihe haben sollte 2) das!
der Eiszapfen durch ein ersetzt werden sollte-
. Könnten Sie diese bitte noch einmal überprüfen?whitespace
, meinst du einfach nur Raum? Ich möchte keine Tabulatoren unterstützen müssen und Sie möchten wahrscheinlich auch nicht, dass ich Zeilenumbrüche umwandleAntworten:
APL (Dyalog Unicode) ,
5735 Bytes SBCS–22 dank einer neuartigen lösung von ngn .
Anonyme implizite Funktion, die eine Zeichenmatrix als Argument verwendet.
Probieren Sie es online!
{
Wenden Sie}⌺3 3
auf jede 3-mal-3-Nachbarschaft die folgende Funktion an:,⍵
Ravel (Abflachen)' '≠
Boolescher Wert ohne Leerzeichen⍱∘⌽⍨
dass NOR ist es umgekehrt (inkl. weder oben noch unten, weder links noch rechts)5 4 2⊃¨⊂
Wähle das fünfte , vierte und zweite Element aus der gesamten Liste,dh leeres Selbst, keine Vertikale, keine Horizontale
2⊥
bewerte in der Basis 2 (binär) dh ≥4: leeres Selbst; 3: keine Nachbarn; 2: keine horizontalen Nachbarn; 1: keine Vertikale; 0: hat beides
'+-|+'↓⍨
lösche so viele Elemente aus dieser Zeichenkette,dh leeres Selbst
:; allein
+
:; vertikale Nachbarn (e):|+
; horizontal-|+
:; beide:+-|+
⊃
wähle das erste Element (Pad mit Leerzeichen, falls nicht vorhanden)dh leeres Selbst
+
:; vertikale Nachbarn (e):|
; horizontal-
:; beide:+
Alte Lösung
Anonyme implizite Funktion, die eine Zeichenmatrix als Argument verwendet.
Probieren Sie es online!
{
Wenden Sie}⌺3 3
auf jede 3-mal-3-Nachbarschaft die folgende Funktion an:,⍵
Ravel (Abflachen)(
…)/
Filtern mit folgender Maske:9⍴0 1
zyklisch[0,1]
auf Länge 9 umformen (Auswahl von N, W, E, S)' '≠
Boolescher Wert ohne Leerzeichen1⌽
einen Schritt nach links drehen;[W,E,S,N]
2 2⍴
umformen in 2-mal-2-Matrix;[[W,E],[S,N]]
∨/
zeilenweise ODER Reduzierung:[horizontal,vertical]
(
…)
Wenden folgende stillschweigende Funktion an:⊢
Die Identität;[horizontal,vertical]
∧/,
davor UND-Verknüpfung;[both,horizontal,vertical]
(
…),
Folgendes voranstellen:,⍵
die Nachbarschaft verwirren5⊃
wählt das 5 th Element (selbst)' '=
Boolean if space (dh leer)Jetzt haben wir
[empty,both,horizontal,vertical]
1⍳⍨
Index ganz links 1 (gibt 5, wenn überhaupt keine Nachbarn)' +-|+'⊃⍨
Verwenden Sie das, um ein Symbol auszuwählenquelle
JavaScript (ES6), 110 Byte
E / A-Format: Array von Zeichenfolgen.
Probieren Sie es online!
Oder 108 Bytes, indem stattdessen eine Zeichenmatrix verwendet wird.
quelle
Python 2 ,
181168 BytesDanke an Leaky Nun für -13 Bytes
Probieren Sie es online!
quelle
MATLAB,
113110101 BytesKonvertiert Eingaben in logische Werte, wendet Faltungen in horizontaler und vertikaler Richtung an und kombiniert die Ausgaben, um die entsprechenden Zeichen zu erstellen.
3 Bytes wurden von @Adriaan gespeichert, um mir mitzuteilen, dass Sie die Ausgabe in PPCG verstopfen können: P
9 Bytes gespart dank zahlreicher @flawr-Kommentare!
quelle
J ,
4947 BytesDanke an FrownyFrog für -2 Bytes!
Probieren Sie es online!
quelle
Retina 0,8,2 , 92 Bytes
Probieren Sie es online! Benötigt rechteckige Eingabe. Link enthält Testfälle. Erläuterung:
Ändern Sie alle Nicht-Leerzeichen in
0
s.Suchen Sie nach allen
0
s mit einem anderen0
unmittelbar darüber oder darunter in derselben Spalte und ändern Sie sie in eine 1. Die1
s sind jetzt die Orte mit vertikalen Nachbarn, während die0
s keine vertikalen Nachbarn haben.Suchen Sie nach allen Ziffern ohne horizontale Nachbarn. Die
0
s haben auch keine vertikalen Nachbarn, also werden sie zu+
s, während die1
s vertikale Nachbarn haben, also werden sie zu|
s.Die restlichen Ziffern haben horizontale Nachbarn. Die
1
s haben auch vertikale Nachbarn, so dass sie zu+
s werden, während die0
s nur horizontale Nachbarn haben, so dass sie zu-
s werden.quelle
Python 3 , 336 Bytes
Probieren Sie es online!
Ich musste viel Code verwenden, um mit Randfallfehlern umzugehen.
quelle
C (gcc) 143 Bytes
Probieren Sie es online!
Die Funktion f ändert ein Array von Strings an Ort und Stelle. Der Bereich um das Array muss mit Leerzeichen aufgefüllt werden (etwas eingeschränkt). Auch wenn dies nicht genau den Anforderungen entspricht, die die meisten Lösungen verwenden, entspricht es den Regeln, wenn wir sagen, dass wir eine Newline mit zwei Leerzeichen darstellen (und eine Reihe von Strings verwenden, die in Newlines enden).
Ungolfed
Dies war eine lustige Herausforderung der Zeigerarithmetik. Mit der C-Zeiger-Iteration ist es einfach, die horizontalen Nachbarn zu ermitteln, aber die vertikalen waren härter. Glücklicherweise ist der y-Zeiger immer noch in der Nähe (was auf den Anfangswert von z zeigt), sodass ich meinen Index daraus ableiten und damit auf dasselbe Element in einer anderen Zeile zugreifen kann. Es fühlte sich sehr falsch an zu schreiben,
y[-1][z-*y]
da es jedem vernünftigen Stil widerspricht!quelle