แปลงเลขชี้กำลังเป็นรูปแบบ ASCII


28

งาน

งานของคุณคือการแปลงสตริงเช่นนี้

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

ในสตริงเช่นนี้:

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

ซึ่งเป็นการประมาณให้ abc d + ef g + hijk l - M N O P (Ag + )

ในคำให้ยกอักขระโดยตรงถัดจากเครื่องหมายรูปหมวกไปที่บรรทัดบนอักขระหนึ่งตัวสำหรับหนึ่งเครื่องหมายรูปหมวก

รายละเอียด

  • อนุญาตให้มีช่องว่างต่อท้ายพิเศษในเอาต์พุตได้
  • ไม่มีคาเร็ตที่ถูกผูกมัดเหมือนm^n^oจะถูกให้เป็นอินพุต
  • เครื่องหมายรูปหมวกจะไม่ถูกตามด้วยช่องว่างหรือเครื่องหมายรูปหมวกอีกทันที
  • เครื่องหมายรูปหมวกจะไม่ถูกนำหน้าด้วยช่องว่างทันที
  • คาเร็ตทั้งหมดจะถูกนำหน้าด้วยอักขระอย่างน้อยหนึ่งตัวและตามด้วยอักขระอย่างน้อยหนึ่งตัว
  • สตริงอินพุตจะมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น (U + 0020 - U + 007E)
  • แทนที่จะส่งออกสองบรรทัดคุณจะได้รับอนุญาตให้ส่งออกอาร์เรย์ของสองสาย

สำหรับผู้ที่พูด regex: สตริงที่ป้อนจะตรงกับ regex นี้:

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

ลีดเดอร์บอร์ด


2
@TimmyD "สตริงอินพุตจะมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น (U + 0020 - U + 007E)"
Nun

3
ทำไมต้องหยุดที่เลขชี้กำลัง? ฉันต้องการบางสิ่งที่จัดการกับ H_2O!
Neil

1
@Neil สร้างความท้าทายของคุณเองแล้วฉันอาจปิดความท้าทายนี้ซ้ำกับสิ่งนั้น :)
Leun Nun

1
ขึ้นอยู่กับตัวอย่างของคุณผมว่าพวกเขาจะsuperindicesไม่จำเป็นต้องเป็นเลขยกกำลัง
หลุยส์ Mendo

4
ผู้ที่พูดภาษา regex ได้รับการยกย่องจากประเทศที่มีการแสดงออกอย่าง จำกัด สาเหตุสำคัญของการเสียชีวิตคือการย้อนรอยหายนะ
David Conrad

คำตอบ:


19

V , 15 14 ไบต์

ÄÒ +òf^xxé kPj

ลองออนไลน์!

ทางออกที่ค่อนข้างตรงไปตรงมา ที่สมบูรณ์แบบที่ท้าทายสำหรับ V!

คำอธิบาย:

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

สะดวกขึ้นอยู่กับวิธีการเรียกซ้ำการทำงานนี้จะทำงานหนึ่งครั้งสำหรับลูกศรทุกตัว


2
เสียงเรียกเข้าเป็นภาษาที่สมบูรณ์แบบสำหรับความท้าทายนี้ +1
Downgoat

18

Cheddar, 77 72 67 ไบต์

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

ไม่มี regex!

ฉันชอบคำตอบนี้เพราะเป็นการสาธิตความสามารถของ Cheddar ที่ยอดเยี่ยม ส่วนใหญ่ต้องขอบคุณฟังก์ชั่นแทนที่ที่เพิ่มโดย Conor ไม่เคยทำ PR to dev เพื่อให้มีฟังก์ชั่นแทนที่เฉพาะในสาขานี้ (อัปเดต: ฉันสร้าง PR แล้วและตอนนี้อยู่ในสาขาเบต้าล่าสุดที่คุณสามารถติดตั้งได้npm install -g cheddar-lang)

ฉันได้พบวิธีในการเล่นกอล์ฟ แต่น่าเสียดายที่ผลลัพธ์การกำกับดูแลเกิดขึ้นเมื่อความยาวของไอเท็มไม่เหมือนกัน:

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

ฉันสามารถบันทึกจำนวนมากโดยใช้ regex และในความเป็นจริงฉันเพิ่งทำ regexes สำหรับ Cheddar ... ปัญหาเดียวคือไม่มีฟังก์ชั่น regex: /

คำอธิบาย

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)

เพื่อให้ได้ความเข้าใจที่ดีขึ้น นี่คือสิ่งที่.linesตอบแทน1^2

["1", " 2"]

.turnกับหมุนนี้:

1
 2

เป็น:

 2
1

อีกตัวอย่างที่จะทำให้ชัดเจนยิ่งขึ้น:

1
 2
2
 2

กลายเป็น:

 2 2
1 2

ทำไมต้องฟอร์แมต

สิ่งที่%-2sกำลังทำนั้นค่อนข้างง่าย %ระบุว่าเรากำลังเริ่ม "รูปแบบ" หรือตัวแปรจะถูกแทรกลงในสตริงนี้ ณ จุดนี้ -หมายถึงการขวาแผ่นสตริงและ2เป็นความยาวสูงสุด โดยค่าเริ่มต้นมันมีช่องว่าง sเพียงระบุว่ามันเป็นสตริง เพื่อดูว่ามันทำอะไร:

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

2
: DI เสมอโหวตเชดดาร์
DJMcMayhem

@DrGreenEggsandIronMan: D ขอบคุณ
Downgoat

1
Cheddar มีturnวิธีการสตริง?
TuxCrafting

6
-1 ชื่อภาษานี้ทำให้ฉันหิวตลอดเวลา
หยุดที่จะเปลี่ยนรหัสลับเมื่อ

@ TùxCräftîñgเฉพาะสำหรับอาร์เรย์ 2 มิติซึ่งเป็นเหตุผลที่ฉันใช้. ไลน์เพื่อรับบรรทัด
Downgoat

10

Perl, 21 + 1 = 22 ไบต์

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

วิ่งด้วย-pธง แทนที่ด้วย raw ESCไบต์ ( 0x1b) และด้วยแท็บแนวตั้ง ( 0x0b)

แท็บแนวตั้งเป็นแนวคิดของ Martin Ender มันบันทึกสองไบต์! ขอบคุณ


คุณไม่จำเป็นต้องเลื่อนเคอร์เซอร์ลงบรรทัดในตอนเริ่มต้นเพื่อไม่ให้ exponents ไม่เหลื่อมกับพรอมต์คอนโซลล่าสุดหรือไม่
Martin Ender

ฉันไม่แน่ใจเกี่ยวกับเรื่องนั้นใช่ ฉันตั้งสมมติฐานว่าจะมีพื้นที่มากที่สุดเท่าที่ฉันต้องการ แต่บางทีนั่นอาจจะเป็นเรื่องโกง (โดยทั่วไปฉันไม่ค่อยภูมิใจในการใช้การเคลื่อนไหวของเคอร์เซอร์เพื่อแก้ปัญหาแบบนี้ แต่มันเป็นสิ่งแรกที่นึกถึง ... )
Lynn

2
ฉันคิดว่ามันเป็นวิธีการแก้ปัญหาที่ดี แต่ผลลัพธ์ควรจะแยกไม่ออกจากการพิมพ์สตริงตามที่ต้องการ
Martin Ender

1
ช่างน่ารักเหลือเกิน
Thomas Weller

7

JavaScript (ES6), 56 55 ไบต์

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

Regexps เพื่อช่วยเหลือแน่นอน อักขระตัวแรกแทนที่อักขระทั้งหมดด้วยช่องว่างเว้นเสียแต่ว่าจะพบเครื่องหมายรูปหมวกซึ่งในกรณีนี้จะลบเครื่องหมายรูปหมวกและเก็บอักขระไว้ตามหลัง (อักขระเหล่านี้รับประกันว่าจะมีอยู่จริง) ตัวที่สองคือตัวอักษรที่ชัดเจนเพื่อแทนที่เครื่องหมายรูปหมวกแต่ละตัวและอักขระต่อไปนี้ด้วยช่องว่าง

แก้ไข: บันทึก 1 ไบต์ขอบคุณ @Lynn ผู้คิดค้นวิธีการใช้สตริงการแทนที่สำหรับการแทนที่ครั้งที่สองเพื่อให้การแทนที่ถูกแมปผ่านอาร์เรย์ของ regexps


2
ดูเหมือนว่าs=>[/.(\^(.))?/g,/\^.(())/g].map(r=>s.replace(r,' $2'))จะเป็นไบต์ที่สั้นกว่า
ลินน์

@ ลินน์นั่นเป็นเรื่องที่น่าสนใจมาก!
Neil

7

Python 3, 157 101 98 85 83 74 ไบต์

วิธีการแก้ปัญหานี้จะติดตามว่าตัวอักษรก่อนหน้านั้นเป็นตัว^ตัดสินว่าจะส่งออกไปยังบรรทัดแรกหรือบรรทัดที่สองตามนั้นหรือไม่

['firstline', 'secondline']ขาออกเป็นอาร์เรย์ของ

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

บันทึกแล้ว13 15 ไบต์ขอบคุณ @LeakyNun!

บันทึกแล้ว 7 ไบต์ขอบคุณ @Joffan!


1
ออโตเมติก จำกัด - Nice
Leun Nun

มันจะเป็นการดีกว่าถ้ามีa=['','']และเชื่อมต่อกัน' 'และcเข้าโดยตรงa[l]และa[~l]?
Joffan

6

Python 2, 73 ไบต์

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

ไม่มี regex จำได้ว่าตัวละครก่อนหน้านี้เป็น^และใส่ตัวละครปัจจุบันในบรรทัดบนหรือด้านล่างตามที่และช่องว่างในอีกหนึ่ง


4

Pyth, 17 ไบต์

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

ส่งคืนอาร์เรย์ 2 สตริง (เตรียมที่jจะเข้าร่วมกับพวกเขาด้วยการขึ้นบรรทัดใหม่)

ลองมันออนไลน์


1
ฉันไม่สามารถหยุดสงสัยว่านามสกุลของคุณออกเสียงอย่างไร : D
Lynn

4

MATL , 18 ไบต์

94=t1YSt~&vG*cw~Z)

ลองออนไลน์!

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 ( -nแฟล็ก) = 48 ไบต์

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

เรียกใช้เช่น: ruby -ne 'puts$_.gsub(/\^(.)|./){$1||" "},gsub(/\^./," ")'


ฉันคิดว่าคุณสามารถบันทึก 1 ไบต์ใช้$_=$_.gsub(/\^(.)|./){$1||" "}+gsub(/\^./," ")และแทน-p -n
Dom Hastings

1
@DomHastings โดยไม่คำนึงว่ามันใช้งานได้หรือไม่รหัสของคุณดูเหมือนจะไม่ขึ้นบรรทัดใหม่และการเพิ่ม+$/หมายความว่ามันจะไม่บันทึกไบต์ putsโยนขึ้นบรรทัดใหม่ให้กับคุณโดยอัตโนมัติเมื่อ,มีอยู่ระหว่างข้อโต้แย้ง
หมึกมูลค่า

โอ้ ... ฉันทดสอบโดยใช้ruby -p ... <<< 'input'แต่ฉันเห็นด้วยถ้ามันหายไปขึ้นบรรทัดใหม่มันไม่ดี! ที่จริงแล้วฉันอาจมีบรรทัดใหม่ต่อท้ายในการทดสอบของฉันก่อนหน้านี้ ... มันเป็นที่ทำงาน แต่ฉันไม่สามารถตรวจสอบได้!
Dom Hastings

@ DomHastings ดูอีกครั้งฉันเดาว่าเป็นเพราะgetsมีการขึ้นบรรทัดใหม่ส่วนใหญ่ แต่ถ้าคุณไพพ์ในไฟล์ที่ไม่มีการขึ้นบรรทัดใหม่มันจะไม่ปรากฏขึ้นและผลลัพธ์จะผิด . ทดสอบโค้ดของคุณด้วยruby -p ... inputfileเนื่องจาก Ruby เปลี่ยนเส้นทางgetsไปยังไฟล์หากเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
หมึกมูลค่า

เข้าใจแล้วมันสมเหตุสมผลดี ฉันเดาว่าบรรทัดใหม่ต่อท้ายในไฟล์จะแก้ไขปัญหาได้เช่นกัน ฉันไม่ใช่นักทับทิมผู้ชำนาญในด้านใดเลยดังนั้นฉันรู้สึกว่าฉันได้เรียนรู้เกี่ยวกับสิ่งนี้มากขึ้นในวันนี้ ขอบคุณ!
Dom Hastings

3

Python (2), 76 68 67 ไบต์

-5 ไบต์ขอบคุณ @LeakyNun

-3 ไบต์ขอบคุณ @ KevinLau-notKenny

-1 ไบต์ขอบคุณ @ValueInk

-0 ไบต์ขอบคุณ @DrGreenEggsandIronMan

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

ฟังก์ชัน Lambda แบบไม่ระบุชื่อนี้รับสตริงอินพุตเป็นอาร์กิวเมนต์เท่านั้นและส่งคืนสองบรรทัดเอาต์พุตที่คั่นด้วยบรรทัดใหม่ ในการเรียกมันให้ตั้งชื่อด้วยการเขียน "f =" ไว้ข้างหน้า

regex ตรงไปตรงมาสวย: ส่วนแรกแทนที่ต่อไปนี้ด้วยช่องว่าง: ตัวอักษรใด ๆ และแครอท caret หรือเพียงถ่าน แต่เฉพาะในกรณีที่ไม่มี caret ก่อนพวกเขา ส่วนที่สองแทนที่เครื่องหมายรูปหมวกใด ๆ ในสตริงและอักขระที่ตามหลังด้วยช่องว่าง


@LeakyNun: ฉันมีเหตุผลบางอย่างที่สงสัยว่า 1. ยังมีอยู่ถ้าฉันนำเข้าห้องสมุด กำลังคัดลอก 2. ลงในคำถามนี้ทันทีเมื่อฉันเห็นความคิดเห็นของคุณ ขอบคุณคุณและเควิน!
KarlKastor

คุณสามารถใช้หนึ่งไบต์ด้วยfrom re import*
DJMcMayhem

@DrGreenEggsandIronMan ดูเหมือนว่าจะใช้จำนวนไบต์เท่ากันทุกประการ (ดูด้านบน)
KarlKastor

เก็บข้อความสั่งการนำเข้าเก่าไว้และทำlambda i,s=re.sub:[s("(?<!\^).\^?"," ",i),s("\^."," ",i)]เพื่อ -1 ไบต์
Value Ink


2

เรติน่า 16 ไบต์

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

พอร์ตของคำตอบ Perl ของฉันชี้ให้เห็นโดย Martin Ender แทนที่ด้วย raw ESCไบต์ ( 0x1b) และด้วยแท็บแนวตั้ง ( 0x0b)


2

shell + TeX + catdvi, 51 43 ไบต์

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

ใช้texเพื่อเรียงพิมพ์คณิตศาสตร์ที่สวยงามแล้วใช้catdviในการแสดงข้อความ คำสั่ง head จะลบอีเมลขยะ (หมายเลขหน้าการขึ้นบรรทัดใหม่) ที่แสดงเป็นอย่างอื่น

แก้ไข: ทำไมสิ่งที่ยาวเหมาะสมถูกต้องและเปลี่ยนเส้นทาง/dev/nullเมื่อคุณสามารถเพิกเฉยด้านข้างและเขียนไปยังไฟล์ตัวอักษรเดียวได้


ตัวอย่าง

การป้อนข้อมูล: abc^d+ef^g + hijk^l - M^NO^P (Ag^+)

เอาต์พุต TeX (ครอบตัดเป็นสมการ): คณิตศาสตร์ "สวย"! ผลลัพธ์สุดท้าย:

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

ข้อสันนิษฐาน: เริ่มต้นใน dir ที่ว่างเปล่า (หรือโดยเฉพาะ dir ที่ไม่มีชื่อลงท้ายด้วย "i") อินพุตเป็นอาร์กิวเมนต์เดี่ยวของสคริปต์เชลล์ อินพุตไม่ใช่สตริงว่าง

catdviใครบางคนบอกฉันว่านี่คือการละเมิดกฎโดยเฉพาะอย่างยิ่ง


2

Haskell, 74 56 55 ไบต์

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

ส่งคืนสตริงหนึ่งคู่ ตัวอย่างการใช้: 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 )")

gทำรายการคู่โดยที่องค์ประกอบแรกคือถ่านในบรรทัดบนและองค์ประกอบที่สองคือถ่านในบรรทัดล่าง unzipเปลี่ยนเป็นรายการคู่

แก้ไข: @xnor แนะนำunzipซึ่งจะช่วยประหยัด 18 ไบต์ @Laikoni พบอีกหนึ่งไบต์เพื่อบันทึก ขอบคุณ!


คุณสามารถทำj=unzip.gอะไร
xnor

@ xnor: โอ้วิธีโง่ฉันไม่เห็นตัวเอง! ขอบคุณมาก!
nimi

คุณสามารถแทนที่g[]=[]ด้วยg x=xเพื่อบันทึกหนึ่งไบต์
Laikoni

@Laikoni: ด่างดี! ขอบคุณ!
nimi

1

Perl, 35 ไบต์

34 ไบต์รหัส + 1 สำหรับ -p

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

การใช้

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 )

หมายเหตุ: นี่เป็นคำตอบเดียวกับValue Inkที่ฉันสอดแนมในภายหลัง จะลบออกถ้าจำเป็นเนื่องจากไม่ได้เพิ่มโซลูชัน Ruby จริงๆ


1

Java 8 lambda, 132 128 112 ตัวอักษร

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

รุ่นที่ไม่ได้รับการยกย่องมีลักษณะเช่นนี้:

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

เอาต์พุตเป็นอาร์เรย์เพียงตรวจสอบว่ามีคาเร็ตหรือไม่และหากเป็นเช่นนั้นอักขระตัวถัดไปจะถูกวางในแถวบนมิฉะนั้นจะมีช่องว่าง


อัพเดท

แทนที่อักขระด้วยค่า ascii เพื่อบันทึก 4 อักขระ

ขอบคุณ @LeakyLun ที่ชี้ให้เห็นว่าใช้อาร์เรย์ถ่านเป็นอินพุตแทน

นอกจากนี้ยังต้องขอบคุณ @KevinCruijssen ที่เปลี่ยนintไปใช้charเพื่อบันทึกอักขระเพิ่มเติม


คุณสามารถลองป้อนข้อมูลchar[]และใช้for(char c:i)เพื่อดูว่าสามารถลดจำนวนไบต์ได้ไหม
Leun Nun

คุณสามารถกอล์ฟลงเล็กน้อยถึง 110 ไบต์โดยใช้: 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;}ด้วย"abc^d+ef^g + hijk^l - M^NO^P (Ag^+)".toCharArray()เป็น input ( เป็นการดีเลิศของการเปลี่ยนแปลงเหล่านี้ )
Kevin Cruijssen

1

โคโคนัท , 122 114 96 ไบต์

แก้ไข: 8 26 bytes down ด้วยความช่วยเหลือจาก 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')

ดังนั้นในขณะที่ผมได้เรียนรู้ในวันนี้หลามมีผู้ประกอบการที่มีเงื่อนไข ternary หรือในความเป็นจริงทั้งสองของพวกเขา<true_expr> if <condition> else <false_expr>และ<condition> and <true_expr> or <false_expr>กับคนสุดท้ายที่มาพร้อมกับหนึ่งถ่านน้อย
รุ่นหลามสอดคล้องสามารถideoned


ความพยายามครั้งแรก:

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

การโทรด้วยf("abc^d+ef^g + hijk^l - M^NO^P (Ag^+)")ภาพพิมพ์

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

มีใครลองกอล์ฟในมะพร้าวหรือยัง มันเสริมสร้างงูหลามกับแนวคิดการเขียนโปรแกรมการทำงานมากขึ้นเช่นการจับคู่รูปแบบและฟังก์ชั่นการต่อข้อมูล (พร้อม..) ที่ใช้ข้างต้น เนื่องจากนี่เป็นครั้งแรกที่ฉันลองมะพร้าวเคล็ดลับใด ๆ จะได้รับการชื่นชม

สิ่งนี้อาจสั้นลงได้เนื่องจากรหัสไพ ธ อนที่ถูกต้องใด ๆ ก็เป็นโคโคนัทที่ถูกต้องและคำตอบของไพ ธ อนที่สั้นกว่านั้นก็โพสต์ไว้ แต่ฉันพยายามค้นหาวิธีแก้ปัญหาที่ใช้งานได้


ฉันคิดว่าคุณสามารถใช้ประกอบ ternary ( x and y or z) caseจะเข้ามาแทนที่
Leun Nun

คุณสามารถใช้s[0]=="^"แทนmatch['^',c]+r in l
Leaky Nun

@LeakyNun เมื่อฉันแทนที่match['^',c]+rด้วยs[0]=="^"แล้วcและrจะไม่ถูกผูกไว้อีกต่อไป สิ่งนี้จะช่วยได้อย่างไร
Laikoni

คุณสามารถใช้s[1]เพื่อแทนที่cและจะเข้ามาแทนที่s[2:] r
Leun Nun

จากนั้นคุณสามารถใช้ประกอบไปด้วยได้ทันที
Leun Nun

0

Dyalog APL, 34 ไบต์

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

มันคืนค่าเวกเตอร์สององค์ประกอบพร้อมสองบรรทัด

ตัวอย่างการดำเนินการ (ความกว้างที่อยู่ด้านหน้าคือการจัดรูปแบบเวกเตอร์สองส่วนสำหรับการบริโภคของมนุษย์):

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

ความคิดเห็นของคุณเกี่ยวกับคำถามของฉันเกี่ยวกับโค้ดไม่ได้ทำอะไรเลย: ใช่รหัสที่คุณนับมี
haykam

0

PowerShell v2 +, 88 83 ไบต์

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

ยาวกว่าคนอื่นเล็กน้อย แต่นำเสนอ PowerShell เวทมนตร์เล็กน้อยและตรรกะที่แตกต่างกันเล็กน้อย

โดยพื้นฐานแล้วแนวคิดเดียวกันกับคำตอบของ Python - เราวนซ้ำไปเรื่อย ๆ โดยป้อนอักขระทีละตัวอักษรโปรดจำไว้ว่าตัวอักษรก่อนหน้าเป็นคาเร็ต ( $c) และใส่อักขระปัจจุบันลงในตำแหน่งที่เหมาะสม อย่างไรก็ตามตรรกะและวิธีการในการกำหนดตำแหน่งที่จะจัดการแตกต่างกันเล็กน้อยและไม่มีตัวแปร tuple หรือแยก - เราทดสอบว่าตัวละครก่อนหน้าเป็นคาเร็ตและถ้าเอาท์พุทตัวละครไปป์ไลน์และเชื่อมต่อพื้นที่บน$b. มิฉะนั้นเราจะตรวจสอบว่าอักขระปัจจุบันเป็นคาเร็ตหรือไม่elseif($_-94)และถ้าไม่ใช่เราจะต่ออักขระปัจจุบันเข้ากับ$bและส่งช่องว่างไปยังไพพ์ไลน์ ในที่สุดเราก็กำหนดว่าตัวละครในปัจจุบันจะเป็นตัวอ่อนสำหรับรอบถัดไปหรือไม่

เรารวบรวมตัวละครเหล่านั้นจากไปป์ไลน์รวมกันเพื่อสรุปแค็ปซูลพวกเขาในสิ่ง-joinที่ทำให้พวกเขากลายเป็นสตริงและปล่อยให้มันพร้อมกับ$bในท่อ เอาท์พุทในตอนท้ายจะมีความหมายด้วยขึ้นบรรทัดใหม่ในระหว่าง

สำหรับการเปรียบเทียบนี่เป็นพอร์ตโดยตรงของคำตอบ Pythonของ @ xnor ที่85 ไบต์ :

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

0

Gema, 42 41 ตัวอักษร

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

Gema ประมวลผลอินพุตเป็นสตรีมดังนั้นคุณต้องแก้ไขในหนึ่งรอบ: บรรทัดแรกจะถูกเขียนทันทีที่ประมวลผลแล้วบรรทัดที่สองจะถูกรวบรวมในตัวแปร $ s จากนั้นส่งออกที่ท้าย

วิ่งตัวอย่าง:

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

หมากฝรั่งอบเชย, 21 ไบต์

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

ไม่ใช่การแข่งขัน ลองออนไลน์

คำอธิบาย

ฉันไม่ค่อยนักกอล์ฟ regex ดังนั้นอาจมีวิธีที่ดีกว่าในการทำเช่นนี้

สตริงขยายตัวไปที่:

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

(สังเกตพื้นที่ต่อท้าย)

Sขั้นตอนแรกรับอินพุตและใช้ lookbehind เชิงลบเพื่อแทนที่อักขระทั้งหมดที่ไม่ใช่คาเร็ตที่ไม่มีคาเร็ตที่นำหน้าด้วยช่องว่างจากนั้นลบคาเร็ตทั้งหมด จากนั้นจะส่งเอาต์พุตสตริงอินพุตที่แก้ไขด้วยบรรทัดใหม่ทันทีและลบสSเตจนั้นออก เนื่องจากตอนนี้ STDIN หมดแล้วและขั้นตอนก่อนหน้าไม่ได้ให้ข้อมูลใด ๆSขั้นตอนต่อไปจะได้รับบรรทัดสุดท้ายของ STDIN อีกครั้งจากนั้นแทนที่คาเร็ตทั้งหมดตามด้วยอักขระใด ๆ ที่มีช่องว่างและเอาต์พุต

ใน 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 ไบต์

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

ลองออนไลน์!

                  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

จะต้องมีวิธีที่ดีกว่า ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.