3 3 2 2 1 1 Crash tắt!


47

Nhiệm vụ của bạn là viết một chương trình đầy đủ sẽ tiếp tục đếm ngược từ 10 mỗi khi nó được chạy.

  • Lần đầu tiên bạn chạy chương trình, nó sẽ in 10.
  • Lần sau, nó sẽ xuất ra 9.
  • Lần sau, nó sẽ xuất ra 8, v.v.
  • Thay vì in 0, chương trình sẽ bị sập. Bạn không phải xử lý chương trình chạy thêm nữa sau đó.
  • Bất kỳ cơ sở nào được sử dụng để lưu trữ có thể được coi là trống trước khi thực hiện chương trình đầu tiên.

Đây là một ví dụ triển khai trong 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))

Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.


12
Những gì không sụp đổ đòi hỏi?
Conor O'Brien

2
@ ConorO'Brien Hmm ... điều này chưa được thảo luận trong meta?
Esolanging Fruit

2
@ Challenger5 Không phải tôi biết. Sẽ ném một lỗi là đủ?
Conor O'Brien

1
@ ConorO'Brien Có.
Esolanging Fruit

Câu trả lời:


18

Ngôn ngữ máy 6502 + Apple] [+ ROM, 12 (11? 10? 9?) Byte

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

Nên bắt đầu từ $8000. Tai nạn đến màn hình hệ thống khi số đếm đạt 0.


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

Nên bắt đầu từ $B1. Điều này tiết kiệm một byte vì tôi có thể sử dụng phiên bản không có trang (hai byte) DEC, nhưng ghi đè lên thói quen quan trọng của Applesoft CHRGET; bạn sẽ cần tải nó và gọi nó từ màn hình và sử dụng CTRL+ BReturnđể khởi tạo lại BASIC sau khi hoàn tất. Không chắc chắn nếu điều này vô hiệu hóa nó hay không.


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

Nên bắt đầu từ $8000. Điều này không khởi tạo $9E, tiết kiệm hai byte. Tuy nhiên, điều này có nghĩa là bạn không được gọi nó bằng một địa chỉ âm (hoặc, nếu bạn gọi nó từ màn hình, bạn phải gọi màn hình với một địa chỉ dương). Nếu bạn làm thế, Applesoft của CALLthói quen sẽ lưu trữ FFtrong $9E, làm cho nó thêm 65.280 với số khi in nó. Một lần nữa, không chắc chắn điều này có làm mất hiệu lực giải pháp hay không.


C6 B6 F0 01 A2 0B 4C 26 ED

Nên bắt đầu từ $B1. Đây là sự kết hợp của hai chương trình trên, tiết kiệm tổng cộng ba byte; bạn sẽ phải gọi màn hình với một địa chỉ tích cực, tải nó và chạy nó từ đó và sử dụng Ctrl+ BReturnđể khởi tạo lại BASIC sau khi bạn hoàn thành.


Lưu ý rằng các chương trình này chỉ sửa đổi chương trình trong bộ nhớ; tải lại chương trình từ đĩa sẽ thiết lập lại đếm ngược. Điều này hoạt động vì Apple] [(và] [+, // e và // c) không có hệ thống bảo vệ bộ nhớ nào; chương trình (và tự sửa đổi) sẽ ở lại trong bộ nhớ ngay cả khi nó thoát, vì vậy bạn có thể tiếp tục chạy nó từ bộ nhớ cho đến khi bạn ghi đè lên bộ nhớ đó bằng thứ khác.


Chạy mẫu

]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
*

Giải trình

     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

Giải thích về phiên bản 10 byte

     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

Biến thể

In ERRvà tiếng bíp khi đếm đến 0

Bình thường - 15 byte

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

Ghi đè CHRGET- 14 byte

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

Không khởi tạo $9E- 13 byte

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

Ghi đè CHRGETvà không khởi tạo $9E- 12 byte

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

Đóng băng khi số đếm đạt 0

Bình thường - 12 byte

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

Ghi đè CHRGET- 11 byte

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

Không khởi tạo $9E- 10 byte

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

Ghi đè CHRGETvà không khởi tạo $9E- 9 byte

C6 B6 F0 FE A2 0B 4C 26 ED

Tôi không chắc là tôi hiểu điều này .. Điều này sẽ không giống với việc có một hàm trong Python làm suy giảm một biến toàn cục và chỉ hoạt động nếu được thực thi trong trình bao? Điều đó có được phép không? Ý tôi là, thông thường, một chương trình sẽ rời khỏi bộ nhớ vào một lúc nào đó, sẽ được tải lại sau đó?
redstarcoder

3
@redstarcoder Không - Apple II thực sự không có hệ thống cấp phát bộ nhớ; bạn có thể lưu trữ mọi thứ ở bất cứ đâu trong RAM và nó sẽ có thể truy cập được bởi bất kỳ chương trình nào cho đến khi nó được ghi đè bằng một giá trị khác.
insert_name_here

@inset_name_here, tôi không chắc làm thế nào nó có thể truy cập được ở bất cứ đâu trong RAM thay đổi bất cứ điều gì. Bạn có thể chạy các chương trình khác một cách đáng tin cậy và vẫn chạy chương trình này sau? Có lẽ tôi không đủ quen thuộc với các quy tắc quanh đây để hiểu đầy đủ, vì vậy tôi sẽ bỏ nó. Tôi chỉ mong đợi một chương trình đầy đủ sẽ tiếp tục thông qua khởi động lại và có thể chạy tốt thường xuyên nếu các chương trình khác được chạy giữa các lần thực thi của nó, nhưng tôi không biết cộng đồng quy định chương trình đầy đủ là gì.
redstarcoder

1
@redstarcoder sự đồng thuận chung là chương trình được chạy trên một máy tính phát triển không có gì ngoài phần mềm cần thiết và không làm gì khác trong thời gian đó.
Tom Carpenter

1
8 byte nếu bạn chạy từ $ 6E thay vào đó: C6 75 F0 03 4C 22 ED 0B
peter ferrie 16/03/18

35

Perl trên Linux, 17 byte

Tôi nghĩ rằng có thể thú vị khi tạo một chương trình không duy trì bất kỳ trạng thái nào và không sửa đổi mã nguồn của chính nó; nói cách khác, nó thực sự kiểm tra tần suất nó được chạy bằng cách hỏi HĐH. Câu hỏi cho biết "Bất kỳ cơ sở nào được sử dụng để lưu trữ có thể được coi là trống trước khi thực hiện chương trình đầu tiên.", Và do đó chúng tôi muốn bắt đầu từ một hệ điều hành hoàn toàn trống. Như vậy, tôi sẽ giải thích rõ hơn về cách bạn thực hiện điều đó, vì nếu không thì việc kiểm tra chương trình rất khó khăn.

Thực tế có hai cách để thiết lập để chạy chương trình. Dù bằng cách nào, hệ điều hành tối thiểu cho mục đích sẽ không chạy được gì ngoài vỏ (để cho phép chúng tôi chạy Perl lần lượt) và lớp vỏ đơn giản nhất có thể ở đó (để nó không làm bất cứ điều gì lạ mắt khiến HĐH không hoạt động chỗ trống). /bin/dashlà một lựa chọn tốt ở đây, vì nó được dự định là một vỏ tối thiểu để phục hồi hệ thống. Sau đó, chúng ta cần khởi động Linux theo cách mà nó không chạy được gì ngoài dash. Chúng ta có thể làm điều này bằng cách khởi động lại máy tính bằng init=/bin/dashdòng lệnh Linux để nó không khởi động gì bên cạnh dash, hoặc (thuận tiện hơn nhiều) tạo một thùng chứa Linux bằng cách sử dụng unshare -Urfp /bin/dashtrong một thiết bị đầu cuối ( unsharekhông thực sự tạo ra một hệ điều hành trống, nhưng nó mô phỏngmột; Đáng chú ý, bên trong container nghĩ rằng nó là root, dashnghĩ rằng đó là init, v.v., giống như sẽ xảy ra trên một hệ điều hành trống thực tế). Tuyên bố miễn trừ trách nhiệm: Tôi chưa thực sự thử nghiệm điều này trên kim loại trần, chỉ bên trong unshare, nhưng nó sẽ hoạt động theo cả hai cách trên lý thuyết.

Cuối cùng, một khi chúng ta đã thiết lập xong, chúng ta chỉ cần nhìn vào PID; vì chúng tôi đang ở trên một hệ thống trống, hệ thống init (ở đây, hệ vỏ) sẽ có PID 1, do đó, các lệnh thực thi của Perl sẽ có các PID từ 2 đến 12. Vì vậy, chương trình của chúng tôi trông như thế này:

say 12-$$||die

Đây là một mẫu chạy:

$ 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.
#

Hệ điều hành nào bạn đang chạy này? Tôi đang dùng Ubuntu Linux 14.04 và unsharekhông hỗ trợ bất kỳ cờ nào -Urfp.
isaacg

@isaacg: Ubuntu 16.04. unsharelà khá mới (đó là một giao diện cho một tính năng hệ điều hành cũng khá mới) và các lỗi chỉ thực sự được khắc phục trong năm ngoái hoặc lâu hơn. Nếu bạn đang sử dụng phiên bản 2 tuổi, điều đó không có gì đáng ngạc nhiên khi nó rất hạn chế về chức năng.

14

Bash + sed, 41 40 38 byte

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

Hãy thử trực tuyến!


Liên kết TIO có một tiêu đề và chân trang, không phải là những người thêm vào số byte?
Pavel

2
Không, đó chỉ là để chạy chương trình 11 lần.
Dennis

Tôi nhận được sed: invalid option -- '/'. sed (GNU sed) 4.2.2
shrx

@shrx Huh. Tôi có cùng phiên bản sed tại địa phương và trên TIO và chúng không hiển thị lỗi đó.
Dennis

9

Javascript, 42 byte

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

Kiểm tra nó với fiddle này - hãy chắc chắn xóa bộ nhớ cục bộ của bạn để thiết lập lại đếm ngược.

Cảm ơn steenbergh, Lmis và obarakon cho rất nhiều byte!


y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)có thể giúp bạn tiết kiệm một byte.
Oliver

Bạn có thể sử dụng sessionStorageđể kiểm tra với thiết lập lại dễ dàng hơn (chỉ cần sử dụng tab mới) nhưng tất nhiên là +2 byte.
Kevin Reid

Ouch, xin lỗi, tôi vừa thấy câu trả lời của bạn, cuối cùng tôi cũng làm như vậy. Nếu bạn muốn, bạn có thể sử dụng l=localStorage;l.l=-~l.l;alert(10-l.l||l)để lưu một byte, tôi sẽ xóa của tôi
C5H8NNaO4

@Mego Tất nhiên :) Tôi không thấy console.logở đây, nhưng tôi thích điều đó hơn
C5H8NNaO4

1
@obarakon Yep và đoản mạch Boolean ngăn không cho việc ađánh giá khi giá trị trong bộ lưu trữ cục bộ không bằng 0.
Mego

8

C #, 197 160 159 125 byte

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

Đã lưu 34 byte nhờ sữa

Và một phiên bản được định dạng (Với ReadKey thêm để bạn có thể xem đầu ra):

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

Nó dài hơn tôi nghĩ nó sẽ có thể có chỗ để chơi gôn.


2
File.ExistsFile.Createthay vì ReadAllTextWriteAllText. Chỉ cần kiểm tra xem tên tệp có tồn tại không, cả hai đều có nội dung tệp. Ngoài ra, namespace System.IOvà bạn có thể loại bỏ không gian tên từ System.Console.Write. 125 byte:namespace System.IO{class P{static void Main(){var n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Write(n*n/n);}}}
sữa

@milk Cảm ơn rất nhiều! Không thể tin rằng tôi đã không nghĩ đến việc chỉ sử dụng tên tệp! Và tôi đã không biết về thủ thuật không gian tên đó, thật tuyệt vời.
TheLethalCoder

8

Thuốc nhuộm APL , 33 28 22/20? byte

Tôi không chắc chắn nếu điều này là hợp lệ, vì nó bao gồm một hàm (phải được gọi với một đối số giả). Tuy nhiên, tất cả các chương trình APL (hoàn toàn có chức năng hoặc không) có cùng trạng thái và thực sự một số phiên bản APL không có chương trình truyền thống, chỉ có chức năng. Để bù lại, tôi đã thêm hai byte để đặt tên cho nó, mặc dù điều đó không cần thiết cho hiệu ứng mong muốn.

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

Lưu ý rằng điều này phụ thuộc vào một sự giải quyết không chính thức, rằng ∘← chỉ định trên toàn cầu.

6:: bất kỳ lỗi giá trị

⊢c trở về c

∘←10 được đặt toàn cầu thành 10

hiện nay

÷÷c trả lại hai lần đảo ngược (lỗi về 0) c

∘← được đặt trên toàn cầu

c-1một ít hơn c

Dùng thử trực tuyến!


Phiên bản 28 byte chắc chắn hợp lệ:

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

Hoạt động bằng cách đặt c thành 11 nếu thiếu, sau đó trừ 1 từ c , đảo ngược hai lần (điều này gây ra lỗi div-by-zero nếu c -1 bằng 0), gán cho c và xuất giá trị mới.


Phiên bản 33 byte cũ:

đụ
÷÷ ≢2 r⊣⎕FX¯1 ← r ← NR'f '










Hoạt động bằng cách xác định lại chính nó trên mỗi lần chạy, nhưng với một dòng mới ít hơn. Xuất ra số lần đảo ngược hai lần của các dòng còn lại (ít hơn hai), do đó sẽ gây ra lỗi div-by-zero khi chỉ còn hai dòng (tiêu đề và mã thực tế).


1
Er ... tại sao có quá nhiều dòng mới?
Kritixi Lithos

4
@KritixiLithos Chương trình xác định lại chính nó với một dòng ít hơn cho mỗi lần chạy.
Adám

7

Perl, 37 36 byte

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

Sự cố khi giá trị ban đầu đạt -1 (sẽ in 0), khi nó ghi trên =~ toán tử.

Đã lưu một byte bằng cách sử dụng sysopenchứ không phải open. Điều này cho phép tôi in ra STDOUTtrước, sử dụng giá trị trả về làm chế độ tệp ( 1, aka O_WRONLY), trước khi $~được gán lại.

Sử dụng mẫu

$ 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 byte

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

Cần nhân vật dòng mới sau =finish.

diecó thể được thay thế bằng 1/0.

Giải trình:

Nó nhận được một danh sách các dòng sau =finish( $=finish.lines) trừ đi từ đó 10và nếu kết quả không phải là 0nó in ra, nếu không thì nódie là.

Điều cuối cùng nó làm là tự mở trong chế độ chắp thêm và thêm một dòng khác vào cuối.


Permalink cho những người không có Perl 6.
Dennis

@Dennis Ít nhất thì điều đó không quá xa vời như những gì Ideone đã có (chạy say $*PERL.compiler.version)
Brad Gilbert b2gills

1
2014.7 ... wow! 2016.11 có khác nhiều so với 2016.7 không? Nếu vậy, tôi có thể xây dựng nó từ nguồn.
Dennis

@Dennis Bản phát hành chính thức của Perl 6 là 2015-12-25. Có một sự thay đổi lớn vào cuối năm 2015 được gọi là The Great List Refactor (GLR), do đó, việc lấy mã để hoạt động vào 2014.7 là gần như không thể. Hầu hết những gì đã xảy ra trong năm 2016 là liên quan đến hiệu suất, mặc dù đã có rất nhiều sửa chữa tình trạng cạnh. Hầu hết các mã golf ở đây sẽ hoạt động trên bất cứ thứ gì sau khi phát hành Rakudo 2015.12. Vì vậy, tôi nghĩ rằng v2016,07 là tốt.
Brad Gilbert b2gills

6

Python 2, 65 byte

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

Lấy cảm hứng từ câu trả lời của L3viathan .

Có thể giảm xuống 60 byte nếu bạn có thể chọn đặt tên cho tệp là một ký tự đơn xvà sau đó thay thế __file__bằng 'x'. Trong trường hợp đó, thay thế 75bằng 70.


@ Flp.Tkc có, nhưng đó không phải là cùng số byte?
Hội trường Alex

ồ, đó là sự thật: P
FlipTack

4

Jolf, 20 byte

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

Hãy thử nó ở đây! Lỗi khi 0được in. Sửa đổi mã. Giải thích sắp tới.


Tôi không quen thuộc lắm với Jolf, nhưng dường như nó không hoạt động ngay lập tức trong trình thông dịch trực tuyến.
Esolanging Fruit

1
@ Challenger5 Ngôn ngữ thường chỉ hoạt động trên firefox.
Conor O'Brien

4

Applesoft BASIC, 21 byte (mã thông báo)

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

Thay thế <CTRL-F><CTRL-H>với các phiên bản nghĩa đen của họ. Lưu ý rằng điều này chỉ sửa đổi chương trình trong bộ nhớ; tải lại từ đĩa sẽ thiết lập lại đếm ngược.


Chạy mẫu

]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

Giải trình

PRINT 9 + 1làm những gì bạn mong đợi. CALL 2066gọi thủ tục ngôn ngữ máy 6502 tại vị trí bộ nhớ 2066, sau đó END :. ENDtạm dừng chương trình để thói quen ngôn ngữ máy (mà, đối với trình thông dịch Applesoft, là rác) không được thực thi.

Thói quen sử dụng ngôn ngữ máy chỉ đơn giản là giảm giá trị 9trong PRINT 9 + 1. Tháo gỡ:

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

Sau khi bộ đếm đạt 0, nó được "giảm" thành / ; cố gắng chạy chương trình sau đó sẽ gây ra lỗi cú pháp.


4

*> <> , 20 18 byte

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

Điều này thực sự hoạt động trên Linux (và bất cứ điều gì hỗ trợ các tệp có tên \ntôi đoán). Nó tạo ra một tập tin có tên\n trong lần chạy đầu tiên và đầu ra 10. Nó tiến hành xuất ra một số ít hơn trên mỗi lần chạy phụ, ngoại trừ 0nơi nó gặp sự cố.

Giải trình

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
Thuận tiện rằng *> <> thêm IO
Alfie Goodacre

4

PHP 57 byte

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

khôngnt thực sự sụp đổ nhưng thoát (không đếm ngược) khi nó chạm 0. Như vậy đã đủ chưa?

Chạy với -r.


4

C #, 156 byte

Tôi đã chơi câu trả lời @ TheLethalCoder's một chút và có thể lưu 3 byte bằng cách sắp xếp lại các câu lệnh và loại bỏ int.parse (). Vẫn còn chỗ để cải thiện, tôi chắc chắn.

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);}}

Ung dung:

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);
    }
}

Câu hỏi meta: Có thể hack-y lấy công việc của TheLethalCoder làm điểm khởi đầu cho câu trả lời của tôi. Nó sẽ tốt hơn (một khi tôi có đại diện) để thêm điều này như một nhận xét về câu trả lời của họ? Tôi không cố gắng để cạnh tranh với họ, tôi chỉ muốn thể hiện môn đánh gôn của mình, để chỉnh sửa lẫn nhau.


Mọi người thường để lại bình luận bên dưới những người khác trả lời đề xuất cải tiến, tuy nhiên vì những cải tiến của tôi được đề xuất bởi mỏ sữa giờ đã khác rất nhiều nên bạn vẫn ổn
TheLethalCoder

Tôi thường đi theo nếu họ là những cải tiến cho nhận xét câu trả lời của người khác nhưng nếu nó đủ khác với họ thì hãy đăng câu trả lời của riêng bạn
TheLethalCoder

3

Powershell V2.0, 49 byte

(Lần đầu tiên chơi golf, không thể tìm thấy các quy tắc về cách tính byte. Tôi đã sử dụng máy tính String to byte trực tuyến)

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

Đang chạy:

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

Chào mừng đến với PPCG! Các quy tắc để tính toán byte phụ thuộc vào mã hóa ký tự được sử dụng bởi ngôn ngữ. Powershell có thể sử dụng mã hóa ASCII hoặc UTF-8, và vì vậy, đối với một tập lệnh chỉ có mã ASCII, như trường hợp ở đây, mỗi ký tự chiếm 1 byte
Luis Mendo

Chào mừng đến với PPCG! Theo người viết thử thách, tất cả các bài nộp phải là một chương trình hoàn chỉnh, điều này không phải - như vậy, về cơ bản, nó đang được chạy trong tương đương với REPL của PowerShell.
admBorkBork

Nếu tôi đã viết cái này bên trong một .ps1 và thực hiện 10 lần crash-off.ps1 chẳng hạn, thì nó có được tính là một chương trình đầy đủ không?
Kieron Davies

@KieronDavies Có, với điều kiện là nếu bạn đóng và mở lại vỏ giữa mỗi lần, bạn vẫn nhận được kết quả tương tự. Giữ các mục "trong bộ nhớ" trong trình bao giữa thực thi là điều xác định "môi trường REPL" của PowerShell từ môi trường "chương trình đầy đủ".
admBorkBork

3

Java, 343 byte

Nỗ lực chơi gôn đầu tiên của tôi

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+"");}}}

vô dụng

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 + "");
        }
    }
}

Bạn có thể giảm xuống còn 300 byte bằng cách nhập java.io.*và tránh sử dụng tên nhà xây dựng đủ điều kiện và bạn có thể cắt thêm 8 byte bằng cách sử dụng "in" sẽ tự động xâu chuỗi các đối số của nó: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

Bạn có thể giảm xuống còn 237 byte bằng cách không ghi "10" vào tệp và thay vào đó chỉ sử dụng ?toán tử dựa trên sự tồn tại của tệp khi bạn đọc 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

Tối ưu hóa nhất tôi có thể thực hiện: 220 byte. Đây là con thú: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

thx cho các đề xuất :)
Viktor Mellgren

3

SQLite, 142 137

Điều này có lẽ có thể được thực hiện thông minh hơn nhiều. 141 136 ký tự cho mã:

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

Cộng 1 cho tên tệp xtrongsqlite3 x '…' .


1
Đẹp! Chưa từng thấy SQLite được sử dụng như thế này trước đây. Bạn có thể nén một vài byte bằng cách thay thế "giá trị (11)" bằng "select 11" và "select n từ t giới hạn 1" bằng "select min (n) từ t"
Bence Joful

3

JavaScript, 74 byte

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 đã làm rõ (trong các ý kiến) rằng cần phải có một chương trình đầy đủ.
Dennis

1
@Dennis Bài nộp sửa đổi của tôi có đủ điều kiện là một chương trình đầy đủ không?
Oliver

Tôi không biết , nhưng tôi không nghĩ vậy. Tôi muốn nói rằng không có cuộc gọi đến alerthoặc tương tự, đó chỉ là một đoạn REPL.
Dennis

2
Co vẻ tôt vơi tôi. (Không thể kiểm tra nó từ điện thoại của tôi.)
Dennis

3

Ruby, 94 87 84 61 59 byte

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

Vui lòng để lại gợi ý dưới đây.

Cảm ơn @ ConorO'Brien vì những ý tưởng (một số không biết xấu hổ gạt ra từ câu trả lời của anh ấy).


puts i=>p i
Conor O'Brien

Sử dụng newsizethay vì openlength.
Lee W

2

Ruby, 52 + 1 = 53 byte

Giả sử tập tin được đặt tên a(+1 byte).

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

Đang chạy

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>'

... Bạn có thể giả sử tên?
dkudriavtsev

Bạn có thể sử dụng $ 0 thay vì a và 'echo >> # $ 0' (với backticks) trên dòng cuối cùng.
GB

@GB Nó vẫn còn nhiều byte hơn so với giả định a(chỉ là +1).
wizzwizz4

? a là 2 byte, $ 0 là 2 byte, nhưng không cần khoảng trắng.
GB

2

Python 2, 89 byte

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

Tôi thích ý tưởng mở của bạn __file__vì vậy tôi đã sử dụng nó trong câu trả lời của tôi.
Hội trường Alex

@AlexHall Ý tưởng tuyệt vời vớilen
L3viathan

@ Flp.Tkc Tôi sẽ không lưu bất kỳ nhân vật nào với điều đó. Tôi vẫn cần sử dụng biến s, bởi vì tôi cần đọc, sau đó tìm kiếm, sau đó viết. Nó print x/x*xsẽ hoạt động, nhưng không cải thiện số byte.
L3viathan

2

TI-BASIC (TI-84 Plus) (15 byte)

If not(Ans
11
Ans-1
AnsAns/Ans

Ans phải bằng 0 (giá trị mặc định) trước lần chạy đầu tiên.

AnsAns/Anslà dòng cuối cùng của chương trình, nó sẽ được xuất ra và được lưu trữ vào Ans trừ khi Ans bằng 0, trong trường hợp đó xảy ra lỗi chia cho 0.


2

JavaScript, 41

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


@Mego Có rõ ràng, tôi không biết làm thế nào điều này có thể xảy ra ... Tôi đã athay thế lkhi tôi viết nó, và thay đổi nó mà không cần suy nghĩ, bởi vì tôi nghĩ nó trông vui hơn ... đã quá muộn và tạm biệt , cảm ơn đã chỉ ra rằng.
C5H8NNaO4

1

GNU Smalltalk, 70, 68 byte

66 byte mã +2 byte cho cờ "-S"

EDITS

  • Đã xóa các dấu ngoặc đơn không cần thiết, -2 byte

Chơi gôn

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

Kiểm tra

>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)

Quan trọng

Bạn phải chạy gst với quyền root, để nó có thể sửa đổi hình ảnh mặc định hoặc chỉ định hình ảnh của riêng bạn với -I .


1

PHP, 45 byte

Thành thật không chắc chắn nếu điều này được tính.

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

Tôi sẽ đăng một liên kết đến một ví dụ, nhưng tất cả những người kiểm tra trực tuyến mà tôi biết không cho phép session_start()sử dụng.

Điều này sẽ tiếp tục đếm ngược mỗi khi bạn làm mới trang cho đến 0, khi dielệnh được chạy.


0

QBIC , 70 byte

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|

Mở tệp a.b(hoặc tạo tệp khi không tìm thấy trong lần chạy đầu tiên), đọc bản ghi 1 vào e. Nếu không tìm thấy bản ghi đó, giả sử 10, khác phụ 1. Tại e==0, đưa ra lỗi. Viết lại echoa.b .

Truy cập tệp không được tích hợp vào QBIC, điều này phụ thuộc rất nhiều vào QBasic cơ bản.


0

Mẻ, 72 byte

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

Cần phải được gọi bằng tên tệp đầy đủ bao gồm cả phần mở rộng. Dòng cuối cùng không được có một dòng mới. Hoạt động bằng cách viết -1đến cuối dòng cuối cùng để nó ước tính ít hơn 1 lần mỗi lần. goto glỗi vì không có nhãn :g.


0

R, 52 byte

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

Về cơ bản sử dụng ls()để liệt kê tên của tất cả các đối tượng được lưu trữ trên toàn cầu. Nếu chúng ta giả sử rằng môi trường toàn cầu trống và "x"chưa tồn tại, hãy tạo x=10, nếu không x!=0trừ đi, 1hãy gọi một đối số bị thiếu sẽ trả về lỗi.


Bạn có thể lưu một byte bằng cách loại bỏ !và chuyển đổi thứ tự của các đối số sau đó và các đối số khác và hai đối số khác bằng cách thay đổi x>0thành x. (Ngoài ra, exists("x")gọn gàng hơn một chút "x"%in%ls(), mặc dù bằng số byte.)
rturnbull

Ah, đọc lại các bình luận trong đặc tả, có vẻ như cần phải có một chương trình đầy đủ, điều đó có nghĩa là bạn không thể dựa vào sự kiên trì của đối tượng giữa các lần chạy.
rturnbull

@rturnbull Mặc dù tôi không thể tìm thấy nơi này được nêu rõ ràng. Tôi sẽ xóa câu trả lời nếu bạn có thể chỉ cho tôi.
Billywob

Nó được đề cập ở đây , mặc dù nó chưa được chỉnh sửa thành thông số kỹ thuật.
rturnbull

0

Batch Windows, 61 byte

@if %n%.==. set n=10
@if %n%==0 goto.
@set /a n-=1&@echo %n%

0

JavaScript, 44 byte

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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.