Sekarang, kita semua tahu sebagian besar bahasa memiliki cara yang sangat sederhana untuk "memodifikasi sendiri" kode. Namun, bagaimana jika Anda benar-benar memodifikasi kode dan mengeditnya ... pada disk?
Tujuan Anda adalah membuat kode yang mencetak angka, lalu mengedit file sendiri untuk mengganti nomor dengan yang berikutnya dalam urutan Fibonacci seperti:
$ ./program
1
$ ./program
1
$ ./program
2
$ ./program
3
$ ./program
5
[etc...]
Aturan
- Anda tidak boleh menyimpan nomor "di luar" dari kode. Tidak ada komentar, tidak ada yang memberitahu skrip untuk keluar, tidak ada EOF, dll.
- Jika kode Anda berfungsi dengan nama file apa pun, kurangi 2 dari jumlah byte Anda dan tulis
$BYTESNOW ($ORIGINALBYTES - 2)
di judul Anda. (Nama file diasumsikan berada dalam kisaran jalur file alfanumerik apa pun.) - Kode Anda harus menulis output ke file itu sendiri, tanpa bantuan perpipaan eksternal.
- Kode Anda dapat mulai dari satu atau nol. Itu tidak masalah.
perl6 program
), Atau harus menyertakan baris shebang sehingga dapat disebut sebagai./program
?program
, dan dapatkah kita menganggapnya terletak di direktori kerja saat ini?"a"
alih - aliharg[0]
. Tampaknya tidak sepadan.Jawaban:
Pesta,
5247 (49-2) byteEDIT:
Golf
Uji
sumber
-?
dari regex. Dan karena Anda berada di sana, Anda juga dapat menghapus grup penangkap pertama :)Python 2,
118111 byte (113 - 2)Ini berfungsi dengan nama file yang valid. Tidak banyak yang bisa dijelaskan di sini, kodenya sendiri sangat verbose.
Berkat FlipTack untuk mengingatkan saya,
close()
tidak wajib.sumber
f=open(...)
bukanwith
pernyataan itu?Batch, 81 byte
Catatan: trailing newline sangat penting. Memerlukan skrip untuk dipanggil menggunakan nama lengkapnya termasuk ekstensi. Output dimulai pada 0.
Karena Batch tidak dapat mengedit file secara realistis, saya hanya menambahkan baris tambahan di akhir file, jadi pada akhirnya ia akan tahu nomor mana yang akan dicetak. The
>>%0
penempatan menyimpan byte karena saya tidak bisa mendahului dengan digit.sumber
C, 142 byte (144 - 2)
Cukup lurus ke depan. Pertama ia membaca kemudian menyimpan dua karakter di posisi 0x1A di header. Saya mungkin bisa melihat lebih dalam untuk menemukan tempat yang lebih aman untuk menyimpan data tetapi itu bekerja untuk saya di mesin saya yang menjalankan OSX, dikompilasi dengan GCC 4.2ish dan saya ragu itu sangat portabel. Juga, karena didasarkan pada karakter itu meluap setelah iterasi ke-13.
Ini memberikan output:
sumber
Node.js,
152137 byte (139 - 2)Dipisahkan dengan baris baru untuk kejelasan, bukan bagian dari jumlah byte.
Penjelasan:
Pemakaian:
sumber
Python 3.6,
9691 (93-2) bytehardcoding nama file akan menghemat 5 byte (88 byte):
Menyimpan beberapa byte berkat @Artyer
sumber
a,b=0,1
f=open('f','r+');next(f);f.write(f'a,b={b,a+b}\n{next(f)}{f.seek(0)}');print(b)#
bash + Utilitas Unix, 43 byte (45-2)
Pertama kali dijalankan, ini menggunakan dc untuk menghitung angka Fibonacci 1 melalui rumus Binet. Setiap panggilan ke sed memodifikasi program dengan mengubah string yang dilewatkan ke dc; perubahan ini memberitahu dc untuk menambahkan 1 tambahan ke eksponen dalam rumus, yang menyebabkannya menghitung angka berikutnya dalam urutan Fibonacci setiap kali.
Uji
Untuk menggambarkan cara kerjanya, pada titik ini, setelah 55 dicetak, program telah dimodifikasi untuk membaca:
jadi menjalankannya lagi menghasilkan
dan program sekarang berbunyi:
sumber
SmileBASIC 3, 99 byte (101 -2)
Bonus -2 byte karena berfungsi dengan nama file apa pun.
Yang ini berhasil, dan entah bagaimana ukurannya sama dengan yang saya rusak!
sumber
PRGEDIT
perintah untuk mengganti baris pertama (dan menambahkan linebreak setelahA=0B=1
) Dan Anda juga tidak perluA=0
yang pertama kali.R, 145 byte (147 - 2)
(Memiliki baris baru tertinggal). Ini berfungsi dengan nama file yang valid.
sumber
Perl 6 ,
6762 byte (64 - 2)sumber
Ditumpuk, tidak bersaing, 65 (67 - 2) byte
Beberapa masalah tentang file IO diperbaiki dalam serangkaian komit terbaru. Dengan demikian, tidak bersaing.
Berikut tautan ke github.
Contoh eksekusi
(Saya menghilangkan jalan yang sebenarnya untuk kejelasan.)
Penjelasan
Cara kerjanya adalah dengan mengambil sepasang angka untuk memulai urutan (
2:>
dalam hal ini adalah kisaran integer[0, 2)
, yaitu(0 1)
), kemudian melakukan transformasi Fibonacci pada mereka, seperti:Pada setiap proses, transformasi ini dijalankan di bagian atas tumpukan. Kemudian, tumpukan didorong ke tumpukan, digandakan, dan anggota pertamanya diperoleh (
stack:0#
). Item ini kemudian dikeluarkan, dan merupakan angka Fibonacci yang diinginkan.repr
kemudian mengambil representasi tumpukan dan menambahkan baris baru. Kemudian, program didorong ke stack, dan dibagi pada baris baru. Kemudian, kami mengambil anggota terakhir (baris terakhir), dan menambahkan ini ke string yang disebutkan di atas. Akhirnya, kami mendorongd0
(file itu sendiri; pikirkand
tanda ollar0
==$0
.) Dan menulis untuk itu.sumber
Ruby, 68 byte (70-2)
sumber
Clojure,
209204195 byte-5 byte dengan beralih untuk mem-parsing angka sebagai panjang alih-alih bilangan bulat, dan menghapus beberapa spasi yang terlewatkan.
-9 byte dengan menghapus spasi antara angka kedua dan
(let...)
(ruang termahal yang pernah ada!).Lihat komentar kode pregolfed untuk deskripsi.
Diuji lagi, dan tidak lagi melempar kesalahan braket yang tidak cocok. Ia bekerja hingga 7540113804746346429, pada saat itu ia melempar pengecualian bilangan bulat bilangan bulat.
Perhatikan juga, ini mengasumsikan kode sumber terletak di "./src/s.clj".
sumber