Detektor radiasi!


26

Program yang dikeraskan dengan radiasi adalah program di mana, jika ada karakter kode yang dihapus, program akan tetap berfungsi sama. Untuk pertanyaan ini, kami akan menulis sebuah program yang mendeteksi ketika diiradiasi.

Tulis sebuah program atau fungsi yang, ketika setiap byte tunggal dihapus, program yang dihasilkan akan menampilkan byte itu dan hanya byte itu. ( Anda dapat menampilkan byte itu beberapa kali, selama Anda tidak menampilkan byte lainnya )

Aturan:

  • Program harus mengandung setidaknya 2 byte yang berbeda. (Tidak ada solusi hanya 0s;)
  • Tidak masalah apa yang dilakukan oleh program aslinya
  • Tidak membaca kode sumber Anda sendiri.
  • Kode akan dinilai pada jumlah byte yang berbeda, di mana jumlah tertinggi menang. Misalnya, abc= 3 poin, ababba= 2 poin, abcmenang.
    • Tie-breaker adalah jumlah byte yang lebih kecil, diikuti oleh waktu pengiriman sebelumnya

Semoga berhasil!



Saya melewatkan garis itu. Memalukan untukku!
Mego

5
"Kode akan dinilai pada jumlah karakter yang berbeda, di mana jumlah tertinggi menang." Saya berharap bahwa sebagian besar (jika tidak semua) solusi akan memiliki beberapa bentuk string di suatu tempat yang mereka dapat pad dengan karakter sewenang-wenang tanpa benar-benar mengubah solusi (jadi itu hanya tergantung pada apakah bahasa Anda terbatas pada ASCII, ASCII diperpanjang atau Unicode) .
Martin Ender

3
... Kotak pasirnya tidak sempurna. :( / Anda bisa mengukur "byte yang berbeda" dan bukan "karakter yang berbeda", karena karakter terkait dengan penyandian dan masalah lainnya.
user202729

1
Bisakah program mengambil input?
gggg

Jawaban:


15

05AB1E , 9 7 byte (Skor 3)

22'''rr

Cobalah online!

Menghapus a '

Dengan apapun yang 'dihapus, 22''rrakan menghasilkan 22 menjadi hal pertama di tumpukan dan 'menjadi hal terakhir di tumpukan, yang bila dibalik dua kali menghasilkan '.

Menghapus sebuah r

Dengan apapun yang rdihapus, 22'''rhasilnya 22 menjadi hal pertama di stack, 'menjadi hal kedua di stack, dan rmenjadi hal terakhir di stack. Ini r, bagaimanapun, didahului oleh 'yang membuatnya menjadi string literal "r"(sebagai lawan dari perintah reverse stack), yang dicetak secara implisit.

Menghapus a 2

Dengan apapun yang 2dihapus, 2'''rrakan menghasilkan 2benda pertama di tumpukan, 'menjadi benda kedua di tumpukan, dan akhirnya rmenjadi yang terakhir di tumpukan, yang bila dibalik akan menghasilkan 2.

Karenanya, jawaban ini valid. Dengan tidak ada yang dihapus itu menghasilkan ', yang tidak relevan. Ini berfungsi untuk nomor selain dari 2 juga.


Dibuat pemeriksa validitas, Anda dapat menggunakannya untuk bersaing di 05AB1E *.

* Saya tidak 100% yakin berapa banyak solusi yang mungkin ada di 05AB1E ...


Lebih banyak solusi valid yang lebih buruk atau sama

  • 1-Poin (tidak valid)
  • 2-Poin
    • '''''''VV, '''''''XXatau'''''''<any command that pops a without pushing>x2
    • # Aneh di 'atas 3 diikuti oleh # genap di satas 1 (EG '''''''''ssss).
    • '''..dengan jumlah periode di atas 1 dan jumlah ganjil di 'atas 2.
  • 3-Poin
    • '\\'''rr- ide yang sama dengan 22'''rrtetapi \adalah 'hapus item tumpukan terakhir'.

Output normal dari 'tidak relevan dengan aturan, seperti yang Anda katakan. Tapi itu tidak membatalkan tujuan nominal mendeteksi anomali, yang agak lucu.
gggg

1
@gggg Saya cukup yakin setidaknya SATU dari alternatif saya tidak mencetak apa-apa lol.
Magic Octopus Mm

1
@MagicOctopusUrn Sama-sama. Hanya berpikir saya mungkin lebih baik mengedit daripada berkomentar.
boboquack

@ Boboquack apakah tag asli saya (@ Boboquack) berfungsi, atau apakah Anda menemukannya dengan melihat posting lagi? Saya mencoba mencari tahu bagaimana tag bekerja ketika pengguna tidak pernah berkomentar lol.
Magic Octopus Mm

@oboquack Maksud saya apakah Anda mendapat pemberitahuan dari "terima kasih"? Juga, kami mungkin harus menghapus utas ini hingga +1 saya untuk "Terima kasih".
Magic Octopus Mm

9

Brainfuck, Skor 3

Mungkin tidak bersaing karena output hanya dilihat melalui dump memori.

+++++++++++++++++++++++++++++++++++++++++++++,-

Asumsikan input kosong dan EOF membiarkan sel tidak berubah. Menggunakan penerjemah yang membuang memori ke output, seperti ini .

Hapus nilai tambah, dan memori adalah nilai unicode untuk "+", kalau tidak itu adalah nilai unicode untuk ",". Ini lebih merupakan aturan bender daripada jawaban sekalipun. Hampir sama dengan "-". Menyalahgunakan fakta bahwa ketiga karakter ini saling berhadapan dalam unicode-karakteret.


Pintar, jujur ​​sepenuhnya, jangan berpikir itu celah.
Magic Octopus Urn

Anda mengasumsikan EOF membuat sel tidak berubah, ya?
Jo King

Ya, dan selama tidak ada input, itu akan baik-baik saja 😊
Håvard Nygård

Saya tergoda untuk mengizinkan ini, tetapi apakah Anda memiliki juru bahasa yang memiliki dump memori yang hanya akan menghasilkan sel yang berubah dan membiarkan sel tidak berubah pada EOF?
Jo King

1
copy.sh/brainfuck Yang ini harusnya berfungsi dengan baik. Jalankan saja dan tekan "view memory".
Håvard Nygård

9

Pohon Pir, 256 byte berbeda, 975 byte

Sayangnya, pertanyaannya cukup banyak membutuhkan solusi optimal untuk mengandung NUL byte di suatu tempat (karena perlu memuat semua 256 byte di suatu tempat). Ini berarti bahwa a) saya tidak dapat memberi Anda tautan TIO (karena TIO tidak menyukai NUL dalam program, atau setidaknya, saya belum menemukan cara untuk mengetiknya yang dapat diatasi oleh browser saya), dan b) I tidak dapat menempelkan program ke Stack Exchange secara harfiah. Sebagai gantinya, saya telah menempatkan xxdhexdump reversibel yang tersembunyi di balik tautan "snipet kode" di bawahnya.

Penjelasan

Program ini terdiri dari tiga bagian yang identik. (Menggabungkan beberapa bagian yang identik dari suatu program adalah sesuatu yang menjadi tema bagi saya dalam program program .) Setiap A Pear Tree membutuhkan sebuah checksum di suatu tempat untuk membuat penerjemah tahu bagian mana dari program yang akan dijalankan; itu memutar setiap bagian dari program yang berhasil checksum untuk memulai sebelum menjalankannya (atau mencetak a partridgejika tidak ada checksum cocok). Dalam hal ini, kami memiliki checksum pada masing-masing dari tiga bagian, dan dengan demikian bagian non-iradiasi akan pindah ke awal. Jadi kita dapat mengasumsikan bahwa program terdiri dari bagian yang tidak dimodifikasi, diikuti oleh dua bagian lain (salah satunya mungkin telah dimodifikasi).

Setiap bagian dimulai dengan baris baru, kemudian dilanjutkan dengan kode berikut (Saya telah menambahkan spasi dan komentar di bawah):

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

Setelah itu muncul salinan setiap oktet yang belum digunakan dalam program sejauh ini (murni untuk menjalankan skor naik), dan akhirnya checksum. (Tidak ada baris baru, bagian mulai dengan baris baru tetapi tidak berakhir dengan baris baru.)

Ada tiga kasus berbeda di sini:

  • Karakter selain baris baru telah dihapus . Dalam hal ini, itu akan muncul beberapa kali ganjil di bagian kedua dan ketiga. Itu berarti itu akan ditambahkan dan / atau dihapus dari %zjumlah ganjil kali, akhirnya berakhir di tabel hash. Bahkan, itu akan menjadi satu - satunya kunci dalam tabel hash (karena string berjalan dari setelah baris baru dari bagian kedua hingga akhir bagian ketiga, dan tabel hash dimulai dengan hanya satu baris baru), jadi itu hanya akan dicetak sendiri.
  • Baris pertama atau ketiga telah dihapus . Dalam hal ini, program akan diputar sedemikian rupa sehingga ketiga dari baris baru yang hilang, secara efektif menggabungkan bagian kedua dan ketiga menjadi satu baris. String literal diakses melalui <DATA>berisi setiap karakter beberapa kali, sehingga tabel hash akan memiliki konten aslinya, satu baris baru, dan itu akan dicetak.
  • Baris kedua kedua telah dihapus . Dalam hal ini, program tidak akan dirotasi (karena bagian pertama memiliki checksum yang valid), sehingga bagian kedua akan dipindahkan ke baris yang sama dengan bagian pertama. <DATA>hanya mulai membaca dari baris di bawah ini __DATA__, jadi itu hanya akan melihat bagian ketiga. Ini memiliki lebih dari lima karakter yang muncul beberapa kali ganjil, jadi itu akan memicu kasing khusus untuk mencetak baris baru.

Verifikasi

Satu hal terakhir yang harus diperiksa untuk setiap program Pear Tree yang dikeraskan dengan radiasi adalah apakah penghapusan terjadi secara acak menyebabkan bagian yang tidak diinginkan dari kode untuk checksum dengan benar dan memutar kode ke tempat yang salah; mengingat bahwa kami menggunakan checksum 32-bit, ini tidak mungkin tetapi bukan tidak mungkin. Saya menggunakan skrip brute-force berikut untuk memastikan bahwa ini tidak terjadi untuk penghapusan apa pun:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

Skrip verifikasi mengkonfirmasi bahwa program ini berfungsi dengan benar.


7

Stax , 11 byte (Nilai 4)

'''cc'~~'dd

Jalankan dan debug online!

Merupakan kehormatan bagi saya untuk memiliki jawaban pertama (secara kronologis) untuk tantangan ini dengan skor lebih tinggi dari atau sama dengan 4. Mungkin skornya bisa lebih tinggi lagi.

Dalam Stax, string literal yang terdiri dari satu karakter ditulis dengan ', demikian '', 'c, 'd, '~juga semua string literal. Perintah yang sesuai untuk c ddan ~berarti menduplikasi bagian atas tumpukan utama, pop bagian atas tumpukan utama, dan pop bagian atas tumpukan utama dan tekan masing-masing ke tumpukan input. Untuk tantangan ini, tumpukan input tidak mempengaruhi output dan tidak penting, maka kita dapat mengatakan ddan ~identik.

Penjelasan

Cara terbaik untuk membagi kode menjadi beberapa bagian dan mempertimbangkannya secara terpisah.

Ketika tidak dirusak, '''ccmendorong literal 'dan literal cke tumpukan utama, dan menduplikasi bagian atas, sehingga tumpukan akan menjadi (dari bawah) c,c,'.

Ketika tidak dirusak, '~~mendorong literal ~dan kemudian muncul (dan dorong ke tumpukan input), yang pada dasarnya adalah no-op untuk tumpukan utama.

Ketika tidak dirusak, 'dddorong literal ddan kemudian muncul, no-op lain untuk tumpukan utama.

Pada akhir program, karena tidak ada output eksplisit yang dilakukan, bagian atas tumpukan utama akan dicetak secara implisit.

Jika program berjalan apa adanya, tumpukan final masih c,c,'dan akan ditampilkan c.

Jika bagian pertama menjadi ''cc, maka kita memiliki literal ', dan dua instruksi penyalinan, tumpukan terakhir akan menjadi ',','. Mengingat bahwa dua bagian lainnya adalah no-op, hasilnya adalah '.

Jika bagian pertama menjadi '''c, hasilnya pada dasarnya sama dengan yang tidak teramplas, tetapi ctidak digandakan. Jadi tumpukan akan menjadi c,'. Setelah dua no-op, bagian atas tumpukan adalah c.

Jadi kita dapat mendeteksi radiasi pada bagian pertama.

Bagian kedua dan bagian ketiga bekerja dengan cara yang persis sama. Saya akan mengambil bagian ketiga sebagai contoh.

Jika bagian ketiga dirusak, maka dua bagian pertama disimpan apa adanya dan tumpukan sebelum menjalankan bagian ketiga c,c,'

Jika bagian ketiga menjadi 'd, literal ddidorong ke atas tumpukan utama dan tidak ada lagi yang dilakukan. Bagian atas tumpukan utama sekarang dakan menjadi output.

Jika bagian ketiga menjadi dd, dua elemen muncul dari tumpukan utama dan sekarang bagian atas tumpukan adalah 'dan keluaran.

Karenanya kita dapat mendeteksi radiasi di bagian ketiga. Untuk alasan yang sama kita dapat mendeteksi radiasi di bagian kedua.


5

05AB1E , skor 2, 6 byte

„"""„„

Mencetak dua kali lipat karakter yang dihapus kadang-kadang. Tidak mengandung '.

Bagaimana itu bekerja:

Menghapus yang pertama

"""„„

Cobalah online!

Pertama, kami mendorong string kosong literal ke stack. Lalu kami dorong „„, yang dicetak secara implisit.

Menghapus a "

„""„„

Cobalah online!

Pertama, kita dorong ""ke tumpukan dengan 2-char stringinstruksi. Kemudian kami mencoba untuk mendapatkan string 2-karakter lain, tetapi ini dibatalkan (saya tidak yakin mengapa) dan ""dicetak.

Menghapus yang kedua atau ketiga

„"""„

Cobalah online!

Pertama, kita dorong ""ke tumpukan dengan 2-char stringinstruksi. Lalu kami dorong , yang dicetak secara implisit.


5

Jelly , 5 byte, skor 2

”””ḷḷ

Cobalah online!

Dengan yang dihapus:

””ḷḷ

Cobalah online!

Karakter dimulai dengan karakter satu byte literal. Program ini dimulai dengan ””yang menghasilkan string . Pasangan itu mengambil argumen kiri. String baru saja melewati dua contoh dari .

Dengan yang dihapus:

”””ḷ

Cobalah online!

Dalam program ini ””menghasilkan karakter lalu ”ḷmenghasilkan karakter dan hanya ini adalah output.


Solusi lain

  • Banyak karakter lain seperti aatau oakan berhasil menggantikan kiriman ini.
  • ⁾⁾⁾⁾FFF. Ini bekerja dengan cara yang serupa. seperti tetapi mulai string dua byte literal. Program "iradiasi" mengeluarkan byte yang dihapus dua kali yang dinyatakan valid dalam komentar.

Ini adalah versi Jelly (jauh lebih mewah) dari pemeriksa validitas Magic Octopus Urn. Kolom kiri output adalah karakter yang dihapus dan kolom kanan adalah output dari program yang dihasilkan.


Saya validitas checker tidak thaaat mewah. Gagal untuk solusi lain yang diposting;).
Magic Octopus Urn
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.