Chevrons in Soliduses umrechnen

23

Schreiben eines Programms , das in einer Zeichenkette , die nur Leerzeichen, Zeilenumbrüche nimmt und spitze Klammern: <, >( Chevrons ). Geben Sie eine Folge von Leerzeichen, Zeilenumbrüchen und Schrägstrichen aus :, ( Soliduses ), deren Formen der Eingabe entsprechen, die jedoch um eine Vierteldrehung im Uhrzeigersinn gedreht wurden, wobei eine Spalte mit Leerzeichen zwischen den einzelnen Zeilen der ursprünglichen Eingabe eingefügt/ wurde \(aus Gründen der Ästhetik).

Wenn die Eingabe beispielsweise wie folgt lautet:

<>

Die Ausgabe wäre:

/\
\/

Wenn die Eingabe wie folgt lautet:

><<<>
 <><

Die Ausgabe wäre:

   \/
/\ /\
\/ /\
/\ /\
   \/

Wenn die Eingabe wie folgt lautet:

>>  <<
<>  <>
  <
  ><

Die Ausgabe wäre:

      /\ \/
      \/ \/
\/ /\    
/\      
      /\ /\
      \/ /\

Beachten Sie, dass in den letzten beiden Beispielen eine einzelne Spalte mit Leerzeichen zwischen den ursprünglichen Eingabezeilen vorhanden ist.

Sie können ein vollständiges Programm schreiben, das die Eingabe auf jede übliche Weise (Befehlszeile, stdin) übernimmt und die Ausgabe ausgibt, oder Sie können eine Funktion mit einem String-Argument schreiben, das die Ausgabe ausgibt oder zurückgibt.

Leere führende und nachfolgende Zeilen oder Spalten mit Leerzeichen in der Eingabe müssen nicht in der Ausgabe vorhanden sein. Außerdem kann die Ausgabe an beliebigen Stellen eine beliebige Anzahl von führenden und / oder nachfolgenden Leerzeichen und / oder Zeilenumbrüchen enthalten, sofern die resultierenden Formen korrekt sind. Mit anderen Worten, die Übersetzung der ASCII-Kunst spielt keine Rolle, nur die Formen und ihre Beziehung zueinander .

Optional können Sie davon ausgehen, dass die Eingabe eine nachgestellte Newline enthält.

Der kürzeste Code in Bytes gewinnt.

Calvins Hobbys
quelle
Dürfen wir annehmen, dass die Eingabe rechteckig ist und nachgestellte Leerzeichen enthält?
Orlp
@orlp Nein. Sie können eine abschließende Newline annehmen, diese muss jedoch nicht rechteckig sein.
Calvins Hobbys

Antworten:

4

CJam, 35 Bytes

qN/_s,S*f+{iD%[S3*" \/"_$]=}f%W%zN*

Probieren Sie es hier online aus

Optimierer
quelle
Ich hatte fast genau den gleichen Code, aber ohne diesen cleveren $Trick waren es immer noch 37 Bytes ...
Dennis
Dieser $Trick hat mir schon oft das Leben gerettet;)
Optimizer
3

CJam, 37 Bytes

qN/_z,S*f{+"< >""/\    \/ "3/er}W%zN*

Versuchen Sie es online in dem CJam Dolmetscher .

Wie es funktioniert

qN/                                   e# Read from STDIN and split at linefeeds.
   _z,                                e# Zip a copy and push the results length.
                                      e# This computes the maximum line length.
      S*                              e# Repeat " " that many times.
        f{                     }      e# For each line:
                                      e#   Push the string of spaces.
          +                           e#   Append it to the line.

           "< >""/\    \/ "3/         e#   Push "< >" and ["/\ " "   " "\/ "].
                             er       e#   Perform transliteration.
                                W%z   e# Reverse the lines and zip.
                                      e# This rotates by 90 degrees.
                                   N* e# Join, separating by linefeeds.  
Dennis
quelle
2

Python 2, 105 Bytes

def f(s):
 for row in map(None,*s.split("\n")):print" ".join("\/ /\ "[1-cmp(c,"<")::3]for c in row[::-1])

Aus all den falschen Gründen muss dies eine der schönsten Anwendungen sein, die map(None, ...)ich bisher hatte. Die Ausgabe füllt sich sogar zu einem perfekten Rechteck.

Nehmen wir das zweite Beispiel:

><<<>
 <><

map(None,*s.split("\n"))führt eines armen Mannes aus zip_longestund gibt:

[('>', ' '), ('<', '<'), ('<', '>'), ('<', '<'), ('>', None)]

Beachten Sie, dass die zweite Zeile kürzer ist als die erste, sodass Noneam Ende eine angezeigt wird. Normalerweise wäre dies ein Problem, aber aus irgendeinem Grund ist in Python 2 fast alles vergleichbar, insbesondere nicht

>>> None < ""
True

Dies bedeutet , dass der Ausdruck 1-cmp(c,"<")kehrt 0, 1, 2für ">", "<", Nonejeweils, so dass wir den String Slicing Trick verwenden , um einen von zu extrahieren "\/", "/\", " ". Auf diese Weise drucken wir die Ausgabe zeilenweise aus und verbinden die 2-Zeichen-Gruppen mit Leerzeichen.

Sp3000
quelle
+1 Dies ist die Lösung, die ich in meinem Kopf sah, als ich die Frage las, sollte nicht überrascht sein, dass sie bereits hier war: P
Kade
1

Scala, 201 188 180 Zeichen

(s:String)(Seq("")0/:s.lines.flatMap(l⇒Seq(l,l))){case((v,i),l)(l.map(c⇒if(Set('>','<')(c))if(c%4==i)'/'else'\\'else c)+:v,2-i)}._1.init.transpose.map(_.mkString).mkString("\n")

Hinweis:

Dies funktioniert nur, wenn die angegebene Zeichenfolge alle Zeilen mit der gleichen Länge enthält (dh mit Leerzeichen aufgefüllt).

Erläuterung:

Ich verwende fold mit dem Anfangswert von tuple of a Seq[String]und an Int(anstatt zu schreiben, Seq.empty[String]schreibe ich den kürzeren Seq("")und .initnach dem fold), der fold bearbeitet eine Sammlung von Strings, jeder String ist eine Zeile in der ursprünglichen Eingabe und jede Zeile ist verdoppelt. Der Trick dabei war, das Modulo des Zeichens zu testen. Da der '<'Wert 60 und der '>'Wert 62 ist, ergibt das Testen auf Modulo 4 0 oder 2. Aus diesem Grund enthält die Falte auch ein Flip- IntSet auf 0 und ein Flip- Set zwischen 0 und 2 mit 2-i. Jede ungerade Zeile sollte '>'auf '/'und '<'auf '\\'und jede gerade Zeile sollte '>'auf '\\und '<'auf abbilden '/'. Deshalb teste ich fürc%4==iund 2 Fliegen mit 1 Stein schlagen. Die Falte "baut" die ursprüngliche Folge von Strings in umgekehrter Reihenfolge wieder auf, und dann transponiere ich (nach dem Ablegen der letzten Zeile) die Folge (aus diesem Grund müssen alle Strings exakt die gleiche Länge haben). wegen der damit verbundenen impliziten muss ich in _.mkStringjeder zeile (vorher spalte) und dann mkString("\n")für die endgültige ausgabe.

Gilad hoch
quelle
0

Perl - 119

@l=map[/./g],reverse<>;do{print;$_=join(' ',map({'<'=>'/\\','>'=>'\/'}->{$_->[$b]}||'  ',@l))."\n";$b++;}while(/[^ 
]/)

Zunächst @lwird eine Liste mit Listen zugewiesen, die die Zeichen in jeder Eingabezeile in umgekehrter Reihenfolge darstellen. Anschließend werden die Zeichenspalten durchlaufen, die spitzen Klammern durch die entsprechenden Schrägstriche ersetzt, die Elemente mit Leerzeichen verbunden und die verbundenen Schrägstriche als Linie gedruckt.

faubi
quelle