ตีความภาษาของคุณ แต่ไม่ใช่ด้วยตัวคุณเอง?


21

มีความท้าทายมากมายที่พูดว่า "ตีความ X" ซึ่ง X เป็นภาษาที่เรียบง่าย ในความคิดของฉันมันน่าเบื่อเกินไป เพื่อให้ทุกคนที่ผัดวันประกันพรุ่งในอินเทอร์เน็ตเป็นสิ่งที่น่าสนใจที่จะทำคุณสามารถลองทำสิ่งนี้:

ท้าทาย

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

เขียนคอมไพเลอร์ / ล่ามเขียนใน$LANG $LANGคุณสามารถใช้สิ่งอำนวยความสะดวกทั้งหมด (รวมถึงevalและเพื่อน) ของภาษาของคุณที่มีอยู่เพื่อเขียนคอมไพเลอร์นี้ เพื่อให้งานมีความท้าทายมากขึ้นมีข้อ จำกัด เพียงข้อเดียว: โปรแกรมของคุณควรสามารถตีความ / คอมไพล์โปรแกรมที่ใช้ได้ทั้งหมด$LANGยกเว้นล่าม / คอมไพเลอร์ของคุณเอง หากเกิดขึ้นว่าโปรแกรมที่จะตีความ / รวบรวมเป็นล่ามหรือคอมไพเลอร์ของคุณเอง (โดยไม่คำนึงถึงชื่อไฟล์) โปรแกรมของคุณควรทำสิ่งที่ไม่เกี่ยวข้องอย่างสมบูรณ์กับการทำงานของล่ามหรือคอมไพเลอร์ (เช่น barfing หรือการพิมพ์Hello, world!)

เพื่อให้งานนี้ซับซ้อนยิ่งขึ้นโปรแกรมของคุณจะต้องไม่อ่านซอร์สของตัวเองเมื่อรวบรวมหรือตีความ

ข้อมูลจำเพาะ

  • งานนี้เป็นรหัสกอล์ฟ การส่งที่มีอักขระน้อยที่สุดที่ชนะถูกต้อง ในกรณีที่เสมอกันการแก้ปัญหาที่ถูกส่งมาก่อนชนะ
  • โปรแกรม / สคริปต์ของคุณควรอ่านโปรแกรมที่จะตีความจากไฟล์ คุณอาจ hardcode เส้นทางและชื่อของมัน เมื่อไฟล์ถูกอ่านคุณอาจรวบรวมไฟล์ไปยังไฟล์อื่น (ซึ่งจะต้องสามารถเรียกใช้งานได้ในระบบของคุณ) หรือเรียกใช้โดยตรง หากขาดความสามารถในการอ่านไฟล์ที่คุณสามารถเลือกวิธีการอ่านรหัสที่พอดีอีก$LANG $LANGคุณไม่สามารถเลือก$LANGเป็นส่วนย่อยของภาษาอื่น แต่ได้ลบความสามารถในการอ่านไฟล์
  • มีการใช้กฎของรหัสสนามกอล์ฟตามปกติ นั่นคือ: ภาษาสัตว์เลี้ยงส่วนบุคคลของคุณที่คุณสร้างขึ้นเพื่อแก้ปัญหานี้เป็นสิ่งต้องห้ามหากการแก้ปัญหากลายเป็นเรื่องง่ายที่จะใช้มัน (เช่นการกำหนดโปรแกรมแบบชาร์ลเดี่ยวที่ใช้วิธีแก้ปัญหา) สนับสนุนการละเมิดกฎ

เราได้รับอนุญาตให้กำหนดภาษาสำหรับสิ่งนี้ตราบใดที่มันสมบูรณ์
Cruncher

@ Cruncher ใช่คุณเป็น ดูหัวข้อย่อยล่าสุดของข้อกำหนดสำหรับรายละเอียดเพิ่มเติม
FUZxxl

คำตอบ:


8

ทับทิม, 63

b=$<.read
t="b=$<.read\nt=%p\nb!=t%%t&&eval(b)"
b!=t%t&&eval(b)

คำตอบได้รับการยอมรับตราบใดที่ไม่มีทางออกที่เล็กกว่า
FUZxxl

11

Perl, 89 ตัวอักษรไม่มีการโกง

$_=q($_=q(Q);s/Q/$_/;($q=join"",<>)eq$_?die:eval$q);s/Q/$_/;($q=join"",<>)eq$_?die:eval$q

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

$ perl unquine.pl unquine.pl
Died at unquine.pl line 1, <> line 1.

โปรดจำไว้ว่าunquine.plไฟล์ควรจะตรง 89 ไบต์ยาวไม่มากไม่น้อย รันด้วยสคริปต์ Perl อื่น ๆ เป็นอินพุตเพียงรันสคริปต์อื่นตามที่ควร:

$ perl unquine.pl hello.pl
Hello, world!

ตามชื่อที่อาจแนะนำการใช้งานจะขึ้นอยู่กับ quine - เฉพาะอันนี้:

$_=q($_=q(Q);s/Q/$_/);s/Q/$_/

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


คุณสามารถแทนที่&&/ ;จับคู่ด้วยเทอร์นารี แนวคิดที่ยอดเยี่ยมและการใช้งาน!
JB

@JB: จับได้ดี! ลงไปที่ 89 ตัวอักษรตอนนี้
Ilmari Karonen

5

GolfScript 30 ตัวอักษร

{`".~"+"#{$<.read}".@=!{~}*}.~

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

นี้คือการปรับตัวค่อนข้างตรงไปตรงมาของโปรแกรมด้วยตนเองระบุนี้ โดยเฉพาะ:

  • { } เป็นตัวบล็อกรหัสตัวอักษรใน GolfScript
  • .~นำไปใช้กับบล็อกรหัสทำซ้ำบล็อกและดำเนินการคัดลอก

ภายในบล็อกรหัส:

  • ` string คัดลอกบล็อกรหัส
  • ".~"+ต่อท้ายอักขระ.~โดยให้สตริงที่มีซอร์สโค้ดของโปรแกรม
  • "#{$<.read}"เป็นเอกสารแฮ็กที่อนุญาตให้เรียกใช้โค้ด Ruby ภายใน GolfScript ในกรณีนี้มันจะประมวลผลคำสั่ง Ruby $<.read(ขโมยอย่างไม่รู้จักเหน็ดเหนื่อยจากโซลูชัน Ruby ของ Lowjacker ) ซึ่งอ่านและส่งคืนเนื้อหาของไฟล์ใด ๆ ที่ระบุในบรรทัดคำสั่ง การแฮ็คนี้เป็นสิ่งจำเป็นเนื่องจาก GolfScript เองไม่ได้ให้ความสามารถของไฟล์ I / O ที่ชัดเจน
  • .@ ทำซ้ำและสับองค์ประกอบที่ด้านบนของสแต็กเพื่อให้สแต็คมีสองสำเนาของเนื้อหาไฟล์ตามด้วยรหัสที่มาของโปรแกรมนี้
  • =! เปรียบเทียบสองรายการแรกบนสแต็ก (เช่นเนื้อหาไฟล์และแหล่งที่มา) โดยส่งคืน 1 หากแตกต่างและ 0 หากเหมือนกัน
  • {~}*ประเมินสำเนาที่เหลือของเนื้อหาไฟล์เป็นรหัส GolfScript แต่เฉพาะในกรณีที่ผลการเปรียบเทียบเป็น 1 (ในทางเทคนิคมันจะประมวลผลการบล็อกรหัส{~}หลายครั้งตามที่กำหนดโดยตัวเลขบนสแต็กเช่น 0 หรือ 1 ครั้ง บล็อก~เป็นตัวดำเนินการ GolfScript eval)

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

{`".~"+1$=!{""\~}*}.~

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


ดูดี แต่ดูเหมือนคุณอ่านอินพุตจากไฟล์ไม่ได้
FUZxxl

แก้ไขแล้วตอนนี้มันอ่านจากไฟล์ (ตรง) เหมือนโซลูชันของ Lowjacker
Ilmari Karonen

5

Python, 167 130 118 ไบต์

นี่เป็นความพยายามครั้งแรกของฉันในการเล่นกอล์ฟดังนั้นนี่ไป! มันตีความโปรแกรมใด ๆ ยกเว้นตัวเอง

รุ่นที่ปรับปรุง:

i=open(raw_input()).read();q='i=open(raw_input()).read();q=%s;i==q%%repr(q)and a;exec(i)\n';i==q%repr(q)and a;exec(i)

หากได้รับตัวเองแล้วก็ barfs ด้วย:

Traceback (most recent call last):
  File "pygolf.py", line 1, in <module>
    i=open(raw_input()).read();q='i=open(raw_input()).read();q=%s;i==q%%repr(q)and a;exec(i)\n';i==q%repr(q)and a;exec(i)
NameError: name 'a' is not defined

ฉันคิดว่าวิธีนี้ใช้ได้ผลเช่นเดียวกับของ Ilmari Karonen แนวคิดพื้นฐานคืออะไร:

input = read_some_file()
if input == some_quine()
    barf()
interpret(input)

ควินที่ฉันใช้นั้นมีพื้นฐานจากสิ่งนี้:

(lambda x: x + repr((x,)))('(lambda x: x + repr((x,)))',)

แต่ตั้งแต่ฉันรู้ว่าควินที่สั้นกว่ามากคือ:

q='q=%s;q%%repr(q)';q%repr(q)

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

'%s;_%%repr(_)';_%repr(_)

เนื่องจากไพ ธ อนไม่มีวิธีสั้น ๆ ในการรับบรรทัดคำสั่งฉันจึงไปกับ raw_input () (ซึ่งยังค่อนข้างยาว แต่ไม่นานเท่า

import sys;sys.argv[1]

การใช้งานคือ:

echo "foobar.py" | python quinterpretter.py

หรือ

python quinterpretter.py
<type filename and hit enter>

ฉันพบ quine สั้นกว่าที่จะใช้ แต่นี่คือรุ่นเก่าของฉัน (สำหรับลูกหลาน):

i=open(raw_input()).read();a if i==(lambda x,y:x+repr((x,y))+y)('i=open(raw_input()).read();a if i==(lambda x,y:x+repr((x,y))+y)', ' else 1;exec(i)\n') else 1;exec(i)

แทนที่% s ด้วย% r และลบการพิมพ์ออก % r หมายถึงดิบและโดยพื้นฐานแล้วเขาก็เป็นสิ่งเดียวกัน
Loovjo

4

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

นี่อาจไม่ได้เป็นกอล์ฟอย่างที่ควรจะเป็น แต่ที่นี่มันคือ:

Javascript, 252

function c(p){q='\"';s='\\';a="function c(p){q='\"';s='\\';a=%;a=a.slice(0,17)+s+a.slice(17,24)+a[23]+a.slice(24);a=q+a.replace('%',q+a+q)+q;alert(a);}";a=a.slice(0,17)+s+a.slice(17,24)+a[23]+a.slice(24);a=a.replace('%',q+a+q);alert(a);if(p!=a)eval(p)}

แจ้งให้เราทราบหากใครรู้เทคนิคที่ดีกว่าสำหรับการสร้างควินินใน Javascript


1
ฉันโพสต์โซลูชัน JS แบบ 135 อักขระด้านล่างโดยยึดตามรหัสของคุณและโซลูชัน Perl ของฉัน +1 สำหรับแรงบันดาลใจ!
Ilmari Karonen

2
read p<p;read c<c;[ "$p" = "$c" ]||. ./c

45 ตัวอักษรของ sh (POSIX เชลล์) ./cรหัสที่จะทำงานจะต้องอยู่ในไฟล์

รหัสสำหรับล่ามเองต้องอยู่ในไฟล์./pดังนั้นฉันเดาว่าฉันถูกโกงถึงแม้ว่าความท้าทายจะไม่ได้รับอนุญาต หรือสิ่งนี้จะตัดสิทธิ์ "ภาษา" ของฉันจากการเป็น "ภาษาโปรแกรมสมบูรณ์แบบทัวริง" หรือไม่?

การใช้เครื่องมือที่ปกติแล้วสามารถเรียกใช้งานจากภายนอกได้ แต่ในทางทฤษฎีอาจถูกสร้างไว้ในเชลล์รหัสสามารถสั้นลงได้:

cmp -s p c||. ./c

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

และจากนั้นคุณสามารถสร้างเวอร์ชันของภาษาของเชลล์ที่ทำงานด้านบนด้วยไวยากรณ์ที่กระชับมากขึ้น

และจากนั้นคุณสามารถสร้างโปรแกรมที่เมื่ออินพุตประกอบด้วย "." เดี่ยว - หรือนรกสตริงว่าง - ประเมินเนื้อหาของไฟล์อื่นเป็นรหัสปกติและเรียกสิ่งนี้ว่าภาษาการเขียนโปรแกรม ดังนั้นสตริงว่างจะเป็นคำตอบสำหรับความท้าทายในภาษาที่คุณสร้าง อันที่จริงนี่คือล่ามสำหรับภาษาดังกล่าว:

read code; if [ "$code" ]; then eval "$code"; else . ./othercode; fi

การใช้ภาษาในการตีความสคริปต์ด้านบนการแก้ปัญหาคือสตริงว่าง และตำแหน่งโค้ดไม่จำเป็นต้องทำการฮาร์ดโค้ดอีกต่อไป

ปัญหา?


2
ความท้าทายไม่ได้บอกว่า "โปรแกรมของคุณต้องไม่อ่านเป็นของตัวเอง"
Ilmari Karonen

Darnit เสียเวลาแล้ว และฉันเห็นมันยังบอกว่าคุณไม่ต้องใช้คุณสมบัติที่คุณจะไม่ใช้ สิ่งนี้จะขัดแย้งกับคุณลักษณะสตริงที่ว่างเปล่า จากนั้นอีกครั้งล่ามจะต้องละเว้น / เปลี่ยนฟังก์ชันการทำงานหากรหัสสำหรับคอมไพเลอร์ / ล่ามตัวเองทำให้เกิดพฤติกรรมที่แตกต่างในภาษาใหม่ ไม่ว่าในกรณีใดฉันมีความสนุกสนานในการเขียนผิด
TaylanUB

@TaylanUB จริง ๆ แล้วคุณต้องตีความโปรแกรม $ lang ที่ถูกต้องทั้งหมดยกเว้นล่ามเอง
FUZxxl

@FUZxxl ใช่ภาษา "sh + empty string" เป็นอย่างอื่นเทียบเท่ากับ sh (หากรหัสไม่ใช่สตริงที่ว่างเปล่า) และโปรแกรมสตริงที่ว่างที่เขียนอยู่จะตีความรหัส sh (ซึ่งจะต้องใส่./othercode) และไม่ ไม่มีอะไรเมื่อรหัสเป็นสตริงที่ว่างเปล่า ฉันไม่ควรเรียกไฟล์. / รหัสอื่นมันทำให้เข้าใจผิด; เป็นเพียงรหัสที่ล่ามที่เขียนในภาษาสตริงว่างเปล่าจะตีความ
TaylanUB

2

JavaScript, 135 ตัวอักษร

function c(p){q='function c(p){q=%27Q%27;p!=unescape(q).replace(/Q/,q)?eval(p):alert()}';p!=unescape(q).replace(/Q/,q)?eval(p):alert()}

โซลูชัน JavaScript ของ Peter Olson เป็นแรงบันดาลใจให้ฉันลองย้ายโซลูชัน Perl ของฉันไปที่ JS เช่นเดียวกับวิธีการแก้ปัญหาของเขารหัสนี้กำหนดฟังก์ชั่นcที่รับสายและ evals มันถ้ามันไม่เท่ากับรหัสข้างต้น

มันเอาฉันในขณะที่ตัวเลขออกมาเป็นวิธีที่ดีที่จะจัดการกับตัวตนของตัวคั่นสตริงสมดุลใน JavaScript unescape()จนผมพบว่าสิ่งที่ย้อนหลังเป็นทางออกที่ชัดเจน:

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

e = "function c(p){q='function c(p){q=%27Q%27;p!=unescape(q).replace(/Q/,q)?eval(p):alert()}';p!=unescape(q).replace(/Q/,q)?eval(p):alert()}"
h = "alert('Hello, world!')"

eval(e)  // defines the function c()

c(h)     // evaluates h
c(e)     // does not evaluate e, alerts "undefined" instead

คุณสามารถแทนที่alert()ด้วย0เพื่อไม่ให้ทำอะไรแทนการแจ้งเตือนundefinedและบันทึก 13 ตัวอักษร
Peter Olson

@PeterOlson: ใช่ แต่งานไม่ได้บอกว่า "โปรแกรมของคุณควรทำสิ่งที่ไม่เกี่ยวข้องอย่างสมบูรณ์" ถ้าตรวจพบตัวเอง ฉันแปลความหมายว่าควรทำอะไร - โดยเฉพาะอย่างยิ่งสิ่งที่ผู้ใช้มองเห็นได้ นอกจากนี้ฉันชอบวิธีนี้ดีกว่า :) (Ps. Yay, หิมะตกข้างนอก! Winter's ในที่สุดนี่!)
Ilmari Karonen

1
@Ilmari ไม่ทำอะไรเลยที่ไม่เกี่ยวข้องกับการตีความ Javascript IMHO
FUZxxl

คุณสามารถไปp=>...แทนfunction c(p)
FireCubez

2

เสียงกระเพื่อมสามัญ, 59

#+~ #.(#:a)(defun L(p)(compile-file p))(push :~ *features*)
  • ใน Lisp REPL ใหม่ให้รวบรวมไฟล์ของคุณ (เช่นsbcl --load)
  • ตอนนี้คุณมีฟังก์ชันLซึ่งสามารถรวบรวมไฟล์ Common LISP ได้แล้ว
  • อย่างไรก็ตามหากคุณโทร(L <your file>)ข้อผิดพลาดจะถูกส่งสัญญาณในขณะที่อ่านไฟล์

ทำไม?

เพราะเป็นครั้งแรกที่คุณผลักคำหลักลงใน:~ *features*ตอนนี้สภาพแวดล้อมของคุณรู้เกี่ยวกับ~คุณสมบัติและมาโครผู้อ่าน#+เมื่อประเมินการ~ แสดงออกของคุณลักษณะแล้วจะประสบความสำเร็จและอ่านแบบฟอร์มต่อไปนี้แทนการข้ามไปตามที่ทำในครั้งแรก ในไฟล์ของคุณแบบฟอร์มต่อไปนี้คือ#.(#:a)ซึ่งขอให้ประเมิน(#:a)ในเวลาอ่านและใช้ค่าผลลัพธ์เป็นโค้ดที่กำลังอ่าน แต่(#:a)เรียกใช้ฟังก์ชันที่เกี่ยวข้องกับสัญลักษณ์ที่#:aไม่ได้เชื่อมต่อ เนื่องจาก#:aไม่ได้เชื่อมต่อจึงเป็นสัญลักษณ์ใหม่ซึ่งไม่ผูกกับฟังก์ชันใด ๆ (เช่นไม่ใช่fboundp) ความผิดพลาด


1

Scheme, 48 หรือ 51 ตัวอักษร

Scheme เป็นภาษาที่มีการใช้งานที่แตกต่างกันมากมาย แม้การใช้งานจะต้องสอดคล้องกับ RnRS ล่าสุด แต่มาตรฐานการทำงานล่าสุด (R6RS) ยังไม่เป็นที่นิยมเนื่องจากขาดความเรียบง่าย ในไม่ช้า R7RS จะถูกนำออกใช้เป็นวิธีการรักษาในขณะที่แยกภาษาใน 2 ภาษาแรกเป็นภาษาที่ทรงพลังและเรียบง่ายและภาษาที่สองเป็นชุดแรกของภาษาแรกที่ตั้งใจจะให้ส่วนขยายคุณลักษณะสำหรับการทำงานร่วมกันระหว่างการใช้งาน ก่อนหน้านั้นเราพึ่งพา SRFIs (Scheme Requests for Implementation) ซึ่งให้บริการ (หากมีการนำไปใช้ในการดำเนินการโฮสต์หรือด้วยตนเอง ทั้งหมดนี้เพื่อกล่าวว่าโค้ดแรก (51 ตัวอักษร) ในขณะที่ยังคงอยู่ในสถานะพกพาเท่าที่จะทำได้อาศัย SRFI-22 (รันสคริปต์สคริปต์ใน UNIX) สำหรับการเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่ง:

(define(main x y)(case y(x => error)(else => load)))

หรือมากกว่าอ่านได้ง่าย:

(define (main current-file arg)
  (case arg
    [current-file => error]
    [else => load]))

ตัวที่สอง (48 ตัวอักษร) หมายถึงไฟล์น้อยกว่าในการตีความซึ่งไม่สามารถประเมินตัวเองได้ (ในสภาพแวดล้อมที่เป็นโมฆะ):

(define(e)(write(eval(read)null-environment))(e))

หรือมากกว่าอ่านได้ง่าย:

(define (interpret)
  (write (eval (read) null-environment))
  (interpret))

รหัสของคุณใช้ไม่ได้หากคุณคัดลอกล่าม
FUZxxl

1
ปล่อยให้เป็นคำตอบแบบแผนเพื่อให้มี parentheticals ซ้อนในร้อยแก้ว
Cyoce

1

Groovy ขนาด 13 ไบต์

{Eval.me(it)}

สิ่งนี้ควรตีความชุดย่อยของ Groovy

กรณีทดสอบ:

p={Eval.me(it)}

p'''
    (0..37).each{println"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"[it..it+2]}
'''

p'''
    {Eval.me(it)}
'''

น่าเสียดายที่ในขณะที่มัน barfs แน่นอนมันจะทำในลักษณะเหมือนล่ามอย่างสมบูรณ์และมันเป็นเรื่องของการป้อนข้อมูลจำนวนมาก


คุณอ่านโปรแกรมที่จะตีความในบรรทัดใด รหัสของคุณน่าสนใจแม้ว่าจะไม่ใช่การส่งที่ถูกต้องสำหรับงานนี้
FUZxxl

ฉันคิดว่าข้อผิดพลาดคือ "ขีด จำกัด การเรียกซ้ำเกิน" หรือไม่
Ilmari Karonen

1

Javascript ES6, 45 ไบต์

$=(_=prompt())=>eval(_==`$=${$};$()`?0:_);$()

ยังคงแข่งขัน! (ขอบคุณ @Downgoat)


ดูchat.stackexchange.com/transcript/message/28761481#28761481
Mama Fun Roll

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