Konvertieren Sie Exponenten in ASCII-Kunst


28

Aufgabe

Ihre Aufgabe ist es, Zeichenfolgen wie folgt zu konvertieren:

abc^d+ef^g + hijk^l - M^NO^P (Ag^+)

So schreiben Sie:

   d   g       l    N P    +
abc +ef  + hijk  - M O  (Ag )

Welches ist eine Annäherung an abc d + ef g + hijk l - M N O P (Ag + )

In Worten, heben Sie die Zeichen direkt neben den Einfügemarken in die obere Zeile, ein Zeichen für ein Einfügemarke.

Technische Daten

  • Zusätzliche nachgestellte Leerzeichen in der Ausgabe sind zulässig.
  • m^n^oAls Eingabe werden keine verketteten Carets wie angegeben.
  • Auf ein Caret folgt nicht sofort ein Leerzeichen oder ein anderes Caret.
  • Einem Caret wird nicht sofort ein Leerzeichen vorangestellt.
  • Allen Carets wird mindestens ein Zeichen vorangestellt, gefolgt von mindestens einem Zeichen.
  • Die Eingabezeichenfolge enthält nur druckbare ASCII-Zeichen (U + 0020 - U + 007E).
  • Anstelle von zwei Ausgabezeilen können Sie auch ein Array mit zwei Zeichenfolgen ausgeben.

Für diejenigen, die Regex sprechen: Die Eingabezeichenfolge entspricht dieser Regex:

/^(?!.*(\^.\^|\^\^|\^ | \^))(?!\^)[ -~]*(?<!\^)$/

Bestenliste


2
@TimmyD "Die Eingabezeichenfolge enthält nur druckbare ASCII-Zeichen (U + 0020 - U + 007E)"
Leaky Nun

3
Warum bei Exponenten anhalten? Ich möchte etwas, das mit H_2O zurechtkommt!
Neil

1
@Neil Dann stell deine eigene Herausforderung und ich kann diese Herausforderung als Duplikat dieser schließen. :)
Undichte Nonne

1
Anhand Ihres Beispiels würde ich sagen, dass es sich um Superindizes handelt , nicht unbedingt um Exponenten
Luis Mendo

4
Diejenigen, die Regex sprechen, stammen aus einem sehr regulären Land, in dem der Ausdruck stark eingeschränkt ist. Die häufigste Todesursache ist katastrophales Backtracking.
David Conrad

Antworten:


19

V , 15 14 Bytes

ÄÒ +òf^xxé kPj

Probieren Sie es online!

Eine ziemlich einfache Lösung. Die perfekte Herausforderung für V!

Erläuterung:

Ä                "Duplicate this current line
 Ò               "Replace this line with spaces
   +             "Move to the beginning of the next line
    ò         ò  "Recursively (The second ò is implicit):
     f^          "  Find a caret
       xx        "  Delete two characters. The second will be saved into the main register
         é       "  Insert a space
           k     "  Move up
            P    "  Paste from the main register
             j   "  Move down

Abhängig von der Funktionsweise der Rekursion wird dies zweckmäßigerweise einmal für jedes einzelne Caret ausgeführt.


2
vim ist die perfekte sprache für diese herausforderung. +1
Downgoat

18

Cheddar, 77 72 67 Bytes

l->l.chars.vfuse.replace("^\n"," ").lines.map(j->"%-2s"%j).turn(3)

Kein Regex!

Ich liebe diese Antwort, da es eine wunderbare Demonstration von Cheddars Fähigkeiten ist. Hauptsächlich dank der von Conor hinzugefügten Ersetzungsfunktion. Der PR für die Entwicklung wurde nie erstellt, so dass die Ersetzungsfunktion nur für diesen Zweig vorhanden ist (Update: Ich habe den PR erstellt und jetzt für den neuesten Beta-Zweig, mit dem Sie ihn installieren können npm install -g cheddar-lang).

Ich habe einen Weg gefunden, um Golf zu spielen, aber leider führt ein Versehen dazu, dass die Artikellängen nicht gleich sind:

["   denifednud   denifednug       denifednul    denifednuN denifednuP    denifednu+ ", "abcdenifednu +efdenifednu  + hijkdenifednu  - Mdenifednu Odenifednu  (Agdenifednu )"]

Ich hätte mit regulären Ausdrücken eine Menge Bytes sparen können, und tatsächlich habe ich gerade reguläre Ausdrücke für Cheddar erstellt ... das einzige Problem ist, dass es keine regulären Ausdrücke gibt: /

Erläuterung

l->                    // Function take input as `l`
   l.chars             // Get array of chars in input
   .vfuse              // Join with newlines
   .replace("^\n"," ") // Replace `^\n` with a space globally
   .lines              // Get the lines (see below for more details on what this returns)
   .map(j->            // Loop through each "line" `j` is arg
       "%-2s"          // C-like printf format.
                       // think of as: padRight(j, " ", 2)
                       // see below for more details
        % j            // Pass j as the string to insert
   ).turn(3)           // Turn the string 270 degrees (see below)
   .vfuse              // Vertically fuse to get result (this is not needed as we can output an array of the lines)

Zum besseren Verständnis. Dafür .lineskehrt zurück1^2

["1", " 2"]

das .turnmit drehen das:

1
 2

in:

 2
1

Ein weiteres Beispiel, das es klarer machen wird:

1
 2
2
 2

wird:

 2 2
1 2

Warum formatieren?

Was der %-2smacht ist ziemlich einfach. %Gibt an, dass ein "Format" gestartet wird oder dass an dieser Stelle eine Variable in diese Zeichenfolge eingefügt wird. -bedeutet, die Zeichenfolge mit der rechten Maustaste aufzufüllen, und 2ist die maximale Länge. Standardmäßig wird mit Leerzeichen aufgefüllt. sGibt nur an, dass es sich um eine Zeichenfolge handelt. Um zu sehen, was es tut:

"%-2s" % "a"  == "a "
"%-2s" % " a" == " a"

2
: Ich stimme Cheddar immer zu.
DJMcMayhem

@ DrGreenEggsandIronMan: D Danke
Downgoat

1
Cheddar haben eine turnMethode für Streicher?
TuxCrafting

6
-1 Der Name dieser Sprache macht mich immer hungrig.
drehte sich nicht mehr gegen den Uhrzeigersinn

@ TùxCräftîñg nur für 2D-Arrays, deshalb habe ich .lines verwendet, um die Linien zu erhalten.
Downgoat

10

Perl, 21 + 1 = 22 Bytes

say'';s/\^(.)/♥[A\1↓/

Laufen Sie mit der -pFlagge. Ersetzen Sie durch ein unformatiertes ESCByte ( 0x1b) und durch einen vertikalen Tabulator ( 0x0b).

Die vertikale Registerkarte ist die Idee von Martin Ender. Es hat zwei Bytes gespart! Vielen Dank.


Müssten Sie den Cursor nicht am Anfang eine Zeile nach unten bewegen, damit die Exponenten die letzte Konsolenaufforderung nicht überlappen?
Martin Ender

Da war ich mir nicht sicher. Ich bin davon ausgegangen, dass ich so viel Platz habe, wie ich brauche, aber vielleicht ist das ein bisschen schummelhaft. (Im Allgemeinen bin ich nicht sehr stolz darauf, Cursorbewegungen zu verwenden, um diese Art von Problem zu lösen, aber es ist das erste, was mir in den Sinn kam ...)
Lynn

2
Ich denke, es ist eine gute Lösung, aber das Ergebnis sollte visuell nicht von dem beabsichtigten Ausdruck der Zeichenfolge zu unterscheiden sein.
Martin Ender

1
Was für eine schöne Lösung
Thomas Weller

7

JavaScript (ES6), 56-55 Byte

s=>[/.(\^(.))?/g,/\^.(())/g].map(r=>s.replace(r,' $2'))

Regexps zur Rettung natürlich. Der erste ersetzt alle Zeichen durch Leerzeichen, es sei denn, er findet ein Caret. In diesem Fall löscht er das Caret und behält das Zeichen danach bei. (Diese Zeichen sind garantiert vorhanden.) Das zweite ist das offensichtliche, bei dem jedes Caret und das folgende Zeichen durch ein Leerzeichen ersetzt werden.

Bearbeiten: 1 Byte gespart dank @Lynn, der einen Weg gefunden hat, die Ersetzungszeichenfolge für die zweite Ersetzung wiederzuverwenden, sodass die Ersetzung über ein Array von regulären Ausdrücken abgebildet werden kann.


2
Sieht aus wie s=>[/.(\^(.))?/g,/\^.(())/g].map(r=>s.replace(r,' $2'))ist ein Byte kürzer.
Lynn

@Lynn Das ist ein wirklich listiger Trick!
Neil

7

Python 3, 157 101 98 85 83 74 Bytes

Diese Lösung verfolgt, ob das vorherige Zeichen vorhanden war ^, und entscheidet dann basierend darauf, ob die Ausgabe in die erste oder zweite Zeile erfolgt.

Ausgänge als Array von ['firstline', 'secondline'].

a=['']*2
l=0
for c in input():x=c=='^';a[l]+=c*x;a[~l]+=' '*x;l=x
print(a)

Gespeichert 13 15 Bytes dank @LeakyNun!

7 Bytes gespart dank @Joffan!


1
Schöner endlicher Automat.
Undichte Nonne

Wäre es besser, zu haben a=['','']und zu verketten ' 'und cdirekt in a[l]und a[~l]?
Joffan

6

Python 2, 73 Bytes

l=['']*2;p=1
for c in input():b=c!='^';l[p]+=c*b;l[~p]+=' '*b;p=b
print l

Kein Regex. Erinnert sich, ob das vorherige Zeichen war ^, und setzt das aktuelle Zeichen darauf basierend in die oberste oder unterste Zeile und ein Leerzeichen in das andere.


4

Pyth, 17 Bytes

CcsmX~Z1j;d;cQ\^2

             Q      input string
            c \^    split on '^'
   m                map for sections d:
    X      ;          insert a space at index:
     ~Z1                the old value of Z (initially 0), before setting Z to 1
                      into:
        j;d             the section joined on spaces
  s                 concatenate
 c              2   chop into groups of 2
C                   transpose

Gibt ein Array mit 2 Zeichenfolgen zurück. (Bereite dich jdarauf vor, sie mit einem Zeilenumbruch zu verbinden.)

Probieren Sie es online aus .


1
Ich kann nicht aufhören, mich zu fragen, wie Ihr Nachname ausgesprochen wird. : D
Lynn

4

MATL , 18 Bytes

94=t1YSt~&vG*cw~Z)

Probieren Sie es online!

94=    % Take input implicitly. Create logical array of the same size that contains
       % true for carets, false otherwise
t      % Push a copy of this array
1YS    % Circularly shift 1 unit to the right. This gives an array that contains true
       % for the elements right after a caret (superindices), and false for the rest 
t~     % Push a copy and negate
&v     % Concatenate vertically. This gives a 2D, 2-row array
G*     % Push the input again, multiply with broadcast. This gives a 2D array in
       % which the first row contains the superindices (characters after a caret)
       % and 0 for the rest; and the second row contains the non-superindices and
       % 0 for the superindices
c      % Convert to char
w      % Swap. Brings to top the array containing true for carets and false otherwise
~      % Negate
Z)     % Use as logical index to remove rows that contain carets. Display implicitly

4

Ruby, 47 + 1 ( -nFlag) = 48 Bytes

puts$_.gsub(/\^(.)|./){$1||" "},gsub(/\^./," ")

Führen Sie es so aus: ruby -ne 'puts$_.gsub(/\^(.)|./){$1||" "},gsub(/\^./," ")'


Ich denke, Sie können 1 Byte mit $_=$_.gsub(/\^(.)|./){$1||" "}+gsub(/\^./," ")und -panstelle von speichern -n.
Dom Hastings

1
@DomHastings Unabhängig davon, ob es funktioniert oder nicht, Ihr Code scheint keine neue Zeile zu haben, und das Hinzufügen +$/bedeutet, dass keine Bytes gespart werden. putswirft für Sie automatisch den Zeilenumbruch ein, wenn der ,zwischen den Argumenten steht.
Value Ink

Oh ... Ich habe es mit getestet, ruby -p ... <<< 'input'aber ich stimme zu, wenn die neue Zeile fehlt, ist es nicht gut! Eigentlich hätte ich vielleicht früher in meinen Tests einen Zeilenvorschub angehängt bekommen ... Es war aber in Arbeit, also kann ich nicht nachsehen!
Dom Hastings

@DomHastings Wenn ich es noch einmal betrachte, schätze ich, dass es daran liegt, dass getsdie nachgestellte Newline die meiste Zeit mit einbezogen wird. Wenn Sie jedoch eine Datei einfügen, die die nachgestellte Newline nicht enthält, wird sie nicht angezeigt und die Ausgabe ist falsch . Testen Sie Ihren Code mit, ruby -p ... inputfileda Ruby den Code getsin die Datei umleitet , wenn es sich um ein Befehlszeilenargument handelt.
Value Ink

Verstanden, macht vollkommen Sinn. Ich vermute, eine nachgestellte Zeile in der Datei würde das Problem ebenfalls beheben. Ich bin in keiner Weise ein fähiger Rubinist, also habe ich das Gefühl, heute ein bisschen mehr darüber gelernt zu haben. Vielen Dank!
Dom Hastings

3

Python (2), 76 68 67 Bytes

-5 Bytes dank @LeakyNun

-3 Bytes dank @ KevinLau-notKenny

-1 Byte dank @ValueInk

-0 Bytes dank @DrGreenEggsandIronMan

import re
lambda i,s=re.sub:[s("(?<!\^).\^?"," ",i),s("\^."," ",i)]

Diese anonyme Lambda-Funktion verwendet die Eingabezeichenfolge als einziges Argument und gibt die beiden durch eine neue Zeile getrennten Ausgabezeilen zurück. Um es zu nennen, geben Sie ihm einen Namen, indem Sie "f =" davor schreiben.

Ziemlich einfacher regulärer Ausdruck: Der erste Teil ersetzt das Folgende durch ein Leerzeichen: ein beliebiges Zeichen und ein Karotten- Caret oder nur ein Char, aber nur, wenn kein Caret vor ihnen steht. Der zweite Teil ersetzt ein beliebiges Caret in der Zeichenfolge und das Zeichen danach durch ein Leerzeichen.


@LeakyNun: Ich habe mich aus irgendeinem Grund gefragt, ob 1. auch gilt, wenn ich Bibliotheken importiere. Kopierte gerade 2. in diese Frage, als ich Ihren Kommentar sah. Danke an dich und Kevin!
Karl Kastor

Sie könnten ein Byte mitfrom re import*
DJMcMayhem

@DrGreenEggsandIronMan Dies scheint genau die gleiche Anzahl von Bytes zu verwenden. (siehe oben)
KarlKastor

Behalten Sie die alte Importanweisung bei und tun Sie dies lambda i,s=re.sub:[s("(?<!\^).\^?"," ",i),s("\^."," ",i)]für -1 Byte
Value Ink.


2

Netzhaut, 16 Bytes

S`^
\^(.)
♥[A$1↓

Ein Port meiner Perl-Antwort, auf den Martin Ender hingewiesen hat. Ersetzen Sie durch ein unformatiertes ESCByte ( 0x1b) und durch einen vertikalen Tabulator ( 0x0b).


2

shell + TeX + catdvi, 51 43 bytes

tex '\empty$'$1'$\end'>n;catdvi *i|head -n2

Verwendet tex, um einige schöne Mathematik zu setzen, und verwendet catdvi, um eine Textdarstellung zu machen. Der Befehl head entfernt ansonsten vorhandenen Junk (Seitennummerierung, Zeilenumbruch).

Bearbeiten: Warum das lange, richtige, Ding machen und umleiten, /dev/nullwenn man Nebeneffekte ignorieren und in eine einzelne Briefdatei schreiben kann?


Beispiel

Eingang: abc^d+ef^g + hijk^l - M^NO^P (Ag^+)

TeX-Ausgabe (auf Gleichung beschnitten): "Schöne" Mathematik! Endausgabe:

   d   g     l  N P   +
abc +ef +hijk -M O (Ag )

Annahmen: Beginnen Sie in einem leeren Verzeichnis (oder einem Verzeichnis, dessen Name nicht mit "i" endet). Die Eingabe ist ein einzelnes Argument für das Shell-Skript. Die Eingabe ist keine leere Zeichenfolge.

Jemand sagt mir, ob dies vor allem Regelmissbrauch ist catdvi.


2

Haskell, 74 56 55 Bytes

g('^':c:r)=(c,' '):g r
g(c:r)=(' ',c):g r
g x=x
unzip.g

Gibt ein Stringpaar zurück. Anwendungsbeispiel: unzip.g $ "abc^d+e:qf^g + hijk^l - M^NO^P: (Ag^+)"->(" d g l N P + ","abc +e:qf + hijk - M O : (Ag )")

gerstellt eine Liste von Paaren, wobei das erste Element das Zeichen in der oberen Zeile und das zweite Element das Zeichen in der unteren Zeile ist. unzipverwandelt es in ein Paar Listen.

Edit: @xnor vorgeschlagen, unzipdie 18 Bytes speichert. @Laikoni hat ein weiteres Byte zum Speichern gefunden. Vielen Dank!


Schaffst du das j=unzip.g?
Xnor

@xnor: oh, wie dumm von mir, das nicht selbst zu sehen! Vielen Dank!
nimi

Sie können ersetzen g[]=[]mit g x=xeinem Byte zu speichern.
Laikoni

@ Laikoni: Gut gesehen! Vielen Dank!
nimi

1

Perl, 35 Bytes

34 Byte Code + 1 für -p

$_=s/\^(.)|./$1||$"/ger.s/\^./ /gr

Verwendung

perl -pe '$_=s/\^(.)|./$1||$"/ger.s/\^./ /gr' <<< 'abc^d+ef^g + hijk^l - M^NO^P (Ag^+)'
   d   g       l    N P    + 
abc +ef  + hijk  - M O  (Ag )

Hinweis: Dies ist genau das Gleiche wie die Antwort von Value Ink , die ich später ausspioniert habe. Wird bei Bedarf entfernt, da dies die Ruby-Lösung nicht wirklich erweitert.


1

Java 8 Lambda, 132 128 112 Zeichen

i->{String[]r={"",""};for(char j=0,c;j<i.length();j++){c=i[j];r[0]+=c==94?i[++j]:32;r[1]+=c==94?32:c;}return r;}

Die ungolfed version sieht so aus:

public class Q86647 {

    static String[] printExponents(char[] input) {
        String[] result = {"",""};
        for (char j = 0, c; j < input.length(); j++) {
            c = input[j];
            result[0] += c == 94 ? input[++j] : 32;
            result[1] += c == 94 ? 32 : c;
        }
        return result;
    }
}

Wird als Array ausgegeben, indem einfach geprüft wird, ob ein Caret vorhanden ist. Wenn dies der Fall ist, wird das nächste Zeichen in die obere Zeile eingefügt, andernfalls wird ein Leerzeichen angezeigt.


Aktualisierung

Ersetzte Zeichen mit ihren ASCII-Werten, um 4 Zeichen zu speichern.

Vielen Dank an @LeakyLun für den Hinweis, stattdessen ein char-Array als Eingabe zu verwenden.

Vielen Dank auch an @KevinCruijssen für die Umstellung intauf char, um weitere Zeichen zu speichern.


Sie können versuchen, einzugeben char[]und zu verwenden, for(char c:i)um festzustellen, ob die Byteanzahl verringert werden kann.
Undichte Nonne

Sie können es ein wenig auf 110 Bytes reduzieren, indem Sie: i->{String[]r={"",""};for(char j=0,c;j<i.length;j++){c=i[j];r[0]+=c==94?i[++j]:32;r[1]+=c==94?32:c;}return r;}with "abc^d+ef^g + hijk^l - M^NO^P (Ag^+)".toCharArray()als Eingabe verwenden. ( Ideone dieser Änderungen. )
Kevin Cruijssen

1

Kokosnuss , 122 114 96 Bytes

Edit: 8 26 Bytes mit Hilfe von Leaky Nun.

def e(s,l)=''==l and s or"^"==l[0]and l[1]+e(s+' ',l[2:])or' '+e(s+l[0],l[1:])
f=print..e$('\n')

Wie ich heute erfuhr, hat Python einen ternären bedingten Operator, oder zwei davon: <true_expr> if <condition> else <false_expr>und der <condition> and <true_expr> or <false_expr>letzte kommt mit einem Zeichen weniger.
Eine Python- konforme Version kann ideonisiert werden .


Erster Versuch:

def e(s,l):
 case l:
  match['^',c]+r:return c+e(s+' ',r)
  match[c]+r:return' '+e(s+c,r)
 else:return s
f=print..e$('\n')

Mit f("abc^d+ef^g + hijk^l - M^NO^P (Ag^+)")Abzügen telefonieren

   d   g       l    N P    +
abc +ef  + hijk  - M O  (Ag )

Hat jemand schon versucht, in Kokosnuss zu golfen? Es bereichert Python mit mehr funktionalen Programmierkonzepten wie dem oben verwendeten Pattern Matching und der Funktionsverkettung (mit ..). Da dies mein erster Versuch bei Kokosnuss ist, würden alle mögliche Spitzen geschätzt.

Dies könnte definitiv verkürzt werden, da jeder gültige Python-Code auch eine gültige Kokosnuss ist und kürzere Python-Antworten veröffentlicht wurden. Ich habe jedoch versucht, eine rein funktionale Lösung zu finden.


Ich denke, Sie können ternäre Operatoren ( x and y or z) verwenden, um die zu ersetzen case.
Undichte Nonne

Sie können sogar s[0]=="^"anstelle vonmatch['^',c]+r in l
Leaky Nun

@LeakyNun Wenn ich ersetzen match['^',c]+rmit s[0]=="^", dann cund rsind nicht mehr gebunden. Wie würde das helfen?
Laikoni

Sie können verwenden s[1], um zu ersetzen cund s[2:]zu ersetzen r.
Undichte Nonne

dann können Sie jetzt ternary verwenden.
Undichte Nonne

0

Dyalog APL, 34 Bytes

{(0 1=⊂b/¯1⌽b){⍺\⍺/⍵}¨⊂⍵/⍨b←⍵≠'∧'}

Es wird ein Vektor mit zwei Elementen mit den beiden Linien zurückgegeben

Probelauf (der vordere Pfeil dient zum Formatieren des zweielektrischen Vektors für den menschlichen Verzehr):

      ↑{(0 1=⊂b/¯1⌽b){⍺\⍺/⍵}¨⊂⍵/⍨b←⍵≠'∧'}'abc∧d+ef∧g + hijk∧l - M∧NO∧P (Ag∧+)'
   d   g       l    N P    + 
abc +ef  + hijk  - M O  (Ag )

Zu Ihrem Kommentar zu meiner Frage zu Code, der nichts tut: Ja, der von Ihnen eingegebene Code zählt.
Haykam

0

PowerShell v2 +, 88 83 Byte

-join([char[]]$args[0]|%{if($c){$_;$b+=' '}elseif($_-94){$b+=$_;' '}$c=$_-eq94});$b

Ein bisschen länger als die anderen, zeigt aber ein bisschen PowerShell-Magie und eine etwas andere Logik.

Im Wesentlichen dasselbe Konzept wie die Antwort von Python - wir durchlaufen die Eingabe zeichenweise, merken uns, ob es sich bei dem vorherigen um ein Caret ( $c) handelte, und setzen das aktuelle Zeichen an die entsprechende Stelle. Die Logik und Methode zum Bestimmen, wo ausgegeben werden soll, wird jedoch etwas anders gehandhabt, und zwar ohne Tupel oder separate Variablen. Wir testen, ob das vorherige Zeichen ein Caret war, und geben das Zeichen in die Pipeline aus und verketten ein Leerzeichen darauf $b. Andernfalls prüfen wir, ob das aktuelle Zeichen ein Caret ist. elseif($_-94)Solange dies nicht der Fall ist , verketten wir das aktuelle Zeichen $bund geben ein Leerzeichen in der Pipeline aus. Zuletzt stellen wir ein, ob der aktuelle Charakter ein Caret für die nächste Runde ist.

Wir sammeln diese Zeichen aus der Pipeline in Parens, kapseln sie in eine, -joindie sie in eine Zeichenfolge verwandelt, und belassen sie zusammen mit $bin der Pipeline. Die Ausgabe am Ende erfolgt implizit mit einem Zeilenumbruch dazwischen.

Zum Vergleich ist hier ein direkter Port von @ xnors Python-Antwort mit 85 Bytes :

$a=,''*2;[char[]]$args[($l=0)]|%{$a[!$l]+="$_"*($c=$_-ne94);$a[$l]+=' '*$c;$l=!$c};$a

0

Gema, 42 41 Zeichen

\^?=?@set{s;$s }
?=\ @append{s;?}
\Z=\n$s

Gema verarbeitet Eingaben als Stream, daher müssen Sie sie in einem Durchgang lösen: Die erste Zeile wird sofort als verarbeitet geschrieben, die zweite Zeile wird in der Variablen $ s gesammelt und am Ende ausgegeben.

Probelauf:

bash-4.3$ gema '\^?=?@set{s;$s };?=\ @append{s;?};\Z=\n$s' <<< 'abc^d+ef^g + hijk^l - M^NO^P (Ag^+)'
   d   g       l    N P    +  
abc +ef  + hijk  - M O  (Ag )

0

Zimtgummi, 21 Bytes

0000000: 5306 6533 bd92 d1db 8899 8381 a2f8 8f8c  S.e3............
0000010: 1230 249e a1                             .0$..

Nicht konkurrierend. Probieren Sie es online aus.

Erläuterung

Ich bin kein großer Regex-Golfer, also gibt es wahrscheinlich einen besseren Weg, dies zu tun.

Die Zeichenfolge wird dekomprimiert, um:

S(?<!\^)[^^]& &\^&`S\^.& 

(Beachten Sie das nachfolgende Leerzeichen)

Die erste SStufe empfängt Eingaben und verwendet einen negativen Lookbehind, um alle Zeichen außer Carets ohne vorangestelltes Caret durch ein Leerzeichen zu ersetzen. Anschließend werden alle Carets gelöscht. Anschließend wird die geänderte Eingabezeichenfolge sofort mit einem Zeilenumbruch ausgegeben und diese SStufe entfernt. Da STDIN jetzt erschöpft ist und die vorherige Stufe keine Eingabe Sgeliefert hat, empfängt die nächste Stufe die letzte Zeile von STDIN erneut und ersetzt dann alle Carets, gefolgt von einem beliebigen Zeichen, mit einem Leerzeichen und gibt dieses aus.

Im Perl-Pseudocode:

$first_stage_sub_1 = ($input =~ s/(?<!\^)[^^]/ /gr);
$first_stage_sub_2 = ($first_stage_sub_1 =~ s/\^//gr);
print $first_stage_sub_2, "\n";

$second_stage_sub = ($input =~ s/\^./ /gr);
print $second_stage_sub, "\n";

0

J , 28 27 Bytes

0|:t#]{."0~_1-_1|.t=.'^'~:]

Probieren Sie es online!

                  t=.'^'~:]    0 for ^, 1 for the rest, define t
              _1|.             Shift right, now zeroes are for superscripts         
     ]{."0~_1-                 Prepend that many spaces to each character
   t#                          Remove the rows with carets
0|:                            Transpose

Es muss einen besseren Weg geben ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.