Penghitung Geiger adalah perangkat yang digunakan untuk mendeteksi radiasi.
Kami akan membuat program penghitung Geiger.
Seperti yang kita semua tahu, ketika radiasi mengenai program komputer, ia menghapus secara tepat 1 byte secara acak. Jadi program penghitung Geiger adalah program yang dengan sendirinya tidak melakukan apa-apa, tetapi ketika byte apa pun dihapus, program yang dimodifikasi akan dicetak beep
, untuk menunjukkan adanya radiasi.
Jawaban akan dinilai dalam byte dengan lebih sedikit byte menjadi lebih baik. Jawaban harus minimal 1 byte.
Program Anda dapat mencetak beep
dengan mengekor baris baru atau mencetak satu baris baru untuk output kosong, asalkan konsisten. Program Anda juga dapat menggunakan kasus yang berbeda untuk beep
seperti BEEP
, bEEP
atau Beep
selama ia melakukannya secara konsisten.
sumber
Jawaban:
Hilang ,
303 293 263 253 238228 byteCobalah online!
Skrip verifikasi (dipinjam dari jawaban pengguna 202729 ). Sayangnya ini hanya dapat menguji setengah dari kode sekaligus, tetapi yakinlah saya telah menguji seluruh program.
Aduh, ini yang sulit. Saya akan mengutip jawaban yang dihapus WW:
Sayangnya, jawabannya tidak memperhitungkan penghapusan baris baru, yang mengacaukan segalanya.
Penjelasan:
(perhatikan bahwa beberapa byte mungkin mati di sana-sini)
Pertama mari kita bicara tentang struktur umum kode:
Semuanya kecuali garis pemrosesan harus seluruhnya terdiri dari salah
>
satu atau salah satu dari itu\/
. Mengapa? Sebagai contoh, mari kita hapus baris baru:Baris pertama sekarang jauh lebih panjang daripada sisa blok. Jika sebuah pointer muncul pada
>\/
karakter non- dengan gerakan vertikal, maka itu akan terjebak dalam infinite loop.Bagian detektor radiasi terbesar adalah bagian di ujung setiap baris.
Biasanya IP yang melewati ini dari baris pertama akan keluar dari baris terakhir. Namun, jika ada karakter pada baris yang dihapus, maka garis tersebut bergeser ke bawah, misalnya:
Dan IP sebagai gantinya keluar dari baris yang tidak ada byte (dengan pengecualian dari baris terakhir, di mana ia keluar dari yang kedua ke terakhir).
Dari sana, masing-masing dari empat baris pertama akan dialihkan ke baris kedua:
Yang kemudian akan mengarah ke salah satu dari dua
beep
ers.Jika salah satu byte di
beep
er pertama telah dihapus, maka itu beralih ke yang kedua:Keduanya
beep
kemudian memimpin kembali ke baris pertama dan berakhir@
.Beberapa bagian lain-lain:
Yang
(((((([[[[[[[
digunakan untuk membersihkan tumpukan ketika pointer mulai dalam sepasang tanda kutip dan berakhir sampai mendorong seluruh baris pertama ke stack. Sayang sekali panjangnya karena baris pertama dapat dihapus untuk membuat garis pertama dua kali lipat. Bereksperimen dalam menghasilkanbeep
aritmatika bukannya tanda kutip berakhir lebih lama.The
\
s dan/
s tersebar di seluruh garis yang ada untuk golf byte di bagian atas kode dengan mengarahkan pointer ke garis yang benar. Karena sebagian besar garis bawah hanyalah pengisi, hanya garis atas yang dapat dip Golf. Jika ada yang punya ide untuk tumpukan bukti radiasi lebih pendek lebih jelas dari apa yang saya miliki sekarang, jangan ragu untuk berkomentar.sumber
\/
untuk memisahkanbeep
dorongan dan fakta bahwa hanya satu dari tanda kutip yang memerlukan klausul keluar yang membantuHexagony , 38 byte
Cobalah online!
Program verifikasi.
Penjelasan
Kami menggunakan deteksi otomatis Hexagony untuk panjang sisi segi enam di sini.
Jika tidak ada byte yang dihapus, program memiliki panjang sisi 4 dan terlihat seperti ini:
Namun, jika byte dihapus. Ada 2 kasus.
Byte yang dihapus adalah setelah byte kedua
<
.Alur eksekusi adalah:
Ada 2 berturut-turut
@
pada baris ke-5, jadi meskipun salah satu dari mereka dihapus, IP akan aman menekan a@
.Byte yang dihapus berada pada atau sebelum detik
<
.Kemudian bagian kedua akan tetap utuh, dan IP tidak lagi diarahkan ke atas oleh itu
<
. Gambar aliran eksekusi:sumber
Hexagony ,
3429 byteCobalah online! Verifikasi!
Penjelasan:
Berikut adalah kode normal yang diformat ke dalam segi enam yang tepat menggunakan HexagonyColorer :
Ganda
//
di awal memastikan bahwa jalan ini selalu diambil. Jika ada karakter yang dihapus,@
itu dihapus dari jalan, baik yang digeser kembali atau dihapus sendiri:Dalam hal ini, kami telah menghapus karakter setelah
|
, yang membuatnya mengikuti jalur ini, mencetakbeep
:Jika kita menghapus karakter dari sebelum
|
(atau karakter|
itu sendiri), kita mengikuti printer bip yang lain:Kami kemudian telah memperhitungkan semua kemungkinan dan kami hanya
beep
menggunakan bagian-bagian program yang belum disinari.sumber
Brainfuck yang memodifikasi sendiri ,
7363 byteCobalah online! Verifikasi!
Spasi di tengah kode sebenarnya mewakili byte NUL.
Penjelasan:
Kode ini dibagi menjadi dua bagian dengan 3 NUL byte di tengah. Keduanya pada dasarnya mencetak
beep
jika bagian lain diiradiasi (dengan beberapa pengecualian).Pertama,
<<[[
pada awalnya adalah untuk memastikan bahwa semua]
cocok setiap saat.[
s tidak akan berusaha mencari kecocokan]
jika sel positif, sementara]
s lakukan . Jika ada yang]
melompat kembali ke salah satu kurung ini biasanya langsung melompat kembali karena sel0
.Bagian selanjutnya,
[[<<]]>
lalu periksa apakah panjang bagian 2 genap. Jika demikian, ia mengeksekusi setengah bagian lain dari 1, yang mencetakbeep
menggunakanbbeepp
pada awal bagian 2.Itu kemudian menghapus semua bagian 2 sehingga tidak mengeksekusi.
Di bagian 2, kami memeriksa apakah panjang bagian 1 dan byte NUL habis dibagi
3
dengan+[<<<]>>
.Demikian pula, kami mencetak
beep
.sumber
Z80Golf ,
533634 byte-16 byte terima kasih kepada @Lynn -2 byte terima kasih kepada @Neil
Karena ini hanya kode mesin Z80, ada banyak
xxd -r
unsintables dalam kode ini, jadi miliki hexdump yang dapat dikembalikan:Cobalah online! (penguji lengkap dengan Python)
Penjelasan
z80golf adalah mesin Z80 hipotetis Anarki Golf, di mana
call $8000
adalah putchar,call $8003
adalah getchar,halt
membuat penerjemah keluar, program Anda ditempatkan$0000
, dan semua memori lainnya diisi dengan nol. Membuat program yang tahan radiasi dalam perakitan cukup sulit, tetapi teknik yang secara umum bermanfaat adalah menggunakan instruksi idempoten satu byte. Sebagai contoh,hanya satu byte, dan
a | c | c == a | c
, sehingga dapat dibuat tahan radiasi dengan hanya mengulangi instruksi. Pada Z80, beban langsung 8-bit adalah dua byte (di mana yang langsung berada di byte kedua), sehingga Anda dapat memuat beberapa nilai ke dalam register dengan andal juga. Inilah yang awalnya saya lakukan di awal program, sehingga Anda dapat menganalisis varian yang lebih panjang yang saya arsipkan di bagian bawah jawaban, tetapi kemudian saya menyadari bahwa ada cara yang lebih sederhana.Program ini terdiri dari dua muatan independen, di mana salah satunya bisa rusak oleh radiasi. Saya memeriksa apakah byte telah dihapus, dan apakah byte yang dihapus itu sebelum salinan kedua payload, dengan memeriksa nilai beberapa alamat memori absolut.
Pertama, kita harus keluar jika tidak ada radiasi yang diamati:
Jika ada byte yang dihapus, maka semua byte akan bergeser dan
$0020
akan berisi yang terakhir76
, jadi$0021
akan menjadi nol. Kami mampu memancarkan awal program, meskipun hampir tidak ada redundansi:$10
dihilangkan, maka radiasi akan terdeteksi dengan benar, lompatan tidak akan diambil, dan offset tidak akan masalah. Byte pertama dari instruksi selanjutnya akan dikonsumsi, tetapi karena itu dirancang agar tahan terhadap penghapusan byte, ini tidak masalah.$20
dihilangkan, maka lompatan offset$10
akan mendekodekan sebagaidjnz $ffe4
(menggunakan byte instruksi berikutnya sebagai offset - lihat di atas), yang merupakan instruksi loop - decrement B, dan lompat jika hasilnya bukan nol. Karenaffe4-ffff
diisi dengan angka nolnop
, dan penghitung program membungkus, ini akan menjalankan awal program 256 kali, dan akhirnya melanjutkan. Saya kagum ini berhasil.$dd
akan membuat sisa dari decode snippet asor (hl) / ld ($1020), hl
, dan kemudian geser ke bagian selanjutnya dari program. Tidakor
akan mengubah register penting, dan karena HL adalah nol pada saat ini, penulisan juga akan dibatalkan.$b6
akan membuat decode sisanya sepertild ($1020), ix
dan melanjutkan seperti di atas.$21
akan membuat decoder memakannya$20
, memicudjnz
perilaku.Perhatikan bahwa menggunakan
or a, (ix+*)
menyimpan dua byte lebihld a, (**) / and a / and a
berkat pemeriksaan terintegrasi untuk nol.Kita sekarang perlu memutuskan mana dari dua salinan payload yang akan dieksekusi:
Dua salinan dipisahkan oleh nop, karena lompatan relatif digunakan untuk memilih di antara mereka, dan radiasi bisa menggeser program dengan cara yang akan membuat lompatan melewati byte pertama setelah tujuan. Selain itu, nop dikodekan sebagai nol, yang membuatnya mudah untuk mendeteksi byte yang digeser. Perhatikan bahwa tidak masalah payload mana yang dipilih jika sakelar itu sendiri rusak, karena kedua salinan tersebut aman. Mari kita pastikan bahwa itu tidak akan melompat ke memori yang tidak diinisialisasi, meskipun:
$dd
akan membuat dua byte selanjutnya decode sebagaior (hl) / dec d
. Clobbers D. Bukan masalah besar.$b6
akan membuat pengkodean yang lebih lama tanpa dokumendec d
. Sama seperti di atas.$15
akan membaca$28
alih - alih sebagai offset, dan eksekusi akan dilanjutkan pada$0c
, seperti di bawah ini.$28
menghilang,$0c
diterjemahkan sebagaiinc c
. Muatan tidak pedulic
.$0c
- untuk itulah gunanya. Jika tidak, byte pertama dari muatan akan dibaca sebagai lompatan offset, dan program akan melompat ke memori yang tidak diinisialisasi.Payloadnya sendiri cukup sederhana. Saya pikir ukuran kecil dari string membuat pendekatan ini lebih kecil dari satu loop, dan lebih mudah untuk membuat posisi independen seperti ini. The
e
dibeep
mengulangi, jadi saya bisa mencukur habis satuld a
. Juga, karena semua memori antara$0038
dan$8000
adalah memusatkan perhatian, aku bisa jatuh melalui itu dan menggunakan lebih pendekrst
varian daricall
instruksi, yang hanya bekerja untuk$0
,$8
,$10
dan seterusnya, hingga$38
.Pendekatan yang lebih tua
64 byte
58 byte
53 byte
Yang ini memiliki penjelasan dalam riwayat sunting, tetapi tidak terlalu berbeda.
Bagaimana jika: output non-kosong baik-baik saja alih-alih berbunyi bip
1 byte
halt
Biasanya program, tetapi jika radiasi menghapusnya, maka memori akan penuh dengan nol, membuat$8000
eksekusi dalam jumlah tak terbatas, mencetak banyak byte nol.sumber
a
dimulai pada nol, dapat Anda tidak menggunakanor a, (N);
bukanld a, (N); and a;
? Sepertinya Anda dapat menyimpan beberapa byte dengan cara itu.or a, (ix + N)
?20 19
di awal menjadi20 18
, dan menghapus20
menciptakan lompatan tanpa syarat mundur, jadi nop harus ditambahkan setelah lompatan pertama dalam program, membalikkan byte simpan.> <> , 23 byte
Cobalah online! Verifikasi.
Sejujurnya sangat mengejutkan betapa singkatnya saya mendapatkan ini. Berakhir dengan kesalahan.
Versi yang tidak salah, 29 byte
Cobalah online!
sumber
Klein , satu dari setiap topologi, berjumlah 291 byte
Setelah melihat jawaban WW menggunakan
001
topologi, saya memutuskan untuk melihat betapa sulitnya melakukan Counter Geiger untuk setiap topologi. (Spoiler: sangat sulit. Sulit untuk mengetahui ke mana pointer akan pergi tanpa gerakan tangan yang membuat saya terlihat seperti sedang mencari tahu di mana tangan kiri saya)Verifikasi!
(Saya juga berpikir untuk menulis sebuah program yang merupakan penghitung Geiger yang valid pada semua topologi, tetapi itu mungkin harus menunggu. Jika ada orang yang ingin mencoba, saya menawarkan hadiah 500 rep)
000 dan 010, 21 byte
Coba 000 online! dan Coba 010 online!
Ini porting dari
><>
solusi saya . Ini jelas berfungsi000
, karena itulah topologi default untuk sebagian besar bahasa 2D, tetapi saya terkejut bahwa itu juga berfungsi010
.001 dan 011, 26 byte
Coba 001 online! dan Coba 011 online!
Yang ini disalin langsung dari jawaban WW . Terima kasih!
100, 21 byte
Cobalah online!
101, 21 byte
Cobalah online!
110, 26 byte
Cobalah online!
111, 24 byte
Cobalah online!
200, 21 byte
Cobalah online!
201, 31 byte
Cobalah online!
Sejauh ini yang paling menyebalkan.
210, 26 byte
Cobalah online!
211, 27 byte
Cobalah online!
Satu-satunya di mana saya harus menangani memasuki pager melalui sisi kanan.
sumber
Brainfuck yang memodifikasi sendiri ,
144102 byteUnprintables ditampilkan sebagai escape sequence (misalnya
\x01
).Verifikasi!
sumber
Pesona Rise , 29 byte
Cobalah online!
Pada dasarnya sama dengan jawaban Klein 000 atau> <> (saya mulai dengan yang Klein). Satu-satunya perubahan yang benar-benar diperlukan adalah untuk mengubah
<
menjadiL
dan.
menjadi(terjemahan simbol perintah), memasukkan titik masuk IP (perlu 2, jika tidak, penghapusan akan menghasilkan program non-kompilasi) dan penyisipan
y
perintah dela untuk mendapatkan dua IP untuk digabung (dengan demikian hanya mencetak satubeep
), sekali lagi, perlu dua. Juga diperlukan memasukkan NOP tambahan untuk menjaga panjang garis tetap sama. Klein juga nyaman digunakan@
untuk "mencetak dan mengakhiri."Tidak ada kemampuan untuk menggunakan spasi putih di kiri bawah, karena setiap reflektor untuk mengubah arah menghambat kemampuan untuk mendeteksi radiasi. misalnya (26 byte, disinari
y
):Mencetak tidak ada keluaran, karena segmen entri yang bengkok menyebabkan refleksi ulang ke terminator saluran bawah.
sumber
Befunge-93 , 55 byte
Cobalah online! Verifikasi!
Saya berharap untuk mendapatkannya sedikit lebih kecil dari ini, tetapi panjang
beep
printer adalah hambatannya.sumber
Wumpus ,
37 34 3231 byteCobalah online! Verifikasi!
Solusi ini menggunakan fakta yang
.
melompat ke posisi modulus panjang program.Atau untuk jumlah byte yang sama
Cobalah online! Verifikasi!
Yang ini menggunakan perbedaan dalam arah penunjuk untuk panjang garis ganjil dan genap. (Saya tidak benar-benar tahu cara kerja yang pertama
"
saat baris baru dihapus)sumber
Klein (001), 26 byte
Cobalah online!
Memeriksa!
Penjelasan
Program ini mengambil keuntungan dari topologi unik Klein khususnya topologi 001 , yang merupakan botol Klein.
Program yang belum diedit mengikuti jalur eksekusi:
Menghapus byte dari program dapat mempengaruhi program dalam 4 cara (masing-masing dengan warna yang berbeda):
Hal pertama yang perlu diperhatikan adalah bahwa
<<
akan selalu membelokkan ip ke kiri asal pada awalnya. Jika salah satu<
dihapus, yang lain menggantikannya. Jadi jika ada byte yang dihapus dari bagian merah, jalur eksekusi berikut akan diikuti:Jika byte biru dihapus, kami mendapatkan jalur yang sangat sederhana:
Jika baris baru dihapus, kami mendapatkan jalur:
Jalur kuning sedikit lebih kompleks. Karena garis bawah adalah satu lebih panjang dari garis atas, ketika program dikuadratkan pada awal pelaksanaan, karakter virtual ditambahkan ke akhir baris pertama untuk membuat mereka ukuran yang sama. Jika ada byte pada baris kedua yang dihapus, garis itu dipersingkat dan karakter virtual itu tidak ditambahkan. Ini penting karena
!
biasanya melompati karakter virtual, tetapi jika tidak ada, ia melompati/
.sumber
><>
solusi saya000
selama 21 byteBackhand ,
2521 byteCobalah online! Verifikasi!
Ini menggunakan kemampuan Backhand untuk mengubah nilai langkah penunjuk untuk melewati instruksi setiap langkah dan menyelesaikan masalah redunancy dengan rapi. Kemudian menggunakan
j
perintah untuk memeriksa apakah kode disinari dengan melompat ke karakter terakhir (@
, berhenti) jika tidak, dan melompat ke yang terakhir kedua (H
, berhenti dan tumpukan output) jika demikian.sumber