Chuyển đổi số mũ thành nghệ thuật ASCII


28

Bài tập

Nhiệm vụ của bạn là chuyển đổi các chuỗi như thế này:

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

Để chuỗi như thế này:

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

Đó là một xấp xỉ với abc d + ef g + Hijk l - M N O P (Ag + )

Nói cách khác, nâng các ký tự trực tiếp bên cạnh dấu mũ lên dòng trên, một ký tự cho một dấu mũ.

Thông số kỹ thuật

  • Cho phép thêm khoảng trắng dấu ở đầu ra.
  • Không có chuỗi quan tâm như m^n^osẽ được đưa ra làm đầu vào.
  • Một dấu mũ sẽ không được theo dõi ngay lập tức bởi một khoảng trắng hoặc bởi một dấu mũ khác.
  • Một dấu mũ sẽ không được đi trước bởi một khoảng trắng.
  • Tất cả các dấu mũ sẽ được đi trước bởi ít nhất một ký tự và theo sau là ít nhất một ký tự.
  • Chuỗi đầu vào sẽ chỉ chứa các ký tự ASCII có thể in (U + 0020 - U + 007E)
  • Thay vì hai dòng đầu ra, bạn được phép xuất một mảng gồm hai chuỗi.

Đối với những người nói regex: chuỗi đầu vào sẽ khớp với regex này:

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

Bảng xếp hạng


2
@TimmyD "Chuỗi đầu vào sẽ chỉ chứa các ký tự ASCII có thể in được (U + 0020 - U + 007E)"
Leaky Nun

3
Tại sao dừng lại ở số mũ? Tôi muốn một cái gì đó xử lý H_2O!
Neil

1
@Neil Thực hiện thử thách của riêng bạn sau đó và tôi có thể đóng thử thách này dưới dạng bản sao của thử thách đó. :)
Nữ tu bị rò rỉ

1
Dựa trên ví dụ của bạn tôi muốn nói họ là superindices , không nhất thiết số mũ
Luis Mendo

4
Những người nói tiếng mưa đá regex từ một quốc gia rất thường xuyên nơi biểu hiện bị hạn chế chặt chẽ. Nguyên nhân hàng đầu của cái chết là quay lui thảm khốc.
David Conrad

Câu trả lời:


19

V , 15 14 byte

ÄÒ +òf^xxé kPj

Hãy thử trực tuyến!

Một giải pháp khá đơn giản. Các hoàn hảo thách thức đối với V!

Giải trình:

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

Thuận tiện, dựa trên cách thức đệ quy hoạt động, điều này sẽ chạy một lần cho mỗi dấu mũ.


2
vim là ngôn ngữ hoàn hảo cho thử thách này. +1
Hạ cấp

18

Cheddar, 77 72 67 byte

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

Không có regex!

Tôi thích câu trả lời này vì nó là một minh chứng tuyệt vời cho khả năng của Cheddar. Chủ yếu nhờ vào chức năng thay thế được thêm bởi Conor. PR to dev chưa bao giờ được thực hiện nên chức năng thay thế chỉ tồn tại trên nhánh này (cập nhật: Tôi đã thực hiện PR và bây giờ là trên nhánh beta mới nhất mà bạn có thể cài đặt npm install -g cheddar-lang)

Tôi đã tìm thấy một cách để chơi nó nhưng không may là một kết quả giám sát trong trường hợp này xảy ra khi độ dài vật phẩm không giống nhau:

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

Tôi có thể đã lưu rất nhiều byte bằng regex và thực tế tôi chỉ tạo regex cho Cheddar ... vấn đề duy nhất là không có hàm regex: /

Giải trình

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)

Để hiểu rõ hơn. Đây là những gì .linestrả lại cho1^2

["1", " 2"]

các .turnvới xoay này:

1
 2

vào:

 2
1

Một ví dụ khác sẽ làm cho nó rõ ràng hơn:

1
 2
2
 2

trở thành:

 2 2
1 2

Tại sao định dạng?

Những gì %-2sđang làm là khá đơn giản. %xác định rằng chúng tôi đang bắt đầu một "định dạng" hoặc một biến sẽ được chèn vào chuỗi này vào thời điểm này. -có nghĩa là đệm bên phải chuỗi và 2là độ dài tối đa. Theo mặc định, nó đệm với không gian. schỉ cần xác định đó là một chuỗi. Để xem những gì nó làm:

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

2
: DI luôn upvote cheddar.
DJMcMayhem

@DrGreenEggsandIronMan: D cảm ơn bạn
Downgoat

1
Cheddar có một turnphương pháp cho chuỗi?
Thiền từ

6
-1 tên ngôn ngữ này luôn làm tôi đói.
đã ngừng quay ngược chiều

@ TùxCräftîñg chỉ dành cho mảng 2D, đó là lý do tại sao tôi sử dụng .lines để lấy các dòng.
Hạ cấp

10

Perl, 21 + 1 = 22 byte

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

Chạy với -pcờ. Thay thế bằng một ESCbyte thô ( 0x1b) và bằng một tab dọc ( 0x0b).

Tab dọc là ý tưởng của Martin Ender. Nó đã lưu hai byte! Cảm ơn.


Bạn không cần phải di chuyển con trỏ xuống một dòng khi bắt đầu để số mũ không chồng lên dấu nhắc bàn điều khiển cuối cùng?
Martin Ender

Tôi không chắc về điều đó, yeah. Tôi đã đưa ra giả định có nhiều không gian như tôi cần, nhưng có lẽ đó là một chút gian lận. (Nói chung, tôi không tự hào lắm khi sử dụng các chuyển động con trỏ để giải quyết loại vấn đề này, nhưng đó là điều đầu tiên xuất hiện trong đầu ...)
Lynn

2
Tôi nghĩ đó là một giải pháp tốt nhưng kết quả sẽ không thể phân biệt được bằng cách in chuỗi như dự định.
Martin Ender

1
Thật là một giải pháp đáng yêu
Thomas Weller

7

JavaScript (ES6), 56 55 byte

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

Tất nhiên để giải cứu tất nhiên. Cái đầu tiên thay thế tất cả các ký tự bằng khoảng trắng, trừ khi nó tìm thấy dấu mũ, trong trường hợp đó, nó sẽ xóa dấu mũ và giữ ký tự theo sau nó. (Những ký tự này được đảm bảo tồn tại.) Thứ hai là cái rõ ràng để thay thế mỗi dấu mũ và ký tự sau của nó bằng một khoảng trắng.

Chỉnh sửa: Đã lưu 1 byte nhờ @Lynn, người đã nghĩ ra cách sử dụng lại chuỗi thay thế cho lần thay thế thứ hai cho phép thay thế được ánh xạ qua một mảng các biểu thức chính quy.


2
Hình như s=>[/.(\^(.))?/g,/\^.(())/g].map(r=>s.replace(r,' $2'))là một byte ngắn hơn.
Lynn

@Lynn Đó là một pha nguy hiểm thực sự xảo quyệt!
Neil

7

Python 3, 157 101 98 85 83 74 byte

Giải pháp này theo dõi xem nhân vật trước đó là ai ^, sau đó quyết định nên xuất ra dòng đầu tiên hay dòng thứ hai dựa trên đó.

Đầu ra như một mảng của ['firstline', 'secondline'].

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

Đã lưu 13 15 byte nhờ @LeakyNun!

Đã lưu 7 byte nhờ @Joffan!


1
Đẹp tự động trạng thái hữu hạn.
Leaky Nun

Nó sẽ tốt hơn để có a=['','']và nối ' 'ctrực tiếp vào a[l]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

Không có regex. Nhớ nếu ký tự trước là ^và đặt ký tự hiện tại vào dòng trên cùng hoặc dưới cùng dựa trên đó và khoảng trắng trong ký tự kia.


4

Bình thường, 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

Trả về một mảng gồm 2 chuỗi. (Chuẩn jbị tham gia với họ với một dòng mới.)

Hãy thử trực tuyến .


1
Tôi không thể ngừng tự hỏi làm thế nào tên cuối cùng của bạn được phát âm. : D
Lynn

4

MATL , 18 byte

94=t1YSt~&vG*cw~Z)

Hãy thử trực tuyến!

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 ( -ncờ) = 48 byte

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

Chạy nó như vậy: ruby -ne 'puts$_.gsub(/\^(.)|./){$1||" "},gsub(/\^./," ")'


Tôi nghĩ bạn có thể tiết kiệm 1 byte bằng cách sử dụng $_=$_.gsub(/\^(.)|./){$1||" "}+gsub(/\^./," ")-pthay vì -n.
Dom Hastings

1
@DomHastings bất kể nó có hoạt động hay không, mã của bạn dường như không có dòng mới và thêm vào +$/có nghĩa là nó sẽ không lưu byte. putstự động ném dòng mới cho bạn khi ,có mặt giữa các đối số.
Mực giá trị

Ồ ... tôi đã thử nghiệm bằng cách sử dụng ruby -p ... <<< 'input'nhưng tôi đồng ý, nếu nó thiếu dòng mới thì không tốt! Trên thực tế, tôi có thể đã có một dòng mới được thêm vào trong các thử nghiệm của mình trước đó ... Tuy nhiên đó là tại nơi làm việc nên tôi không thể kiểm tra!
Dom Hastings

@DomHastings Nhìn lại lần nữa, tôi đoán là vì nó getsbao gồm dòng mới trong hầu hết thời gian, nhưng nếu bạn đặt trong một tệp không chứa dòng mới, thì nó sẽ không xuất hiện và đầu ra sẽ sai . Kiểm tra mã của bạn với ruby -p ... inputfilevì Ruby chuyển hướng getstệp đến nếu đó là đối số dòng lệnh.
Mực giá trị

Có nó, làm cho ý nghĩa hoàn hảo. Tôi đoán một dòng mới trong tập tin cũng sẽ khắc phục vấn đề. Tôi không phải là một người chơi Ruby thành thạo bằng mọi cách nên tôi cảm thấy như tôi đã học được thêm một chút về nó ngày hôm nay. Cảm ơn!
Dom Hastings

3

Python (2), 76 68 67 byte

-5 byte nhờ vào @LeakyNun

-3 Byte nhờ @ KevinLau-notKenny

-1 Byte nhờ @ValueInk

-0 byte nhờ @DrGreenEggsandIronMan

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

Hàm Lambda ẩn danh này lấy chuỗi đầu vào làm đối số duy nhất của nó và trả về hai dòng đầu ra được phân tách bằng một dòng mới. Để gọi nó, hãy đặt tên cho nó bằng cách viết "f =" trước nó.

Regex khá đơn giản: Phần đầu tiên thay thế phần sau bởi một khoảng trắng: bất kỳ nhân vật và một củ cà rốt hoặc chỉ một char, nhưng chỉ khi không có caret trước chúng. Phần thứ hai thay thế bất kỳ dấu mũ nào trong chuỗi và char sau nó bằng khoảng trắng.


@LeakyNun: Tôi vì một số lý do tự hỏi nếu 1. cũng giữ nếu tôi nhập thư viện. Đã sao chép 2. vào câu hỏi này ngay bây giờ khi tôi thấy bình luận của bạn. Cảm ơn bạn và Kevin!
KarlKastor

Bạn có thể nghỉ một byte vớifrom re import*
DJMcMayhem

@DrGreenEggsandIronMan Điều này dường như sử dụng chính xác cùng một số byte. (xem ở trên)
KarlKastor

Giữ câu lệnh nhập cũ và thực hiện lambda i,s=re.sub:[s("(?<!\^).\^?"," ",i),s("\^."," ",i)]cho -1 byte
Giá trị mực


2

Võng mạc, 16 byte

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

Một cổng câu trả lời Perl của tôi, được chỉ ra bởi Martin Ender. Thay thế bằng một ESCbyte thô ( 0x1b) và bằng một tab dọc ( 0x0b).


2

shell + TeX + catdvi, 51 43 byte

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

Sử dụng texđể sắp chữ một số toán học đẹp, và sau đó sử dụng catdviđể làm biểu diễn văn bản. Lệnh head sẽ loại bỏ rác (đánh số trang, dòng mới) hiện có.

Chỉnh sửa: Tại sao điều dài, thích hợp, điều và chuyển hướng đến /dev/nullkhi bạn có thể bỏ qua các tác dụng phụ và ghi vào một tệp chữ cái duy nhất?


Thí dụ

Đầu vào: abc^d+ef^g + hijk^l - M^NO^P (Ag^+)

Đầu ra TeX (cắt theo phương trình): Toán học "đẹp"! Đầu ra cuối cùng:

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

Giả định: Bắt đầu trong thư mục trống (hoặc cụ thể là một thư mục không có tên kết thúc bằng "i"). Đầu vào là một đối số duy nhất cho tập lệnh shell. Đầu vào không phải là một chuỗi rỗng.

Ai đó nói với tôi nếu đây là lạm dụng quy tắc, đặc biệt catdvi.


2

Haskell, 74 56 55 byte

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

Trả về một cặp chuỗi. Ví dụ sử dụng: 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 )")

gtạo một danh sách các cặp, trong đó phần tử đầu tiên là char ở dòng trên và phần tử thứ hai là char ở dòng dưới. unzipbiến nó thành một cặp danh sách.

Chỉnh sửa: @xnor đề xuất unzipgiúp tiết kiệm 18 byte. @Laikoni tìm thấy thêm một byte để lưu. Cảm ơn!


Bạn có thể làm được j=unzip.gkhông
xnor

@xnor: oh, thật ngu ngốc khi tôi không nhìn thấy điều đó! Cảm ơn rất nhiều!
nimi

Bạn có thể thay thế g[]=[]bằngg x=x để lưu một byte.
Laikoni

@Laikoni: Phát hiện tốt! Cảm ơn!
nimi

1

Perl, 35 byte

Mã 34 byte + 1 cho -p

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

Sử dụng

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 )

Lưu ý: Điều này hoàn toàn giống với câu trả lời của Value Ink mà tôi đã theo dõi sau đó. Sẽ xóa nếu cần vì điều này không thực sự thêm vào giải pháp Ruby.


1

Java 8 lambda, 132 128 112 ký tự

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

Phiên bản không có hình dạng như thế này:

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

Đầu ra dưới dạng một mảng, chỉ cần kiểm tra xem có dấu mũ hay không và nếu vậy ký tự tiếp theo sẽ được đặt ở hàng trên, nếu không sẽ có khoảng trắng.


Cập nhật

Thay thế các ký tự bằng các giá trị ascii của chúng để lưu 4 ký tự.

Cảm ơn @LeakyLun đã chỉ ra để sử dụng một mảng char làm đầu vào thay thế.

Cũng cảm ơn @KevinCruijssen vì đã chuyển intsang charđể lưu thêm một số ký tự.


Bạn có thể thử nhập char[]và sử dụng for(char c:i)để xem có thể giảm số byte không.
Nữ tu bị rò rỉ

Bạn có thể đánh golf xuống một chút đến 110 byte bằng cách sử dụng: 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;}với "abc^d+ef^g + hijk^l - M^NO^P (Ag^+)".toCharArray()đầu vào. ( Ý tưởng của những thay đổi này. )
Kevin Cruijssen

1

Dừa , 122 114 96 byte

Chỉnh sửa: 8 26 byte xuống với sự giúp đỡ từ 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')

Vì vậy, như tôi đã học ngày hôm nay, trăn có một toán tử có điều kiện theo thứ tự, hoặc trên thực tế hai trong số chúng: <true_expr> if <condition> else <false_expr><condition> and <true_expr> or <false_expr>với cái cuối cùng đi kèm với một char ít hơn.
Một phiên bản phù hợp với python có thể được ideoned .


Nỗ lực đầu tiên:

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

Gọi bằng f("abc^d+ef^g + hijk^l - M^NO^P (Ag^+)")bản in

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

Có ai đã thử chơi golf trong dừa chưa? Nó làm phong phú thêm python với các khái niệm lập trình chức năng nhiều hơn như khớp mẫu và nối hàm (với.. ) được sử dụng ở trên. Vì đây là lần thử đầu tiên của tôi tại dừa, bất kỳ lời khuyên nào cũng sẽ được đánh giá cao.

Điều này chắc chắn có thể được rút ngắn vì bất kỳ mã trăn hợp lệ nào cũng là dừa hợp lệ và các câu trả lời ngắn hơn về trăn đã được đăng, tuy nhiên tôi đã cố gắng tìm một giải pháp hoàn toàn có chức năng.


Tôi nghĩ bạn có thể sử dụng toán tử ternary ( x and y or z) để thay thế case.
Nữ tu bị rò rỉ

Bạn thậm chí có thể sử dụng s[0]=="^"thay vìmatch['^',c]+r in l
Leaky Nun

@LeakyNun Khi tôi thay thế match['^',c]+rbằng s[0]=="^", sau đó crkhông còn bị ràng buộc. Điều này sẽ giúp như thế nào?
Laikoni

Bạn có thể sử dụng s[1]để thay thế cs[2:]thay thế r.
Nữ tu bị rò rỉ

sau đó bạn có thể sử dụng ternary ngay bây giờ.
Nữ tu bị rò rỉ

0

APL Dyalog, 34 byte

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

Nó trả về một vectơ hai phần tử với hai dòng

Chạy mẫu (uparrow ở phía trước là để định dạng vectơ hai chiều cho tiêu dùng của con người):

      ↑{(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 )

Để bình luận của bạn về câu hỏi của tôi về mã không làm gì: có, mã đó bạn đặt số đếm.
haykam

0

PowerShell v2 +, 88 83 byte

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

Dài hơn một chút so với những người khác, nhưng thể hiện một chút ma thuật PowerShell và một chút logic khác.

Về cơ bản, khái niệm tương tự như câu trả lời của Python - chúng tôi lặp lại theo từng ký tự đầu vào, nhớ xem cái trước đó có phải là dấu mũ ( $c) hay không và đặt ký tự hiện tại vào vị trí thích hợp. Tuy nhiên, logic và phương pháp xác định vị trí đầu ra được xử lý khác nhau một chút và không có biến số hoặc biến riêng biệt - chúng tôi kiểm tra xem ký tự trước đó có phải là dấu mũ hay không, và nếu đó xuất ký tự ra đường ống và nối một khoảng trắng lên $b. Mặt khác, chúng tôi kiểm tra xem ký tự hiện tại có phải là dấu mũ elseif($_-94)hay không, miễn là không, chúng tôi ghép ký tự hiện tại lên $bvà xuất một khoảng trắng cho đường ống. Cuối cùng, chúng tôi đặt liệu nhân vật hiện tại có phải là người chăm sóc cho vòng tiếp theo hay không.

Chúng tôi tập hợp các nhân vật đó từ các đường ống lại với nhau trong các parens, gói gọn chúng trong -joinmột chuỗi biến chúng thành một chuỗi và để lại cùng với $btrên đường ống. Đầu ra ở cuối được ẩn với một dòng mới giữa.

Để so sánh, đây là một cổng trực tiếp của câu trả lời Python của @ xnor , với 85 byte :

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

0

Gema, 42 41 ký tự

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

Gema xử lý đầu vào dưới dạng luồng, do đó bạn phải giải quyết nó trong một lần: dòng đầu tiên được viết ngay lập tức khi được xử lý, dòng thứ hai được thu thập trong biến $ s, sau đó xuất ra ở cuối.

Chạy mẫu:

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

Quế Gum, 21 byte

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

Không cạnh tranh. Hãy thử trực tuyến.

Giải trình

Tôi không phải là một tay golf regex nên có lẽ cách tốt hơn để làm điều này.

Chuỗi giải nén thành:

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

(lưu ý dấu cách)

SGiai đoạn đầu tiên nhận đầu vào và sử dụng giao diện phủ định để thay thế tất cả các ký tự khác với dấu mũ không có dấu mũ trước bằng khoảng trắng, sau đó xóa tất cả dấu mũ. Sau đó, nó ngay lập tức xuất chuỗi đầu vào đã sửa đổi với một dòng mới và loại bỏ Sgiai đoạn đó . Vì STDIN hiện đã cạn kiệt và giai đoạn trước không cung cấp bất kỳ đầu vào nào, nên giai đoạn tiếp theoS giai đoạn nhận được dòng STDIN cuối cùng và sau đó thay thế tất cả các dấu mũ theo sau bởi bất kỳ ký tự nào có khoảng trắng và xuất ra.

Trong mã Perl psuedo:

$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 byte

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

Hãy thử trực tuyến!

                  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

Phải có cách tốt hơn...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.