ใช้สัญลักษณ์ Anyfix!


16

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

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

คุณจะต้องสนับสนุนคำสั่งต่อไปนี้:

(Arity 1)

  • ที่ซ้ำกัน
  • เชิงลบ

(Arity 2)

  • ส่วนที่เพิ่มเข้าไป
  • การคูณ
  • ความเสมอภาค: ผลตอบแทนหรือ01

คุณอาจเลือกใช้สัญลักษณ์ที่ไม่ใช่ช่องว่างห้าคำสำหรับคำสั่งเหล่านี้ เพื่อจุดประสงค์ในการสาธิตฉันจะใช้สิ่ง"ที่ซ้ำกัน×เป็นการคูณและการ+บวก

สำหรับตัวอักษรคุณจะต้องสนับสนุนจำนวนเต็มที่ไม่เป็นลบเท่านั้น แต่ล่ามของคุณจะต้องมีจำนวนเต็มทั้งหมด (ภายในช่วงจำนวนเต็ม (เหมาะสม) ของภาษาของคุณ)

10+5ลองมาดูตัวอย่างนี้: ที่เก็บข้อมูลควรทำตัวเป็นสแต็กไม่ใช่คิว ดังนั้นก่อนกองเริ่มต้นที่และจัดคิวเริ่มต้นรายการที่ผู้ประกอบการ[] []จากนั้นที่แท้จริงคือการประเมินผลซึ่งจะทำให้สแต็ค10 [10]ถัดไปตัวดำเนินการ+ได้รับการประเมินซึ่งต้องการอาร์กิวเมนต์สองตัว ['+']แต่มีเพียงคนเดียวคือข้อโต้แย้งในกองดังนั้นรายชื่อผู้ประกอบการที่อยู่ในคิวจะกลายเป็น จากนั้นที่แท้จริงคือการประเมินผลซึ่งจะทำให้สแต็ค5 [10, 5]ณ จุดนี้ผู้ประกอบการ'+'สามารถประเมินจึงเป็นสิ่งที่ทำให้สแต็คและคิว[15][]

ผลสุดท้ายควรจะเป็น[15]สำหรับ+ 10 5, และ10 + 510 5 +

10+"ลองมาดูตัวอย่างหนัก: สแต็คและคิวเริ่มต้นและ[] ได้รับการประเมินครั้งแรกซึ่งจะทำให้สแต็ค ถัดไปคือการประเมินซึ่งไม่เปลี่ยนแปลงสแต็ค (เพราะไม่มีข้อโต้แย้งพอ) และทำให้คิว จากนั้นจะทำการประเมิน นี้สามารถทำงานได้ทันทีดังนั้นจึงเป็นที่ทำให้สแต็ค ขณะนี้สามารถได้รับการประเมินเพื่อให้สแต็คจะกลายเป็นและคิว ผลสุดท้ายคือ[]10[10]+['+']"[10, 10]+[20][][20]

สิ่งที่เกี่ยวกับคำสั่งของการดำเนินงาน?

×+"10 10ลองมาดูที่ สแต็กและคิวเริ่มต้นทั้งสองเป็น[]:

  • ×: ['×']สแต็คได้มีการเปลี่ยนแปลงและคิวจะกลายเป็น
  • +: ['×', '+']สแต็คได้มีการเปลี่ยนแปลงและคิวจะกลายเป็น
  • ": ['×', '+', '"']สแต็คได้มีการเปลี่ยนแปลงและคิวจะกลายเป็น
  • 10: [10]สแต็คจะกลายเป็น แม้ว่า×ควรจะเป็นผู้ดำเนินการรายแรกที่ได้รับการประเมินเนื่องจากปรากฏก่อน"สามารถรันได้ทันทีและไม่มีผู้ดำเนินการรายใดก่อนจึงจะสามารถประเมินผลได้ สแต็คจะกลายเป็นและคิว[10, 10] ขณะนี้สามารถประเมินได้ซึ่งจะทำให้สแต็คและคิว['×', '+']×[100]['+']
  • 10: สแต็กจะกลายเป็น[100, 10]ซึ่งช่วยให้+สามารถประเมิน สแต็คจะกลายเป็นและคิว[110][]

[110]ผลสุดท้ายคือ

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

ท้าทาย

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

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์จะชนะ

กรณีทดสอบ

สำหรับกรณีการทดสอบเหล่านี้ซ้ำ"ลบคือ-นอกจากเป็น+คูณเป็นและความเท่าเทียมกันคือ×=

Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • คุณอาจใช้ล่ามอย่างเป็นทางการของ anyfix และเล่นกอล์ฟหากคุณต้องการ คาดว่าจะสูญเสียอย่างน่ากลัว

การป้อนข้อมูลจะได้รับเป็นสตริงและเอาท์พุทเป็นอาร์เรย์จำนวนเต็มเดียวออกมาเป็นตัวแทนสตริงของทั้ง คุณอาจสันนิษฐานว่าข้อมูลที่ป้อนจะมีช่องว่างตัวเลขและ 5 ตัวอักษรที่คุณเลือกเท่านั้น

* ไม่จริง


2
ไปได้ทุกที่ * ™
Jonathan Allan

ผลลัพธ์ของตัวดำเนินการความเสมอภาคคืออะไร 0และ1?
เฟลิกซ์ Palmen

1
@JanathanAllan ดูด้านบน; ฉันลบคำสั่งฉีกออก
HyperNeutrino

1
@ RickHitchcock แน่นอน
HyperNeutrino

1
คุณอาจรวมถึง×+"10 10ในกรณีทดสอบหรือตัวอย่างอื่น ๆ ที่ 1) ใช้ช่องว่างและ 2) ชะลอการใช้ตัวดำเนินการซ้ำซ้อน (สองสิ่งที่ฉันพลาดทั้งหมด)
Arnauld

คำตอบ:


5

JavaScript (ES6), 204 203 200 ไบต์

ส่งคืนจำนวนเต็ม

e=>e.replace(/\d+|\S/g,v=>{for((1/v?s:v>','?u:b)[U='unshift'](v);!!u[0]/s[0]?s[U](u.pop()>'c'?s[0]:-S()):!!b[0]/s[1]?s[U](+eval(S(o=b.pop())+(o<'$'?'==':o)+S())):0;);},s=[],u=[],b=[],S=_=>s.shift())|s

ตัวละครที่ใช้:

  • +: ส่วนที่เพิ่มเข้าไป
  • *: การคูณ
  • #: ความเท่าเทียมกัน
  • d: ซ้ำซ้อน
  • -: เชิงลบ

กรณีทดสอบ

จัดรูปแบบและแสดงความคิดเห็น

e => e.replace(                     // given an expression e, for each value v matching
  /\d+|\S/g, v => {                 // a group of digits or any other non-whitespace char.
    for(                            //   this loop processes as many operators as possible
      (                             //   insert v at the beginning of the relevant stack:
        1 / v ? s : v > ',' ? u : b //     either value, unary operator or binary operator
      )[U = 'unshift'](v);          //     (s[], u[] or b[] respectively)
      !!u[0] / s[0] ?               //   if there's at least 1 value and 1 unary operator:
        s[U](                       //     unshift into s[]:
          u.pop() > 'c' ?           //       for the duplicate operator:
            s[0]                    //         a copy of the last value
          :                         //       else, for the negative operator:
            -S()                    //         the opposite of the last value
        ) :                         //     end of unshift()
      !!b[0] / s[1] ?               //   if there's at least 2 values and 1 binary operator:
        s[U](                       //     unshift into s[]:
          +eval(                    //       the result of the following expression:
            S(o = b.pop()) +        //         the last value, followed by the
            (o < '$' ? '==' : o) +  //         binary operator o with '#' replaced by '=='
            S()                     //         followed by the penultimate value
          )                         //       end of eval()
        ) : 0;                      //     end of unshift()
    );                              //   end of for()
  },                                // end of replace() callback
  s = [],                           // initialize the value stack s[]
  u = [],                           // initialize the unary operator stack u[]
  b = [],                           // initialize the binary operator stack b[]
  S = _ => s.shift()                // S = helper function to shift from s[]
) | s                               // return the final result

อย่าคิดว่ามันใช้งาน-1+-2ได้ ส่งคืน 3 แทน -3
Rick Hitchcock

1
@RickHitchcock ความเข้าใจของฉันคือการที่ 2 -จะต้องนำไปใช้-1ทันที
Arnauld

ฉันคิดว่าอันที่สอง-จะไปด้วย2เนื่องจากมันมาหลังจากผู้ประกอบการรายอื่น บางที @HyperNeutrino สามารถชี้แจงได้ ตัวดำเนินการเชิงลบอาจไม่ชัดเจนในบางสถานการณ์
Rick Hitchcock

3

JavaScript (ES6), 162 152 143 150 ไบต์

(s,N=s.replace(/(-?\d+)-|-(-)/g,'- $1 ').match(/(- ?)*?\d+|R/g))=>+eval(`R=${N[0]>'9'?N[1]:N[0]},${s.match(/[+*=]/g).map((o,i)=>'R=R'+o+'='+N[i+1])}`)

ungolfed เล็กน้อย:

(s,
 N=s.replace(/(-?\d+)-|-(-)/g,'- $1 ').      //change postfix negatives to prefix,
                                             //and change "--" to "- - "
     match(/(- ?)*?\d+|R/g)                  //grab numbers and duplicates
)=>+eval(`R=${N[0] > '9' ?  N[1] : N[0]},    //handle a delayed duplicate
          ${s.match(/[+*=]/g).               //grab the operators
              map((o,i)=>'R=R'+o+'='+N[i+1]) //create a comma-separated list of assignments
           }
         `)

คำอธิบาย

ฉันใช้*สำหรับการคูณและRซ้ำ ตัวดำเนินการอื่น ๆ เหมือนกับในคำถาม

N กลายเป็นอาร์เรย์ของตัวเลข (รวมถึงรายการซ้ำ)

replaceจัดการกรณีที่เครื่องหมายลบมาหลังจากที่จำนวน ยกตัวอย่างเช่นมันจะเปลี่ยน1-ไป- 1และจะ-1-- -1

ภายในeval, s.matchสร้างอาร์เรย์ของผู้ประกอบการไบนารี โปรดทราบว่าสิ่งนี้จะมีองค์ประกอบน้อยกว่าNหนึ่งเสมอ

ผลลัพธ์ของฟังก์ชันคือevalการทำแผนที่ของตัวเลขและตัวดำเนินการ

นี่คือสิ่งที่evaled สำหรับแต่ละกรณีทดสอบ:

0+2*3        R=0,R=R+=2,R=R*=3        = 6 
1+2*3        R=1,R=R+=2,R=R*=3        = 9 
1R+R+        R=1,R=R+=R,R=R+=R        = 4 
2R**R        R=2,R=R*=R,R=R*=R        = 16 
3R*+R        R=3,R=R*=R,R=R+=R        = 18 
3R+*R        R=3,R=R+=R,R=R*=R        = 36 
123R=        R=123,R=R==R             = 1 
1+2=3        R=1,R=R+=2,R=R==3        = 1 
1R=2+        R=1,R=R==R,R=R+=2        = 3 
1-2-+        R=- 1,R=R+=- 2           = -3 
-1-2+        R=1,R=R+=2               = 3 
*+R10 10     R=10,R=R*=10,R=R+=10     = 110 
+*R10 10     R=10,R=R+=10,R=R*=10     = 200 
-1+--2       R=-1,R=R+=- -2           = 1 
-1+-2        R=-1,R=R+=-2             = -3 

ตัวดำเนินการเครื่องหมายจุลภาคในนิพจน์ JavaScript ส่งคืนผลลัพธ์ของนิพจน์สุดท้ายดังนั้นmapจะส่งกลับนิพจน์ที่ใช้งานได้โดยอัตโนมัติ

+สัญญาณเป็นสิ่งจำเป็นก่อนที่จะevalมีการเปลี่ยนแปลงtrueไป1และการfalse0

การใช้Rทั้งตัวแปรและโอเปอเรเตอร์ที่ซ้ำซ้อนช่วยลดความยุ่งยากmapของนิพจน์ย่อย

กรณีทดสอบ:


2
ฉันไม่คิดว่าจะreplaceทำงานตามที่ตั้งใจไว้ สิ่งนี้ส่งคืน3สำหรับ-1+--2และฉันคิดว่า1จะถูกต้อง (การ1เปลี่ยนแปลงลงชื่อสามครั้งก่อนที่จะมีข้อโต้แย้งที่สองสำหรับการ+มีอยู่ส่งผลให้-1 + 2)
เฟลิกซ์ Palmen

เยี่ยมมาก @ FelixPalmen แก้ไขแล้ว
Rick Hitchcock

2

JavaScript, 321 311 ไบต์

_="f=a=>(a.replace(/\\d+|./g,mq!~(b='+*=\"- '.indexOf(a))|b>2j3j4j5&&o+aw1/y?(y*=-1wcz:1/y?oywcz:hz,rql.map(z=>m(lki,1)[0],i)),hq1/s[1]?sk0,2,+eval(`y${a=='='?a+a:a}s[1]`)):cz,cqlki,0,a),s=[],l=[],e='splice'),s)z(a,i)ys[0]w)^r``:q=z=>os.unshift(k[e](j?b-";for(i of"jkoqwyz")with(_.split(i))_=join(pop());eval(_)

ลองออนไลน์!

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


อย่าคิดว่ามันใช้งาน-1+-2ได้ ส่งคืน 3 แทน -3
Rick Hitchcock

@RickHitchcock ทำไมคุณเชื่อว่ามันควรจะกลับ-3แทน3?

ฉันอาจเข้าใจผิดเกี่ยวกับตัวดำเนินการเชิงลบ โดยทั่วไป-1 + -2คือ-3แต่ควรแยกวิเคราะห์เป็น--1 + 2แทนหรือไม่
Rick Hitchcock

1
@RickHitchcock 3ผมค่อนข้างมั่นใจว่าผลที่ได้คือ ก่อนที่2จะมาถึงสแต็คสิ่งที่สอง-จะถูกประเมินและดังนั้นเราจึงมี1 2 +อัน3ไหน อาและคุณอาจต้องแก้ไขคำตอบด้วย

คุณอาจพูดถูก คุณและ Arnauld ได้คำตอบเดียวกันและฉันขอ OP เพื่อความกระจ่าง จะให้คะแนนคุณอีกครั้งถ้าทำได้
Rick Hitchcock

1

Haskellขนาด 251 ไบต์

(#([],[]))
(x:r)#(o,n)|x>'9'=r#h(o++[x],n)|[(a,t)]<-lex$x:r=t#h(o,read a:n)
_#(o,n:_)=n
h=e.e
e(o:s,n:m:r)|o>'N'=e(s,g[o]n m:r)
e(o:s,n:r)|o=='D'=e(s,n:n:r)|o=='N'=e(s,-n:r)
e(o:s,n)|(p,m)<-e(s,n)=(o:p,m)
e t=t
g"a"=(+)
g"m"=(*)
g"q"=(((0^).abs).).(-)

ลองออนไลน์! ใช้อักขระต่อไปนี้: aสำหรับการเพิ่มmการคูณqเพื่อความเท่าเทียมกันDเพื่อการซ้ำซ้อนและNการปฏิเสธ (ฉันต้องการที่จะใช้eเพื่อความเท่าเทียมกัน แต่วิ่งเข้าไปในปัญหาที่lexจะแยกวิเคราะห์2e3เป็นตัวเลข.) ตัวอย่างการใช้งาน: อัตราผลตอบแทน(#([],[])) "2a3 4m"20


1

รหัสเครื่อง 6502 (C64), 697 ไบต์

00 C0 A2 00 86 29 86 26 86 27 86 28 86 4B 86 4C 86 CC 20 E4 FF F0 FB C9 0D F0
10 C9 20 30 F3 A6 27 9D B7 C2 20 D2 FF E6 27 D0 E7 C6 CC A9 20 20 1C EA A9 0D
20 D2 FF 20 95 C0 20 09 C1 20 95 C0 A6 26 E4 27 F0 4E BD B7 C2 E6 26 C9 20 F0
E8 C9 2D D0 09 A6 4C A9 01 9D B7 C3 D0 32 C9 22 D0 09 A6 4C A9 02 9D B7 C3 D0
25 C9 2B D0 09 A6 4C A9 81 9D B7 C3 D0 18 C9 2A D0 09 A6 4C A9 82 9D B7 C3 D0
0B C9 3D D0 0D A6 4C A9 83 9D B7 C3 E6 28 E6 4C D0 A3 4C 8A C2 A6 29 F0 6F A4
28 F0 6B CA F0 4B C6 28 A6 4B E6 4B BD B7 C3 F0 F5 30 14 AA CA D0 0B 20 7B C2
20 E1 C1 20 4D C2 D0 D9 20 5C C2 D0 D4 29 0F AA CA D0 0B 20 6D C2 20 08 C2 20
4D C2 D0 C3 CA D0 0B 20 6D C2 20 16 C2 20 4D C2 D0 B5 20 6D C2 20 F4 C1 20 4D
C2 D0 AA A4 4B B9 B7 C3 F0 02 10 AC C8 C4 4C F0 0F B9 B7 C3 F0 F6 30 F4 AA A9
00 99 B7 C3 F0 A6 60 A0 00 A6 26 E4 27 F0 15 BD B7 C2 C9 30 30 0E C9 3A 10 0A
E6 26 99 37 C4 C8 C0 05 D0 E5 C0 00 F0 08 A9 00 99 37 C4 20 39 C2 60 A2 FF E8
BD 37 C4 D0 FA A0 06 88 CA 30 0A BD 37 C4 29 0F 99 37 C4 10 F2 A9 00 99 37 C4
88 10 F8 A9 00 8D 3D C4 8D 3E C4 A2 10 A0 7B 18 B9 BD C3 90 02 09 10 4A 99 BD
C3 C8 10 F2 6E 3E C4 6E 3D C4 CA D0 01 60 A0 04 B9 38 C4 C9 08 30 05 E9 03 99
38 C4 88 10 F1 30 D2 A2 06 A9 00 9D 36 C4 CA D0 FA A2 10 A0 04 B9 38 C4 C9 05
30 05 69 02 99 38 C4 88 10 F1 A0 04 0E 3D C4 2E 3E C4 B9 38 C4 2A C9 10 29 0F
99 38 C4 88 10 F2 CA D0 D6 C0 05 F0 06 C8 B9 37 C4 F0 F6 09 30 9D 37 C4 E8 C8
C0 06 F0 05 B9 37 C4 90 F0 A9 00 9D 37 C4 60 A9 FF 45 FC 85 9F A9 FF 45 FB 85
9E E6 9E D0 02 E6 9F 60 A2 00 86 9F A5 FB C5 FD D0 07 A5 FC C5 FE D0 01 E8 86
9E 60 A5 FB 18 65 FD 85 9E A5 FC 65 FE 85 9F 60 A9 00 85 9E 85 9F A2 10 46 FC
66 FB 90 0D A5 FD 18 65 9E 85 9E A5 FE 65 9F 85 9F 06 FD 26 FE CA 10 E6 60 20
33 C1 A6 29 AD 3D C4 9D 3F C4 AD 3E C4 9D 3F C5 E6 29 60 A6 29 A5 9E 9D 3F C4
A5 9F 9D 3F C5 E6 29 60 A6 29 BD 3E C4 9D 3F C4 BD 3E C5 9D 3F C5 E6 29 60 C6
29 A6 29 BD 3F C4 85 FD BD 3F C5 85 FE C6 29 A6 29 BD 3F C4 85 FB BD 3F C5 85
FC 60 A6 29 BD 3E C5 10 13 20 7B C2 20 E1 C1 20 4D C2 A9 2D 20 D2 FF A6 29 BD
3E C5 8D 3E C4 BD 3E C4 8D 3D C4 20 8B C1 A9 37 A0 C4 4C 1E AB

การสาธิตออนไลน์

การใช้ sys49152จากนั้นใส่นิพจน์คำสั่ง anyfix แล้วกด return

  • ใกล้กับไม่มีการตรวจสอบข้อผิดพลาดดังนั้นคาดว่าผลลัพธ์ที่ตลกเกี่ยวกับการแสดงออกที่ไม่ถูกต้อง
  • สัญลักษณ์สำหรับการคูณคือ *อื่น ๆ ทั้งหมดตามที่แนะนำ
  • ความยาวสูงสุดที่ป้อนคือ 256 อักขระสามารถมีได้ไม่เกิน 127 โอเปอเรเตอร์
  • รูทีนอินพุตไม่จัดการกับอักขระควบคุมดังนั้นอย่าพิมพ์ผิด;)
  • จำนวนเต็มเป็น 16 บิตลงนามล้นจะล้อมรอบเงียบ ๆ
  • จำนวนไบต์มีขนาดใหญ่เนื่องจาก CPU นี้ไม่รู้จักการคูณและ C64 OS / ROM ไม่ได้ให้เลขคณิตหรือจำนวนเต็มใด ๆให้คุณแปลงหรือแปลงเป็น / จากสตริงทศนิยม

นี่คือca65 สไตล์รหัสที่มาประกอบที่สามารถอ่านได้


1

VB.NET (.NET 4.5) 615 576 ไบต์

-39 ไบต์ขอบคุณ Felix Palmen โดยเปลี่ยน\r\nเป็น\n

ต้องการImports System.Collections.Generic(รวมอยู่ในจำนวนไบต์)

Dim s=New Stack(Of Long),q=New List(Of String),i=Nothing,t=0,c=0
Function A(n)
For Each c In n
If Long.TryParse(c,t)Then
i=i &"0"+t
Else
If c<>" "Then q.Add(c)
If i<>A Then s.Push(i)
i=A
End If
If i=A Then E
Next
If i<>A Then s.Push(i)
E
A=s
End Function
Sub E()
c=s.Count
If c=0Then Exit Sub
For Each op In q
If op="-"Or op="d"Or c>1Then
Select Case op
Case"*"
s.Push(s.Pop*s.Pop)
Case"+"
s.Push(s.Pop+s.Pop)
Case"="
s.Push(-(s.Pop=s.Pop))
Case"-"
s.Push(-s.Pop)
Case"d"
s.Push(s.Peek)
End Select
q.Remove(op)
E
Exit Sub
End If
Next
End Sub

จุดเข้าคือฟังก์ชั่นAซึ่งใช้สตริงเป็นอินพุตและส่งกลับStack(Of Long)และผลตอบแทน

สัญลักษณ์:

  • ส่วนที่เพิ่มเข้าไป - +
  • การคูณ - *
  • ความเท่าเทียมกัน - =
  • การปฏิเสธ - -
  • การทำซ้ำ - d

ข้อมูลทั่วไป:

ฟังก์ชั่นAรับอินพุตและโทเค็นมัน มันใช้Long?เพื่อทำผลรวมการทำงานสำหรับจำนวนเต็มหลายหลักซึ่งNothingหมายความว่าเราไม่ได้กำลังอ่านจำนวนเต็ม

รูทีนย่อยEรับสแต็คของจำนวนเต็มและคิวของโอเปอเรเตอร์และประเมินสัญลักษณ์ของคำสั่ง anyfix มันเรียกตัวเองซ้ำจนกระทั่งไม่มีการกระทำที่เหลือ

ฉันประกาศ params ส่วนกลางทั้งหมดในครั้งเดียวเพื่อบันทึกไบต์ทั้งการประกาศและการส่งพารามิเตอร์

ค่าตอบแทนจากการตั้งค่าโดยการกำหนดค่าให้กับตัวแปรที่ตรงกันAA

VB Trueนั้นเทียบเท่ากับ-1ดังนั้นการดำเนินการต้องลบล้างผลลัพธ์เพื่อให้ได้ค่าที่ถูกต้อง

ลองออนไลน์!


แนะนำให้เพิ่มลองออนไลน์!
เฟลิกซ์ Palmen

btw กับImportsฉันได้รับนับไบต์เท่านั้น576- คุณสามารถผิด?
เฟลิกซ์ Palmen

@ FelixPalmen ฉันนับด้วย\r\nแทน\nดังนั้นนั่นคือสิ่งที่แตกต่าง
Brian J

@FelixPalmen เพิ่ม TIO ขอบคุณสำหรับการเตือนฉัน! :) (โอ้ฉันไม่ได้ตระหนักถึงคุณทำให้มันสำหรับบทความนี้แล้ว)
ไบรอันเจ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.