3 … 2 … 1 …ล้มเหลว!


47

งานของคุณคือการเขียนโปรแกรมเต็มรูปแบบที่จะนับต่อจาก 10 ทุกครั้งที่ทำงาน

  • 10ครั้งแรกที่คุณเรียกใช้โปรแกรมก็ควรพิมพ์
  • 9ครั้งต่อไปก็ควรเอาท์พุท
  • ในครั้งต่อไปก็ควรเอาท์พุท8และอื่น ๆ
  • แทนที่จะทำการพิมพ์0โปรแกรมควรจะล้มเหลว คุณไม่ต้องจัดการกับโปรแกรมที่รันอีกครั้งหลังจากนั้น
  • สิ่งอำนวยความสะดวกใด ๆ ที่ใช้สำหรับการจัดเก็บอาจสันนิษฐานว่าว่างเปล่าก่อนที่จะเรียกใช้โปรแกรมครั้งแรก

นี่คือตัวอย่างการใช้งานใน Python 3:

try:f=open("a","r+");v=int(f.read())
except:f=open("a","w");v=10
1/v
print(v)
f.seek(0)
f.write(str(v-1))

นี่คือดังนั้นคำตอบที่สั้นที่สุด (วัดเป็นไบต์) ชนะ


12
การกระแทกเกิดอะไรขึ้น?
Conor O'Brien

2
@ ConorO'Brien อืม ... เรื่องนี้ยังไม่ได้พูดถึงใน meta?
แยกผลไม้

2
@ Challenger5 ไม่ใช่ที่ฉันรู้ การโยนข้อผิดพลาดจะเพียงพอหรือไม่
Conor O'Brien

1
@ ConorO'Brien ใช่
แยกผลไม้

ที่เกี่ยวข้อง
FryAmTheEggman

คำตอบ:


18

ภาษาเครื่อง 6502 + Apple] [+ ROM, 12 (11? 10? 9?) ไบต์

CE 06 80 F0 01 A2 0B A9 00 4C 24 ED

$8000ควรเริ่มต้นที่ เกิดปัญหากับการตรวจสอบระบบเมื่อจำนวนถึง 0


C6 B6 F0 01 A2 0B A9 00 4C 24 ED

$B1ควรเริ่มต้นที่ นี้ช่วยประหยัดไบต์ตั้งแต่ผมสามารถใช้ (สองไบต์) เวอร์ชั่นศูนย์หน้าของDECแต่เขียนทับ Applesoft ประจำที่สำคัญCHRGET; คุณจะต้องโหลดและโทรจากจอภาพและใช้CTRL+ BReturnเพื่อเริ่มต้น BASIC อีกครั้งเมื่อคุณทำเสร็จแล้ว ไม่แน่ใจว่าสิ่งนี้ทำให้ใช้ไม่ได้หรือไม่


CE 06 80 F0 01 A2 0B 4C 26 ED

$8000ควรเริ่มต้นที่ สิ่งนี้ไม่เริ่มต้น$9Eบันทึกสองไบต์ อย่างไรก็ตามนี่หมายความว่าคุณจะต้องไม่เรียกมันด้วยที่อยู่ติดลบ (หรือถ้าคุณโทรจากจอภาพคุณต้องโทรหาจอภาพด้วยที่อยู่ที่เป็นบวก) ถ้าคุณทำเช่นนั้นCALLกิจวัตรของ Applesoft จะเก็บFFไว้$9Eทำให้เพิ่ม 65280 ลงในจำนวนเมื่อพิมพ์ อีกครั้งไม่แน่ใจว่าสิ่งนี้ทำให้การแก้ปัญหาใช้ไม่ได้หรือไม่


C6 B6 F0 01 A2 0B 4C 26 ED

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


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


วิ่งตัวอย่าง

]BLOAD COUNT THEN BRK
]CALL 32768
10
]CALL 32768
9
]CALL 32768
8
]CALL 32768
7
]CALL 32768
6
]CALL 32768
5
]CALL 32768
4
]CALL 32768
3
]CALL 32768
2
]CALL 32768
1
]CALL 32768

8008-    A=80 X=9D Y=00 P=36 S=EE
*

คำอธิบาย

     DEC NUM+1  ; Decrement the LDX instruction's operand
     BEQ NUM+1  ; If it is now zero, branch to it; 00 is the opcode for the BRK instruction, which causes the program to crash to the monitor
NUM  LDX #$0B   ; Load the X register with 0x0A; the operand has already been decremented once
     LDA #$00   ; Load the accumulator with 0
     JMP $ED24  ; Jump to $ED24, an Applesoft ROM routine which prints A (high byte),X (low byte) in decimal

คำอธิบายเวอร์ชัน 10 ไบต์

     DEC NUM+1  ; Decrement the LDX instruction's operand
     BEQ NUM+1  ; If it is now zero, branch to it; 00 is the opcode for the BRK instruction, which causes the program to crash to the monitor
NUM  LDX #$0B   ; Load the X register with 0x0A; the operand has already been decremented once
     JMP $ED26  ; Jump to $ED26, which is two bytes into the Applesoft routine at $ED24. The two skipped bytes would store the accumulator in $9E

สายพันธุ์

พิมพ์ERRและส่งเสียงบี๊บเมื่อจำนวนถึง 0

ปกติ - 15 ไบต์

CE 06 80 F0 07 A2 0B A9 00 4C 24 ED 4C 2D FF

เขียนทับCHRGET- 14 ไบต์

C6 B6 F0 07 A2 0B A9 00 4C 24 ED 4C 2D FF

ไม่เริ่มต้น$9E- 13 ไบต์

CE 06 80 F0 05 A2 0B 4C 26 ED 4C 2D FF

เขียนทับCHRGETและไม่เริ่มต้น$9E- 12 ไบต์

C6 B6 F0 05 A2 0B 4C 26 ED 4C 2D FF

ค้างเมื่อนับถึง 0

ปกติ - 12 ไบต์

CE 06 80 F0 FE A2 0B A9 00 4C 24 ED

เขียนทับCHRGET- 11 ไบต์

C6 B6 F0 FE A2 0B A9 00 4C 24 ED

ไม่เริ่มต้น$9E- 10 ไบต์

CE 06 80 F0 FE A2 0B 4C 26 ED

เขียนทับCHRGETและไม่เริ่มต้น$9E- 9 ไบต์

C6 B6 F0 FE A2 0B 4C 26 ED

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

3
@redstarcoder No - Apple II ไม่มีระบบการจัดสรรหน่วยความจำอย่างแท้จริง คุณสามารถเก็บสิ่งใดก็ได้ใน RAM และจะสามารถเข้าถึงได้โดยโปรแกรมใด ๆ จนกว่ามันจะถูกเขียนทับด้วยค่าอื่น
insert_name_here

@inset_name_here ฉันไม่แน่ใจว่าจะสามารถเข้าถึงได้จากทุกที่ใน RAM ที่เปลี่ยนแปลงอะไร คุณสามารถรันโปรแกรมอื่น ๆ ได้อย่างน่าเชื่อถือและยังคงรันโปรแกรมนี้ในภายหลัง บางทีฉันอาจไม่คุ้นเคยกับกฎระเบียบที่นี่เพื่อทำความเข้าใจอย่างถ่องแท้ดังนั้นฉันจะทิ้งมันไป ฉันแค่คาดหวังว่าโปรแกรมเต็มรูปแบบจะยังคงมีอยู่ผ่านการรีบูตและสามารถทำงานได้ปกติหากโปรแกรมอื่นทำงานระหว่างการดำเนินการ แต่ฉันไม่ทราบว่าชุมชนใช้กฎใดในโปรแกรมเต็มรูปแบบ
redstarcoder

1
@redstarcoder ฉันทามติทั่วไปคือโปรแกรมทำงานบนคอมพิวเตอร์เพื่อการพัฒนาโดยไม่มีอะไรนอกจากซอฟต์แวร์ที่จำเป็นและไม่ได้ทำสิ่งใดในเวลาเฉลี่ย
Tom Carpenter

1
8 ไบต์หากคุณเรียกใช้จาก $ 6E แทน: C6 75 F0 03 4C 22 ED 0B
peter ferrie

35

Perl บน Linux ขนาด 17 ไบต์

ฉันคิดว่ามันน่าสนใจที่จะสร้างโปรแกรมที่ไม่รักษาสถานะใด ๆ ไว้และไม่ได้แก้ไขซอร์สโค้ดของมันเอง กล่าวอีกนัยหนึ่งมันตรวจสอบความถี่ที่ถูกเรียกใช้โดยถามระบบปฏิบัติการ คำถามกล่าวว่า "สิ่งอำนวยความสะดวกใด ๆ ที่ใช้สำหรับการจัดเก็บอาจสันนิษฐานว่าว่างเปล่าก่อนที่จะเรียกใช้งานโปรแกรมครั้งแรก" ดังนั้นเราจึงต้องการเริ่มต้นจากระบบปฏิบัติการที่ว่างเปล่าโดยสมบูรณ์ เช่นนี้ฉันควรอธิบายว่าคุณดำเนินการอย่างไรดีมิฉะนั้นการทดสอบโปรแกรมนั้นยาก

จริงๆแล้วมีสองวิธีในการตั้งค่าสำหรับการเรียกใช้โปรแกรม ไม่ว่าจะด้วยวิธีใดระบบปฏิบัติการขั้นต่ำสำหรับจุดประสงค์จะไม่ทำงานอะไรเลยนอกจากเชลล์ (เพื่อให้เราสามารถใช้งาน Perl ได้) และเชลล์ที่ง่ายที่สุดเท่าที่จะเป็นไปได้ (เพื่อให้มันไม่ได้ทำอะไรแปลก ๆ ที่ว่างเปล่า) /bin/dashเป็นตัวเลือกที่ดีที่นี่เนื่องจากตั้งใจให้เป็นเชลล์ขั้นต่ำสำหรับการกู้คืนระบบ จากนั้นเราต้องเริ่มต้น Linux ในแบบที่มันไม่ทำงาน แต่dashอย่างใด เราสามารถทำเช่นนี้โดยการรีบูตเครื่องคอมพิวเตอร์ที่มีinit=/bin/dashในบรรทัดคำสั่ง Linux เพื่อที่จะเริ่มอะไรที่นอกเหนือdashหรือ (มากสะดวกยิ่งขึ้น) การสร้างภาชนะ Linux ใช้unshare -Urfp /bin/dashในขั้ว ( unshareไม่จริงสร้างเปล่า OS แต่จะจำลองหนึ่ง; สะดุดตาด้านในของคอนเทนเนอร์คิดว่ามันเป็นรูทdashคิดว่ามันเป็น init เป็นต้นเช่นเดียวกับที่เกิดขึ้นบนระบบปฏิบัติการเปล่าที่ว่างเปล่า) Disclaimer: ฉันไม่ได้ทดสอบจริงนี้บนโลหะเปลือย แต่เฉพาะภายในunshareแต่มันควรจะทำงานทั้งสองแบบในทฤษฎี

ในที่สุดเมื่อเราตั้งค่านั้นเราก็ต้องดู PID; ในขณะที่เราอยู่ในระบบว่างเปล่าระบบเริ่มต้น (ที่นี่เชลล์) จะมี PID 1 ดังนั้นการประมวลผล Perl จะมี PID ตั้งแต่ 2 ถึง 12 ดังนั้นโปรแกรมของเรามีลักษณะดังนี้:

say 12-$$||die

นี่คือตัวอย่างการเรียกใช้:

$ unshare -Urfp /bin/dash
# perl -E 'say 12-$$||die'
10
# perl -E 'say 12-$$||die'
9
# perl -E 'say 12-$$||die'
8
# perl -E 'say 12-$$||die'
7
# perl -E 'say 12-$$||die'
6
# perl -E 'say 12-$$||die'
5
# perl -E 'say 12-$$||die'
4
# perl -E 'say 12-$$||die'
3
# perl -E 'say 12-$$||die'
2
# perl -E 'say 12-$$||die'
1
# perl -E 'say 12-$$||die'
Died at -e line 1.
#

คุณใช้ระบบปฏิบัติการอะไรอยู่ ฉันอยู่บน Ubuntu Linux 14.04 และunshareไม่สนับสนุนการใด ๆ -Urfpของธง
isaacg

@isaacg: Ubuntu 16.04 unshareค่อนข้างใหม่ (เป็นอินเทอร์เฟซสำหรับคุณลักษณะของระบบปฏิบัติการที่ค่อนข้างใหม่) และข้อบกพร่องที่เกิดขึ้นจริงในช่วงปีที่ผ่านมา หากคุณใช้เวอร์ชั่น 2 ปีมันก็ไม่น่าแปลกใจเลยที่มันมีข้อ จำกัด ในการใช้งาน

14

Bash + sed, 41 40 38 ไบต์

echo $[n=10/1]
sed -i s/$n/$[n-1]/g $0

ลองออนไลน์!


ลิงก์ TIO มีส่วนหัวและส่วนท้ายไม่เพิ่มจำนวนเหล่านั้นลงในไบต์หรือไม่
Pavel

2
ไม่พวกมันแค่เรียกใช้โปรแกรม 11 ครั้ง
เดนนิส

sed: invalid option -- '/'ฉันได้รับ sed (GNU sed) 4.2.2
ย่น

@shrx Huh ฉันมีรุ่นเดียวกันของ sed ภายในและบน TIO และพวกเขาไม่แสดงข้อผิดพลาดนั้น
เดนนิส

9

Javascript, 42 ไบต์

y=localStorage;y.a=y.a||10;alert(y.a--||a)

ทดสอบด้วยซอนี้ - อย่าลืมลบที่เก็บข้อมูลในเครื่องของคุณเพื่อรีเซ็ตการนับถอยหลัง

ขอบคุณ steenbergh, Lmis และ obarakon สำหรับจำนวนไบต์!


y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)สามารถช่วยคุณประหยัดไบต์
Oliver

คุณสามารถใช้sessionStorageเพื่อทดสอบด้วยการรีเซ็ตที่ง่ายกว่า (เพียงใช้แท็บใหม่) แต่มีขนาด +2 ไบต์
Kevin Reid

โอ้วขอโทษฉันเพิ่งเห็นคำตอบของคุณฉันลงเอยด้วยการทำแบบเดียวกัน ถ้าคุณต้องการคุณสามารถใช้l=localStorage;l.l=-~l.l;alert(10-l.l||l)เพื่อบันทึก byte ฉันจะลบ Mine
C5H8NNaO4

@Mego แน่นอน :) ฉันไม่เห็นconsole.logที่นี่ แต่ฉันต้องการที่อย่างใดอย่างหนึ่ง
C5H8NNaO4

1
@obarakon Yep และการลัดวงจรแบบบูลีนป้องกันไม่ให้aประเมินเมื่อค่าใน localstorage ไม่ใช่ 0
Mego

8

C #, 197 160 159 125 ไบต์

namespace System.IO{class P{static void Main(){int n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Wr‌​ite(n*n/n);}}}

บันทึกแล้ว 34 ไบต์ขอบคุณนม

และเวอร์ชันที่จัดรูปแบบ (พร้อมReadKeyเพิ่มเพื่อให้คุณสามารถดูผลลัพธ์):

namespace System.IO
{
    class P
    {
        static void Main()
        {
            int n=11;
            for(;File.Exists(""+--n););
            File.Create(""+n);
            Console.Wr‌​ite(n*n/n);
        }
    }
}

มันนานกว่าที่ฉันคิดว่ามันน่าจะมีห้องสำหรับเล่นกอล์ฟ


2
File.ExistsและFile.CreateแทนและReadAllText WriteAllTextเพียงตรวจสอบว่ามีชื่อไฟล์อยู่หรือไม่ทั้งคู่กับเนื้อหาไฟล์ นอกจากนี้namespace System.IOและคุณสามารถลบ namespace ออกSystem.Console.Writeได้ 125 ไบต์:namespace System.IO{class P{static void Main(){var n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Write(n*n/n);}}}
นม

@ นมขอบคุณมาก! ไม่อยากจะเชื่อเลยว่าฉันไม่ได้คิดถึงการใช้ชื่อไฟล์ แต่! และฉันไม่รู้เกี่ยวกับเคล็ดลับเนมสเปซนั้นยอดเยี่ยม
TheLethalCoder

8

Dyalog APL , 33 28 22/20? ไบต์

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

f←{6::⊢c∘←10⋄÷÷c∘←c-1}

โปรดทราบว่าสิ่งนี้ขึ้นอยู่กับการเล่นโวหารอย่างไม่เป็นทางการที่∘←กำหนดทั่วโลก

6:: เมื่อมีข้อผิดพลาดค่าใด ๆ

⊢cผลตอบแทน

∘←10 ซึ่งตั้งค่าทั่วโลกเป็น 10

ตอนนี้

÷÷c คืนค่า inverted สองครั้ง (ข้อผิดพลาดเป็นศูนย์) c

∘← ซึ่งตั้งค่าทั่วโลกเป็น

c-1น้อยกว่าหนึ่ง

ลองใช้ออนไลน์!


รุ่น 28 ไบต์มีผลบังคับใช้อย่างแน่นอน:

f
'c←11'/⍨0=⎕NC'c'
c←÷÷c-1

ทำงานโดยการตั้งค่าcถึง 11 หากหายไปจากนั้นลบ 1 จากcกลับด้านสองครั้ง (ซึ่งให้ข้อผิดพลาด div-by-zero ถ้าc -1 คือ 0) กำหนดให้cและส่งออกค่าใหม่


รุ่นเก่า 33 ไบต์:

ฉ
÷÷≢2↓↓r⊣⎕FX¯1 R ←⎕NR'f'










ทำงานโดยกำหนดตัวเองใหม่ในการวิ่งแต่ละครั้ง แต่มีการขึ้นบรรทัดใหม่ต่อท้ายน้อยกว่าหนึ่งรายการ เอาต์พุตจำนวนบรรทัดที่เหลือกลับสองเท่าของบรรทัดที่เหลือ (น้อยกว่าสอง) จึงให้ข้อผิดพลาด div-by-zero เมื่อเหลือเพียงสองบรรทัด (ส่วนหัวและโค้ดจริง)


1
เอ่อ ... ทำไมมีการขึ้นบรรทัดใหม่มากมาย
Kritixi Lithos

4
@KritixiLithos โปรแกรมจะนิยามตัวเองใหม่โดยใช้หนึ่งบรรทัดที่น้อยกว่าสำหรับการทำงานแต่ละครั้ง
อดัม

7

Perl, 37 36 ไบต์

9=~//;print$'-sysopen$~,$0,print$'+1

เกิดปัญหาเมื่อค่าเริ่มต้นถึง -1 (ซึ่งจะพิมพ์ 0) ตามที่เขียนทับ=~ผู้ประกอบการ

บันทึกไบต์ใช้มากกว่าsysopen openสิ่งนี้อนุญาตให้ฉันพิมพ์ไปSTDOUTก่อนโดยใช้ค่าส่งคืนเป็นโหมดไฟล์ ( 1หรือที่รู้จักO_WRONLY) ก่อนที่จะ$~ถูกกำหนดใหม่

ตัวอย่างการใช้งาน

$ perl crash-off.pl
10
$ perl crash-off.pl
9
$ perl crash-off.pl
8

...

$ perl crash-off.pl
2
$ perl crash-off.pl
1
$ perl crash-off.pl
syntax error at crash-off.pl line 1, near "1~"
Execution of crash-off.pl aborted due to compilation errors.

6

Perl 6 ,  60  58 ไบต์

put 10-$=finish.lines||die;
$*PROGRAM.open(:a).put;
=finish
 
open($*PROGRAM,a=>put 10-$=finish.lines||die).put
=finish
 

=finishความต้องการขึ้นบรรทัดใหม่หลังจากที่ตัวละคร

die1/0สามารถถูกแทนที่ด้วย

คำอธิบาย:

มันจะได้รับรายการบรรทัดหลังจาก=finish( $=finish.lines) ลบออกจาก10และถ้าผลลัพธ์ไม่0พิมพ์ออกมามิฉะนั้นจะdieเป็น s

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


ลิงก์ถาวรสำหรับผู้ที่ไม่มี Perl 6
Dennis

@Dennis อย่างน้อยก็ไม่มีใครที่ล้าสมัยเหมือนที่ Ideone มี (เรียกใช้say $*PERL.compiler.version)
Brad Gilbert b2gills

1
2014.7 ... ว้าว! 2559.11 นั้นแตกต่างจากปี 2559.7 หรือไม่? ถ้าเป็นเช่นนั้นฉันสามารถสร้างได้จากแหล่งที่มา
เดนนิส

@Dennis การเปิดตัว Perl 6 อย่างเป็นทางการคือ 2015-12-25 มีการเปลี่ยนแปลงครั้งใหญ่ในช่วงปลายปี 2558 เรียกว่า The Great List Refactor (GLR) ดังนั้นการได้รับรหัสเพื่อใช้งานกับ 2014.7 นั้นแทบจะเป็นไปไม่ได้ สิ่งที่เกิดขึ้นส่วนใหญ่ในปี 2559 นั้นเกี่ยวข้องกับประสิทธิภาพแม้ว่าจะมีการแก้ไขเงื่อนไขขอบมากมาย รหัส golfed ส่วนใหญ่ที่นี่ควรทำงานอะไรก็ได้หลังจากการเปิดตัว Rakudo 2015.12 ดังนั้นฉันคิดว่า v2016.07 นั้นใช้ได้
Brad Gilbert b2gills

6

Python 2, 65 ไบต์

f=open(__file__,"r+")
x=75-len(f.read())
x/x
print x
f.write('#')

แรงบันดาลใจจากคำตอบของ L3viathan

สามารถลดลงได้ถึง 60 ไบต์ถ้าคุณสามารถเลือกที่จะตั้งชื่อไฟล์ตัวอักษรตัวเดียวเหมือนxแล้วแทนที่ด้วย__file__ 'x'ในกรณีที่แทนที่ด้วย7570


@ Flp.Tkc ใช่ แต่นั่นไม่ใช่จำนวนไบต์เท่ากันใช่ไหม
Alex Hall

โอ้จริงแล้วนั่นคือ: P
FlipTack

4

Jolf, 20 ไบต์

γ-@▲lqΈ?␡γ?γaγ0₯I₯C1

ลองที่นี่! ข้อผิดพลาดเมื่อ0พิมพ์ แก้ไขรหัส คำอธิบายที่จะมา


ฉันไม่คุ้นเคยกับ Jolf มากนัก แต่ดูเหมือนจะไม่ได้ทำงานกับล่ามออนไลน์ในทันที
แยกผลไม้

1
@ Challenger5 ภาษามักใช้งานกับ firefox เท่านั้น
Conor O'Brien

4

Applesoft BASIC, 21 ไบต์ (โทเค็น)

0  PRINT 9 + 1: CALL 2066: END : OR <CTRL-F><CTRL-H>`

แทนที่<CTRL-F>และ<CTRL-H>กับรุ่นที่แท้จริงของพวกเขา โปรดทราบว่านี่เป็นการปรับเปลี่ยนโปรแกรมในหน่วยความจำเท่านั้น การโหลดซ้ำจากดิสก์จะรีเซ็ตการนับถอยหลัง


วิ่งตัวอย่าง

]RUN
10

]RUN
9

]RUN
8

]RUN
7

]RUN
6

]RUN
5

]RUN
4

]RUN
3

]RUN
2

]RUN
1

]RUN

?SYNTAX ERROR IN 0

คำอธิบาย

PRINT 9 + 1ทำในสิ่งที่คุณคาดหวัง CALL 2066เรียกรูทีนภาษาเครื่อง 6502 ที่ตำแหน่งหน่วยความจำ 2066 ซึ่งเป็นหลังจากEND :นั้น ENDหยุดโปรแกรมเพื่อรูทีนภาษาเครื่อง (ซึ่งตัวแปลของ Applesoft เป็นขยะ) จะไม่ถูกดำเนินการ

ประจำเครื่องภาษาเพียง decrements ใน9 PRINT 9 + 1ถอดชิ้นส่วน:

0812-   CE 06 08    DEC $0806
0815-   60          RTS

หลังจากตัวนับถึง 0 มันเป็น "ลดค่า" ถึง/; การพยายามเรียกใช้โปรแกรมจะทำให้เกิดข้อผิดพลาดทางไวยากรณ์


4

*> <> , 20 18 ไบต์

a1Fi:0(?b1-:?:1Fn;

ใช้งานได้จริงบน Linux (และสิ่งที่รองรับไฟล์ที่ชื่อ\nฉันเดา) มันจะสร้างไฟล์ชื่อในการทำงานครั้งแรกและเอาท์พุท\n 10มันจะดำเนินการเพื่อส่งออกหนึ่งหมายเลขน้อยลงในการทำงานย่อยแต่ละครั้งยกเว้น0ที่มันเกิดปัญหาแทน

คำอธิบาย

a1F                   open file named "\n"
   i:                 recieve input and duplicate it (-1 if empty)
     0(?b             if the file is empty, push 11 to the stack
         1-           subtract one
           :          duplicate the number
            ?:        if the number isn't 0, duplicate it again
              1F      save the number to the file
                n     output the number (crash if non-existant)
                 ;    exit

2
สะดวกสบายที่ *> <> เพิ่ม IO
Alfie Goodacre

4

PHP 57 ไบต์

echo$n=($f=file(f))?$f[0]:10?:die;fputs(fopen(f,w),--$n);

doesn't จริงๆ แต่ความผิดพลาดออก (โดยไม่นับลง) เมื่อ 0hits เพียงพอหรือไม่

-rทำงานด้วย


4

C #, 156 ไบต์

ฉัน golfed @ TheLethalCoder คำตอบสำหรับบิตและก็สามารถบันทึก 3 ไบต์โดยการจัดเรียงคำสั่งใหม่และกำจัด int.parse () ยังคงมีห้องสำหรับการปรับปรุงฉันแน่ใจ

using System.IO;class P{static void Main(){int n;try{n=File.ReadAllText("f")[0]-48;}catch{n=10;}System.Console.Write(n/n*n);File.WriteAllText("f",""+--n);}}

Ungolfed:

using System.IO;
class P
{
    static void Main()
    {
        int n;
        try
        {
            n = File.ReadAllText("f")[0] - 48;
        }
        catch {
            n = 10;
        }
        System.Console.Write(n / n * n);
        File.WriteAllText("f", "" + --n);
    }
}

คำถาม Meta: มันอาจจะแฮ็ค -y เพื่อใช้งาน TheLethalCoder เป็นจุดเริ่มต้นสำหรับคำตอบของฉัน มันจะดีกว่า (เมื่อฉันมีตัวแทน) เพื่อเพิ่มความคิดเห็นในคำตอบของพวกเขา? ฉันไม่ได้พยายามที่จะแข่งขันกับพวกเขาฉันแค่ต้องการอวดสนามกอล์ฟของฉัน


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

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

3

Powershell V2.0, 49 ไบต์

(รหัสกอล์ฟครั้งแรกไม่พบกฎเกี่ยวกับวิธีการคำนวณไบต์ฉันใช้เครื่องคิดเลข String to ไบต์ออนไลน์)

if(!$n){$n=10;$n}else{$n-=1;if($n-eq0){throw};$n}

วิ่ง:

PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
10

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
9

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
8

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
7

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
6

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
5

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
4

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
3

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
2

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
1

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
ScriptHalted
At line:1 char:49
+ if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw <<<< };$n;}
    + CategoryInfo          : OperationStopped: (:) [], RuntimeException
    + FullyQualifiedErrorId : ScriptHalted

ยินดีต้อนรับสู่ PPCG! กฎการคำนวณไบต์ขึ้นอยู่กับการเข้ารหัสอักขระที่ใช้โดยภาษา Powershell อาจใช้การเข้ารหัส ASCII หรือ UTF-8 และดังนั้นสำหรับสคริปต์ที่มีรหัส ASCII เท่านั้นเช่นกรณีที่นี่อักขระแต่ละตัวใช้เวลา 1 ไบต์
Luis Mendo

ยินดีต้อนรับสู่ PPCG! ตามผู้ประพันธ์ท้าทายการส่งทั้งหมดจะต้องเป็นโปรแกรมที่สมบูรณ์ซึ่งสิ่งนี้ไม่ได้เป็นอย่างที่เป็นอยู่แล้วมันจะถูกเรียกใช้ในเทียบเท่ากับ PowerShell ของ REPL
AdmBorkBork

หากฉันเขียนสิ่งนี้ภายใน. ps1 และดำเนินการเช่นนั้น 10 ครั้ง crash-off.ps1 นั้นนับเป็นโปรแกรมเต็มหรือไม่
Kieron Davies

@KieronDavies ใช่โดยมีเงื่อนไขว่าหากคุณปิดและเปิดเชลล์อีกครั้งในระหว่างแต่ละครั้งคุณยังคงได้รับผลลัพธ์เดียวกัน การรักษารายการ "ในหน่วยความจำ" ในเชลล์ระหว่างการดำเนินการคือสิ่งที่กำหนด "สภาพแวดล้อม REPL" ของ PowerShell จากสภาพแวดล้อม "โปรแกรมเต็มรูปแบบ"
AdmBorkBork

3

Java, 343 ไบต์

ความพยายามครั้งแรกของฉันในการเล่นกอล์ฟ

import java.io.PrintWriter;class M{public static void main(String[] a) throws Exception{if(!new java.io.File("x").exists()) try(PrintWriter p=new java.io.PrintWriter("x")){p.write("10");}int b=new java.util.Scanner(new java.io.File("x")).nextInt();try(PrintWriter p=new java.io.PrintWriter("x")){p.print(b/b*b-1+"");System.out.print(b+"");}}}

ungolfed

import java.io.PrintWriter;

class M {
    public static void main(String[] a) throws Exception {
        if (!new java.io.File("x").exists()) {
            try (PrintWriter p = new java.io.PrintWriter("x")) {
                p.write("10");
            }
        }
        int b = new java.util.Scanner(new java.io.File("x")).nextInt();
        try (PrintWriter p = new java.io.PrintWriter("x")) {
            p.print(b / b * b - 1 + "");
            System.out.print(b + "");
        }
    }
}

คุณสามารถลดขนาดได้ถึง 300 ไบต์โดยการนำเข้าjava.io.*และหลีกเลี่ยงการใช้ชื่อคอนสตรัคเตอร์ที่ผ่านการรับรองและคุณสามารถตัดอีก 8 โดยใช้ข้อเท็จจริงที่ว่า "พิมพ์" จะทำให้อาร์กิวเมนต์ของอาร์กิวเมนต์เป็นไปโดยอัตโนมัติ:import java.io.*;class M{public static void main(String[] a) throws Exception{if(!new File("x").exists()) try(PrintWriter p=new PrintWriter("x")){p.print(10);}int b=new java.util.Scanner(new File("x")).nextInt();try(PrintWriter p=new PrintWriter("x")){p.print(b/b*b-1);System.out.print(b);}}}
Glen

คุณสามารถลดขนาดลงได้ถึง 237 ไบต์โดยไม่ต้องเขียน "10" ลงในไฟล์และเพียงแค่ใช้?โอเปอเรเตอร์ตามการมีอยู่ของไฟล์เมื่อคุณอ่านb:import java.io.*;class M{public static void main(String[] a) throws Exception{int b=new File("x").exists()?new java.util.Scanner(new File("x")).nextInt():10;try(PrintWriter p=new PrintWriter("x")){p.print(b/b*b-1);System.out.print(b);}}}
Glen

ปรับให้เหมาะสมที่สุดที่ฉันสามารถทำได้: 220 ไบต์ นี่คือสัตว์ร้าย:import java.io.*;class A{public static void main(String[]a)throws Exception{File f=new File("f");int b=f.exists()?new FileInputStream(f).read()-48:10;new PrintWriter(f).printf("%d",b/b*b-1).close();System.out.print(b);}}
Olivier Grégoire

ขอบคุณสำหรับคำแนะนำ :)
วิคเตอร์ Mellgren

3

SQLite, 142 137

สิ่งนี้สามารถทำได้อย่างชาญฉลาดมากขึ้น 141 136 ตัวอักษรสำหรับรหัส:

create table if not exists t(n not null);insert into t select 11;update t set n=case n when 1 then null else n-1 end;select min(n)from t

พลัส 1 สำหรับชื่อไฟล์ในxsqlite3 x '…'


1
ดี! ไม่เคยเห็น SQLite เคยใช้แบบนี้มาก่อน คุณสามารถบีบสองสามไบต์ได้โดยแทนที่ "values ​​(11)" ด้วย "select 11" และ "select n จาก t limit 1" ด้วย "select min (n) จาก t"
Bence Joful

3

JavaScript, 74 ไบต์

x=typeof x!=typeof 1?10:x!=1?x-=1:_

l=localStorage;l.a=typeof l.a!=typeof""?10:l.a!=1?l.a=--l.a:_;aler‌​t(l.a)


5
OP ได้ชี้แจง (ตามความคิดเห็น) ว่าจำเป็นต้องใช้โปรแกรมเต็มรูปแบบ
เดนนิส

1
@Dennis การส่งแก้ไขของฉันมีคุณสมบัติเป็นโปรแกรมเต็มหรือไม่
Oliver

ฉันไม่รู้แต่ฉันก็ไม่คิดอย่างนั้น ฉันจะบอกว่าไม่มีการเรียกร้องalertหรือคล้ายกันมันเป็นเพียงตัวอย่าง REPL
Dennis

2
ดูดีกับผม. (ไม่สามารถทดสอบจากโทรศัพท์ของฉันได้)
Dennis

3

Ruby, 94 87 84 61 59 ไบต์

j=File.open(?a,"a+");1/(i=j.readlines.size-14);p -i;j.puts

โปรดออกคำแนะนำด้านล่าง

ขอบคุณ @ ConorO'Brien สำหรับความคิด (บางคนไร้ยางอายออกจากคำตอบของเขา)


puts i=>p i
Conor O'Brien

การใช้งานnewและการsizeแทนและopen length
Lee W

2

Ruby, 52 + 1 = 53 ไบต์

ถือว่าไฟล์นั้นมีชื่อว่าa(+1 ไบต์)

q=File.read ?a
0/h=62-q.size
p h
File.write ?a,q+?1#

วิ่ง

C:\Users\Conor O'Brien\Documents\Programming
λ type a
q=File.read ?a
0/h=62-q.size
p h
File.write ?a,q+?1#
C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
10

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
9

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
8

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
7

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
6

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
5

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
4

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
3

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
2

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
1

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
a:2:in `/': divided by 0 (ZeroDivisionError)
        from a:2:in `<main>'

... คุณสามารถสมมติชื่อได้หรือไม่
dkudriavtsev

คุณสามารถใช้ $ 0 แทน a และ 'echo >> # $ 0' (มี backticks) ในบรรทัดสุดท้าย
GB

@GB มันยังคงเป็นไบต์มากกว่าที่คิดa(ซึ่งเป็นเพียง +1)
wizzwizz4

? a คือ 2 ไบต์, $ 0 คือ 2 ไบต์ แต่ไม่ต้องการ whitepaces
GB

2

Python 2, 89 ไบต์

x=10
x/x
print x
f=open(__file__,"r+")
s=f.read()
f.seek(0)
f.write(s.replace(`x`,`x-1`))

ฉันชอบความคิดของคุณในการเปิด__file__ดังนั้นฉันจึงใช้ประโยชน์จากคำตอบของฉัน
Alex Hall

@AlexHall ความคิดที่ยอดเยี่ยมด้วยlen
L3viathan

@ Flp.Tkc ฉันจะไม่บันทึกอักขระใด ๆ ฉันยังต้องใช้ตัวแปรsเพราะฉันต้องอ่านแล้วหาแล้วเขียน วิธีprint x/x*xนี้ใช้ได้ผล แต่ไม่ได้ปรับปรุงจำนวนไบต์
L3viathan

2

TI-BASIC (TI-84 Plus) (15 ไบต์)

If not(Ans
11
Ans-1
AnsAns/Ans

ตอบควรเท่ากับ 0 (ค่าเริ่มต้น) ก่อนการเรียกใช้ครั้งแรก

เนื่องจากAnsAns/Ansเป็นบรรทัดสุดท้ายของโปรแกรมมันจะถูกส่งออกและเก็บไว้ใน Ans เว้นแต่ว่า Ans จะเป็น 0 ซึ่งในกรณีนี้ข้อผิดพลาดหารด้วย 0 จะเกิดขึ้น


2

JavaScript, 41

l=localStorage;l.l=-~l.l;alert(11-l.l||I)


@ ใช่แน่นอนฉันไม่รู้ว่ามันจะเกิดอะไรขึ้น ... ฉันมีaแทนlเมื่อฉันเขียนมันและเปลี่ยนมันโดยไม่คิดเพราะฉันคิดว่ามันดูสนุกกว่า ... มันสายเกินไปแล้ว ขอบคุณสำหรับการชี้ให้เห็นว่า
C5H8NNaO4

1

GNU Smalltalk 70, 68 ไบต์

รหัส 66 ไบต์ +2 ไบต์สำหรับแฟล็ก "-S"

การแก้ไข

  • ลบวงเล็บที่ไม่จำเป็น -2 ไบต์

แข็งแรงเล่นกอล์ฟ

X=Y ifTrue:[Smalltalk at:#X put:10]ifFalse:[X:=X-1].(X*X/X)printNl

ทดสอบ

>seq 11|xargs -L1 sudo gst -S fail.st 2>/dev/null
10
9
8
7
6
5
4
3
2
1
Object: 0 error: The program attempted to divide a number by zero
ZeroDivide(Exception)>>signal (ExcHandling.st:254)
SmallInteger(Number)>>zeroDivide (SysExcept.st:1426)
SmallInteger>>/ (SmallInt.st:277)
UndefinedObject>>executeStatements (fail.st:1)

สิ่งสำคัญ

คุณต้องเรียกใช้GSTเป็นรากมันจะสามารถปรับเปลี่ยนภาพเริ่มต้นหรือระบุภาพของคุณเองด้วย-I


1

PHP, 45 ไบต์

สุจริตไม่แน่ใจว่าสิ่งนี้นับ

<?session_start();echo10-$_SESSION[0]++?:die;

ฉันโพสต์ลิงก์ไปยังตัวอย่าง แต่ผู้ทดสอบออนไลน์ทั้งหมดที่ฉันรู้ว่าไม่อนุญาตให้session_start()ใช้

การทำเช่นนี้จะนับถอยหลังทุกครั้งที่คุณรีเฟรชหน้าเว็บจนถึง 0 เมื่อdieคำสั่งรัน


0

QBIC , 70 ไบต์

open"r",1,"a.b" $get#1,1,e|~e=0|e=z\e=e-1]?e~e=0|$error 1|]$put#1,1,e|

เปิดแฟ้มa.b(หรือสร้างมันเมื่อไม่พบในการทำงานครั้งแรก) อ่านบันทึก 1 eเข้า หากไม่พบเร็กคอร์ดนั้นให้สันนิษฐานว่าเป็น 10 และอื่น ๆ ย่อยที่ 1 เมื่อe==0เกิดข้อผิดพลาด เขียนกลับไปea.b

การเข้าถึงไฟล์ไม่ได้สร้างขึ้นใน QBIC สิ่งนี้ขึ้นอยู่กับ QBasic พื้นฐาน


0

แบตช์ 72 ไบต์

@call:l
@if %n%==0 goto g
@echo %n%
@cmd/cset/a-1>>%0
:l
@set/an=10

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


0

R, 52 ไบต์

`if`(!"x"%in%ls(),cat(x<-10),`if`(x>0,cat(x<-x-1),))

ใช้เป็นหลักls()ในการแสดงชื่อของวัตถุที่เก็บไว้ทั่วโลกทั้งหมด หากเราสมมติว่าสภาพแวดล้อมส่วนกลางนั้นว่างเปล่าและ"x"ยังไม่มีอยู่ให้สร้างขึ้นx=10มิฉะนั้นหากการx!=0ลบ1อื่นเรียกอาร์กิวเมนต์ที่หายไปซึ่งส่งกลับข้อผิดพลาด


คุณสามารถบันทึกไบต์โดยการลบ!และการเปลี่ยนคำสั่งของแล้วและอื่นขัดแย้งและอีกสองโดยการเปลี่ยนไปx>0 x(นอกจากนี้ยังexists("x")เป็นผู้ชนะเล็กน้อยกว่า"x"%in%ls()แม้ว่าจะเท่ากับจำนวนไบต์)
rturnbull

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

@rtbull แม้ว่าฉันไม่สามารถหาที่นี้มีการระบุไว้อย่างชัดเจน ฉันจะลบคำตอบถ้าคุณสามารถชี้ให้ฉันได้
Billywob

มันพูดถึงที่นี่แม้ว่ามันจะไม่ได้รับการแก้ไขลงในสเป็ค
rturnbull


0

JavaScript ขนาด 44 ไบต์

function* f(n=11){for(;--n;yield n);throw''}

p=f()
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)

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