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 kode-golf , jadi jawaban tersingkat (diukur dalam byte) menang.
Jawaban:
6502 bahasa mesin + Apple] [+ ROM, 12 (11? 10? 9?) Byte
Harus mulai
$8000
. Gangguan ke monitor sistem ketika hitungan mencapai 0.Harus mulai
$B1
. Ini menghemat satu byte karena saya dapat menggunakan versi halaman nol (dua byte)DEC
, tetapi menimpa rutin Applesoft yang kritisCHRGET
; Anda harus memuatnya dan memanggilnya dari monitor, dan menggunakan CTRL+ BReturnuntuk menginisialisasi ulang BASIC setelah Anda selesai. Tidak yakin apakah ini membatalkan atau tidak.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 iniCALL
rutin akan menyimpanFF
di$9E
, menyebabkan ia menambahkan 65.280 ke nomor ketika mencetaknya. Sekali lagi, tidak yakin apakah ini membatalkan solusi atau tidak.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
Penjelasan
Penjelasan versi 10 byte
Varian
Mencetak
ERR
dan berbunyi bip saat hitungan mencapai 0Normal - 15 byte
Timpa
CHRGET
- 14 byteTidak menginisialisasi
$9E
- 13 byteTimpa
CHRGET
dan tidak diinisialisasi$9E
- 12 byteMembeku ketika hitungan mencapai 0
Normal - 12 byte
Timpa
CHRGET
- 11 byteTidak menginisialisasi
$9E
- 10 byteTimpa
CHRGET
dan tidak diinisialisasi$9E
- 9 bytesumber
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/dash
adalah pilihan yang baik di sini, karena ini dimaksudkan sebagai shell minimal untuk pemulihan sistem. Kemudian, kita perlu menjalankan Linux sedemikian rupa sehingga hanya bisa berjalandash
. Kita dapat melakukan ini dengan me-reboot komputer denganinit=/bin/dash
pada baris perintah Linux sehingga tidak memulai apa-apa selain itudash
, atau (jauh lebih nyaman) membuat wadah Linux menggunakanunshare -Urfp /bin/dash
di terminal (unshare
tidak benar-benar membuat OS kosong, tetapi ia mensimulasikansatu; terutama, bagian dalam wadah berpikir itu root,dash
berpikir 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 dalamunshare
, tetapi harus bekerja dua arah dalam teoriAkhirnya, 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:
Inilah contoh menjalankan:
sumber
unshare
tidak mendukung salah satu flag-Urfp
.unshare
cukup 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.Bash + sed,
414038 byteCobalah online!
sumber
sed: invalid option -- '/'
. sed (GNU sed) 4.2.2Javascript, 42 byte
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!
sumber
y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)
dapat menghemat satu byte.sessionStorage
untuk menguji dengan reset yang lebih mudah (cukup gunakan tab segar) tetapi tentu saja +2 byte.l=localStorage;l.l=-~l.l;alert(10-l.l||l)
untuk menyimpan byte, saya akan menghapus byte sayaconsole.log
sini, tapi saya lebih suka itua
dari mengevaluasi ketika nilai dalam penyimpanan lokal tidak 0.C #,
197160159125 byteDisimpan 34 byte berkat susu
Dan versi yang diformat (Dengan
ReadKey
ditambahkan sehingga Anda dapat melihat hasilnya):Itu lebih lama daripada yang saya kira jadi mungkin ada ruang untuk bermain golf.
sumber
File.Exists
danFile.Create
bukannyaReadAllText
danWriteAllText
. Cukup periksa apakah ada nama file, jangan keduanya dengan konten file. Juga,namespace System.IO
dan Anda dapat menghapus namespace dariSystem.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);}}}
Dyalog APL ,
332822/20? byteSaya 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.
Perhatikan bahwa ini bergantung pada kekhasan tidak resmi, yang berlaku
∘←
secara global.6::
atas kesalahan nilai apa pun⊢c
kembali c∘←10
yang secara global diatur ke 10⋄
sekarang÷÷c
mengembalikan dua kali terbalik (kesalahan nol) c∘←
yang diatur secara global kec-1
satu kurang dari cTryAPL online!
Versi 28 byte yang pasti valid:
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:
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).
sumber
Perl,
3736 byteHancur ketika nilai awal mencapai -1 (yang akan mencetak 0), saat ia menulis di atas
=~
operator.Menyimpan byte menggunakan
sysopen
daripadaopen
. Ini memungkinkan saya untuk mencetakSTDOUT
terlebih dahulu, menggunakan nilai kembali sebagai mode file (1
, aliasO_WRONLY
), sebelum$~
dipindahkan.Contoh Penggunaan
sumber
Perl 6 ,
6058 byteMembutuhkan karakter baris baru setelahnya
=finish
.die
dapat diganti dengan1/0
.Penjelasan:
Ia mendapat daftar baris setelah
=finish
($=finish.lines
) mengurangi itu dari10
, dan jika hasilnya bukan0
mencetaknya, jika tidak makadie
s.Hal terakhir yang dilakukannya adalah membuka dirinya dalam mode append, dan menambahkan baris lain ke akhir.
sumber
say $*PERL.compiler.version
)Python 2, 65 byte
Terinspirasi oleh jawaban L3viathan .
Dapat dikurangi menjadi 60 byte jika Anda dapat memilih untuk memberi nama file seperti karakter tunggal
x
dan kemudian ganti__file__
dengan'x'
. Jika demikian, ganti75
dengan70
.sumber
Jolf, 20 byte
Coba di sini! Kesalahan saat
0
dicetak. Memodifikasi kode. Penjelasan yang akan datang.sumber
Applesoft BASIC, 21 byte (tokenized)
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
Penjelasan
PRINT 9 + 1
melakukan apa yang Anda harapkan.CALL 2066
panggilan 6502 mesin-rutin bahasa di lokasi memori 2066, yang setelahEND :
.END
menghentikan program sehingga rutin bahasa mesin (yang, bagi juru bahasa Applesoft, adalah sampah) tidak dijalankan.Rutin bahasa mesin hanya mengurangi
9
inPRINT 9 + 1
. Membongkar:Setelah penghitung mencapai 0, itu "dikurangi" menjadi
/
; mencoba menjalankan program kemudian akan menyebabkan kesalahan sintaksis.sumber
*> <> ,
2018 byteIni sebenarnya bekerja di Linux (dan apa pun yang mendukung file bernama
\n
I guess). Itu menciptakan file bernama\n
pada jalankan pertama dan output10
. Ini menghasilkan satu nomor lebih sedikit pada setiap menjalankan subsquent, kecuali di0
mana ia crash.Penjelasan
sumber
PHP 57 byte
tidak benar-benar macet tetapi keluar (tanpa menghitung mundur) ketika hits
0
. Apakah itu cukup?Jalankan dengan
-r
.sumber
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.
Tidak Disatukan:
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.
sumber
Powershell V2.0, 49 byte
(Golf kode pertama kali, tidak dapat menemukan aturan tentang cara menghitung byte. Saya menggunakan kalkulator String ke byte online)
Berlari:
sumber
Java, 343 byte
Upaya golf pertama saya
ungolfed
sumber
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);}}}
?
operator berdasarkan keberadaan file ketika Anda membacab
: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);}}}
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);}}
SQLite,
142137Ini mungkin bisa dilakukan dengan lebih cerdik.
141136 karakter untuk kode:Plus 1 untuk nama file
x
disqlite3 x '…'
.sumber
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:_;alert(l.a)
sumber
alert
atau serupa, itu hanya cuplikan REPL.Ruby,
9487846159 byteSilakan tinggalkan saran di bawah ini.
Terima kasih @ ConorO'Brien untuk ide-idenya (beberapa tanpa malu merobek jawabannya).
sumber
puts i
=>p i
new
dansize
bukannyaopen
danlength
.Ruby, 52 + 1 = 53 byte
Mengasumsikan file bernama
a
(+1 byte).Lari
sumber
a
(yang hanya +1).Python 2, 89 byte
sumber
__file__
sehingga saya memanfaatkannya dalam jawaban saya.len
s
, karena saya perlu membaca, lalu mencari, lalu menulis. Theprint x/x*x
akan bekerja, tetapi tidak meningkatkan jumlah byte.TI-BASIC (TI-84 Plus) (15 byte)
Ans harus sama dengan 0 (nilai default) sebelum jalankan pertama.
Karena
AnsAns/Ans
ini 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.sumber
JavaScript, 41
l=localStorage;l.l=-~l.l;alert(11-l.l||I)
sumber
a
alih - alihl
ketika saya menulisnya, dan mengubahnya tanpa berpikir, karena saya pikir itu terlihat lebih menyenangkan ... sudah terlambat dan herby , terima kasih sudah menunjukkannya.GNU Smalltalk,
70, 68 byteKode 66 byte +2 byte untuk bendera "-S"
EDIT
Golf
Uji
Penting
Anda harus menjalankan gst sebagai root, agar dapat memodifikasi gambar default, atau menentukan gambar Anda sendiri dengan -I .
sumber
PHP, 45 byte
Jujur tidak yakin jika yang ini penting.
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
die
perintah dijalankan.sumber
QBIC , 70 byte
Buka file
a.b
(atau buat saat tidak ditemukan saat pertama kali dijalankan), bacalah rekaman 1 menjadie
. Jika catatan itu tidak ditemukan, anggaplah 10, selain itu sub 1. Padae==0
, ungkapkan kesalahan. Tulis kembalie
kea.b
.Akses file tidak dibangun ke QBIC, ini sangat bergantung pada QBasic yang mendasarinya.
sumber
Batch, 72 byte
Perlu dipanggil menggunakan nama file lengkap termasuk ekstensi. Baris terakhir tidak boleh memiliki baris tambahan. Bekerja dengan menulis
-1
hingga akhir baris terakhir sehingga evaluasi menjadi 1 lebih sedikit setiap kali.goto g
kesalahan karena tidak ada label:g
.sumber
R, 52 byte
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, hasilkanx=10
, jika tidakx!=0
kurangi1
panggil argumen yang hilang yang menghasilkan kesalahan.sumber
!
dan mengganti urutan argumen saat itu dan yang lain, dan dua lainnya dengan mengubahx>0
kex
. (Juga,exists("x")
sedikit lebih rapi daripada"x"%in%ls()
, meskipun sama dalam hitungan byte.)Windows Batch, 61 byte
sumber
JavaScript, 44 byte
sumber