Konwertuj wykładniki na sztukę ASCII

28

Zadanie

Twoim zadaniem jest konwersja ciągów takich jak to:

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

Do ciągów takich jak to:

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

Co jest przybliżeniem do abc d + ef g + hijk l - M N O P (Ag + )

Innymi słowy, podnieś znaki bezpośrednio obok karetek do górnej linii, jeden znak dla jednego karetki.

Okular

  • Dopuszczalne są dodatkowe końcowe spacje w danych wyjściowych.
  • Jako m^n^odane wejściowe nie zostaną podane powiązane łańcuchy .
  • Po karetce nie nastąpi natychmiast spacja ani inna karetka.
  • Kreska nie zostanie natychmiast poprzedzona spacją.
  • Wszystkie opieki poprzedzone będą co najmniej jedną postacią, a po niej co najmniej jedna postać.
  • Łańcuch wejściowy będzie zawierał tylko drukowalne znaki ASCII (U + 0020 - U + 007E)
  • Zamiast dwóch wierszy danych wyjściowych możesz wypisać tablicę dwóch ciągów znaków.

Do tych, którzy mówią regex: ciąg wejściowy będzie pasował do tego wyrażenia regularnego:

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

Tabela liderów

Leaky Nun
źródło
2
@TimmyD „Łańcuch wejściowy będzie zawierał tylko drukowalne znaki ASCII (U + 0020 - U + 007E)”
Leaky Nun
3
Po co zatrzymywać się na wykładnikach? Chcę czegoś, co obsługuje H_2O!
Neil
1
@ Neil Stwórz własne wyzwanie, a ja mogę je zamknąć jako duplikat tego. :)
Leaky Nun
1
Na podstawie twojego przykładu powiedziałbym, że są one superindeksami , niekoniecznie wykładniczkami
Luis Mendo
4
Ci, którzy mówią wyrażenia regularne, pochodzą z bardzo regularnego kraju, w którym ekspresja jest ściśle ograniczona. Główną przyczyną śmierci jest katastrofalny powrót.
David Conrad

Odpowiedzi:

19

V , 15 14 bajtów

ÄÒ +òf^xxé kPj

Wypróbuj online!

Dość proste rozwiązanie. Idealnym wyzwaniem dla V!

Wyjaśnienie:

Ä                "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

Dogodnie, w zależności od tego, jak działa rekurencja, będzie ona działać raz dla każdego pojedynczego kursora.

DJMcMayhem
źródło
2
vim to idealny język do tego zadania. +1
Downgoat
18

Cheddar, 77 72 67 bajtów

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

Brak wyrażenia regularnego!

Uwielbiam tę odpowiedź, ponieważ jest to wspaniała demonstracja umiejętności Cheddara. Głównie dzięki funkcji zamiany dodanej przez Conor. PR do dev nigdy nie został stworzony, więc funkcja zamiany istnieje tylko w tej gałęzi (aktualizacja: Zrobiłem PR i teraz jest w najnowszej wersji beta, którą można zainstalować npm install -g cheddar-lang)

Znalazłem sposób na grę w golfa, ale niestety niedopatrzenie powoduje, że długości przedmiotów nie są takie same:

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

Mógłbym zaoszczędzić wiele bajtów za pomocą wyrażeń regularnych, a tak naprawdę właśnie utworzyłem wyrażenia regularne dla Cheddar ... jedynym problemem jest brak funkcji wyrażeń regularnych: /

Wyjaśnienie

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)

Aby uzyskać lepsze zrozumienie. Po to .lineswraca1^2

["1", " 2"]

.turnz obrócić to:

1
 2

w:

 2
1

Kolejny przykład, który wyjaśni:

1
 2
2
 2

staje się:

 2 2
1 2

Dlaczego formatować?

To, co %-2srobi, jest dość proste. %określa, że ​​rozpoczynamy „format” lub że zmienna zostanie wstawiona do tego ciągu w tym momencie. -oznacza padanie sznurka w prawo i 2jest maksymalną długością. Domyślnie wypełnia się spacjami. spo prostu określa, że ​​jest to ciąg znaków. Aby zobaczyć, co robi:

"%-2s" % "a"  == "a "
"%-2s" % " a" == " a"
Downgoat
źródło
2
: DI zawsze upvote cheddar.
DJMcMayhem
@DrGreenEggsandIronMan: D dziękuję
Downgoat
1
Cheddar ma turnmetodę na łańcuchy?
TuxCrafting
6
-1 nazwa tego języka zawsze powoduje, że jestem głodna.
przestał się obracać w lewo
@ TùxCräftîñg tylko dla tablic 2D, dlatego użyłem .lines, aby uzyskać linie.
Downgoat
10

Perl, 21 + 1 = 22 bajtów

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

Uruchom z -pflagą. Zastąp surowym ESCbajtem ( 0x1b) i pionową tabulacją ( 0x0b).

Pionowa zakładka to pomysł Martina Endera. Zaoszczędził dwa bajty! Dzięki.

Lynn
źródło
Czy nie musisz przesuwać kursora w dół o linię na początku, aby wykładniki nie zachodziły na ostatni monit konsoli?
Martin Ender
Nie byłem tego pewien, tak. Założyłem, że mam tyle miejsca, ile potrzebuję, ale może to trochę podstępne. (Ogólnie rzecz biorąc, nie jestem bardzo dumny z używania ruchów kursora do rozwiązania tego rodzaju problemów, ale to pierwsza rzecz, jaka przyszła mi do głowy ...)
Lynn
2
Myślę, że to dobre rozwiązanie, ale wynik powinien być wizualnie nie do odróżnienia od wydrukowania łańcucha zgodnie z przeznaczeniem.
Martin Ender
1
Cóż za cudowne rozwiązanie
Thomas Weller,
7

JavaScript (ES6), 56 55 bajtów

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

Oczywiście wracać na ratunek. Pierwszy zastępuje wszystkie postacie spacjami, chyba że znajdzie daszek, w którym to przypadku usuwa daszek i zatrzymuje znak za nim. (Gwarantujemy, że te postacie istnieją.) Drugi to oczywisty sposób na zastąpienie każdego karetki i następnego znaku spacją.

Edycja: Zapisano 1 bajt dzięki @Lynn, który wymyślił sposób ponownego użycia ciągu zastępującego dla drugiego zastępowania, umożliwiając zamapowanie zamienionego na tablicy wyrażeń regularnych.

Neil
źródło
2
Wygląda na s=>[/.(\^(.))?/g,/\^.(())/g].map(r=>s.replace(r,' $2'))to, że bajt jest krótszy.
Lynn
@Lynn To naprawdę przebiegły wyczyn!
Neil
7

Python 3, 157 101 98 85 83 74 bajty

To rozwiązanie śledzi, czy poprzedni znak był ^, a następnie decyduje, czy wypisać do pierwszego czy drugiego wiersza na podstawie tego.

Dane wyjściowe jako tablica ['firstline', 'secondline'].

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

Zaoszczędź 13 15 bajtów dzięki @LeakyNun!

Zaoszczędź 7 bajtów dzięki @Joffan!

Miedź
źródło
1
Ładny automat skończony.
Leaky Nun
Byłoby lepiej mieć a=['','']i concatenate ' 'i cbezpośrednio pod a[l]i a[~l]?
Joffan
6

Python 2, 73 bajty

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

Brak wyrażenia regularnego. Zapamiętuje, czy poprzedni znak był ^, i umieszcza bieżący znak w górnej lub dolnej linii na tej podstawie, a spację w drugiej.

xnor
źródło
4

Pyth, 17 bajtów

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

Zwraca tablicę 2 ciągów znaków. (Przygotuj się, jaby dołączyć do nich z nową linią).

Wypróbuj online .

Anders Kaseorg
źródło
1
Nie mogę przestać się zastanawiać, jak wymawia się twoje nazwisko. : D
Lynn
4

MATL , 18 bajtów

94=t1YSt~&vG*cw~Z)

Wypróbuj 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
Luis Mendo
źródło
4

Rubinowy, 47 + 1 ( -nflaga) = 48 bajtów

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

Uruchom tak: ruby -ne 'puts$_.gsub(/\^(.)|./){$1||" "},gsub(/\^./," ")'

Wartość tuszu
źródło
Myślę, że możesz zapisać 1 bajt za pomocą $_=$_.gsub(/\^(.)|./){$1||" "}+gsub(/\^./," ")i -pzamiast -n.
Dom Hastings,
1
@DomHastings bez względu na to, czy działa, czy nie, twój kod nie wydaje się mieć nowej linii, a dodanie +$/oznacza, że ​​nie będzie zapisywać bajtów. putsrzuca ci nowy wiersz automatycznie, gdy ,występuje między argumentami.
Wartość tuszu
Och ... Testowałem przy użyciu, ruby -p ... <<< 'input'ale zgadzam się, jeśli brakuje nowej linii, to nie jest dobrze! Właściwie mogłem wcześniej dodać do moich testów nową linię ... To działało, ale nie mogę sprawdzić!
Dom Hastings
@DomHastings Patrząc na to jeszcze raz, domyślam się, że to dlatego, że getsprzez większość czasu zawiera końcowy znak nowej linii, ale jeśli wstawisz plik, który nie zawiera końcowego znaku nowej linii, to nie pojawi się i wynik będzie niepoprawny . Przetestuj swój kod, ruby -p ... inputfileponieważ Ruby przekierowuje getsdo pliku, jeśli jest to argument wiersza poleceń.
Wartość tuszu
Rozumiem, ma to sens. Myślę, że końcowy znak nowej linii w pliku również rozwiązałby problem. W żadnym wypadku nie jestem biegłym Rubyistą, więc mam wrażenie, że dowiedziałem się dzisiaj trochę więcej. Dzięki!
Dom Hastings,
3

Python (2), 76 68 67 bajtów

-5 bajtów dzięki @LeakyNun

-3 Bajty dzięki @ KevinLau-notKenny

-1 bajtów dzięki @ValueInk

-0 bajtów dzięki @DrGreenEggsandIronMan

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

Ta anonimowa funkcja Lambda przyjmuje ciąg wejściowy jako jedyny argument i zwraca dwie linie wyjściowe oddzielone znakiem nowej linii. Aby go nazwać, należy nadać mu nazwę, pisząc przed nim „f =”.

Całkiem proste wyrażenie: pierwsza część zastępuje spacją: dowolną postacią i karetką marchewki lub tylko char, ale tylko wtedy, gdy nie ma przed nimi karetki. Druga część zastępuje każdy znak w ciągu i znak po nim spacją.

KarlKastor
źródło
@LeakyNun: Z jakiegoś powodu zastanawiałem się, czy 1. zachowuje się również, jeśli importuję biblioteki. Kopiowałem 2. do tego pytania, kiedy zobaczyłem twój komentarz. Dzięki tobie i Kevinowi!
KarlKastor
Możesz zdjąć jeden bajt zfrom re import*
DJMcMayhem
@DrGreenEggsandIronMan Wydaje się, że używa dokładnie takiej samej liczby bajtów. (patrz wyżej)
KarlKastor
Zachowaj starą instrukcję importu i zrób lambda i,s=re.sub:[s("(?<!\^).\^?"," ",i),s("\^."," ",i)]dla -1 bajtów
wartość tuszu
2

Siatkówka, 16 bajtów

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

Port mojej odpowiedzi na Perla, wskazany przez Martina Endera. Zastąp surowym ESCbajtem ( 0x1b) i pionową tabulacją ( 0x0b).

Lynn
źródło
2

shell + TeX + catdvi, 51 43 bajtów

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

Używa texdo pisania pięknej matematyki, a następnie używa catdvido przedstawienia tekstu. Polecenie head usuwa śmieci (numeracja stron, końcowe znaki nowej linii), które w przeciwnym razie są obecne.

Edycja: Dlaczego ta długa, właściwa rzecz i przekierowanie do /dev/nullmomentu, w którym można zignorować efekty uboczne i zapisać w pliku z jedną literą?


Przykład

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

Wyjście TeXa (przycięte do równania): „Piękna” matematyka! Wyjście końcowe:

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

Założenia: Zacznij od pustego katalogu (lub konkretnie katalogu bez nazwy kończącej się na „i”). Dane wejściowe to pojedynczy argument w skrypcie powłoki. Dane wejściowe nie są pustym ciągiem.

Ktoś mi powie, czy to szczególnie nadużycie zasad catdvi.

algmyr
źródło
2

Haskell, 74 56 55 bajtów

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

Zwraca parę ciągów. Przykład użycia: 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 )")

gtworzy listę par, gdzie pierwszy element to znak w górnej linii, a drugi element to znak w dolnej linii. unzipzamienia go w parę list.

Edycja: @xnor zasugerował, unzipco pozwala zaoszczędzić 18 bajtów. @Laikoni znalazł jeszcze jeden bajt do zapisania. Dzięki!

nimi
źródło
Można to zrobić j=unzip.g?
xnor
@xnor: och, jak głupio z mojej strony, że sam tego nie widzę! Wielkie dzięki!
nimi
Można wymienić g[]=[]z g x=xuratować jeden bajt.
Laikoni,
@Laikoni: Dobrze zauważony! Dzięki!
nimi
1

Perl, 35 bajtów

34 bajty kod + 1 dla -p

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

Stosowanie

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 )

Uwaga: jest to dokładnie to samo, co odpowiedź Value Ink , którą później zauważyłem. Usunie w razie potrzeby, ponieważ tak naprawdę nie dodaje się do rozwiązania Ruby.

Dom Hastings
źródło
1

Java 8 lambda, 132 128 112 znaków

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;}

Wersja bez golfa wygląda następująco:

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;
    }
}

Wyprowadza jako tablicę, po prostu sprawdzając, czy jest daszek, a jeśli tak, następny znak zostanie umieszczony w górnym rzędzie, w przeciwnym razie będzie spacja.


Aktualizacje

Zamieniono znaki na wartości ascii, aby zapisać 4 znaki.

Dzięki @LeakyLun za wskazanie, aby zamiast tego użyć tablicy char jako danych wejściowych.

Również dzięki @KevinCruijssen do przełączania intsię charzaoszczędzić trochę więcej znaków.

Frozn
źródło
Możesz spróbować wpisać char[]i użyć, for(char c:i)aby sprawdzić, czy można zmniejszyć liczbę bajtów.
Leaky Nun
Możesz zagrać w golfa nieco do 110 bajtów, używając: 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;}z "abc^d+ef^g + hijk^l - M^NO^P (Ag^+)".toCharArray()jako danych wejściowych. ( Ideon tych zmian. )
Kevin Cruijssen
1

Kokos , 122 114 96 bajtów

Edycja: 8 26 bajtów w dół z pomocą Dziurawej Zakonnicy.

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')

Tak więc, jak się dzisiaj dowiedziałem, python ma trójskładnikowy operator warunkowy, a właściwie dwa z nich: <true_expr> if <condition> else <false_expr>a <condition> and <true_expr> or <false_expr>ostatni z nich ma jeden char mniej.
Wersja idealna do Pythona może być ideonowana .


Pierwsze podejscie:

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')

Dzwonię z f("abc^d+ef^g + hijk^l - M^NO^P (Ag^+)")odciskami

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

Czy ktoś już próbował golfa w kokosie? Wzbogaca python w bardziej funkcjonalne koncepcje programowania, takie jak dopasowanie wzorca i konkatenacja funkcji (z ..) używane powyżej. Ponieważ jest to moja pierwsza próba kokosa, wszelkie wskazówki będą mile widziane.

Można to zdecydowanie skrócić, ponieważ każdy poprawny kod Pythona jest również prawidłowym kokosem i opublikowano krótsze odpowiedzi w języku Python, jednak starałem się znaleźć rozwiązanie czysto funkcjonalne.

Laikoni
źródło
Myślę, że można użyć operatorów trójskładnikowych ( x and y or z), aby zastąpić case.
Leaky Nun
Możesz nawet użyć s[0]=="^"zamiastmatch['^',c]+r in l
Leaky Nun
@LeakyNun podczas wymiany match['^',c]+rz s[0]=="^", wtedy ci rnie są wiążące. Jak to by pomogło?
Laikoni
Możesz użyć, s[1]aby zastąpić ci s[2:]wymienić r.
Leaky Nun
możesz teraz użyć trójki.
Leaky Nun
0

Dyalog APL, 34 bajty

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

Zwraca dwuelementowy wektor z dwiema liniami

Próbka (w górę z przodu jest formatowanie wektora dwuelementowego do spożycia przez ludzi):

      ↑{(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 )
lstefano
źródło
Do twojego komentarza do mojego pytania o tym, że kod nic nie robi: tak, ten kod, który umieściłeś, się liczy.
haykam
0

PowerShell v2 +, 88 83 bajtów

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

Trochę dłużej niż inne, ale pokazuje trochę magii PowerShell i trochę inną logikę.

Zasadniczo ta sama koncepcja, co odpowiedzi Pythona - iterujemy wprowadzany znak po znaku, pamiętamy, czy poprzedni był znakiem karetki ( $c), i umieszczamy bieżący znak w odpowiednim miejscu. Jednak logika i metoda określania miejsca wyjścia są obsługiwane nieco inaczej i bez krotki lub osobnych zmiennych - sprawdzamy, czy poprzedni znak był daszkiem, a jeśli tak, wypisujemy znak do potoku i konkatenujemy spację do $b. W przeciwnym razie sprawdzamy, czy bieżący znak jest karetką elseif($_-94)i dopóki tak nie jest, łączymy bieżący znak z $bi wysyłamy spację do potoku. Na koniec ustalamy, czy obecna postać jest karetką na następną rundę.

Zbieramy te postacie z potoku razem w pareny, zamykamy je w ciąg, -joinktóry zamienia je w ciąg, i zostawiamy to wraz z $bpotokiem. Wyjście na końcu jest niejawne z nową linią między nimi.

Dla porównania, tutaj jest bezpośredni port @ XNOR za Pythona odpowiedzi na 85 bajtów :

$a=,''*2;[char[]]$args[($l=0)]|%{$a[!$l]+="$_"*($c=$_-ne94);$a[$l]+=' '*$c;$l=!$c};$a
AdmBorkBork
źródło
0

Gema, 42 41 znaków

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

Gema przetwarza dane wejściowe jako strumień, więc musisz rozwiązać je w jednym przebiegu: pierwszy wiersz jest zapisywany natychmiast po przetworzeniu, drugi wiersz jest gromadzony w zmiennej $ s, a następnie wyprowadzany na końcu.

Przykładowy przebieg:

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 )
człowiek w pracy
źródło
0

Guma cynamonowa, 21 bajtów

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

Nie konkuruje. Wypróbuj online.

Wyjaśnienie

Nie jestem zbyt dużym golfistą, więc prawdopodobnie jest na to lepszy sposób.

Ciąg dekompresuje się do:

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

(zwróć uwagę na spację końcową)

Pierwszy Setap otrzymuje dane wejściowe i używa znaku negatywnego do zamiany wszystkich znaków innych niż daszki bez poprzedzającego daszka spacją, a następnie usuwa wszystkie daszki. Następnie natychmiast wyświetla zmodyfikowany ciąg wejściowy z nową linią i usuwa ten Setap. Ponieważ STDIN jest teraz wyczerpany, a poprzedni etap nie dostarczył żadnych danych wejściowych, następny Setap ponownie otrzymuje ostatni wiersz STDIN, a następnie zastępuje wszystkie karetki, a następnie dowolną postacią spacją i wyświetla to.

W kodzie psuedo Perla:

$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";
spaghetto
źródło
0

J , 28 27 bajtów

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

Wypróbuj 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

Musi być lepszy sposób ...

FrownyFrog
źródło