Wenn ich Dokumentation, Kommentare usw. schreibe, liebe ich es, ASCII-Tabellen zu erstellen. Normalerweise sehen sie ziemlich gut aus, aber ich bin immer der Meinung, dass sie noch besser aussehen könnten - zumal UTF-8 / Unicode die Box-Zeichen enthält . Die Verwendung dieser Zeichen ist jedoch sehr mühsam, da zum Einfügen mehrere Tastendrücke erforderlich sind. Deine Aufgabe? Schreiben Sie ein Programm oder eine Funktion, die ASCII-Tabellen automatisch in das UTF-8 / Unicode-Äquivalent konvertieren kann.
Diese Herausforderung war Sandkasten .
Herausforderung
Schreiben Sie ein Programm, das eine ASCII-Tabelle als Eingabezeichenfolge angibt und die neu gezeichnete Tabelle mit den Unicode / UTF-8-Box-Zeichen ausgibt. Insbesondere sollten die Zeichen, die Teil der Tabelle sind, wie folgt übersetzt werden:
(Unicode, 3 bytes each in UTF-8)
- to ─ (\u2500)
| to │ (\u2502)
= to ═ (\u2550)
and + to one of:
┌ (\u250C), ┐ (\u2510), └ (\u2514), ┘ (\u2518),
├ (\u251C), ┤ (\u2524), ┬ (\u252C), ┴ (\u2534),
┼ (\u253C)
or, if '=' on either side:
╒ (\u2552), ╕ (\u2555), ╘ (\u2558), ╛ (\u255D),
╞ (\u255E), ╡ (\u2561), ╤ (\u2564), ╧ (\u2567),
╪ (\u256A)
Einzelheiten
I / O:
- Standard-E / A ist zulässig
- Sie können Eingaben in jedem vernünftigen Format vornehmen, einschließlich der Tabelle als Zeichenfolge oder als Pfad zu einer Datei, die die Tabelle enthält.
- Sie können in eine Datei ausgeben und den Dateinamen als zusätzliches Argument verwenden.
- Allerdings können Sie die Eingabedatei nicht ändern . (Es sollte zur Erleichterung der zukünftigen Bearbeitung beibehalten werden.)
Eingang:
- Sie können davon ausgehen, dass jede Eingabezeile mit derselben Länge aufgefüllt wurde
.
- Sie können nicht davon ausgehen, dass das erste Zeichen nach einer neuen Zeile ein Teil der Tabellenränder ist (wie es Leerzeichen sein können).
- Die Eingabe wird als gültige Tabelle betrachtet, wenn alle Zeichen (die Teil der Tabelle sind)
-=|
mit genau zwei Zeichen+
verbunden sind und mit mindestens einem Zeichen sowohl horizontal als auch vertikal verbunden sind. - Ihr Programm erzeugt möglicherweise keine Fehler mit gültigen Eingaben.
- Wenn die Eingabe ungültig ist, ist das Verhalten undefiniert und Sie können eine beliebige Ausgabe erzeugen.
- Die Eingabe kann beliebige UTF-8-Zeichen enthalten, einschließlich der Box-Zeichen.
Ausgabe:
- Alle Zeichen
-=|+
, die nicht Teil der Tabelle sind, müssen unverändert bleiben. - Ebenso müssen alle anderen Zeichen unverändert bleiben.
- Eine einzelne führende und / oder nachfolgende Zeile ist zulässig.
Andere:
- Standardlücken sind wie gewohnt verboten.
- Wenn Ihre bevorzugte Sprache über eine integrierte Sprache verfügt, die dieses Problem löst, können Sie sie möglicherweise nicht verwenden.
- Dies sind Programme, Funktionen, Unterprogramme oder Anweisungen, die für diese Herausforderung ohne Zusätze gültig wären.
- Jedes der Zeichen, die für diese Herausforderung benötigt werden, ist drei Byte lang, wenn sie in UTF-8 codiert sind.
Verbundene Charaktere :
Ein Charakter ist mit einem anderen verbunden, wenn:
- Es ist
|
und ist direkt über oder unter+
oder|
; - Es ist
-
und ist direkt vor oder nach+
oder-
; - Es ist
=
und ist direkt vor oder nach+
oder=
; - Es ist
+
und direkt über oder unter|
oder+
, oder direkt vor oder nach-
,=
oder+
.
Ein Zeichen wird als Teil der Tabelle betrachtet, wenn es mit einem Zeichen verbunden ist, das Teil der Tabelle ist. Per Definition ist der erste +
in der Eingabe ein Teil der Tabelle.
Beispiele
Beispiele hier als kopierfähige Version verfügbar.
Input: Output:
+------------------+ ┌──────────────────┐
| Hello+World! | │ Hello+World! │
+==================+ ╞══════════════════╡
| This is+my first | -> │ This is+my first │
|+-+ code|golf +-+| │+-+ code|golf +-+│
|+-+chall|enge! +-+| │+-+chall|enge! +-+│
+------------------+ └──────────────────┘
+===+===+===+ ╒═══╤═══╤═══╕
| 1 | 2 | 3 | │ 1 │ 2 │ 3 │
+---+===+===+===+ ┌───╪═══╪═══╪═══╡
| 1 | 1 | 2 | 3 | │ 1 │ 1 │ 2 │ 3 │
+---+---+---+---+ -> ├───┼───┼───┼───┤
| 2 | 2 | 4 | 6 | │ 2 │ 2 │ 4 │ 6 │
+---+---+---+---+ ├───┼───┼───┼───┤
|-3 |-3 |-6 |-9 | │-3 │-3 │-6 │-9 │
+===+---+---+---+ ╘═══╧───┴───┴───┘
+-----+ -> <Undefined>
+-----+ -> ┌─────┐
+-----+ └─────┘
+-----------------+
| Hello, World! |
| This is invalid | -> <Undefined>
| input |
-----------------+
++++ ┌┬┬┐
++++ -> ├┼┼┤
++++ └┴┴┘
+--+
++++ -> <Undefined>
+--+
Schließlich...
Das ist Code-Golf , also gewinnt die geringste Anzahl von Bytes. Viel Spaß beim Golfen!
+-+
Auszüge nicht als zusammenhängende Tabelle betrachtet?Hello World
Tabelle meinen, wird davon ausgegangen , dass die inneren Tabellen keine Tabelle bilden, da der Text in der Tabelle unverändert bleiben muss und sie nicht als Teil der äußeren Tabellenränder betrachtet werden, da sie nicht ordnungsgemäß mit ihnen verbunden sind.+----+
Beispiel meinen , liegt das daran, dass die Richtung der Ecken nicht eindeutig ist.Antworten:
Python 3,
392281 BytesGolfen Sie ein bisschen mehr und konvertieren Sie es in eine rekursive Lösung anstatt in eine iterative:
Nimmt eine Zeichenfolge von Zeilen gleicher Länge, die durch Zeilenumbrüche getrennt sind, und gibt eine Zeichenfolge im gleichen Format zurück. Kann bei ungültigen Eingaben eine Ausnahme auslösen.
Vorherige Lösung:
Ungolfed-Version:
quelle
Python 3 ,
914898827823594587569540469 BytesBearbeiten: Deutlich geänderte Strategie, jetzt ein Bitfeld von Nachbarn (ähnlich der Antwort von Dead-Opossum). Ich habe die frühere Version unten gelassen.
Probieren Sie es online!
Die Eingabe erfolgt in Form einer Liste von Zeichenlisten, die an Ort und Stelle geändert wird. Rekursionen ab dem ersten gefundenen.
Probieren Sie es online!
Hier ist die nächste Sache, die ich zu einer ungolfed Version habe:
quelle
JavaScript,
311307 BytesCode-Snippet anzeigen
Erläuterung
Ab der ersten gefundenen
+
Kreuzung versucht das Programm, Pfade zu anderen Kreuzungen in alle Richtungen zu finden, und führt dabei Ersetzungen durch. Es speichert die gefundenen Richtungen und den "doppelten Rand" -Zustand in einer Bitmap, die dann das entsprechende Kreuzungszeichen bestimmt.quelle
Python 3 , 599 Bytes
Ich kann in Python 3 nicht wirklich gut Golf spielen, aber (zu meiner Schande) konnte ich in Python 2 keine normale Ausgabe von UTF-8-Zeichen erhalten.
Ich denke, der einzige interessante Trick hier ist die Entscheidung über die
+
Transformation.Ich habe alle möglichen Varianten mit 4-Bit-Adressen verschlüsselt. Jedes Adressbit ähnelt der Verbindung zur Nachbarzelle. Also 0 - keine Verbindung und 1 - Verbindung.
1111
ist┼
0011
ist┐
usw.
Einige Konfigurationen von Verbindungen sind ungültig und ersetzt mit Dummy - Werten:
'012┐45┌┬8┘0┤└┴├┼'
Wenn eine Nachbarzelle enthält
=
, wird die zweite Liste mit doppelten Zeilen verwendet.Die Adresse wird hier zusammengefasst.
r
enthält Stringlänge 8, wobei alle zwei Zeichen 1/0 sind und das tatsächliche Nachthauptzeichen.Zum Beispiel:
1+0y1-1|
.Dies wird verwendet, um die Liste der Ersetzungen wie oben gezeigt auszuwählen. Und dann beauftragt zu adressieren:
int(r[0::2],2)
Dieses Lambda wird verwendet, um zu überprüfen, ob die Zellenkoordinaten gültig sind und das Zeichen der Zelle eines von '+ - | =' ist.
Dieses Lambda wurde verwendet, um Saibling aus der Zelle zu erhalten. Kehrt zurück
' '
wenn die Koordinaten ungültig sind. (kann auf jeden Fall weggolfen werden)Bedingungen für die Rekursion. Könnte auch Golf sein.
Probieren Sie es online!
quelle