เขียนโปรแกรมที่แสดงระดับของกระจกเงา


31

มีอักขระ ASCII ที่พิมพ์ได้ 95 ตัว:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

ในฟอนต์ Consolas (ค่าดีฟอลต์ของการแลกเปลี่ยนรหัสสแต็กบล็อก) อักขระบางตัวมีการมิรเรอร์รอบแกนแนวตั้งของสมมาตร:

  • คู่ของตัวละครเหล่านี้เป็นกระจกของกันและกัน: () [] {} <> /\
  • ตัวละครเหล่านี้เป็นมิเรอร์ของตัวเอง: ! "'*+-.8:=AHIMOTUVWXY^_ovwx|(โปรดทราบว่าช่องว่างคือหนึ่ง)
  • สิ่งเหล่านี้ไม่มีกระจก: #$%&,012345679;?@BCDEFGJKLNPQRSZ`abcdefghijklmnpqrstuyz~

( i, l, 0, #และอาจจะมีตัวละครอื่น ๆ กระจกของตัวเองในแบบอักษรบางอย่าง แต่เราจะยึดติดอยู่กับรูปทรง Consolas.)

สตริงถูกกล่าวถึงว่าเป็นมิรเรอร์ของตัวเองถ้ามันถูกสร้างด้วยอักขระมิรเรอร์เพียง 39 ตัวซึ่งจัดเรียงไว้เพื่อให้สตริงมีเส้นแนวตั้งส่วนกลางของความสมมาตร ดังนั้น](A--A)[กระจกของตัวเอง แต่](A--A(]ไม่ใช่

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

ตัวอย่างเช่นหากโปรแกรมเป็น](A--A)[(ครึ่งซ้าย: ](A-, ครึ่งขวา:) -A)[ดังนั้น:

  • เล่นเอาท์พุทควร](A--A)[ 1(N = 0)
  • เล่นเอาท์พุทควร](A-](A--A)[-A)[ 2(N = 1)
  • เล่นเอาท์พุทควร](A-](A-](A--A)[-A)[-A)[ 3(N = 2)
  • เล่นเอาท์พุทควร](A-](A-](A-](A--A)[-A)[-A)[-A)[ 4(N = 3)
  • . . .
  • เล่นเอาท์พุทควร](A-](A-](A-](A-](A-](A-](A-](A-](A-](A--A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[ 10(N = 9)
  • เป็นต้น

กฎระเบียบ

  • ส่งออกไปยัง stdout หรือทางเลือกที่ใกล้เคียงที่สุดในภาษาของคุณ อาจมีบรรทัดใหม่ต่อท้ายที่เป็นตัวเลือก ไม่ควรป้อนข้อมูลใด ๆ
  • กระบวนการนี้ควรทำงานในทางทฤษฎีสำหรับ N ไม่เกิน 2 15 -1 หรือสูงกว่าให้หน่วยความจำและพลังการประมวลผลเพียงพอ
  • ต้องการโปรแกรมเต็มรูปแบบไม่ใช่เพียงคำสั่งREPL

โปรแกรมเริ่มต้นที่สั้นที่สุด (N = 0 กรณี) เป็นไบต์ที่ชนะ


ในบางฟอนต์#ก็คือการเลือกของตัวเองเช่นกัน แต่คุณพูดถูกไม่ใช่ใน Consolas
SuperJedi224

1
อนุญาตให้ใช้งาน repls ได้หรือไม่ ในคำอื่น ๆ : เราควรเขียนโปรแกรมที่ถูกต้องสมบูรณ์หรือการแสดงออกก็เพียงพอหรือไม่ ฉันกำลังคิดเกี่ยวกับรายการ Haskell ซึ่งจะทำงานเมื่อทำงานใน ghci แต่ไม่ใช่โปรแกรมที่สมบูรณ์ที่ถูกต้อง
Bakuriu

@Bakuriu ต้องใช้โปรแกรมเต็มรูปแบบ คำตอบของ Haskell นั้นไม่ถูกต้อง
งานอดิเรกของ Calvin

4
เหตุใดจึงไม่สะท้อน 'b' และ 'd' ของแต่ละคน มันทำให้แผนของฉันเป็นไปไม่ได้: P
Thijs ter Haar

1
@ThijsterHaar จริง ๆ แล้วฉันไม่ได้พิจารณาว่า แต่ดูเหมือนว่ารูปร่างของพวกเขา Consolas แตกต่างกันเล็กน้อยขอโทษ: P
งานอดิเรกของ Calvin

คำตอบ:


20

Pip, 12 8 4 ไบต์

ขณะนี้มีไบต์น้อยลง 66%!

x++x
  • xเป็นตัวแปรถูกกำหนดค่า""เริ่มต้นเป็น 0ในบริบทตัวเลขนี้จะกลายเป็น
  • ครึ่งแรกซองสุดท้ายทำให้การแสดงออกที่มีรูปแบบ+ x+x+...+xนี่เป็นคำสั่งที่ถูกต้องที่ไม่ทำอะไรเลย
  • ในช่วงครึ่งหลังรวมทั้งสุดท้ายจากครึ่งปีแรกที่ทำให้การแสดงออกที่มีรูปแบบ+ เพิ่มไปที่และส่วนที่เหลือจะเพิ่มให้กับตัวเอง N ครั้ง เนื่องจากนิพจน์ได้รับการประเมินจากซ้ายไปขวาใน Pip การเพิ่มขึ้นจะรับประกันว่าจะเกิดขึ้นก่อนและผลลัพธ์จะเท่ากับจำนวนของระดับมิเรอร์++x+x+...+x++xx1
  • ในตอนท้ายค่าของนิพจน์นี้จะถูกพิมพ์อัตโนมัติ

น่าเสียดายที่ Pip ไม่สามารถประมวลผลนิพจน์จำนวนมากได้ดี: วิธีนี้ทำให้เกิดmaximum recursion depth exceededข้อผิดพลาดสำหรับ N มากกว่า 500 หรือมากกว่านั้น ต่อไปนี้เป็นวิธีแก้ไขปัญหาก่อนหน้าซึ่งไม่สามารถทำได้สำหรับ8 ไบต์ :

x++oo++x

เพิ่มเติมเกี่ยวกับ Pip


ตกลงนอกเสียจากว่ามีใครบางคนโพสต์คำตอบขนาด 2 ไบต์ดูเหมือนว่าคุณจะได้รับสิ่งนี้ในกระเป๋า โดยวิธีการที่ผมไม่ทราบว่าถ้าคุณเคยทำงานกับN = 32767Fatal error: maximum recursion depth exceeded while calling a Python objectแต่ผลผลิตที่เกิดขึ้นจริง
เดนนิส

@ เดนนิสใช่ฉันวิ่งเข้าไปที่จริง - มันเริ่มต้นค่อนข้างประมาณ 600 ถ้าไม่ก่อน เหตุผลคือนิพจน์ได้รับการประเมินโดยการประเมิน subexpressions ทั้งหมดก่อนซ้ำดังนั้นx+x+...+xสร้าง O (N) ความลึกของการเรียกซ้ำ บางทีนั่นอาจทำให้คำตอบนี้เป็นโมฆะ ฉันจะเพิ่มบันทึกย่อ
DLosc

ขีด จำกัด การเรียกซ้ำสามารถปรับได้อย่างง่ายดายใน Python ใช่ไหม
เดนนิส

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

ฉันได้พยายาม. บนเครื่องของฉันเพิ่มการ จำกัด การเรียกซ้ำเป็น 200,000 segfaults แล้ว แต่เนื่องจากคำตอบต้องทำงานให้หน่วยความจำและพลังการคำนวณที่เพียงพอเท่านั้นจึงไม่น่ามีปัญหา
เดนนิส

34

GolfScript ขนาด 10 ไบต์

!:{)::(}:!

ลองออนไลน์ด้วย Web Golfscript: N = 0 , N = 1 , N = 2 , N = 3 , N = 41

Web GolfScript มีขีด จำกัด 1024 อักขระ แต่ล่าม Ruby จัดการN = 32767 ได้อย่างสมบูรณ์แบบ:

$ curl -Ss http://www.golfscript.com/golfscript/golfscript.rb > golfscript.rb
$ echo '"!:{):"32768*":(}:!"32768*' | ruby golfscript.rb > mirror-level-32767.gs
$ ruby golfscript.rb mirror-level-32767.gs
32768

มันทำงานอย่างไร

GolfScript เริ่มแรกมีสตริงว่างบนสแต็ก

ในครึ่งแรกแรกสิ่งต่อไปนี้จะเกิดขึ้น:

  • !ใช้ตรรกะไม่ได้กับสตริงว่าง 1ผลักดันนี้

  • :{{ช่วยประหยัดจำนวนเต็มในกองในตัวแปร

    ใช่นั่นคือตัวระบุที่ถูกต้องแม้ว่าจะไม่มีวิธีในการเรียกคืนค่าที่เก็บไว้

  • ) เพิ่มจำนวนเต็มบนสแต็ก

  • : เป็นคำสั่งที่ไม่สมบูรณ์

ครึ่งซ้ายที่ตามมาเกิดขึ้นดังต่อไปนี้:

  • :!(ที่:เป็นที่เหลือจากก่อนหน้านี้) !จะช่วยประหยัดจำนวนเต็มในกองในตัวแปร

    ใช่นั่นคือตัวระบุที่ถูกต้อง สิ่งนี้จะทำลาย!คำสั่ง แต่เราจะไม่ใช้อีกต่อไป

  • :{, )และ:การทำงานเป็นมาก่อน

ในครึ่งแรกครึ่งแรกจะเกิดสิ่งต่อไปนี้:

  • ::(ที่:เป็นที่เหลือจากก่อนหน้านี้) :จะช่วยประหยัดจำนวนเต็มในกองในตัวแปร

    ใช่แม้จะเป็นตัวระบุที่ถูกต้อง เช่นเดียวกับ{วิธีการดึงค่าที่เก็บไว้

  • ( ลดจำนวนเต็มลงบนสแต็กโดยให้จำนวนครึ่งซ้าย

  • }เพราะมันไม่มีที่เปรียบและยุติการดำเนินการทันที

    นี่คือคุณสมบัติที่ไม่มีเอกสาร ผมเรียกพวกเขาsupercomments

รหัสที่เหลือจะถูกละเว้นเพียง


ดูเหมือนว่าแปลกจริง ๆ ที่จะมีตรงกัน}ในครึ่งหลังของรหัสของคุณในการแข่งขันกระจก
ballesta25

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

27

รหัสเครื่อง Z80, 8 6 ไบต์ *

<8ww8> * สมมติเงื่อนไขบางอย่างโดยการป้อนจาก Amstrad BASIC

<   INC A         // A=A+1
8w  JR C, #77     ## C is unset unless A has overflowed, does nothing

w   LD (HL), A    // Saves A to memory location in HL (randomly initialised)
8>  JR C, #3E     ## C is still unset, does nothing

Aเริ่มต้น 0 เมื่อป้อนจาก BASIC มันเพิ่มขึ้นA nครั้งจากนั้นเขียนมันnครั้งไปยังตำแหน่งหน่วยความจำเดียวกัน (ซึ่งถูกตั้งค่าเป็นตำแหน่งสุ่มเล็กน้อยโดยพื้นฐาน)! การJRดำเนินการ Jump Relative ไม่เคยทำอะไรเลยตั้งแต่การCตั้งค่าสถานะไม่ได้ถูกตั้งค่าไว้เสมอดังนั้นใช้เพื่อ "comment out" byte ต่อไปนี้! รุ่นนี้มีการโกงเล็กน้อยโดยสมมติว่าเงื่อนไขการเข้าบางอย่างคือการป้อนจากการรับประกันขั้นพื้นฐานที่Aเป็น 0 เสมอตำแหน่งของ(HL)ไม่รับประกันว่าจะปลอดภัยและในความเป็นจริงอาจเป็นสถานที่อันตราย โค้ดด้านล่างมีความทนทานมากกว่าซึ่งเป็นสาเหตุที่ทำให้ใช้เวลานานกว่านั้นมาก

รหัสเครื่อง Z80 ขนาด 30 ไบต์

เป็น ASCII: o!.ww.!>A=o>{))((}<o=A<!.ww.!o

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

o   LD L, A       ## 
!.w LD HL, #772E  // Load specific address to not corrupt random memory!
w   LD (HL), A    ## Save random contents of A to memory
.!  LD L, #21     ## 
>A  LD A, #41     // A=#41
=   DEC A         // A=#40
o   LD L, A       // L=#40
>{  LD A, #7B     ## 
)   ADD HL, HL    // HL=#EE80
)   ADD HL, HL    // HL=#DD00. L=#00 at this point

((  JR Z, #28     ## 
}   LD A, L       // A=L
<   INC A         // A=L+1
o   LD L, A       // L=L+1
=   DEC A         // A=L
A   LD B, C       ## 
<   INC A         // A=L+1
!.w LD HL, #772E  // Load address back into HL
w   LD (HL), A    // Save contents of A to memory
.!  LD L, #21     ## 
o   LD L, A       // L=A

รายละเอียดของคำแนะนำที่อนุญาต:

n   op    description
--  ----  -----------
28  LD    LoaD 8-bit or 16-bit register
3   DEC   DECrement 8-bit or 16-bit register
1   INC   INCrement 8-bit or 16-bit register
1   ADD   ADD 8-bit or 16-bit register

Available but useless instructions:
3   JR    Jump Relative to signed 8-bit offset
1   DAA   Decimal Adjust Accumulator (treats the A register as two decimal digits
          instead of two hexadecimal digits and adjusts it if necessary)
1   CPL   1s ComPLement A
1   HALT  HALT the CPU until an interrupt is received

จากคำสั่งที่ได้รับอนุญาต 39 คำสั่ง 28 การดำเนินการโหลด (บล็อกจาก 0x40 ถึง 0x7F เป็นLDคำสั่งไบต์เดียวทั้งหมด) ซึ่งส่วนใหญ่ไม่มีความช่วยเหลือที่นี่! คำแนะนำในการโหลดไปยังหน่วยความจำเท่านั้นที่อนุญาตยังคงอยู่LD (HL), Aซึ่งหมายความว่าฉันต้องเก็บค่าAไว้ เนื่องจากAเป็นเพียงการลงทะเบียนที่เหลือพร้อมกับINCคำแนะนำที่ได้รับอนุญาตนี่จึงค่อนข้างมีประโยชน์!

ฉันไม่สามารถโหลดAด้วย 0x00 เพื่อเริ่มต้นด้วยเพราะ ASCII 0x00 ไม่ใช่ตัวละครที่ได้รับอนุญาต! ค่าที่ใช้ได้ทั้งหมดอยู่ไกลจาก 0 และคำสั่งทางคณิตศาสตร์และตรรกะทั้งหมดไม่ได้รับอนุญาต! ยกเว้น ... ฉันยังสามารถทำได้ADD HL, HLเพิ่ม 16 บิตHLเอง! นอกเหนือจากการโหลดโดยตรงค่า (ใช้ไม่ได้ที่นี่!), การเพิ่มAและ decrementing A, LหรือHLนี้เป็นวิธีเดียวที่ฉันมีการเปลี่ยนแปลงค่าของการลงทะเบียนที่! จริง ๆ แล้วมีคำสั่งพิเศษหนึ่งอย่างที่อาจเป็นประโยชน์ในครึ่งแรก แต่ความเจ็บปวดในการทำงานในช่วงครึ่งหลังและคำแนะนำแบบเติมเต็มที่เกือบจะไร้ประโยชน์ที่นี่และจะใช้พื้นที่มากขึ้น

ดังนั้นฉันจึงพบค่าใกล้เคียงที่สุดกับ 0 ฉันสามารถ: 0x41 มันใกล้เคียงกับ 0 อย่างไร? ในไบนารีมันคือ 0x01000001 ดังนั้นฉันจะลดมันโหลดมันลงไปLแล้วทำADD HL, HLสองครั้ง! Lตอนนี้เป็นศูนย์ซึ่งฉันโหลดกลับไปA! น่าเสียดายที่รหัส ASCII สำหรับADD HL, HLคือ)ตอนนี้ฉันต้องใช้(สองครั้ง โชคดีที่(เป็นJR Z, eที่eเป็นไบต์ต่อไป ดังนั้นมันจึงกลืนกินไบต์ที่สองและฉันแค่ต้องแน่ใจว่ามันไม่ได้ทำอะไรเลยโดยระวังZธง! คำสั่งสุดท้ายที่จะส่งผลกระทบต่อZธงคือDEC A(ตอบโต้ADD HL, HLไม่เปลี่ยนแปลง) และเนื่องจากฉันรู้ว่าAมันคือ 0x40 ณ จุดนั้นจึงรับประกันZได้ว่าไม่ได้ตั้งค่า

คำสั่งแรกในครึ่งปีหลังJR Z, #28จะไม่ทำอะไรเลย 255 ครั้งแรกเนื่องจากสามารถตั้งค่าสถานะ Z ได้เฉพาะเมื่อ A มีโอเวอร์โฟลว์จาก 255 ถึง 0 หลังจากนั้นเอาต์พุตจะไม่ถูกต้องอย่างไรก็ตามเนื่องจากเป็นการบันทึกค่า 8 บิตเท่านั้น ไม่ควรสำคัญ รหัสไม่ควรขยายเกิน 255 ครั้ง

รหัสจะต้องมีการดำเนินการเป็นตัวอย่างเพราะวิธีการที่มีอยู่ทั้งหมดของการกลับมาอย่างหมดจดไม่ได้รับอนุญาต คำสั่ง RETurn ทั้งหมดอยู่เหนือ 0x80 และการปฏิบัติการข้ามไม่กี่ครั้งที่อนุญาตสามารถข้ามไปยังออฟเซ็ตบวกได้เท่านั้นเนื่องจากค่าลบ 8 บิตทั้งหมดไม่ได้รับอนุญาตเช่นกัน!


6
อะไร. นี่คืออะไร.
cloudfeet

4
ตอนนี้ฉันเห็นคำตอบนี้แล้วโดยใช้ GolfScript / J / etc ดูเหมือนว่าการโกง : p
cloudfeet

มีโปรเซสเซอร์ที่ใช้ร่วมกับ Z80 ได้ด้วยการลงทะเบียน 16 บิตหรือไม่? ฉันขอตั้งแต่คำถามที่ต้องใช้รหัสที่มีการทำงานสำหรับN = 32767
เดนนิส

1
@Dennis เพื่อให้โปรแกรมทำงานกับN = 32767จะต้องมีความยาวอย่างน้อย2 x 32767หรือ65534ไบต์ Z80 สามารถระบุหน่วยความจำได้เพียง 65536 ไบต์ทำให้เป็นงานที่เป็นไปไม่ได้เพราะฉันไม่เชื่อว่าฉันจะทำให้โปรแกรมมีขนาดเล็กกว่า 6 ไบต์! การAลงทะเบียนอยู่ที่ 8 บิตเสมอมิฉะนั้นโปรเซสเซอร์จะไม่สามารถทำงานร่วมกับ Z80 ได้ ฉันจะบอกว่ามีหน่วยความจำและกำลังการประมวลผลเพียงพอที่ได้รับการคุ้มครองที่นี่!
CJ Dennis

1
@Dennis คุณเข้าใจไหมว่าทำไมไม่มีโปรเซสเซอร์ Z80 ที่เข้ากันได้จะมีการAลงทะเบียนอะไรนอกเหนือจาก 8 บิต? เปลี่ยนเป็น 16 บิตจะทำลายรหัสอาศัย 255 + 1 = 0 เช่น คุณจะต้องคิดค้นซีพียูให้เรียกมันว่า Z160 ซึ่งใช้การลงทะเบียน 16 บิตเริ่มต้น แต่ยังคงใช้ชุดคำสั่ง 8 บิตเดียวกันจาก Z80 แปลก!
CJ Dennis

19

J, 16 14 ไบต์

(_=_)]++[(_=_)

ประเพณี:

   (_=_)]++[(_=_)
1
   (_=_)]+(_=_)]++[(_=_)+[(_=_)
2
   (_=_)]+(_=_)]+(_=_)]++[(_=_)+[(_=_)+[(_=_)
3

คำอธิบาย:

  • J ประเมินจากขวาไปซ้าย

  • (_=_)เป็นinf equals infที่เป็นความจริงมีค่าเพื่อให้การแสดงออกจะกลายเป็น1 1+]...[+1( (8=8)ยังใช้งานได้ แต่นี่ดูเย็นกว่า :))

  • [และ]คืนค่าอาร์กิวเมนต์ซ้ายและขวาตามลำดับหากมี 2 อาร์กิวเมนต์ หากพวกเขาได้รับเพียง 1 พวกเขากลับมาที่

  • +เพิ่ม 2 ข้อโต้แย้ง หากได้รับเพียง 1 ก็จะส่งกลับว่า

ทีนี้ลองประเมินการแสดงออกระดับ 3 (จากขวาไปซ้าย):

(_=_)]+(_=_)]++[(_=_)+[(_=_)  NB. (_=_) is 1

1]+1]+1]++[1+[1+[1  NB. unary [, binary +

1]+1]+1]++[1+[2  NB. unary [, binary +

1]+1]+1]++[3  NB. unary [, unary +

1]+1]+1]+3  NB. unary +, binary ]

1]+1]+3  NB. unary +, binary ]

1]+3  NB. unary +, binary ]

3

เมื่อเราเห็นครึ่งขวาของการ1เพิ่มและด้านซ้ายของการ1ถูกละเว้นส่งผลให้จำนวนเต็มที่ต้องการNระดับกระจก

ลองออนไลน์ได้ที่นี่


12

Haskell, 42 ไบต์

(8-8)-(-(8-8)^(8-8))--((8-8)^(8-8)-)-(8-8)

โชคดีที่ความคิดเห็นของบรรทัดใน Haskell (-> --) นั้นสามารถสะท้อนได้และครึ่งหนึ่งของมัน (-> -) เป็นฟังก์ชันที่ถูกต้อง ส่วนที่เหลือเป็นคณิตศาสตร์ที่จะได้รับหมายเลขและ0 1โดยทั่วไปเรามี(0)-(-1)ความคิดเห็นN=0และเสริม(0)-(-1)-ในแต่ละขั้นตอน

ถ้าตัวเลขลอยจุดที่ได้รับอนุญาตสำหรับการส่งออกเราสามารถสร้าง1จาก8/8และได้รับโดยมี 26 ไบต์:

Haskell, 26 ไบต์

(8-8)-(-8/8)--(8\8-)-(8-8)

เอาท์พุ1.02.0, ฯลฯ


2
เทคนิคนี้ไม่ถูกต้องเนื่องจากต้องเป็นโปรแกรมแบบเต็ม
งานอดิเรกของ Calvin

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

ฉันจะเรียกมันว่าโปรแกรมเต็มรูปแบบหากคุณสามารถบันทึกเป็นไฟล์program.hsแล้วเรียกใช้$ runhaskell program.hsจากบรรทัดคำสั่งและดูผลลัพธ์ ฉันไม่รู้จักแฮสเค็ลล์ดังนั้นฉันไม่สามารถพูดได้อย่างแน่นอนว่าต้องเปลี่ยนอะไร
งานอดิเรกของ Calvin

2
@ Calvin'sHobbies: runhaskellเป็นเชลล์สคริปต์ที่ตั้งค่าสภาพแวดล้อมบางอย่างและสุดท้ายเรียกghcว่าคอมไพเลอร์ Haskell คุณสามารถเรียกใช้รหัสของฉันโดยตรงกับ:ghc ghc -e "(8-8)-(-8/8)--(8\8-)-(8-8)"การเปิดตัวนี้ghcจะประเมินรหัสที่ให้เป็นอาร์กิวเมนต์พิมพ์ผลลัพธ์และออก ไม่มี REPL ไม่มีการโต้ตอบ หลักสูตรนี้จะเพิ่ม +1 -eเพื่อนับไบต์สำหรับ
nimi

@nimi: -eไม่ได้มีส่วนร่วมให้คะแนนในกรณีนี้ เราไม่นับเป็นไบต์perl -Eหรือgcc -std=c99อย่างใดอย่างหนึ่ง
เดนนิส

11

CJam, 14 ไบต์

]X+:+OooO+:+X[

ลองออนไลน์ในล่าม CJam: N = 0 , N = 1 , N = 2 , N = 3 , N = 41

โปรดทราบว่ารหัสนี้เสร็จสิ้นพร้อมกับข้อความแสดงข้อผิดพลาด การใช้ล่าม Java ข้อความแสดงข้อผิดพลาดนั้นสามารถระงับได้โดยการปิดหรือเปลี่ยนเส้นทาง STDERR 1

มันทำงานอย่างไร

ในครึ่งซ้ายจะเกิดสิ่งต่อไปนี้:

  • ] ล้อมรอบสแต็กทั้งหมดในอาร์เรย์

  • Xต่อท้าย1อาร์เรย์นั้น

  • :+ คำนวณผลรวมขององค์ประกอบอาร์เรย์ทั้งหมด

  • Oo พิมพ์เนื้อหาของอาร์เรย์ที่ว่างเปล่า (เช่นไม่มีอะไร)

ในครึ่งแรกครึ่งแรกจะเกิดสิ่งต่อไปนี้:

  • o พิมพ์จำนวนเต็มบนสแต็กซึ่งเป็นเอาต์พุตที่ต้องการ

  • O+ พยายามที่จะผนวกอาร์เรย์ว่างไว้ในรายการสูงสุดของสแต็ก

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

รหัสที่เหลือจะถูกละเว้นเพียง

1 ตามการสำรวจเมตาควรอนุญาตให้ส่งผลงานด้วยข้อผิดพลาดหรือไม่? สิ่งนี้ได้รับอนุญาต


ฉันสงสัยว่าจะยอมรับสิ่งนี้เนื่องจากข้อผิดพลาด แต่เนื่องจากมันไม่ชนะฉันจึงไม่กังวลเกินไป
งานอดิเรกของ Calvin

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