3 ... 2 ... 1 ... Hancurkan!


47

Tugas Anda adalah menulis program lengkap yang akan terus menghitung mundur dari 10 setiap kali dijalankan.

  • Pertama kali Anda menjalankan program, itu harus dicetak 10.
  • Lain kali, itu harus keluar 9.
  • Lain kali, harus keluar 8, dan seterusnya.
  • Alih-alih mencetak 0, program harus macet. Anda tidak perlu lagi menangani program yang sedang berjalan setelah itu.
  • Fasilitas apa pun yang digunakan untuk penyimpanan dapat dianggap kosong sebelum pelaksanaan pertama dari program.

Berikut ini contoh implementasi dalam 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))

Ini adalah , jadi jawaban tersingkat (diukur dalam byte) menang.


12
Apa yang dimaksud dengan menerjang?
Conor O'Brien

2
@ ConorO'Brien Hmm ... ini belum dibahas dalam meta?
Buah Esolanging

2
@ Challenger5 Bukan yang saya tahu. Apakah melempar kesalahan sudah cukup?
Conor O'Brien

1
@ ConorO'Brien Ya.
Buah Esolanging

Jawaban:


18

6502 bahasa mesin + Apple] [+ ROM, 12 (11? 10? 9?) Byte

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

Harus mulai $8000. Gangguan ke monitor sistem ketika hitungan mencapai 0.


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

Harus mulai $B1. Ini menghemat satu byte karena saya dapat menggunakan versi halaman nol (dua byte) DEC, tetapi menimpa rutin Applesoft yang kritis CHRGET; Anda harus memuatnya dan memanggilnya dari monitor, dan menggunakan CTRL+ BReturnuntuk menginisialisasi ulang BASIC setelah Anda selesai. Tidak yakin apakah ini membatalkan atau tidak.


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

Harus mulai $8000. Ini tidak menginisialisasi $9E, menghemat dua byte. Namun, ini berarti Anda tidak boleh menyebutnya dengan alamat negatif (atau, jika Anda memanggilnya dari monitor, Anda harus memanggil monitor dengan alamat positif). Jika Anda melakukannya, Applesoft ini CALLrutin akan menyimpan FFdi $9E, menyebabkan ia menambahkan 65.280 ke nomor ketika mencetaknya. Sekali lagi, tidak yakin apakah ini membatalkan solusi atau tidak.


C6 B6 F0 01 A2 0B 4C 26 ED

Harus mulai $B1. Ini adalah kombinasi dari dua program di atas, menghemat total tiga byte; Anda harus memanggil monitor dengan alamat positif, memuatnya dan menjalankannya dari sana, dan menggunakan Ctrl+ BReturnuntuk menginisialisasi ulang BASIC begitu Anda selesai.


Perhatikan bahwa program-program ini hanya memodifikasi program dalam memori; memuat ulang program dari disk akan mengatur ulang hitungan mundur. Ini berfungsi karena Apple] [(dan] [+, // e, dan // c) tidak memiliki sistem perlindungan memori apa pun; program (dan modifikasi-nya sendiri) akan tetap berada dalam memori bahkan setelah keluar, sehingga Anda dapat tetap menjalankannya dari memori sampai Anda menimpa memori itu dengan sesuatu yang lain.


Contoh dijalankan

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

Penjelasan

     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

Penjelasan versi 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

Varian

Mencetak ERRdan berbunyi bip saat hitungan mencapai 0

Normal - 15 byte

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

Timpa CHRGET- 14 byte

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

Tidak menginisialisasi $9E- 13 byte

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

Timpa CHRGETdan tidak diinisialisasi $9E- 12 byte

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

Membeku ketika hitungan mencapai 0

Normal - 12 byte

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

Timpa CHRGET- 11 byte

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

Tidak menginisialisasi $9E- 10 byte

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

Timpa CHRGETdan tidak diinisialisasi $9E- 9 byte

C6 B6 F0 FE A2 0B 4C 26 ED

Saya tidak yakin saya mengerti ini .. Bukankah ini sama dengan memiliki fungsi dalam Python yang menurunkan variabel global dan hanya berfungsi jika dieksekusi di shell? Apakah itu diizinkan? Apa yang saya maksud adalah, bukankah biasanya diharapkan suatu program meninggalkan memori di beberapa titik, untuk dimuat ulang lagi nanti?
redstarcoder

3
@redstarcoder Tidak - Apple II benar-benar tidak memiliki sistem alokasi memori; Anda dapat menyimpan apa saja di mana saja di RAM dan itu akan tetap dapat diakses oleh program apa pun sampai ditimpa dengan nilai lain.
insert_name_here

@inset_name_here, saya tidak yakin bagaimana ini dapat diakses di mana saja di RAM mengubah apa pun. Bisakah Anda menjalankan program lain dengan andal dan masih menjalankan program ini nanti? Mungkin saya tidak cukup akrab dengan aturan-aturan di sekitar sini untuk sepenuhnya dipahami, jadi saya akan membatalkannya. Saya hanya berharap program lengkap untuk bertahan melalui reboot dan dapat berjalan dengan baik biasanya jika program lain dijalankan di antara eksekusi, tetapi saya tidak tahu apa yang komunitas aturan untuk program penuh.
redstarcoder

1
@redstarcoder, konsensus umum adalah bahwa program ini dijalankan pada komputer pengembangan dengan hanya perangkat lunak yang diperlukan dan tidak melakukan hal lain dalam waktu yang berarti.
Tom Carpenter

1
8 byte jika Anda menjalankan dari $ 6E sebagai gantinya: C6 75 F0 03 4C 22 ED 0B
peter ferrie

35

Perl di Linux, 17 byte

Saya pikir mungkin menarik untuk membuat program yang tidak mempertahankan statusnya sendiri, dan tidak mengubah kode sumbernya sendiri; dengan kata lain, ia sebenarnya memeriksa seberapa sering dijalankan dengan menanyakan OS. Pertanyaannya mengatakan "Setiap fasilitas yang digunakan untuk penyimpanan dapat dianggap kosong sebelum eksekusi pertama dari program.", Dan dengan demikian kami ingin memulai dari OS yang benar-benar kosong. Karena itu, saya lebih baik menjelaskan bagaimana Anda melakukan hal itu, karena kalau tidak menguji program itu sulit.

Sebenarnya ada dua cara mengatur untuk menjalankan program. Either way, OS minimal untuk tujuan akan menjalankan apa-apa selain shell (untuk memungkinkan kita untuk menjalankan Perl pada gilirannya), dan shell yang paling sederhana yang mungkin pada saat itu (sehingga tidak melakukan apa pun yang mewah yang membuat OS tidak kosong). /bin/dashadalah pilihan yang baik di sini, karena ini dimaksudkan sebagai shell minimal untuk pemulihan sistem. Kemudian, kita perlu menjalankan Linux sedemikian rupa sehingga hanya bisa berjalan dash. Kita dapat melakukan ini dengan me-reboot komputer dengan init=/bin/dashpada baris perintah Linux sehingga tidak memulai apa-apa selain itu dash, atau (jauh lebih nyaman) membuat wadah Linux menggunakan unshare -Urfp /bin/dashdi terminal ( unsharetidak benar-benar membuat OS kosong, tetapi ia mensimulasikansatu; terutama, bagian dalam wadah berpikir itu root, dashberpikir itu init, dll, sama seperti yang akan terjadi pada OS kosong yang sebenarnya). Penafian: Saya belum benar-benar menguji ini pada logam kosong, hanya di dalam unshare, tetapi harus bekerja dua arah dalam teori

Akhirnya, setelah kita mengaturnya, kita hanya perlu melihat PID; karena kita berada pada sistem kosong, sistem init (di sini, shell) akan memiliki PID 1, sehingga eksekusi Perl akan memiliki PID mulai dari 2 hingga 12 inklusif. Jadi program kami terlihat seperti ini:

say 12-$$||die

Inilah contoh menjalankan:

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

OS apa yang Anda jalankan ini? Saya menggunakan Ubuntu Linux 14.04, dan unsharetidak mendukung salah satu flag -Urfp.
isaacg

@isaacg: Ubuntu 16.04. unsharecukup baru (ini merupakan antarmuka ke fitur OS yang juga cukup baru) dan bug hanya benar-benar disetrika selama setahun terakhir. Jika Anda menggunakan versi berumur 2½ tahun, tidak mengherankan bahwa fungsinya sangat terbatas.

14

Bash + sed, 41 40 38 byte

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

Cobalah online!


TIO link memiliki header dan footer, bukankah itu menambah jumlah byte?
Pavel

2
Tidak, itu hanya menjalankan program 11 kali.
Dennis

Saya mengerti sed: invalid option -- '/'. sed (GNU sed) 4.2.2
shrx

@shrx Huh. Saya memiliki versi sed yang sama secara lokal dan TIO, dan mereka tidak menunjukkan kesalahan itu.
Dennis

9

Javascript, 42 byte

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

Uji dengan biola ini - pastikan untuk membersihkan penyimpanan lokal Anda untuk mengatur ulang hitungan mundur.

Terima kasih kepada steenbergh, Lmis, dan obarakon untuk banyak byte!


y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)dapat menghemat satu byte.
Oliver

Anda dapat menggunakan sessionStorageuntuk menguji dengan reset yang lebih mudah (cukup gunakan tab segar) tetapi tentu saja +2 byte.
Kevin Reid

Aduh, maaf, saya hanya melihat jawaban Anda, saya akhirnya melakukan hampir sama. Jika Anda mau, Anda dapat menggunakan l=localStorage;l.l=-~l.l;alert(10-l.l||l)untuk menyimpan byte, saya akan menghapus byte saya
C5H8NNaO4

@Mego Tentu saja :) Saya tidak melihat di console.logsini, tapi saya lebih suka itu
C5H8NNaO4

1
@obarakon Yep, dan hubungan arus pendek Boolean mencegah adari mengevaluasi ketika nilai dalam penyimpanan lokal tidak 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);}}}

Disimpan 34 byte berkat susu

Dan versi yang diformat (Dengan ReadKeyditambahkan sehingga Anda dapat melihat hasilnya):

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

Itu lebih lama daripada yang saya kira jadi mungkin ada ruang untuk bermain golf.


2
File.Existsdan File.Createbukannya ReadAllTextdan WriteAllText. Cukup periksa apakah ada nama file, jangan keduanya dengan konten file. Juga, namespace System.IOdan Anda dapat menghapus namespace dari 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);}}}
susu

@milk Terima kasih banyak! Tidak percaya saya tidak berpikir untuk menggunakan nama file saja! Dan saya tidak tahu tentang trik namespace itu, luar biasa.
TheLethalCoder

8

Dyalog APL , 33 28 22/20? byte

Saya tidak yakin apakah ini valid, karena terdiri dari fungsi (yang harus dipanggil dengan argumen dummy). Namun, semua program APL (murni fungsional atau tidak) memiliki status yang sama, dan memang beberapa versi APL tidak memiliki program tradisional, hanya fungsi. Sebagai kompensasi, saya telah menambahkan dua byte untuk nama itu, meskipun itu tidak diperlukan untuk efek yang diinginkan.

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

Perhatikan bahwa ini bergantung pada kekhasan tidak resmi, yang berlaku ∘←secara global.

6:: atas kesalahan nilai apa pun

⊢ckembali c

∘←10 yang secara global diatur ke 10

sekarang

÷÷c mengembalikan dua kali terbalik (kesalahan nol) c

∘← yang diatur secara global ke

c-1satu kurang dari c

TryAPL online!


Versi 28 byte yang pasti valid:

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

Bekerja dengan menetapkan c ke 11 jika hilang, kemudian mengurangi 1 dari c , membalikkan dua kali (yang memberikan kesalahan div-by-zero jika c -1 adalah 0), menetapkan ke c , dan mengeluarkan nilai baru.


Versi 33 byte yang lama:

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










Bekerja dengan mendefinisikan ulang dirinya sendiri pada setiap proses, tetapi dengan satu baris yang kurang tertinggal. Menghasilkan dua kali jumlah garis yang tersisa terbalik (kurang dua), sehingga memberikan kesalahan div-by-nol ketika hanya dua baris yang tersisa (header dan kode aktual).


1
Er ... mengapa ada begitu banyak baris baru?
Kritixi Lithos

4
@KritixiLithos Program ini mendefinisikan ulang dirinya sendiri dengan satu baris lebih sedikit untuk setiap proses.
Adám

7

Perl, 37 36 byte

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

Hancur ketika nilai awal mencapai -1 (yang akan mencetak 0), saat ia menulis di atas =~operator.

Menyimpan byte menggunakan sysopendaripada open. Ini memungkinkan saya untuk mencetak STDOUTterlebih dahulu, menggunakan nilai kembali sebagai mode file ( 1, alias O_WRONLY), sebelum $~dipindahkan.

Contoh Penggunaan

$ 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
 

Membutuhkan karakter baris baru setelahnya =finish.

diedapat diganti dengan 1/0.

Penjelasan:

Ia mendapat daftar baris setelah =finish( $=finish.lines) mengurangi itu dari 10, dan jika hasilnya bukan 0mencetaknya, jika tidak maka dies.

Hal terakhir yang dilakukannya adalah membuka dirinya dalam mode append, dan menambahkan baris lain ke akhir.


Permalink untuk mereka yang tidak memiliki Perl 6.
Dennis

@Dennis Setidaknya satu itu tidak ketinggalan zaman seperti apa yang dimiliki Ideone (lari say $*PERL.compiler.version)
Brad Gilbert b2gills

1
2014.7 ... wow! Apakah 2016.11 sangat berbeda dari 2016.7? Jika demikian, saya dapat membuatnya dari sumber.
Dennis

@ Dennis Rilis resmi Perl 6 adalah 2015-12-25. Ada perubahan besar di akhir 2015 yang disebut The Great List Refactor (GLR), jadi mendapatkan kode untuk berfungsi pada 2014.7 hampir tidak mungkin. Sebagian besar yang terjadi pada tahun 2016 adalah terkait kinerja, meskipun ada banyak perbaikan kondisi tepi. Sebagian besar kode golf di sini harus bekerja pada apa pun setelah rilis Rakudo 2015,12. Jadi saya pikir v2016.07 baik-baik saja.
Brad Gilbert b2gills

6

Python 2, 65 byte

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

Terinspirasi oleh jawaban L3viathan .

Dapat dikurangi menjadi 60 byte jika Anda dapat memilih untuk memberi nama file seperti karakter tunggal xdan kemudian ganti __file__dengan 'x'. Jika demikian, ganti 75dengan 70.


@ Flp.Tkc ya, tapi bukankah itu jumlah byte yang sama?
Alex Hall

oh, itu benar: P
FlipTack

4

Jolf, 20 byte

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

Coba di sini! Kesalahan saat 0dicetak. Memodifikasi kode. Penjelasan yang akan datang.


Saya tidak terlalu mengenal Jolf, tetapi sepertinya itu tidak langsung berfungsi pada penerjemah online.
Buah Esolanging

1
@ Challenger5 Bahasa ini biasanya hanya berfungsi di firefox.
Conor O'Brien

4

Applesoft BASIC, 21 byte (tokenized)

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

Ganti <CTRL-F>dan <CTRL-H>dengan versi literalnya. Perhatikan bahwa ini hanya memodifikasi program dalam memori; memuat ulang dari disk akan mengatur ulang hitungan mundur.


Contoh dijalankan

]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

Penjelasan

PRINT 9 + 1melakukan apa yang Anda harapkan. CALL 2066panggilan 6502 mesin-rutin bahasa di lokasi memori 2066, yang setelahEND : . ENDmenghentikan program sehingga rutin bahasa mesin (yang, bagi juru bahasa Applesoft, adalah sampah) tidak dijalankan.

Rutin bahasa mesin hanya mengurangi 9in PRINT 9 + 1. Membongkar:

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

Setelah penghitung mencapai 0, itu "dikurangi" menjadi /; mencoba menjalankan program kemudian akan menyebabkan kesalahan sintaksis.


4

*> <> , 20 18 byte

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

Ini sebenarnya bekerja di Linux (dan apa pun yang mendukung file bernama \nI guess). Itu menciptakan file bernama \npada jalankan pertama dan output 10. Ini menghasilkan satu nomor lebih sedikit pada setiap menjalankan subsquent, kecuali di 0mana ia crash.

Penjelasan

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
Nyaman karena *> <> menambahkan IO
Alfie Goodacre

4

PHP 57 byte

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

tidak benar-benar macet tetapi keluar (tanpa menghitung mundur) ketika hits 0. Apakah itu cukup?

Jalankan dengan -r.


4

C #, 156 byte

Saya bermain-main @ jawaban TheLethalCoder sebentar, dan mampu menghemat 3 byte dengan menyusun ulang pernyataan dan menghilangkan int.parse (). Masih ada ruang untuk perbaikan, saya yakin.

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

Tidak Disatukan:

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-question: Mungkin hack-y untuk mengambil pekerjaan TheLethalCoder sebagai titik awal untuk jawaban saya. Akankah lebih baik (setelah saya memiliki perwakilan) untuk menambahkan ini sebagai komentar pada jawaban mereka? Saya tidak mencoba bersaing dengan mereka, saya hanya ingin memamerkan golf saya, untuk saling membangun.


Orang-orang biasanya meninggalkan komentar di bawah jawaban orang lain yang menyarankan perbaikan, namun karena perbaikan pada tambang yang disarankan oleh tambang susu sekarang jauh berbeda sehingga milik Anda baik-baik saja
TheLethalCoder

Saya biasanya pergi jika mereka perbaikan komentar jawaban orang lain tetapi jika itu cukup berbeda untuk mereka kemudian memposting jawaban Anda sendiri
TheLethalCoder

3

Powershell V2.0, 49 byte

(Golf kode pertama kali, tidak dapat menemukan aturan tentang cara menghitung byte. Saya menggunakan kalkulator String ke byte online)

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

Berlari:

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

Selamat datang di PPCG! Aturan untuk menghitung byte tergantung pada pengkodean karakter yang digunakan oleh bahasa. Powershell mungkin menggunakan pengkodean ASCII atau UTF-8, dan untuk skrip dengan hanya kode ASCII, seperti halnya di sini, setiap karakter membutuhkan 1 byte
Luis Mendo

Selamat datang di PPCG! Per penulis tantangan, semua pengiriman harus merupakan program yang lengkap, yang bukan - seperti, itu pada dasarnya dijalankan dalam PowerShell setara dengan REPL.
AdmBorkBork

Jika saya menulis ini di dalam .ps1 dan mengeksekusi itu 10 kali crash-off.ps1 misalnya, apakah itu dianggap sebagai program lengkap?
Kieron Davies

@KieronDavies Ya, asalkan jika Anda menutup dan membuka kembali shell di antara setiap kali, Anda masih mendapatkan hasil yang sama. Menyimpan item "dalam memori" di shell di antara eksekusi adalah apa yang mendefinisikan "lingkungan REPL" dari PowerShell dari lingkungan "program penuh".
AdmBorkBork

3

Java, 343 byte

Upaya golf pertama saya

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

Anda dapat menurunkannya hingga 300 byte dengan mengimpor java.io.*dan menghindari menggunakan nama konstruktor yang sepenuhnya memenuhi syarat, dan Anda dapat memotong 8 byte lainnya dengan menggunakan fakta bahwa "cetak" akan secara otomatis merumuskan argumennya: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

Anda dapat menurunkannya menjadi 237 byte dengan tidak menulis "10" ke file, dan sebagai gantinya hanya menggunakan ?operator berdasarkan keberadaan file ketika Anda membaca 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

Paling optimal saya bisa membuat: 220 byte. Inilah binatang itu: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 untuk saran :)
Viktor Mellgren

3

SQLite, 142 137

Ini mungkin bisa dilakukan dengan lebih cerdik. 141 136 karakter untuk kode:

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

Plus 1 untuk nama file xdi sqlite3 x '…'.


1
Bagus! Belum pernah melihat SQLite digunakan seperti ini sebelumnya. Anda dapat memeras beberapa byte dengan mengganti "values ​​(11)" dengan "select 11", dan "select n from t limit 1" dengan "select min (n) from 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 telah mengklarifikasi (dalam komentar) bahwa program lengkap diperlukan.
Dennis

1
@Dennis Apakah kiriman revisi saya memenuhi syarat sebagai program lengkap?
Oliver

Saya tidak tahu , tapi saya rasa tidak. Saya akan mengatakan bahwa tanpa panggilan alertatau serupa, itu hanya cuplikan REPL.
Dennis

2
Terlihat bagus untukku. (Tidak dapat mengujinya dari ponsel saya.)
Dennis

3

Ruby, 94 87 84 61 59 byte

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

Silakan tinggalkan saran di bawah ini.

Terima kasih @ ConorO'Brien untuk ide-idenya (beberapa tanpa malu merobek jawabannya).


puts i=>p i
Conor O'Brien

Gunakan newdan sizebukannya opendan length.
Lee W

2

Ruby, 52 + 1 = 53 byte

Mengasumsikan file bernama a(+1 byte).

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

Lari

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

... Anda dapat mengambil nama?
dkudriavtsev

Anda bisa menggunakan $ 0 alih-alih a dan 'echo >> # $ 0' (dengan backticks) di baris terakhir.
GB

@ GB Masih lebih banyak byte daripada asumsi a(yang hanya +1).
wizzwizz4

a adalah 2 byte, $ 0 adalah 2 byte, tetapi tidak perlu whitepaces.
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`))

Saya menyukai ide Anda untuk membuka __file__sehingga saya memanfaatkannya dalam jawaban saya.
Alex Hall

@AlexHall Ide bagus denganlen
L3viathan

@ Flp.Tkc Saya tidak akan menyimpan karakter apa pun dengan itu. Saya masih perlu menggunakan variabel s, karena saya perlu membaca, lalu mencari, lalu menulis. The print x/x*xakan bekerja, tetapi tidak meningkatkan jumlah byte.
L3viathan

2

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

If not(Ans
11
Ans-1
AnsAns/Ans

Ans harus sama dengan 0 (nilai default) sebelum jalankan pertama.

Karena AnsAns/Ansini adalah baris terakhir dari program, maka akan dikeluarkan dan disimpan ke Ans kecuali jika Ans adalah 0, dalam hal ini kesalahan pembagian dengan 0 terjadi.


2

JavaScript, 41

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


@Mego Ya tentu saja, saya tidak tahu bagaimana ini bisa terjadi ... Saya punya aalih - alih lketika saya menulisnya, dan mengubahnya tanpa berpikir, karena saya pikir itu terlihat lebih menyenangkan ... sudah terlambat dan herby , terima kasih sudah menunjukkannya.
C5H8NNaO4

1

GNU Smalltalk, 70, 68 byte

Kode 66 byte +2 byte untuk bendera "-S"

EDIT

  • Menghapus tanda kurung yang tidak perlu, -2 byte

Golf

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

Uji

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

Penting

Anda harus menjalankan gst sebagai root, agar dapat memodifikasi gambar default, atau menentukan gambar Anda sendiri dengan -I .


1

PHP, 45 byte

Jujur tidak yakin jika yang ini penting.

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

Saya akan mengirim tautan ke contoh, tetapi semua penguji online yang saya tahu tidak mengizinkan session_start()untuk digunakan.

Ini akan terus menghitung mundur setiap kali Anda me-refresh halaman hingga 0, ketika dieperintah dijalankan.


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|

Buka file a.b(atau buat saat tidak ditemukan saat pertama kali dijalankan), bacalah rekaman 1 menjadi e. Jika catatan itu tidak ditemukan, anggaplah 10, selain itu sub 1. Pada e==0, ungkapkan kesalahan. Tulis kembali ekea.b .

Akses file tidak dibangun ke QBIC, ini sangat bergantung pada QBasic yang mendasarinya.


0

Batch, 72 byte

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

Perlu dipanggil menggunakan nama file lengkap termasuk ekstensi. Baris terakhir tidak boleh memiliki baris tambahan. Bekerja dengan menulis -1hingga akhir baris terakhir sehingga evaluasi menjadi 1 lebih sedikit setiap kali. goto gkesalahan karena tidak ada label :g.


0

R, 52 byte

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

Pada dasarnya digunakan ls()untuk membuat daftar nama semua objek yang disimpan secara global. Jika kami menganggap bahwa lingkungan global kosong dan "x"belum ada, hasilkan x=10, jika tidak x!=0kurangi 1panggil argumen yang hilang yang menghasilkan kesalahan.


Anda dapat menyimpan byte dengan menghapus !dan mengganti urutan argumen saat itu dan yang lain, dan dua lainnya dengan mengubah x>0ke x. (Juga, exists("x")sedikit lebih rapi daripada "x"%in%ls(), meskipun sama dalam hitungan byte.)
rturnbull

Ah, membaca kembali komentar dalam spesifikasi, sepertinya diperlukan program lengkap, yang berarti Anda tidak bisa mengandalkan kegigihan objek di antara proses.
rturnbull

@ Arturnbull Meskipun saya tidak dapat menemukan di mana ini dinyatakan secara eksplisit. Saya akan menghapus jawabannya jika Anda bisa mengarahkan saya ke sana.
Billywob

Itu disebutkan di sini , meskipun belum diedit ke dalam spesifikasi.
rturnbull

0

Windows Batch, 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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.