Ubah eksponen menjadi seni ASCII

28

Tugas

Tugas Anda adalah mengonversi string seperti ini:

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

Untuk string seperti ini:

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

Yang merupakan perkiraan untuk abc d + ef g + hijk l - M N O P (Ag + )

Dengan kata lain, naikkan karakter langsung di sebelah tanda sisipan ke garis atas, satu karakter untuk satu tanda tanda.

Spesifikasi

  • Ruang putih ekstra trailing di output diizinkan.
  • Tidak ada rantai berantai seperti yang m^n^oakan diberikan sebagai input.
  • Tanda sisipan tidak akan segera diikuti oleh spasi atau tanda tanda lain.
  • Tanda sisipan tidak akan langsung didahului oleh spasi.
  • Semua caret akan didahului oleh setidaknya satu karakter dan diikuti oleh setidaknya satu karakter.
  • String input hanya akan berisi karakter ASCII yang dapat dicetak (U + 0020 - U + 007E)
  • Alih-alih dua baris output, Anda diizinkan untuk output array dua string.

Bagi mereka yang berbicara regex: string input akan cocok dengan regex ini:

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

Papan peringkat

Biarawati Bocor
sumber
2
@TimmyD "String input hanya akan berisi karakter ASCII yang dapat dicetak (U + 0020 - U + 007E)"
Leaky Nun
3
Mengapa berhenti di eksponen? Saya ingin sesuatu yang menangani H_2O!
Neil
1
@Neil Buat tantangan Anda sendiri, dan saya bisa menutup tantangan ini sebagai duplikat dari yang itu. :)
Leaky Nun
1
Berdasarkan contoh Anda, saya akan mengatakan mereka superindices , belum tentu eksponen
Luis Mendo
4
Mereka yang berbicara regex berasal dari negara yang sangat reguler di mana ekspresi sangat dibatasi. Penyebab utama kematian adalah kemunduran bencana.
David Conrad

Jawaban:

19

V , 15 14 byte

ÄÒ +òf^xxé kPj

Cobalah online!

Solusi yang cukup mudah. The sempurna tantangan bagi V!

Penjelasan:

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

Mudahnya, berdasarkan cara kerja rekursi, ini akan berjalan sekali untuk setiap caret tunggal.

DJMcMayhem
sumber
2
vim adalah bahasa yang sempurna untuk tantangan ini. +1
Downgoat
18

Cheddar, 77 72 67 byte

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

Tidak ada regex!

Saya suka jawaban ini karena ini merupakan demonstrasi yang luar biasa dari kemampuan Cheddar. Terutama berkat fungsi ganti yang ditambahkan oleh Conor. PR untuk dev tidak pernah dibuat sehingga fungsi ganti hanya ada pada cabang ini (pembaruan: Saya membuat PR dan sekarang ini pada cabang beta terbaru yang dapat Anda instal dengan npm install -g cheddar-lang)

Saya telah menemukan cara untuk bermain golf, tetapi sayangnya hasil pengawasan dalam hal ini terjadi ketika panjang item tidak sama:

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

Saya bisa menyimpan banyak byte menggunakan regex, dan sebenarnya saya baru saja membuat regex untuk Cheddar ... satu-satunya masalah adalah bahwa tidak ada fungsi regex: /

Penjelasan

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)

Untuk mendapatkan pemahaman yang lebih baik. Ini adalah tujuan .linespengembalian1^2

["1", " 2"]

yang .turndengan memutar ini:

1
 2

ke:

 2
1

Contoh lain yang akan membuatnya lebih jelas:

1
 2
2
 2

menjadi:

 2 2
1 2

Mengapa format?

Apa yang %-2sdilakukannya cukup sederhana. %menentukan kita sedang memulai "format", atau bahwa suatu variabel akan dimasukkan ke dalam string ini pada titik ini. -artinya ke kanan-pad string, dan 2merupakan max-length. Secara default itu bantalan dengan spasi. shanya menentukan itu sebuah string. Untuk melihat fungsinya:

"%-2s" % "a"  == "a "
"%-2s" % " a" == " a"
Downgoat
sumber
2
: DI saya selalu upvote cheddar.
DJMcMayhem
@DrGreenEggsandIronMan: D terima kasih
Downgoat
1
Cheddar punya turnmetode untuk string?
TuxCrafting
6
-1 nama bahasa ini selalu membuat saya lapar.
Berhenti menghidupkan counterclock dengan
@ TùxCräftîñg hanya untuk array 2D, itulah sebabnya saya menggunakan .lines untuk mendapatkan baris.
Downgoat
10

Perl, 21 + 1 = 22 byte

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

Jalankan dengan -pbendera. Ganti dengan ESCbyte mentah ( 0x1b), dan dengan tab vertikal ( 0x0b).

Tab vertikal adalah ide Martin Ender. Ini menghemat dua byte! Terima kasih.

Lynn
sumber
Tidakkah Anda perlu memindahkan kursor ke bawah di garis awal sehingga eksponen tidak tumpang tindih dengan konsol prompt terakhir?
Martin Ender
Saya tidak yakin tentang itu, ya. Saya membuat asumsi memiliki ruang sebanyak yang saya butuhkan, tapi mungkin itu sedikit curang. (Secara umum, saya tidak terlalu bangga menggunakan gerakan kursor untuk menyelesaikan masalah semacam ini, tetapi itu adalah hal pertama yang terlintas dalam pikiran ...)
Lynn
2
Saya pikir ini solusi yang baik tetapi hasilnya harus secara visual tidak dapat dibedakan dari mencetak string seperti yang dimaksudkan.
Martin Ender
1
Solusi yang bagus
Thomas Weller
7

JavaScript (ES6), 56 55 byte

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

Regexps untuk menyelamatkan tentu saja. Yang pertama mengganti semua karakter dengan spasi, kecuali jika menemukan tanda sisipan, dalam hal ini tanda tanda menghapus tanda sisipan dan membiarkan karakter setelahnya. (Karakter-karakter ini dijamin ada.) Yang kedua adalah yang jelas untuk mengganti setiap tanda sisipan dan karakter berikutnya dengan spasi.

Sunting: Disimpan 1 byte berkat @Lynn yang menemukan cara untuk menggunakan kembali string pengganti untuk penggantian kedua yang memungkinkan penggantian dipetakan di atas larik regexps.

Neil
sumber
2
Sepertinya s=>[/.(\^(.))?/g,/\^.(())/g].map(r=>s.replace(r,' $2'))byte lebih pendek.
Lynn
@ Lynn Itu aksi yang sangat licik!
Neil
7

Python 3, 157 101 98 85 83 74 byte

Solusi ini melacak apakah karakter sebelumnya ^, lalu memutuskan apakah akan menampilkan ke baris pertama atau kedua berdasarkan itu.

Output sebagai array dari ['firstline', 'secondline'].

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

Disimpan 13 15 byte berkat @LeakyNun!

Disimpan 7 byte berkat @Joffan!

Tembaga
sumber
1
Otomat keadaan terbatas yang bagus.
Leaky Nun
Apakah akan lebih baik untuk memiliki a=['','']dan menggabungkan ' 'dan clangsung ke a[l]dan a[~l]?
Joffan
6

Python 2, 73 byte

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

Tidak ada regex. Ingat jika karakter sebelumnya adalah ^, dan menempatkan karakter saat ini di garis atas atau bawah berdasarkan itu, dan spasi di yang lain.

Tidak
sumber
4

Pyth, 17 byte

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

Mengembalikan array 2 string. (Sertakan juntuk bergabung dengan mereka dengan baris baru.)

Cobalah online .

Anders Kaseorg
sumber
1
Saya tidak bisa berhenti bertanya-tanya bagaimana nama belakang Anda diucapkan. : D
Lynn
4

MATL , 18 byte

94=t1YSt~&vG*cw~Z)

Cobalah 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
sumber
4

Ruby, 47 +1 ( -nbendera) = 48 byte

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

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

Nilai Tinta
sumber
Saya pikir Anda dapat menghemat 1 byte menggunakan $_=$_.gsub(/\^(.)|./){$1||" "}+gsub(/\^./," ")dan -pbukannya -n.
Dom Hastings
1
@HomHastings terlepas dari apakah itu berfungsi atau tidak, kode Anda tampaknya tidak memiliki baris baru, dan menambahkan +$/berarti itu tidak akan menghemat byte. putsmelempar baris baru untuk Anda secara otomatis ketika ,ada di antara argumen.
Nilai Tinta
Oh ... Saya diuji menggunakan ruby -p ... <<< 'input'tetapi saya setuju, jika tidak ada baris baru, itu tidak baik! Sebenarnya, saya mungkin telah menambahkan baris baru dalam tes saya sebelumnya ... Itu sedang bekerja jadi saya tidak bisa memeriksa!
Dom Hastings
@HomHastings Melihatnya lagi, tebakan saya adalah karena itu getsmencakup sebagian besar baris baru, tetapi jika Anda mem-pipkan file yang tidak mengandung baris baru, maka itu tidak akan muncul dan hasilnya akan salah . Uji kode Anda dengan ruby -p ... inputfilesejak Ruby mengarahkan kembali getske file jika itu argumen baris perintah.
Nilai Tinta
Mengerti, sangat masuk akal. Saya kira baris baru di file juga akan memperbaiki masalah. Saya bukan seorang Rubyist yang mahir, jadi saya merasa saya telah belajar sedikit lebih banyak tentangnya hari ini. Terima kasih!
Dom Hastings
3

Python (2), 76 68 67 Bytes

-5 Bytes berkat @LeakyNun

-3 Bytes terima kasih kepada @ KevinLau-notKenny

-1 Byte, terima kasih kepada @ValueInk

-0 byte terima kasih kepada @DrGreenEggsandIronMan

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

Fungsi Lambda anonim ini mengambil string input sebagai satu-satunya argumen dan mengembalikan dua garis output yang dipisahkan oleh baris baru. Untuk menyebutnya beri nama dengan menulis "f =" sebelum itu.

Regex sederhana: Bagian pertama menggantikan yang berikut dengan spasi: karakter apa pun dan wortel caret atau hanya char, tetapi hanya jika tidak ada caret sebelum mereka. Bagian kedua menggantikan setiap tanda dalam string dan char setelahnya dengan spasi.

KarlKastor
sumber
@ LeakyNun: Saya karena beberapa alasan bertanya-tanya apakah 1. juga berlaku jika saya mengimpor perpustakaan. Sedang menyalin 2. ke pertanyaan ini saat saya melihat komentar Anda. Terima kasih untukmu dan Kevin!
KarlKastor
Anda bisa melepas satu byte denganfrom re import*
DJMcMayhem
@DrGreenEggsandIronMan Ini tampaknya menggunakan jumlah byte yang persis sama. (lihat di atas)
KarlKastor
Simpan pernyataan impor yang lama dan lakukan lambda i,s=re.sub:[s("(?<!\^).\^?"," ",i),s("\^."," ",i)]untuk -1 byte
Value Ink
2

Retina, 16 byte

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

Port jawaban Perl saya, ditunjukkan oleh Martin Ender. Ganti dengan ESCbyte mentah ( 0x1b) dan dengan tab vertikal ( 0x0b).

Lynn
sumber
2

shell + TeX + catdvi, 51 43 byte

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

Menggunakan texuntuk mengeset beberapa matematika yang indah, dan kemudian menggunakan catdviuntuk membuat representasi teks. Perintah kepala menghapus sampah (penomoran halaman, mengikuti baris baru) yang ada.

Sunting: Mengapa melakukan hal yang lama, tepat, dan mengarahkan /dev/nullketika Anda dapat mengabaikan efek samping dan menulis ke satu file huruf?


Contoh

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

Output TeX (dipotong ke persamaan): Matematika "Indah"! Output akhir:

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

Asumsi: Mulai dengan direktori kosong (atau direktori khusus tanpa nama yang diakhiri dengan "i"). Input adalah argumen tunggal ke skrip shell. Input bukan string kosong.

Seseorang memberi tahu saya apakah ini penyalahgunaan peraturan, khususnya catdvi.

algmyr
sumber
2

Haskell, 74 56 55 byte

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

Mengembalikan sepasang string. Contoh penggunaan: 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 )")

gmembuat daftar pasangan, di mana elemen pertama adalah char di baris atas dan elemen kedua adalah char di baris bawah. unzipmengubahnya menjadi sepasang daftar.

Sunting: @xnor yang disarankan unzipyang menyimpan 18 byte. @Laikoni menemukan satu byte lagi untuk disimpan. Terima kasih!

nimi
sumber
Bisakah kamu melakukannya j=unzip.g?
xnor
@ xnor: oh, betapa bodohnya saya jika tidak melihatnya sendiri! Terima kasih banyak!
nimi
Anda dapat mengganti g[]=[]dengan g x=xuntuk menyimpan satu byte.
Laikoni
@Laikoni: Terlihat dengan jelas! Terima kasih!
nimi
1

Perl, 35 byte

34 byte kode +1 untuk -p

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

Pemakaian

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 )

Catatan: Ini persis sama dengan jawaban Value Ink yang saya lihat sesudahnya. Akan dihapus jika diperlukan karena ini tidak benar-benar menambah solusi Ruby.

Dom Hastings
sumber
1

Java 8 lambda, 132 128 112 karakter

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

Versi ungolfed terlihat seperti ini:

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

Output sebagai array, cukup memeriksa apakah ada tanda sisipan dan jika demikian karakter berikutnya akan diletakkan di baris atas, kalau tidak akan ada spasi.


Pembaruan

Karakter yang diganti dengan nilai ascii mereka untuk menyimpan 4 karakter.

Terima kasih kepada @LeakyLun karena menunjukkan untuk menggunakan array char sebagai input.

Juga terima kasih kepada @KevinCruijssen untuk beralih intke charuntuk menyimpan beberapa karakter.

Frozn
sumber
Anda dapat mencoba memasukkan char[]dan menggunakan for(char c:i)untuk melihat apakah jumlah byte dapat dikurangi.
Leaky Nun
Anda dapat menurunkannya hingga 110 byte dengan menggunakan: 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()sebagai input. ( Ide perubahan ini. )
Kevin Cruijssen
1

Coconut , 122 114 96 byte

Sunting: 8 26 byte ke bawah dengan bantuan dari 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')

Jadi seperti yang saya pelajari hari ini python memiliki operator kondisional ternary, atau bahkan dua dari mereka: <true_expr> if <condition> else <false_expr>dan <condition> and <true_expr> or <false_expr>dengan yang terakhir datang dengan satu char kurang.
Versi python conform dapat diidealkan .


Percobaan pertama:

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

Memanggil dengan f("abc^d+ef^g + hijk^l - M^NO^P (Ag^+)")cetakan

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

Adakah yang sudah mencoba bermain golf dengan kelapa? Ini memperkaya python dengan konsep pemrograman yang lebih fungsional seperti pencocokan pola dan penggabungan fungsi (dengan ..) yang digunakan di atas. Karena ini adalah percobaan pertama saya di kelapa, tips apa pun akan dihargai.

Ini pasti dapat dipersingkat karena kode python yang valid juga kelapa yang valid dan jawaban python yang lebih pendek telah diposting, namun saya mencoba untuk menemukan solusi murni fungsional.

Laikoni
sumber
Saya pikir Anda dapat menggunakan operator ternary ( x and y or z) untuk menggantikan case.
Leaky Nun
Anda bahkan dapat menggunakan s[0]=="^"sebagai gantinyamatch['^',c]+r in l
Leaky Nun
@ LeakyNun Ketika saya ganti match['^',c]+rdengan s[0]=="^", maka cdan rtidak lagi terikat. Bagaimana ini membantu?
Laikoni
Anda dapat menggunakan s[1]untuk mengganti cdan s[2:]mengganti r.
Leaky Nun
maka Anda dapat menggunakan ternary sekarang.
Leaky Nun
0

Dyalog APL, 34 byte

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

Ini mengembalikan vektor dua elemen dengan dua garis

Contoh dijalankan (uparrow di depan adalah untuk memformat vektor dua el untuk konsumsi manusia):

      ↑{(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
sumber
Untuk komentar Anda tentang pertanyaan saya tentang kode tidak melakukan apa-apa: ya, kode yang Anda masukkan penting.
haykam
0

PowerShell v2 +, 88 83 byte

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

Sedikit lebih lama dari yang lain, tetapi menampilkan sedikit keajaiban PowerShell dan sedikit logika yang berbeda.

Pada dasarnya konsep yang sama dengan jawaban Python - kita beralih pada input karakter-oleh-karakter, ingat apakah yang sebelumnya adalah tanda sisipan ( $c), dan menempatkan karakter saat ini ke tempat yang tepat. Namun, logika dan metode untuk menentukan ke mana output ditangani sedikit berbeda, dan tanpa tuple atau variabel terpisah - kami menguji apakah karakter sebelumnya adalah tanda sisipan, dan jika demikian output karakter ke pipa dan menyatukan spasi ke $b. Kalau tidak, kami memeriksa apakah karakter saat ini adalah tanda sisipan elseif($_-94)dan selama tidak, kami menggabungkan karakter saat ini ke $bdan mengeluarkan spasi ke pipeline. Akhirnya, kami menetapkan apakah karakter saat ini adalah tanda untuk putaran berikutnya.

Kami mengumpulkan karakter-karakter dari pipa bersama-sama dalam parens, merangkum mereka dalam -joinyang mengubahnya menjadi string, dan meninggalkannya bersama dengan $bdi pipa. Output pada akhirnya tersirat dengan peralihan baris baru.

Sebagai perbandingan, berikut adalah port langsung dari jawaban Python @ xnor , sebesar 85 byte :

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

Gema, 42 41 karakter

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

Gema memproses input sebagai stream, jadi Anda harus menyelesaikannya dalam satu jalur: baris pertama ditulis segera setelah diproses, baris kedua dikumpulkan dalam variabel $ s, kemudian output di akhir.

Contoh dijalankan:

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 )
manatwork
sumber
0

Cinnamon Gum, 21 byte

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

Non-bersaing. Cobalah online.

Penjelasan

Saya tidak banyak dari pemain golf regex jadi mungkin ada cara yang lebih baik untuk melakukan ini.

String tersebut didekompresi menjadi:

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

(perhatikan ruang trailing)

Tahap pertama Smenerima input dan menggunakan tampilan negatif di belakang untuk mengganti semua karakter selain caret tanpa caret sebelumnya dengan spasi, lalu hapus semua caret. Kemudian langsung menampilkan string input yang dimodifikasi dengan baris baru dan menghapus Stahap itu. Karena STDIN sekarang habis dan tahap sebelumnya tidak memberikan input apa pun, Stahap berikutnya menerima baris terakhir dari STDIN lagi dan kemudian mengganti semua caret diikuti oleh karakter apa pun dengan spasi dan menghasilkan itu.

Dalam Perl psuedo-code:

$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";
sebuah spaghetto
sumber
0

J , 28 27 byte

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

Cobalah 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

Pasti ada cara yang lebih baik ...

FrownyFrog
sumber