ASCII-Kunst macht Spaß. Moderne Texteditoren können sehr gut Text bearbeiten. Sind moderne Programmiersprachen der Aufgabe gewachsen?
Eine häufige Aufgabe bei der Bearbeitung von ASCII-Grafiken besteht darin, Text auf ein Rechteck zwischen zwei Zeichen zuzuschneiden. Dies ist die Aufgabe, die Sie in dieser Herausforderung umsetzen müssen.
Einzelheiten
Ihr Programm wird 3 Eingaben annehmen:
- Das erste ist das 'Start'-Zeichen des Blocks - es markiert die obere linke Ecke
- Das zweite ist das 'Ende'-Zeichen des Blocks - es markiert die untere rechte Ecke
- Das dritte ist eine Form von mehrzeiligem Text, entweder eine Zeichenfolge oder eine Liste von Zeichenfolgen oder ein Dateiname oder was auch immer
Das Ergebnis ist mehrzeiliger Text (ebenfalls in einem der oben genannten Formate), der auf das Rechteck zwischen den angegebenen Eingaben zugeschnitten wird. Beachten Sie, dass die ersten beiden Eingänge möglicherweise nicht eindeutig sind.
Edge-Fälle
Boxen müssen immer ein Volumen von mindestens 2 haben.
() (
)
sind Boxen, aber diese:
)( ) (
( )
sind nicht (mit start = (
und end = )
).
Die Eingabe enthält nur eine Box. Daher dürfen Start- und Endzeichen nur einmal vorkommen, es sei denn, sie sind dasselbe Zeichen. In diesem Fall müssen sie genau zweimal vorkommen.
Außerdem muss jede Zeile in der Eingabe mindestens so lang sein wie der Abstand zwischen dem Beginn einer Zeile und dem rechten Rand des Felds in der Eingabe.
Ihr Programm muss keine ungültigen Eingaben verarbeiten. Sie können zu undefiniertem Verhalten führen.
Regeln
Es gelten die typischen Code-Golf-Regeln. Kürzester Code gewinnt.
Beispiele
Sonniger Tag: start: ( end: ) input:
This is some text
. (but this text
is in a box ).
So only it is important.
Ausgabe:
(but this text
is in a box )
Beachten Sie auch das Entfernen des horizontalen Raums. ASCII-Kunstpflanzen sind 2d.
Regnerischen Tag: start: ( end: ) input:
This is some text (
But is that even )
really a box?
Ausgabe:
(
)
Gleicher Anfang / Ende: start: / end: / input:
Oh, I get how this could be useful
/----------------------------\
| All this text is in a box! |
\----------------------------/
Ausgabe:
/----------------------------\
| All this text is in a box! |
\----------------------------/
Ungültige Eingabe: start: ( end: ) input:
Boxes are rectangular ( so this has
0 volume ) which is illegal.
Ungültige Eingabe 2: start: ( end: ) input:
(The lines must already be square
so this line that is too short
relative to this end, is illegal)
Antworten:
Vim,
16, 12 Bytes / TastenanschlägeProbieren Sie es online! im V-Interpreter
Ich wette, alte Texteditoren sind noch besser! : D
Auch wenn dies nicht unbedingt der Fall sein muss, funktioniert diese Antwort mit beiden "ungültigen" Eingaben, die ausgegeben werden
und
Erläuterung:
quelle
/\/<cr><c-v>nygv$o0dp
oder so etwas viel zu lange :)Gelee , 13 Bytes
Ein dyadischer Link, der eine Liste von Start- und Endzeichen auf der linken Seite und eine Liste von Zeilen (als Listen von Zeichen) auf der rechten Seite akzeptiert, die eine Liste von Zeilen (als Listen von Zeichen) ergibt.
Probieren Sie es online!(Vollständiges Programm - Wenn Eingaben in Python gültig sind, müssen sie in Python-Zeichenfolgen angegeben werden.)
Wie?
Zum Beispiel mit left =
['a', 'b']
und right (als Liste von Zeichenlisten - die Zeilen):=€
ergibt eine Liste von zwei Listen von Listen (die erste führt'a'=
, die zweite'b'=
):Wenn Sie dies summieren, erhalten Sie eine einzelne Liste von Listen (elementweise summieren):
ŒṪ
dann gibt uns die (1-indizierten) mehrdimensionalen Indizes der Nicht-Nullen,[[2,3],[4,6]]
dh[[top,left],[bottom,right]]
.r/
dann führt[2,3]r[4,6]
das, dar
vektorisiert, ist wie das[2r4, 3r6]
Auswerten zu[[2,3,4],[3,4,5,6]]
- dh[rows,columns]
.,þ/
führt dann aus,[2,3,4],þ[3,4,5,6]
woþ
eine äußere Produktanweisung ist und,
ist Paar. Dies ergibt alle[row,column]
Werte pro Spalte, in diesem Fall:Wir wollen diese nach Zeilen aufteilen, daher
Z
wird dies verwendet, um Folgendes zu transponieren:Schließlich
œị
zurück Indizes in den Eingangsleitungen:Es ist erwähnenswert, dass, wenn beide Begrenzungszeichen gleich
=€
sind, beide zweimal identifiziert werden, aberSŒṪ
das Richtige getan wird, da dies2
wahr ist, zB mit['a','a']
:quelle
APL (Dyalog) ,
3830 Bytes4 Bytes gespart dank @EriktheOutgolfer
Probieren Sie es online!
quelle
⍸matrix∊separators
finden und mit ihnen nehmen / fallen lassen(⍸a=⎕)↓(1+⍸a=⎕)↑a←⎕
mit⎕io←0
⊃{⌽⊖⍵↓⍨⊃⍸⍺=⍵}/⎕⎕⎕
(sic, mit 3 nachgestellten Quads) was noch kürzer ist. Oder... ⎕⎕(↑⎕)
wenn eine vorgemischte Matrix nicht erlaubt ist.Gelee , 14 Bytes
Probieren Sie es online!
quelle
()
), nicht'()'
. Wenn es syntaktisch analysierbar ist, muss es in Anführungszeichen gesetzt werden. My//
muss jedoch nicht in Anführungszeichen gesetzt werden (Operator für ganzzahlige Teilung ohne Operanden? Hm ...).()
Jelly das nur als eine Art Sonderzeichen interpretiert. Die meisten Zeichenpaare versuche ich zu arbeiten. Ich würde gerne hören, was die Leute, die mit Jelly vertraut sind, denken. EDIT: Ninja-Ed von Erik der OutgolferPython 2 , 130 Bytes
Probieren Sie es online!
quelle
Canvas , 37 Byte
Probieren Sie es hier aus!
36 Bytes zum Abrufen der Koordinaten der Zeichen (und zum Konvertieren in x, y, w, h, da dies
@
erforderlich ist) und 1 Byte zum Abrufen des Unterabschnitts. Es muss einen besseren Ansatz gebenquelle
JavaScript (ES6), 98 Byte
Übernimmt die Eingabe als zwei Ganzzahlen und ein Array von Zeichenfolgen. Gibt ein Array von Zeichenfolgen zurück.
Probieren Sie es online!
Kommentiert
quelle
filter
undmap
?! Würde das Erstellen eines neuen Arrays mitreduce
oder einer rekursiven Lösung nicht kürzer ausfallen? Am Telefon, in der Kneipe, oder ich probiere es selbst aus.X
undY
sind sicher bekannt.Java 10, 204 Bytes
Ändert das Eingabearray, anstatt ein neues zurückzugeben, um Bytes zu sparen. Dies bedeutet, dass entfernte Linien werden
""
stattdessen . Wenn dies nicht erlaubt ist, werde ich es ändern.Probieren Sie es online aus.
Erläuterung:
Beispielsweise:
Mit den Eingängen
start = "("
,end = ")"
undlines =
Die erste Schleife schneidet es oben und links ab und ändert es in:
Die zweite Schleife schneidet es unten und rechts zu und ändert es in:
quelle
Retina 0.8.2 , 110 Bytes
Probieren Sie es online! Erläuterung:
Löschen Sie die Eingabezeilen vor der ersten Zeile des Feldes.
Befindet sich das Startzeichen in der linken Spalte der Eingabe, löschen Sie es.
Wenn das Startzeichen noch nicht gelöscht wurde, verschieben Sie alle Eingabespalten um eins nach links und wiederholen Sie den Vorgang von Anfang an.
Löschen Sie das Endzeichen und alles in der Eingabe nach dem Endzeichen.
Kürzen Sie alle Zeilen auf die Länge der nächsten Zeile. Dies funktioniert, indem alle bis auf ein Zeichen in jeder Zeile gezählt werden und dann versucht wird, bis zu dieser Anzahl von Zeichen in der nächsten Zeile übereinzustimmen. Gelingt dies, war die zweite Zeile kürzer, sodass das letzte Zeichen gelöscht und die Schleife wiederholt wird.
quelle
C (gcc) , 237 Bytes
Probieren Sie es online!
Ich bin mir zu 99% sicher, dass dies mit einer Art Hilfsfunktion verkürzt werden kann, um den horizontalen Index eines Zeichens und den Zeiger auf ein Zeichen zu finden, da er zweimal wiederholt wird. Leider konnte ich nicht kurz genug finden, um es zu tun, ich kann es später noch einmal versuchen, wenn ich die Zeit finde.
Beschreibung
quelle
Stax , 15 Bytes
Führen Sie es aus, und debuggen Sie es
In der ersten Eingabezeile werden die Box-Trennzeichen (1 oder 2) verwendet. Der Rest der Zeilen ist der Eingabe-Body.
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle