เรียกใช้ Stackylogic


45

Stackylogic เป็นภาษาการเขียนโปรแกรมแบบลอจิกที่ฉันสร้างขึ้นซึ่งใช้เวลาในการ0's และ1' s สำหรับการป้อนข้อมูลและการส่งออกเดียว0หรือ1เมื่อเสร็จสิ้น

โปรแกรม Stackylogic ประกอบด้วยเส้นที่สามารถมีตัวละครทั้งสาม01?เช่นเดียวกับว่าหนึ่ง<ในตอนท้ายของหนึ่งของเส้น สายอาจจะไม่ว่างเปล่าและบรรทัดที่มี<จะต้องมีอย่างน้อยหนึ่ง0, 1หรือ?ก่อนที่มันจะ

นี่คือโปรแกรมตัวอย่างที่ (ตามที่ฉันจะอธิบาย) คำนวณNANDของสองบิต:

1
?<
11
?
0

ทุกบรรทัดในโปรแกรม Stackylogic ถือเป็นสแต็กโดยมีด้านล่างทางด้านซ้ายและด้านบนทางด้านขวา โดยนัยมีสแต็กเปล่า (บรรทัดว่าง) อยู่ก่อนบรรทัดแรกในโปรแกรมและหลังบรรทัดสุดท้าย

<ซึ่งเราจะเรียกเคอร์เซอร์เครื่องหมายสแต็คที่จะเริ่มต้นเมื่อโปรแกรม Stackylogic มีการเรียกใช้ การดำเนินการของโปรแกรม Stackylogic ดำเนินการดังนี้:

  1. วางอักขระบนสุดออกจากสแต็กที่เคอร์เซอร์กำลังชี้ไป

    • หากตัวละครนั้น?ให้แจ้งผู้ใช้สำหรับ0หรือหรือ1และทำราวกับว่าเป็นตัวละคร
    • หากอักขระอยู่0ให้เลื่อนเคอร์เซอร์ขึ้นหนึ่งกอง (ไปยังบรรทัดที่อยู่เหนือบรรทัดปัจจุบัน)
    • หากอักขระอยู่1ให้เลื่อนเคอร์เซอร์หนึ่งสแต็กลง (ไปยังบรรทัดด้านล่างบรรทัดปัจจุบัน)
  2. หากกองเคอร์เซอร์เลื่อนไปที่ว่างเปล่าเอาท์พุทค่าสุดท้ายที่โผล่ออกมาจากกอง (เสมอ0หรือหรือ1) และจบโปรแกรม

  3. มิฉะนั้นหากเคอร์เซอร์เลื่อนไปที่ไม่ว่างเปล่าให้กลับไปที่ขั้นตอนที่ 1 และทำซ้ำกระบวนการ

โปรดสังเกตว่าโปรแกรม Stackylogic มักจะจบลงเพราะพวกเขาจะต้องทำให้หมดสแต็กในที่สุด

ตัวอย่าง NAND

ในโปรแกรม NAND เคอร์เซอร์เริ่มต้นที่?:

1
?<
11
?
0

เราจะสมมติว่าผู้ใช้ป้อนข้อมูล1หนึ่งครั้งที่?มันเกิดขึ้นซึ่งหมายความว่าเคอร์เซอร์จะเลื่อนลงทำให้โปรแกรมมีลักษณะดังนี้:

1

11<
?
0

ตอนนี้ธรรมดา1อยู่ที่ด้านบนของเคอร์เซอร์สแต็ค มันถูกตอกย้ำและเคอร์เซอร์จะเลื่อนอีกครั้ง:

1

1
?<
0

ทีนี้สมมติให้ผู้ใช้ป้อน0ค่า?ซึ่งหมายความว่าเคอร์เซอร์จะเลื่อนขึ้น:

1

1<

0

อีกครั้ง a 1อยู่บนเคอร์เซอร์สแตกดังนั้นเคอร์เซอร์จะปรากฏและเลื่อนลง:

1


<
0

ในที่สุดเคอร์เซอร์สแต็คจะว่างเปล่าดังนั้นค่าสุดท้ายที่ผุดขึ้น1คือคือเอาต์พุตและโปรแกรมจะสิ้นสุด

นี้ถูกต้องสำหรับประตู NAND เพราะเป็น1 NAND 0 1แน่นอนว่าวิธีนี้ใช้ได้กับอินพุตสองบิตอีกสามตัวหากคุณต้องการตรวจสอบ

หรือตัวอย่าง

โปรแกรม Stackylogic จำลองเกตOR :

?
?<

มันง่ายที่จะเห็นว่าอินพุตเริ่มต้นของ1จะผลักเคอร์เซอร์ไปที่สแต็กว่างเปล่าโดยนัยด้านล่างบรรทัดสุดท้ายการสิ้นสุดโปรแกรมและการแสดงผล1ที่เป็นเพียงอินพุต

สำหรับการป้อนข้อมูลของ00ในทางกลับกันเคอร์เซอร์จะหาทางไปสแต็คที่ว่างเปล่าโดยนัยที่ด้านบนสิ้นสุดโปรแกรมและการส่งออกสุดท้าย0ที่จะเข้า

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในโปรแกรม Stackylogic เป็นสตริงและวิ่งมันพิมพ์หรือกลับเป็นผลหรือ01

เมื่อ?คุณสามารถขอให้ผู้ใช้ป้อน0หรือ1ป้อนค่าหรืออ่านค่าจากสตริงที่กำหนดไว้ล่วงหน้าของ0's และ1' ที่คุณใช้เป็นอินพุต (ซึ่งอาจเป็นอินพุตสตริงอื่นไปยังโปรแกรม / ฟังก์ชันของคุณหรือคุณอาจสันนิษฐานว่าบรรทัดแรกหรือบรรทัดสุดท้ายของสตริงโปรแกรมจะเป็นสตรีมอินพุต)

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

โปรแกรมตัวอย่างเพิ่มเติม

ZERO
0<

ONE
1<

BUFFER
?<

NOT
1
?<
0

AND
?<
?

NAND
1
?<
11
?
0

OR
?
?<

NOR
1
?
00
?<
0

XOR(v1)
?
0
1?<
?
0

XOR(v2)
?
?<
11
?
0

XNOR(v1)
1
?
0?<
1
?

XNOR(v2)
1
?
00
?<
?

MEDIAN(v1)
1
???<
0

MEDIAN(v2)
?
1?<
??

ขอขอบคุณมาร์ตินสำหรับแบ่ง โปรแกรม


หากคุณต้องการที่จะเพิ่มฟังก์ชั่น 3 ?\1?<\??ป้อนข้อมูลต่อไปนี้เป็นวิธีหนึ่งที่จะดำเนินการได้เฉลี่ย: หรือนี่คือการใช้งาน 5 บรรทัดแบบสมมาตร:?\?0\?<\?1\?
Martin Ender

ฉันพบว่ามีการนำ neater มาใช้ด้วย: 1\???<\0.
Martin Ender

2
@ MartinEnder มีการใช้ฟังก์ชั่นค่ามัธยฐาน 3-input (ฟังก์ชั่นส่วนใหญ่ - กฎส่วนใหญ่) อย่างเท่าเทียมกัน ยกตัวอย่างเช่น 7 111\???????<\000อินพุตฟังก์ชั่นส่วนใหญ่เป็นกฎ
Greg Martin

ปล่อยให้ "bizarro" ของโปรแกรม Stackylogic $ P $ เป็นโปรแกรม $ BP $ ที่เกิดขึ้นจากการกลับคำสั่งของบรรทัดของโปรแกรมต้นฉบับและเปลี่ยน 1s ทั้งหมดเป็น 0 และรองกลอน (แต่ทิ้งและ s เพียงอย่างเดียว) ดูเหมือนว่าเอาต์พุตของ $ BP $ สำหรับอินพุต $ b_1, b_2, \ dots $ คือไม่ใช่ของเอาต์พุต $ P $ สำหรับอินพุต $! b_1,! b_2, \ dot $ ขอให้สังเกตว่าการติดตั้งใช้งานของ AND และ OR นั้นเกี่ยวข้องกับความแปลกประหลาดในลักษณะนี้เช่นเดียวกับ NAND และ NOR และ XOR / XNOR ทั้งสองเวอร์ชัน บางโปรแกรมเป็นพิลึกของพวกเขาเอง (บัฟเฟอร์, ไม่, MEDIAN (v1))
Greg Martin

1
@ GregMartin Yep ผมเชื่อว่าระยะทางเทคนิคเป็นคู่
งานอดิเรกของ Calvin

คำตอบ:


15

เรติน่า , 79 78 73 68 66 65 63 62 55 44 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

+`(.)([^_]*)\?<|(¶.*)0<|1<(¶.+)
$2$1$4<$3
1<

อินพุตผ่าน STDIN และคาดว่าจะเป็นอินพุตของผู้ใช้คั่นด้วยสอง linefeeds จากซอร์สโค้ด

ลองออนไลน์! (สองบรรทัดแรกเปิดใช้งานชุดการทดสอบโดยที่แต่ละบรรทัดเป็นกรณีทดสอบแยกต่างหาก/แทนที่จะเป็น linefeeds)

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

คำอธิบาย

เวอร์ชั่นสุดท้ายของเรื่องนี้จบลงด้วยความเรียบง่าย

+`(.)([^_]*)\?<|(¶.*)0<|1<(¶.+)
$2$1$4<$3

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

  1. กำลังประมวลผล?:

    (.)([^_]*)\?<
    $2$1<
    

    สิ่งนี้จะใช้อักขระตัวแรกของอินพุตจากนั้นจับคู่อักขระโดยพลการจนกว่าจะพบ?<และใส่อักขระตัวแรกข้างหน้า<(การลบ?)

  2. กำลังประมวลผล0:

    (¶.*)0<
    <$1
    

    นี้ตรงกับบรรทัดก่อน0<และทำให้มันหลังจากที่ลบ< 0(อย่างมีประสิทธิภาพเพียงแค่ลบ0และเลื่อน<หนึ่งบรรทัดขึ้นไป)

  3. กำลังประมวลผล1:

    1<(¶.+)
    $1<
    

    สวยมากสิ่งเดียวกันยกเว้นว่าเราย้ายหนึ่งบรรทัดลงในขณะที่การลบ< 1รายละเอียดที่สำคัญอย่างหนึ่งที่ควรสังเกตคือการใช้+แทน*นั่นคือเราต้องการให้บรรทัดถัดไปไม่ว่างเปล่า

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

หากตัวละครด้านหน้า<เป็น?หนทางเดียวที่การแข่งขันจะล้มเหลวคือไม่มีตัวละครที่ไม่ได้อยู่ตรงหน้า แต่ก็ไม่สามารถเกิดขึ้นได้เพราะเรารับประกันได้ว่ามีการป้อนข้อมูลเพียงพอเสมอ

หากตัวอักษรด้านหน้า<คือ0regex จะจับคู่เสมอเนื่องจากมีบรรทัดอื่นที่อยู่เหนือบรรทัดปัจจุบันเสมอ (ซึ่งอาจเป็นบรรทัดว่างที่แยกอินพุตจากซอร์สโค้ด)

ถ้าตัวละครในด้านหน้าของ<เป็น1, regex จะล้มเหลวถ้าทั้งที่เราอยู่ในบรรทัดสุดท้าย (ตั้งแต่จะล้มเหลวเพื่อให้ตรง) หรือถ้าบรรทัดถัดไปเป็นที่ว่างเปล่า (ตั้งแต่.+จะล้มเหลวเพื่อให้ตรง) 1โปรดทราบว่าทั้งสองกรณีดังกล่าวสอดคล้องกับการยกเลิกโปรแกรมหลังจากปะทุ

ในที่สุดก็มีความเป็นไปได้นอกจากนี้ยังมีที่ไม่ได้นำโดยใด<?01ปรากฎว่าเราสามารถเข้าถึงสถานการณ์นี้ได้โดยการ popping a 0และเลื่อนขึ้นไปที่บรรทัดว่างดังนั้น<ตอนนี้จะนำหน้าด้วย linefeed

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

1<

สิ่งนี้นับการจับคู่ของ1<ในสตริง โดยด้านบนเหตุผลนี้จะเป็น1ถ้าโปรแกรมสิ้นสุดบน1และถ้ามันสิ้นสุดลงใน00


3
คุณเป็นพ่อมด
GamrCorps

เช่น Regex Mch Wow
Rohan Jhunjhunwala

12

นูน , 102 95 ไบต์

ภาษาของรายการสแต็คที่เข้ารหัสในภาษาสแต็กกลายเป็นเรื่องยากมาก ทำเครื่องหมายคำของฉัน: ฉันจะได้นี้ถึง 100 ไบต์หรือน้อยกว่า! แก้ไข: สำเร็จ!

N/S\+{s)_'<={R:M;}{R):R;+}?}%'<-M){(æ=)s_:Q;"?10 ""l+ M):M; M(:M; W:M;A~p"S/Ë~~_!S*+tM)Q:A;}h;;

ลองออนไลน์!

การป้อนข้อมูลโปรแกรมผ่าน args บรรทัดคำสั่ง อินพุต0และ1เอสปกติ (บน TIO หมายถึงการขึ้นบรรทัดใหม่ในช่อง "อินพุต")


คำอธิบาย:

รหัสทั้งหมดสามารถแบ่งออกเป็นสามชิ้น:

N/S\+

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

{s)_'<={R:M;}{R):R;+}?}%'<-

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

M){(æ=)s_:Q;"?10 ""l+ M):M; M(:M; W:M;A~p"S/Ë~~_!S*+tM)Q:A;}h;;

นี่เป็นเรื่องสนุก! มันวนซ้ำอย่างต่อเนื่องจนกว่าจะถึงบรรทัดที่มีเพียงช่องว่าง ( " ") บนมัน (สัญลักษณ์สแต็กเปล่า) หากบรรทัดไม่ว่างเปล่าจะทำสิ่งต่อไปนี้:

  1. แสดงอักขระตัวสุดท้ายออกจากสแต็ก
  2. สลับคำสั่ง:
    1. หากตัวละครเป็น a ?ให้ป้อนข้อมูลและเพิ่มอักขระนั้นต่อท้ายบรรทัด
    2. หากตัวละครเป็น a 0ให้เลื่อนตัวชี้บรรทัดขึ้นหนึ่งตัว
    3. หากตัวละครเป็น a 1ให้เลื่อนตัวชี้บรรทัดลงหนึ่งอัน
    4. หากตัวละครเป็น(ช่องว่าง) ให้พิมพ์รายการที่ดึงแล้วล่าสุดและโปรแกรมสิ้นสุด

6

รหัสเครื่อง 32 บิต x86, 70 ไบต์

ในรูปหกเหลี่ยม:

FC89E1565F31D28A07A8DF740B3C3C7511428D5C24FCEB0A5729142484C07405B20147EBE2578B3B8A17F6C2DF7414FF0B923C3F7501AC3C30750383C30883EB04EBE389CCC3

อินพุตเป็นสตริงหลายบรรทัดที่สิ้นสุดด้วย NULL (คั่นด้วยตัวป้อนบรรทัด) ผ่านทาง ESI การป้อนข้อมูลของผู้ใช้จะถือว่าเป็นบรรทัดแรก ส่งคืน '0' / '1' ใน AL

ถอดชิ้นส่วน:

fc           cld
89 e1        mov    ecx,esp
56           push   esi
5f           pop    edi                  ;EDI=ESI
31 d2        xor    edx,edx              ;EDX=0
_loop0:
8a 07        mov    al,BYTE PTR [edi]    ;AL=*EDI
a8 df        test   al,0xf5              ;AL&~0x0a==0 => separator ('\n' or '\0')
74 0b        je     _stck
3c 3c        cmp    al,'<'
75 11        jne    _loop0end
42           inc    edx                  ;For "cursor" symbol adjust stack pointer offset
8d 5c 24 fc  lea    ebx,[esp-0x4]        ;and load EBX with the address where this pointer
eb 0a        jmp    _loop0end            ;is going to be stored in the next iteration
_stck:
57           push   edi                  ;Pointer to the separator
29 14 24     sub    DWORD PTR [esp],edx  ;adjusted to point to the top of the stack
84 c0        test   al,al                ;AL==0?
74 05        je     _loop0break          ;break
b2 01        mov    dl,0x1               ;EDX can be [0..2], resets to 1
_loop0end:
47           inc    edi                  ;++EDI
eb e2        jmp    _loop0
_loop0break:
57           push   edi                  ;*EDI==0, add lower implicit empty stack
_loop1:                                  ;The actual state machine code
8b 3b        mov    edi,DWORD PTR [ebx]  ;EDI=*EBX
8a 17        mov    dl,BYTE PTR [edi]    ;DL=*EDI
f6 c2 df     test   dl,0xf5              ;DL&~0x0a
74 14        je     _loop1break          ;ZF==1 => current stack is empty
ff 0b        dec    DWORD PTR [ebx]      ;--(*EBX): pop the stack
92           xchg   edx,eax              ;AL=DL
3c 3f        cmp    al,'?'
75 01        jne    _skplods             ;AL=='?' => substitute char from the input string
ac           lodsb
_skplods:
3c 30        cmp    al,'0'
75 03        jne    _0x31                ;EBX+=AL==0?4:-4
83 c3 08     add    ebx,0x8              ;But to avoid wasting 2 bytes for the jump after the 'add'
_0x31:                                   ;add 8 and fall through to subtract 4 back
83 eb 04     sub    ebx,0x4
eb e3        jmp    _loop1
_loop1break:
89 cc        mov    esp,ecx              ;Clear the stack
c3           ret                         ;Returns '0'/'1' in AL

5

JavaScript (ES6), 136 138

การขึ้นบรรทัดใหม่ที่ยกเลิกในโปรแกรม

(p,i,j=0)=>eval("for(p=`\n${p}`.split`\n`.map((x,i)=>((c=(x=[...x]).pop())=='<'?k=i:x.push(c),x));a=p[k].pop();k-=1-c-c)c=1/a?a:i[j++]")

น้อย golfed

(p, i, j=0)=>{
  p=`\n${p}`
     .split`\n`
     .map(
       (x,i)=>
       (
         x = [...x],
         c = x.pop(),
         c == '<' ? k=i : x.push(c),
         x
       )
     )
  for(; a = p[k].pop(); k -= 1-c-c)
    c = 1/a ? a : i[j++];
  return c;
}

ทดสอบ

F=(p,i,j=0)=>eval("for(p=`\n${p}`.split`\n`.map((x,i)=>((c=(x=[...x]).pop())=='<'?k=i:x.push(c),x));a=p[k].pop();k-=1-c-c)c=1/a?a:i[j++]")

function run() {
  var pgm=P.value+'\n'
  var i=I.value
  O.textContent = F(pgm,i)
}

run()
#P { width:60%; height: 6em }
#I { width:50%;  }
Program<br>
<textarea id=P>1
?&lt;
11
?
0</textarea><br>
Input<br>
<input id=I value=01>
<button onclick='run()'>Run</button>
<br>Output
<pre id=O></pre>



2

Python 3, 147 146 145 144 ไบต์

1 ไบต์ต้องขอบคุณ @Lynn

def f(p):
 i=p[:p.find("<")].count("\n");p=p.split()
 try:
  while 1:*p[i],c=p[i];c=c>"<"and input()or c;i+=c<"<"and int(c)*2-1
 except:return c

1

Python 3, 318

def s(f,z):
 p=b="";g=0;a=[];n=a.append;n(p)
 for i in f:
  if i=="\n":n(p);p=''
  else:p+=i
 n(p);p=b;n(p)
 while g<len(a):
  if'<'in a[g]:q=g;a[q]=a[q][:-1]
  g+=1
 while 1:
  v=a[q]
  if v=='':print(b);break
  if v[-1]=='1':a[q]=v[:-1];q+=1;b=1
  elif v[-1]=="0":a[q]=v[:-1];q-=1;b=0
  else:a[q]=v[:-1]+z[0];z=z[1:]

F คือโปรแกรม z กำลังป้อนข้อมูล ใช่ชื่อตัวแปรของฉันบ้า


1

ES6, 190 ไบต์

f=(p,i)=>{
n=p.split`<`[0].split`\n`.length-1
p=p.split`\n`.map(o=>o.split``)
i=i.split``
p[n].pop()
while(p[n]&&p[n].length){
c=p[n].pop()
v=c=='?'?i.shift():Number(c)
n+=v*2-1
}
return v
}

ใช้เหมือน f(program, input)


2
เกร็ดความรู้ทั่วไปเกี่ยวกับการเล่นกอล์ฟ (มีรายการของสิ่งเหล่านี้): ใช้[...o]แทนo.split``และใช้forแทนwhileเนื่องจากจะช่วยให้คุณย้ายนิพจน์ทั้งสองไปสู่การforบันทึกสองไบต์ เคล็ดลับเฉพาะสองสามข้อ: ฉันคิดว่าNumberนักแสดงของคุณไม่จำเป็นอย่างที่*2คุณต้องการและฉันจะอ่านiโดยใช้j=0และi[j++]ฉันคิดว่าประหยัดได้ 11 ไบต์
Neil

1
คุณไม่จำเป็นต้องf=อนุญาตให้ใช้งานฟังก์ชั่นนิรนาม
gcampbell

0

Java, 256 255 231 219 215 213 ไบต์

int f(char[][]p,char[]I){int l=p.length,d=0,j=-1,c=0,k=0,i[]=new int[l];while(++j<l)if(p[j][i[j]=p[j].length-1]==60)i[k=j]--;try{for(;;k+=c>48?1:-1)c=(c=p[k][i[k]--])>49?I[d++]:c;}catch(Throwable t){}return c-48;}

การสาธิตเกี่ยวกับ Ideone

ใช้โปรแกรมและอินพุตเป็นอาร์กิวเมนต์และส่งคืนผลลัพธ์เป็นจำนวนเต็ม


@LeakyNun เปลี่ยนเป็นforวง แต่ความคิดเห็นแรกของคุณหมายความว่าอย่างไร
PurkkaKoodari

@ Pietu1998 LeakyNun หมายความว่าสามารถเป็นได้int f(String[]I)...และคุณสามารถหลีกเลี่ยงString[]p=I.split("\n");
แมว

หมายความว่าคุณสามารถประกาศฟังก์ชั่นนี้เป็นint f(String[]P)
Leun Nun

1
@cat ninja'd 7 วินาที: /
Leaky Nun

นอกจากนี้หากคุณชำระให้กับ Java 8 คุณสามารถมีแลมบ์ดา (ฉันคิดว่า)->(String[]I){...
cat

0

PHP (<7.0), 195 192 ไบต์

รับโปรแกรมเป็นอาร์กิวเมนต์แรกและแต่ละค่าเป็นอาร์กิวเมนต์เพิ่มเติม
โปรดทราบว่าฉันทดสอบด้วยการแบ่ง ("", .. ) เป็นช่องว่างแทนการขึ้นบรรทัดใหม่ แต่ควรใช้งานได้อยู่ดี
ให้ประกาศเลิกใช้ถ้าทำงานใน php> 5.3
นอกจากนี้ยังให้คำเตือนถ้าคุณออกไปด้านบนของโปรแกรม อย่างไรก็ตามมันยังใช้งานได้และแสดงผลถูกต้อง

<?php foreach(split("\n",$argv[++$t])as$l)$p[]=str_split($l);for($i=-1;end($p[++$i])!='<';);array_pop($p[$i]);for(;($v=array_pop($p[$i]))!==null;$i+=$n?:-1)($n=$v)=='?'&&$n=$argv[++$t];echo$n;

0

C, 264 249 244 242

C ทำได้ไม่ดีนักกับการจัดการกับสตริง แต่มันค่อนข้างสั้น

มันทำงานได้โดยการสแกนสตริงสำหรับเคอร์เซอร์ ( <) ย้ายกลับ 1 ตำแหน่งอ่านคำสั่งแทนที่ด้วยtabอักขระและย้ายไปข้างหน้าหรือข้างหลังหนึ่งบรรทัด อินพุตอยู่ในรูปแบบของอาร์เรย์ C char เช่นchar array[]="1\n?<\n11\n?\n0";result = f(array);แม้ว่าการอนุญาตให้ขึ้นบรรทัดใหม่จะได้รับอนุญาตเช่นกัน

แม้ว่าสตริงอินพุตจะถูกแก้ไขความยาวจะไม่เปลี่ยนแปลง

t;f(char*n){char*p=strchr(n,60);for(*p--=9;;){if(*p==63)scanf("%d",&t),*p=t+48;if(*p^49){for(*p--=9;p>n&&*p^10;--p);for(--p;p>n&&*p==9;--p);if(p<n||*p==10)return 0;}else{for(*p++=9;*p&&*p^10;++p);for(p+=!!*p;*p>10;++p);if(*--p<11)return 1;}}}

โปรแกรมทดสอบ

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

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, const char **argv)
{
    while (*++argv)
    {
        char *input=malloc(strlen(*argv)+1),*p;
        strcpy(input,*argv);
        printf("testing %s\n",input);
        for (p=input;*p;++p)
            if (*p=='\\')
                *p=10;
        printf("result: %d\n\n",f(input));
        free(input);
    }
    return 0;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.