Gegeben ein Text wie dieser:
# #### ## #
## # ## #
#### ##
Geben Sie denselben Text aus, indem Sie die Pixel mit den Zeichen verbinden ─│┌┐└┘├┤┬┴┼
. Wenn ein Pixel keine Nachbarn hat, ändern Sie es nicht.
Die Ausgabe des letzten Textes ist also:
│ ─┬── ┌─ │
└─ │ ┌┘ │
└──┘ ─┘
- Sie können Eingaben als boolesches Array annehmen.
- Die Eingabe enthält immer mindestens 1 Pixel.
- Sie können Box-Drawing-Zeichen als 1 Byte zählen.
- Sie können davon ausgehen, dass die Eingabe mit Leerzeichen aufgefüllt ist.
Testfälle
## #
=>
── #
###
#
=>
─┬─
│
##### ##
# # #
########
=>
─┬─┬─ ┌─
│ │ │
─┴─┴──┴─
# #
#####
# #
=>
│ │
─┼─┼─
│ │
# # # # #
# # # #
# # # # #
# # # #
# # # # #
=>
# # # # #
# # # #
# # # # #
# # # #
# # # # #
#####
#####
#####
#####
#####
=>
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘
Da dies Codegolf ist , gewinnt der kürzeste Code.
-|r7LJE3TW+
ist ein geeigneter 1-Byte-Zeichen-Ersatz für die Blockzeichen.Antworten:
Jelly ,
605251504948 BytesEin Byte dank @ Dennis gespeichert .
Die Eingabe ist ein boolesches Array aus Einsen und Nullen. Iteriert über jede Spalte und jede Zeile und konvertiert den Kopf und den Schwanz jedes Infixes der Größe 3 von einem Paar binärer Ziffern in eine Dezimalzahl und multipliziert diese mit der Mitte jedes Infixes. Dann summiert es es mit sich selbst, um den Index darin zu finden
'#───│┌┐┬│└┘┴│├┤┼ '
.Probieren Sie es online! ( Fall 2 ) ( Fall 3 ) ( Fall 4 )
Erläuterung
Dies basiert auf der gleichen Idee wie meine Antwort in J, aber anstatt in jedem 3x3-Subarray zu verarbeiten, verarbeite ich jede Zeile und jede Spalte, während ich immer noch dieselbe Indextabelle erhalte.
Über die Hälfte der Bytes wird für die Erstellung der Liste der Box-Zeichen aufgewendet
'#───│┌┐┬│└┘┴│├┤┼ '
. String-Literale beginnen mit“
in Jelly und haben je nach Terminator unterschiedliche Bedeutungen. Hier’
bedeutet das Abschlusszeichen , dass die Zeichenfolge als die Codepunkte jedes Zeichens gemäß der Jelly- Codepage analysiert und aus einer Liste von 250-stelligen Basisziffern in eine Dezimalzahl konvertiert wird.Konvertieren Sie dann diese Dezimalstelle in eine Liste von Ziffern in der bijektiven Basis 61 und erhöhen Sie jede um 9471, um sie in den Bereich der Box-Zeichen zu verschieben, und konvertieren Sie jede mit Pythons
chr
. Stellen Sie dann ein Zeichen-Literal”#
voran und fügen Sie ein Leerzeichen hinzu⁶
.quelle
J ,
827266 BytesDie Eingabe ist eine boolesche Tabelle mit Einsen und Nullen. Die Regeln besagen, dass die Box-Zeichen jeweils ein Byte und nicht drei zählen und dass dies hier angewendet wurde.
Verwendungszweck
Erläuterung
Zunächst wird der Eingang allseitig mit 0en aufgefüllt.
Dann wird jedes Subarray der Größe 3 ausgewählt
Dann werden nur 5 der Werte in jedem Subarray berücksichtigt
Die Werte
ABCD
werden ausgewählt, indem jedes Subarray abgeflacht und bei Indizes ausgewählt wird1 7 3 5
. Diese Werte werden mitE
dem Index 4 multipliziert. Sie werden dann aus einer Liste von Binärziffern in eine Dezimalzahl konvertiert und um inkrementiertE
. Diex
Werte werden nicht benötigt.Dies wird als Index verwendet, um den zu zeichnenden Charakter gemäß der folgenden Tabelle auszuwählen (zum Golfen etwas neu angeordnet). Die letzte Spalte ordnet den Ausgabewert jedes Unterfelds einem Kästchen zu.
Außerdem
' #───│┌┐┬│└┘┴│├┤┼'
verwendet die Zeichenfolge in J 8-Bit-Zeichen, sodass sie für die 17 benötigten Zeichen eine Länge von 47 (für jedes Byte) aufweist. Der Befehlucp
konvertiert es in 16-Bit-Zeichen, was eine Länge von 17 ermöglicht.quelle
JavaScript (ES6),
155121103102 ZeichenEdit: 18 Byte mit Hilfe von ETHproductions gespeichert
Edit: 1 Byte mit dem 1. Parameter von replace () as gespeichert
'#'
Wie es funktioniert
Wir iterieren alle
#
Zeichen, die in der Eingabezeichenfolge enthalten sind. Für jeden von ihnen testen wir#
mit dert()
Funktion, ob seine Nachbarn auch Zeichen sind :Der Parameter
x
dert()
Funktion ist der Offset des Nachbarn zur aktuellen Positionp
. Wir verwenden -1 / + 1, um die linken / rechten Nachbarn und -w / + w für die oberen / unteren Nachbarn zu testen (wobeiw
die Breite einer Zeile ist, dh die Position des ersten Zeilenumbruchs + 1).Jedem Nachbarn wird ein anderes Gewicht (1, 2, 4 oder 8) gemäß dem folgenden Kompass zugewiesen:
Jede Gewichtskombination führt zu einem eindeutigen Wert in [0 .. 15]. Wenn zum Beispiel sowohl der obere als auch der rechte Nachbar festgelegt sind, ist die Summe 1 + 4 = 5, was sich in der folgenden
└
Tabelle niederschlägt:Führt
'#│─┘─└─┴││┐┤┌├┬┼'[weight_sum]
daher zum erwarteten Charakter.quelle
s=>(w=s[0].length+1,s=s.join`\n`).replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)])
s=>s.replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)],w=s.indexOf`\n`+1)
Python 2.7,
318315 Bytes (270267 Zeichen)Ich bin mir sicher, dass dies weiter verbessert werden kann (insbesondere würde ich diesen nervigen ersten Kommentar gerne loswerden), aber hier ist mein Beitrag:
Hier ist eine Erklärung, wie das Ganze funktioniert:
BEARBEITEN: Einige Leerzeichen zuvor entfernt
for ... in ...
quelle
JavaScript (ES6),
150139133131 ZeichenNimmt Eingaben als Array von Zeichenfolgen, z
f(["###", " # "])
.Testschnipsel
Code-Snippet anzeigen
quelle
ALPACA , 414 + 2 = 416 Bytes
Benötigt die
-fI
Fahnen.Diese Lösung verwendet eine sehr große Anzahl von Bytes, ist jedoch insofern einzigartig, als sie einen zellularen Automaten verwendet. ALPACA wird normalerweise als Metasprache verwendet, aber hier verwende ich es als Programmiersprache.
Ungolfed-Version:
quelle
PHP, 203 Bytes
Dies kann wahrscheinlich auf kürzere Weise erfolgen.
Liest die Eingabe von STDIN. renn mit
-r
.quelle
Python 3, 149 Bytes
Nimmt Eingaben wie
##\n #\n
und gibt Ausgaben wie zurück['─', '┐', '\n', ' ', '│', '\n']
.quelle
R,
199.212BytesEDIT: Es ist jetzt eine Funktion und kein Code-Snippet.
Die Eingabe ist eine Matrix
m
aus 1 und 0. Das ist ziemlich hässlich und abgedreht.Ein paar Tests:
quelle
x = "┼"
funktioniert gut für mich.Perl,
8988 BytesBeinhaltet +2 für
-0p
. Die Sonderzeichen werden als 1 Byte gezählt. Um sie jedoch als einzelne Zeichen anzuzeigen, sollten Sie auch die Option -C hinzufügen.Geben Sie in STDIN den Zeilenabstand ein, damit alle Zeilen die gleiche Länge haben:
connect.pl
:quelle
MATL, 102 Zeichen
Ich weise einem Nachbarn einen Wert zu (1, 2, 4 oder 8). Ihre Summe stimmt mit einem Zeichen in einer Zeichenfolge überein, die die Zeichnungszeichen enthält. Ich denke, es gibt noch viel Raum für Verbesserungen, aber für einen groben Entwurf:
Verbesserungen vorgenommen werden:
Probieren Sie es online! (Möglicherweise wird keine Unterstützung für Box-Zeichen unterstützt.)
quelle