Ini adalah tantangan yang menyenangkan untuk dikerjakan, hidup dan mati, di antara perayaan Natal. Terima kasih telah memposting! Golf ini menarik karena spesifikasinya penuh dengan perkecualian dan case khusus, yang membutuhkan banyak syarat. Selain itu, walaupun saya tidak perlu mengonversi ke dan dari desimal kali ini, saya memang membutuhkan fungsi "maks" untuk menentukan jumlah digit terbesar di setiap angka dan nilai digit terbesar di setiap tempat.
Versi pertama ini adalah 4844 bytes, hanya untuk memberi Anda gambaran tentang seberapa banyak saya bermain golf ini.
Program mengharapkan input sebagai daftar bilangan bulat yang dipisahkan koma . Tidak ada spasi atau baris baru. Menggunakannya akan menghasilkan perilaku yang tidak terdefinisi.
'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
Penjelasan
Saya akan memandu Anda melalui cara program bekerja dengan menunjukkan kepada Anda bagaimana ia memproses input spesifik 202,100,1
.
Pada awalnya, kita membangun beberapa nilai yang kita perlukan nanti - kebanyakan kode ASCII dari karakter yang akan kita hasilkan.
Seperti yang Anda lihat, '8'
dan '.'
sudah tersedia. '|'
, bagaimanapun, benar-benar 124, bukan 14. Kami menggunakan loop sementara untuk menambahkan dua kali nilai sementara di slot # 1 ke atasnya untuk mendapatkan 124 (yaitu 14 + 55 × 2, karena loop sementara berjalan untuk 56−1 = 55 iterasi). Ini menghemat beberapa byte karena literer bilangan bulat besar seperti 124 sangat panjang. Dalam diagram berikut, saya menunjukkan lokasi setiap variabel yang digunakan program.
Selanjutnya, kami ingin memasukkan semua karakter dan menyimpannya di kaset mulai dari sel # 12 ( p adalah pointer berjalan untuk ini). Pada saat yang sama, kami ingin tahu berapa lama angka terpanjang (berapa digit). Untuk mencapai hal ini, kita menyimpan total running di unary ke kiri mulai dari sel # −1 (kita menggunakan q sebagai pointer berjalan). Setelah nomor input pertama ( 202
), rekaman sekarang terlihat seperti ini:
Anda akan memperhatikan bahwa angka-angka dimatikan oleh 4. Nah, ketika kami pertama kali memasukkan mereka, mereka adalah nilai ASCII mereka, jadi mereka "mati" dengan 48 dan koma adalah 44. Untuk setiap karakter, kami menyalin 46 dari '.'
ke dalam r dan kemudian kurangi dengan loop sementara (yang mengurangkan 45) dan kemudian kita tambahkan 1. Kita melakukannya sehingga koma (pemisah kita) adalah 0, sehingga kita dapat menggunakan kondisional untuk mengenalinya.
Juga, Anda akan memperhatikan bahwa kami meninggalkan sel # 11 di 0. Kami membutuhkannya untuk mengenali batas nomor pertama.
Karakter selanjutnya adalah koma, jadi kami menyimpan 0 di # 15, tapi tentu saja kali ini kami tidak maju q . Sebagai gantinya, kita mengatur q kembali ke 0 dan mulai “menimpa” 1 yang telah kita tempatkan.
Setelah semua karakter yang tersisa diproses, kami mendapatkan ini:
Seperti yang Anda lihat, angka 1 yang ditulis oleh q sekarang menunjukkan (secara unary) panjang angka terpanjang.
Kami sekarang menggunakan loop sementara untuk memindahkan q ke paling kiri, dan kemudian menempatkan pointer lain di sana yang akan saya panggil r2 . Tujuan dari r2 akan menjadi jelas nanti.
Pada titik ini, izinkan saya mengklarifikasi terminologi yang akan saya gunakan selama ini.
- Dengan angka , maksud saya salah satu nomor input yang dipisahkan oleh koma. Dalam contoh kita, mereka adalah 202, 100 dan 1.
- Dengan digit , maksud saya satu digit di salah satu angka. Angka pertama memiliki 3 digit.
- Menurut tempat , maksud saya tempat yang, puluhan tempat, ratusan tempat, dll. Jadi jika saya mengatakan "digit di tempat saat ini", dan tempat saat ini adalah tempat yang, angka itu adalah 2, 0, dan 1 di dalamnya memesan.
Sekarang kembali ke pemrograman reguler kami. Seluruh sisa program adalah loop besar yang bergerak q maju hingga mencapai sel # 0. Setiap sel di sepanjang jalan mewakili suatu tempat, dengan yang ditempatkan di paling kanan, dan q akan mulai dari yang paling signifikan. Dalam contoh kita, itu adalah ratusan tempat.
Kami melanjutkan dengan menambah titik sel q di (yaitu, * q ).
Kami sekarang berada di "tahap 2" untuk ratusan tempat. Pada tahap ini, kita akan mengetahui digit terbesar di antara semua digit di ratusan tempat. Kami menggunakan trik penghitungan unary yang sama untuk ini, kecuali kali ini penunjuk disebut r dan penunjuk r2 menandai posisi awal yang harus diatur ulang setiap kali kami beralih ke nomor berikutnya.
Mari kita mulai dengan angka pertama. Kita mulai dengan mengatur p ke 11 (posisi awal yang dikodekan dari semua angka). Kami kemudian menggunakan loop sementara untuk menemukan ujung angka dan mengatur p2 di sana untuk menandai posisi. Pada saat yang sama, kami juga mengatur q2 ke 0:
Jangan terganggu oleh fakta bahwa q2 menunjuk ke dalam vars. Kami tidak memiliki lapisan sel kosong di sana karena kami dapat mendeteksi sel # 0 hanya karena itu nomor nol.
Selanjutnya, kita pergi melalui angka saat ini dengan mengurangi p dan q2 bersama-sama sampai * p nol. Di setiap tempat, nilai * q2 memberi tahu kita apa yang perlu kita lakukan. 1 berarti "tidak melakukan apa-apa", jadi kami terus berjalan. Akhirnya kita menemukan 2 dalam sel # −3. Setiap kali * q2 tidak sama dengan 1, q2 selalu sama dengan q .
Seperti yang sudah saya nyatakan, tahap 2 adalah "menentukan digit terbesar di tempat ini". Jadi kita atur r ke r2 , gunakan loop sementara untuk mengurangi * p dan pindahkan r ke kiri dan isi rekaman dengan 1s, dan kemudian gunakan loop sementara lainnya untuk memindahkan r kembali ke kanan dan naikkan * p lagi untuk mengembalikan nilai. Ingat bahwa setiap while dijalankan untuk satu iterasi yang lebih sedikit daripada nilai yang kita gunakan; karena ini, jumlah 1s yang ditulis akan menjadi 3 lebih (daripada 4 lebih) dari nilai digit, dan nilai akhir yang disimpan kembali dalam * p akan menjadi 2 lebih. Dengan demikian, ini telah dikurangi secara efektif * p oleh 2.
Setelah itu, kita menetapkan p ke nilai p2 dan kemudian kita melakukan semua itu lagi. Untuk kedua kalinya, atur q2 ke 0, cari ujung angka dengan memindahkan p ke kanan, dan kemudian pergi melalui digit angka ini dengan menurunkan p dan q2 bersamaan. Sekali lagi kita akan menjumpai 2 dalam sel # −3 dan menulis bahwa 1s tersisa dari * r .
Dalam kasus angka ketiga, kita akhirnya tidak melakukan apa-apa karena tidak memiliki ratusan tempat (jadi q2 tidak pernah mencapai q ), tapi tidak apa-apa karena itu tidak mempengaruhi perhitungan nilai digit maksimum.
Kami juga mengatur sel * (r - 4) , yang telah saya tandai dengan panah yang tidak berlabel di sini, menjadi 1 (meskipun sudah pada 1). Saya tidak akan memberi tahu Anda mengapa, tapi mungkin Anda sudah menebaknya?
Peningkatan * q berikutnya membawa kita ke tahap 3, yaitu "kurangi angka maksimum dari semua digit di tempat saat ini". Seperti sebelumnya, kita mengatur ulang p ke 11 dan q2 ke 0 dan kemudian melewati semua angka seperti yang kita lakukan pada tahap sebelumnya; kecuali saat ini, * q = 3 bukannya 2. Setiap kali q2 memenuhi q dan p ada di ratusan tempat, kami menggunakan loop while untuk mengurangi * p sebanyak yang ada 1s di blok kiri * r2 (5 dalam contoh kita) dengan menggunakan rsebagai pointer berjalan. Kami sebenarnya menurunkannya sekali lagi sehingga angka terbesar berakhir pada −2, untuk alasan yang akan menjadi jelas nanti:
Setelah kami memproses semua angka, kami sekarang berada di akhir tahap 3. Di sini kami melakukan dua hal tunggal.
- Pertama, kita juga mengurangi ukuran r -block (plus 1) dari * q , tetapi menggunakan pointer r2 , yang meninggalkannya di sebelah kiri. * q menjadi negatif dengan cara ini. Dalam kasus kami, r -block memiliki lima 1s, jadi * q menjadi −3.
- Kedua, kita menetapkan variabel keluar ke nilai non-nol untuk menunjukkan bahwa kita sekarang memasuki tahap output. (Secara teknis, fakta bahwa * q negatif sudah menunjukkan tahap output, tetapi ini terlalu sulit untuk diperiksa, maka variabel tambahan.)
Anda sekarang mengerti bahwa kami terus menelusuri angka-angka, menemukan tempat saat ini (ditunjukkan oleh nilai non-1 * q ) dalam setiap angka, dan melakukan sesuatu tergantung pada nilai * q . Kita melihat bahwa * q mula-mula bertambah menjadi 2 (= menghitung nilai digit maksimum), lalu 3 (kurangi nilai digit maksimum dari setiap digit di tempat ini) dan kemudian kita kurangi dari itu untuk membuatnya negatif. Dari sana, itu akan terus naik hingga mencapai 1, sehingga mengembalikan nilai yang berarti "tidak melakukan apa-apa". Pada saat itu, kami pindah ke tempat berikutnya.
Sekarang, ketika * q negatif, kita mengeluarkan. * q berada pada nilai yang tepat sehingga kita akan menampilkan jumlah baris karakter yang benar sebelum mencapai 1; jika digit terbesar adalah 2, kita perlu menghasilkan 3 baris. Mari kita lihat apa yang terjadi pada setiap nilai * q :
- * q = −2:
- Untuk angka pertama, * p adalah −2, yang menunjukkan bahwa kita perlu menampilkan
'.'
(titik) atau ':'
(titik dua). Kita memutuskan mana dengan melihat q : jika −1, kita berada di tempat yang sama, jadi output a ':'
(yang kita hitung sebagai '8'
+2), jika tidak a '.'
.
- Untuk angka kedua, * p adalah −3. Apa pun yang bukan −2 berarti kita mengeluarkan
'|'
(pipa) dan kemudian menambah nilainya. Dengan cara ini akan mencapai −2 di tempat yang tepat dan kemudian kita output '.'
s / ':'
s untuk sisa digit itu.
- Dalam setiap kasus, kami juga mengatur pd variabel menjadi 0 sebelum kami memproses angka, dan mengatur pd (= "dicetak") ke nilai bukan nol untuk menunjukkan bahwa kami telah mencetak karakter.
- Untuk angka ketiga, tidak ada pemrosesan yang terjadi karena angka ketiga tidak memiliki ratusan tempat. Dalam hal ini, pd akan tetap 0 setelah memproses angka, yang menunjukkan bahwa kita masih perlu menampilkan a
'|'
(tetapi hanya jika keluar adalah nol, karena kalau tidak kita masih dalam tahap 2 atau 3).
- Setelah memproses semua angka, jika keluar adalah nol, buat baris baru. Perhatikan bahwa kita membutuhkan variabel keluar sehingga kita tidak menampilkan baris baru di tahap 2 atau 3.
- * q = −1: Sama seperti sebelumnya, kecuali bahwa * p adalah −2 untuk kedua angka pertama, sehingga keduanya menghasilkan a
'.'
(dan keluaran ketiga a'|'
seperti sebelumnya).
- * q = 0: Ketika * q adalah 0, ini berarti "tidak melakukan apa-apa jika kita berada di tempat, jika tidak, output deretan
'|'
s terlepas dari * p ". Dengan cara ini kita mendapatkan lapisan di antara digit.
Sekarang kita menambah q untuk pindah ke tempat berikutnya, puluhan tempat, dan kenaikan * q di sana. Di awal Tahap 2, rekaman itu terlihat seperti ini:
Kemudian kami melakukan Tahap 2 seperti sebelumnya. Ingat ini secara efektif mengurangi 2 dari setiap digit di tempat ini dan juga meninggalkan angka unary kiri * r2 yang menunjukkan digit maksimum. Kami meninggalkan nomor unary sebelumnya sendirian dan terus memperpanjang kaset ke kiri; itu hanya akan membutuhkan kode tambahan yang tidak perlu untuk "membersihkan". Ketika kita selesai dan kita bertambah * q , pada awal Tahap 3 rekaman itu sekarang:
Sebenarnya, ini bohong. Ingat sebelumnya di mana saya mengatakan kami menetapkan * (r - 4) ke 1 dan saya tidak memberi tahu Anda mengapa? Sekarang saya akan memberi tahu Anda alasannya. Ini untuk kasus-kasus seperti ini, di mana digit terbesarnya adalah 0, artinya semua digit di tempat ini adalah 0. Pengaturan * (r - 4) , ditunjukkan oleh panah tanpa label di atas, ke 1 memperpanjang angka unary dengan 1, tetapi hanya dalam kasus khusus ini. Dengan cara ini kita berpura-pura seolah digit terbesar adalah 1, yang berarti kita akan menghasilkan satu baris tambahan.
Setelah Tahap 3 (kurangi digit maksimum dari semua digit di tempat saat ini), termasuk langkah ekstra yang membuat * q negatif, rekaman itu terlihat seperti ini. Terakhir kali digit terbesar diwakili oleh −2 di blok * p , tapi kali ini mereka semua −3 karena mereka semua benar-benar nol tetapi kami berpura-pura seolah-olah digit maksimumnya adalah 1.
Sekarang mari kita lihat apa yang terjadi ketika * q berlanjut ke 1:
- Ketika * q = −1, nilai * p semuanya −3, yang berarti kita mengeluarkan
'|'
dan menambahnya.
- Ketika * q = 0, kita menghasilkan
'|'
karena itulah yang selalu kita lakukan ketika * q = 0, terlepas dari * p .
Jadi, kami mendapat dua baris pipa.
Akhirnya, kita memindahkan * q ke tempat seseorang. Yang ini menjadi menarik karena kita perlu menampilkan ':'
s jika digit sebenarnya adalah 1 tetapi 1 '8'
jika 1. Mari kita lihat bagaimana hasil program. Pertama, kami menambahkan * q untuk memulai Tahap 2:
Setelah Tahap 2 ("hitung nilai digit maksimum"), kita tinggal dengan ini:
Setelah Tahap 3 (“kurangi nilai digit maksimum dari semua digit di tempat saat ini”) rekaman itu terlihat seperti ini:
Sekarang mari kita lihat setiap iterasi * q secara bergantian:
- * q = −2:
- Angka pertama: sudah di −2, jadi output a
':'
(daripada a '.'
karena q = −1).
- Angka kedua: −4, jadi output a
'|'
dan increment.
- Angka ketiga: pada −3, jadi keluaran a
'|'
. Namun, kali ini, alih-alih bertambah, kasus khusus memicu. Hanya jika kita mengeluarkan tempat terakhir ( q = −1), dan kita berada di baris kedua-terakhir untuk itu ( * q = −2), dan digit sebenarnya adalah 1 ( * p = −3) , lalu alih-alih menambahkannya ke −2, kami menetapkannya ke −1. Dengan kata lain, kita menggunakan −1 sebagai nilai khusus untuk menunjukkan bahwa pada iterasi berikutnya, kita perlu output '8'
sebagai gantinya ':'
.
- * q = −1:
- Nomor pertama: sudah di at2, jadi keluaran a
':'
.
- Angka kedua: pada −3, jadi keluaran a
'|'
. Kondisi khusus tidak terpicu karena * q tidak lagi −2. Karena itu, increment.
- Angka ketiga: pada −1, jadi keluaran
'8'
.
- * q = 0: Biasanya, kita akan menampilkan baris bantalan
'|'
s di sini, tetapi dalam kasus khusus di mana kita berada di tempat yang ( q = −1), kita lewati itu.
Setelah ini, q bertambah menjadi 0 dan loop sementara besar berakhir.
Sekarang Anda tahu bagaimana input suka 202,100,1
bekerja. Namun, ada satu lagi kasus khusus yang belum kami bahas. Anda mungkin ingat bahwa ketika kami sedang memproses tempat terakhir, ketika * p −3 kita atur ke −1 untuk 1
(alih-alih menambahnya menjadi −2) sehingga iterasi berikutnya akan menghasilkan sebuah '8'
gantinya. Ini hanya berfungsi karena kami memiliki iterasi di mana * p adalah −3 dan kami membuat keputusan apakah akan menambahnya atau menetapkannya ke −1. Kami tidak memiliki iterasi seperti itu jika semua digit di tempat yang adalah 0 atau 1. Dalam kasus seperti itu semua nilai * p untuk 1s akan dimulai pada −2; tidak ada kesempatan untuk memutuskan untuk mengaturnya ke −1daripada menambahnya dari −3 . Karena itu, ada kondisi casing khusus lain di dalam Tahap 3 ("kurangi digit maksimum dari setiap digit di tempat saat ini"). Saya mengklaim bahwa setelah mengurangkan nilai digit maksimum dari setiap digit (pada titik mana digit maksimumnya berada pada −1), kami hanya menguranginya sekali lagi, tetapi sebenarnya ada kondisi yang menyatakan sebagai berikut:
Jika digit yang kita lihat sama dengan digit maksimum di tempat ini ( * p = −1), dan tempat ini adalah tempat yang ( q = −1), dan digit maksimum adalah 1 ( * (r + 5) = 0, yaitu blok unary di paling kiri hanya 5 sel panjang), hanya kemudian kita meninggalkan * p di −1 untuk menunjukkan bahwa satu-satunya iterasi dari output harus menghasilkan suatu '8'
. Dalam semua kasus lain, kami menurunkannya sekali lagi.
Selesai Selamat Tahun Baru!
Sunting 1 (3183 → 3001): Beberapa golf Selamat Tahun Baru! Saya berhasil menyingkirkan variabel p2 dan r2 sepenuhnya! p sekarang berlari bolak-balik untuk terus menemukan awal dan akhir angka, tetapi tampaknya lebih pendek dalam kode. Saya mencoba untuk menghilangkan q2 juga, tetapi saya tidak bisa membuat kode lebih pendek seperti itu.
Saya juga menemukan beberapa tempat lagi di mana saya bisa menerapkan trik golf yang tidak dapat dibaca seperti menggunakan kembali nilai terakhir dari loop sementara. Untuk memberi Anda contoh, alih-alih
while *(++p) { 1 } // just increment p until *p is 0; the 1 is a noop
if (pd) { x } else { y } // where pd is a variable
Saya dapat menyimpan '""""
(lakukan yang pertama, kemudian yang kedua) dan '"""
(konstan 1) dengan menulisnya dengan cara yang seperti
if (while *(++p) { pd }) { x } else { y }
Tentu saja, ini hanya berfungsi jika saya tahu bahwa loop sementara akan berjalan untuk setidaknya satu iterasi, tetapi jika itu terjadi, nilai kembalinya adalah pd sehingga saya dapat menggunakannya sebagai syarat untuk if.