สัญลักษณ์คำนำหน้ากับเครื่องหมายคำนำหน้า


19

คำเตือน: ไม่นี่ไม่ใช่เรื่องตลกที่จะเล่นสตริง

งาน

มีเพียงหนึ่งการดำเนินการที่จะสนับสนุนคือ: การลบ ( -)

คุณมีเพียงสองอะตอมที่จะสนับสนุน: ศูนย์ ( 0) และหนึ่ง ( 1)

ที่นี่คำนำหน้าสัญกรณ์-ABเทียบเท่ากับสัญกรณ์ postfix AB-ที่AและBเป็นนิพจน์

งานของคุณคือการแปลงนิพจน์ในรูปแบบของคำนำหน้าให้เทียบเท่าในรูปแบบของ postfix

คำนิยาม

นิพจน์ในรูปแบบนำหน้าถูกสร้างขึ้นโดยไวยากรณ์ต่อไปนี้:

S > -SS
S > 0
S > 1

การแสดงออกในเครื่องหมาย postfix ถูกสร้างขึ้นโดยไวยากรณ์ต่อไปนี้:

S > SS-
S > 0
S > 1

ตัวอย่าง

Prefix notation:  --01-0-01
Parentheses:      -(-01)(-0(-01))
Convert:          (01-)(0(01-)-)-
Postfix notation: 01-001---

กฎและเสรีภาพ

  • คุณสามารถเปลี่ยนชื่อการดำเนินการและอะตอมเป็นตัวละครใดก็ได้ตราบใดที่มันสอดคล้องกัน
  • รูปแบบอินพุตต้องสอดคล้องกับรูปแบบเอาต์พุต (นอกเหนือจากข้อเท็จจริงที่ว่าอินพุตอยู่ในรูปแบบของคำนำหน้าและผลลัพธ์อยู่ในรูปแบบของ postfix)

TestCase

Input       Output
1           1
0           0
-01         01-
-10         10-
--01-0-01   01-001---

Testcases สินเชื่อDada


1
คุณช่วยเพิ่มกรณีทดสอบอีกสองสามข้อได้ไหม
Shaggy

@Shaggy คุณชอบแบบทดสอบแบบไหน?
แม่ชีที่รั่วไหล

@LeakyNun เป็นเรื่องดีไหมที่จะใช้อินพุทและเอาท์พุทเป็นตัววนซ้ำอย่างที่ฉันทำในคำตอบล่าสุดของฉัน?
L3viathan

@ L3viathan ผมคิดว่าอย่างนั้น ...
รั่วนูน

คำตอบ:


12

brainfuck , 32 ไบต์

,[[->++++<<+>]>[[-]<<[.[-]<]]>,]

ลองออนไลน์!

ฉันใช้@เป็นการดำเนินการเพราะจุดรหัส (64) สะดวก Uเป็นไปได้ด้วยจำนวนไบต์เดียวกันโดยใช้ 3 * 85 + 1 = 256 = 0

คำอธิบาย

เทปถูกใช้เป็นสแต็ก ในแต่ละการวนซ้ำของลูปหลักตัวชี้ข้อมูลจะเริ่มต้นสองเซลล์ทางด้านขวาของด้านบนของสแต็ก

,[                Take input and start main loop
  [->++++<<+>]    Push input, and compute 4*input
  >[              If 4*input is nonzero (and thus input is not @):
    [-]<<           Zero out this cell and move to top of stack
    [.[-]<]         Pop from stack and output until \0 is reached
  ]
  >,              Move pointer into the correct position.  If input was @, the earlier > pushed \0 onto the stack.
]

6

Retina , 37 30 29 ไบต์

M!`-*.
+m`^-(.*)¶(\d.*)
$1$2-

ลองออนไลน์! บันทึกแล้ว 7 ไบต์โดยตระหนักว่าคำศัพท์เริ่มต้นด้วยตัวเลขเสมอดังนั้นฉันไม่จำเป็นต้อง จำกัด การจับคู่เป็นลำดับสุดท้าย-อีกต่อไป (ก่อนหน้านี้เป็นคำเดียวที่รับประกันได้ว่าจะตามด้วยสองคำ) บันทึก 1 ไบต์โดยไม่ใส่-s ในบรรทัดของตนเอง ยกตัวอย่างเช่น-01กลายเป็นที่ถูกแทนที่แล้วด้วย-0¶1 01-ตอนนี้ถ้าฉันมี--010คือ--0¶1¶0แล้วฉันต้องการเปลี่ยนด้านใน-0¶1เพื่อ01-ให้ฉันสามารถแทนที่-01-¶0ด้วย01-0-แต่จริง ๆ แล้วมันไม่สำคัญว่าอัน-ไหนของสองฉันเอาออกดังนั้นฉันจะลบหนึ่งที่จุดเริ่มต้นของบรรทัดเป็น ง่ายต่อการทดสอบ


ฉันคิดว่านี่คือสิ่งที่คุณ :)
Leo

@Leo ไม่ทำงานโดยทั่วไปเช่นควรจะเป็น-0-0-00 0000---
Neil

คุณพูดถูก ฉันมีความคิดอื่น แต่มันแตกต่างกันอย่างมากดังนั้นฉันจะโพสต์เป็นคำตอบใหม่
Leo

1
@Leo ตอนนี้ฉันได้พบบางสิ่งบางอย่างของฉัน ...
นีล

1
@Leo กับกอล์ฟล่าสุดของฉันเราถูกผูกไว้!
Neil

6

Haskell , 62 59 ไบต์

f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
fst.f

ลองออนไลน์! การใช้งาน: fst.f $ "--01-0-01". 0และสามารถเป็นตัวอักษรโดยพลการที่มีขนาดใหญ่กว่าตัวอักษร1-

แก้ไข: -3 ไบต์ขอบคุณ Zgarb!

ฟังก์ชันfแยกวิเคราะห์ซ้ำหนึ่งนิพจน์และส่งกลับ tuple ของนิพจน์นี้ในรูปแบบของ postfix และสตริงที่เหลือตามไวยากรณ์ง่าย ๆ ที่สามารถสร้างคำนำหน้านิพจน์ได้:

<exp> ::= - <exp> <exp> | 0 | 1

หากอักขระตัวแรกaของสตริงการป้อนข้อมูลมีขนาดใหญ่กว่า-เราจะอยู่ที่นิพจน์อะตอมมิกและคืนค่า tuple ของสตริงที่มีอักขระaและส่วนที่เหลือของสตริงอินพุต

หากเราพบก-ต้องแยกคำสองนิพจน์ นี้สามารถทำได้โดยการ(a,x)<-f rที่จะได้รับการแสดงออกครั้งแรกaและจากนั้นแยกสตริงส่วนที่เหลือxอีกครั้ง(b,c)<-f xที่จะได้รับการแสดงออกที่สองและสตริงส่วนที่เหลือสุดท้ายb ไม่ตรงนี้เพราะใน tuples แผนที่ฟังก์ชั่นสององค์ประกอบที่สองของ tuple ในขณะที่เป็นสามไบต์สั้นกว่า หลังจากได้รับทั้งสำนวนและสตริงส่วนที่เหลือสำนวนที่มีการตัดแบ่งและ "-" ถูกผนวก:c(a,(b,c))<-f<$>f r<$>(a,x)<-f r,(b,c)<-f x(a++b++"-",c)


1
คุณสามารถบันทึก 3 ไบต์ด้วยการรวมเคส:f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
Zgarb

@Zgarb ขอบคุณ! ด้วยเหตุผลบางอย่างฉันพิจารณาเฉพาะf(x:r)|x<'0',(a,(b,c))<-f<$>f r=(a++b++"-",c)|1<3=([x],r)เมื่อฉันค้นหารุ่นที่มีทั้งสองกรณีรวมกันซึ่งมีความยาวมากกว่าไบต์
Laikoni

5

Haskell, 54 ไบต์

v f""=""
v f(a:s)=last(v.v:[id|a>'-'])((a:).f)s
h=v h

ฟังก์ชันvรับสตริงและฟังก์ชันจัดเรียงนิพจน์ย่อยใหม่จากนั้นใช้ฟังก์ชันกับส่วนที่เหลือของสตริงจนกว่าทุกอย่างจะถูกจัดเรียงใหม่ อาร์กิวเมนต์ call stack และ function ร่วมกันติดตามว่านิพจน์ใดที่ถูกวิเคราะห์คำ ฟังก์ชั่นhตอบคำถามท้าทายและถูกvเรียกตัวเองว่าเป็นอาร์กิวเมนต์แรก ๆ


1
ว้าว! (1) นั่นเป็นเพียง 53 คุณไม่จำเป็นต้องนับบรรทัดใหม่ขั้นสุดท้าย (2) บรรทัดแรกสามารถตัดให้สั้นลงv f l=lหากคุณเลื่อนไปบรรทัดที่สอง
Ørjan Johansen

1
v idผมไม่คิดว่าคุณต้องการที่จะแยกการแสดงออกมากกว่าหนึ่งทั้งเพื่อให้คุณสามารถบันทึกไบต์โดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อ
Ørjan Johansen

1
ที่จริงแล้วบรรทัดแรกจะไม่ถูกเรียกบนอินพุตที่ถูกต้องดังนั้นคุณสามารถลบได้
Ørjan Johansen

1
การแบ่งเป็นยามดูเหมือนจะเอาชนะlastเคล็ดลับโดยหนึ่งไบต์
Ørjan Johansen

4

Perl 5 , 57 ไบต์

sub f{"@_"=~s/x((?0)|.)((?0)|.)/my$n=$2;f($1).f($n).x/re}

ฉันใช้xเป็นโอเปอเรเตอร์แทน-(ดูที่การเชื่อมโยง TryItOnline ร้อง)

ลองออนไลน์!

คำอธิบาย:
/x((?0)|.)((?0)|.)/จับคู่นิพจน์แบบเต็มแบบเรียกซ้ำ: xที่จุดเริ่มต้นจากนั้นนิพจน์(?0)(เป็นการเรียกซ้ำ) หรืออะตอม ( .) ตามด้วยนิพจน์หรืออะตอมอื่น
จากนั้นฉันต้องบันทึกนิพจน์ / อะตอมที่สอง ( my$n=$2;) เพราะมิฉะนั้นการเรียกซ้ำจะแทนที่มัน
จากนั้นฟังก์ชั่นจะถูกเรียกซ้ำในนิพจน์แรก ( f($1)) จากนั้นในวันที่สองf($n)และxจะถูกผนวกเข้าที่ท้าย ( .x)


4

Python 3, 117 112 105 100 98 76 62 61 59 ไบต์

def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]

การเปลี่ยนแปลง:

  • ลบ linebreaks หากทำได้ (-5 ไบต์)
  • แลมบ์ดาแทนฟังก์ชั่นเต็มรูปแบบ (-7 ไบต์ขอบคุณ @Dada)
  • ไม่อื่น (-5 ไบต์ขอบคุณ @Leaky Nun)
  • ยกเลิกการเล่นกอล์ฟมากเกินไป (-2 ไบต์ขอบคุณ @Leaky Nun)
  • ทำงานกับรายการส่วนกลางแทน (-22 ไบต์)
  • ที่จริงแล้วมาทำงานกับ iterators แทน (-14 bytes)
  • เปลี่ยน!=เป็น>(-1 ไบต์คัดลอกจากคำแนะนำของ @ovs)
  • เล่ห์เหลี่ยมการประเมินผลขี้เกียจ (-2 ไบต์ขอบคุณ @ovs)

ใช้แบบนี้:

>>> list(p(iter("--01-0-01")))
['0', '1', '-', '0', '0', '1', '-', '-', '-']


2
lambda x:p(x)[0]อาจแทนที่fฟังก์ชั่นของคุณ
Dada

1
คุณไม่จำเป็นต้องทำยังelseไง
Leun Nun

1
มีการd="-"บันทึกไบต์จริง ๆ หรือไม่
Leun Nun

1
def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]for 59 bytes
ovs

3

Pyth, 20 ไบต์

L+&-hbTsyM.-Btbytbhb

สิ่งนี้จะสร้างฟังก์ชันyที่ต้องการสตริงเป็นพารามิเตอร์

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

ฟังก์ชันyจะแยกวิเคราะห์และแปลงนิพจน์ส่วนนำหน้าแรกเป็นนิพจน์ postfix ดังนั้นหากจะเรียกว่าเหมือนมันจะกลับมาเท่านั้นy"10"1

L+&-hbTsyM.-Btbytbhb
L                      define a function y(b), that returns:
   -hbT                   remove the chars "10" from the first char b
                          (T=10, and - will convert a number to a string)
  &                       if this gives the empty string (a falsy value)
 +                hb         then append b[0] to it and return it
                             (so this will parse a digit 0 or 1 from the string)
  &                       otherwise (the first char is a -)
               ytb           parse the first prefix expression from b[1:]
                             (recursive call)
          .-Btb              remove this parsed expression bifurcated from b[1:]
                             this gives a tuple [b[1:], b[1:] without first expr]
        yM                   parse and convert an expression from each one
       s                     join the results
 +                hb         and append the b[0] (the minus) to it and return

2

เรติน่า , 34 31 29 ไบต์


;
-;
¶
+`¶(.+);(.+)
$1$2-
;

ลองออนไลน์!

;ถูกใช้เพื่อระบุโหนดซึ่งเริ่มแรกประกอบด้วยหมายเลขเดียวแล้วเติบโตเป็นสิ่งใด ๆ ที่มีการแยกวิเคราะห์แล้ว -กลายเป็นบรรทัดใหม่เพื่อให้.+เราสามารถคว้าสิ่งที่ไม่ได้แยกวิเคราะห์-ได้


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