Apa yang kami lupakan?


31

Tugas Anda adalah menulis program komputer yang tidak kosong yang terdiri dari beberapa urutan byte. Jika kita memilih byte tertentu dalam program dan menghapus semua instance dari program, program yang dimodifikasi harus menampilkan byte yang dihapus.

Misalnya jika program kami

aabacba

Maka bcbakan menghasilkan a, aaacaakan perlu untuk keluaran bdan aababaakan keluaran c.

Tidak masalah apa yang dilakukan oleh program yang tidak dimodifikasi.

Jawaban akan dicetak dalam byte dengan tujuan untuk meminimalkan jumlah byte.


4
Karena tantangan ini bukan tagged quine, dapatkah kita membaca kode sumber kita sendiri?
Dennis

1
@Dennis Sure. Jadilah tamuku
Wheat Wizard

2
Jika semua byte dalam program kami mewakili digit, dapatkah kami mengeluarkannya melalui kode keluar?
Tn. Xcoder

15
Saya pikir ini akan lebih baik sebagai tantangan kode di mana Anda harus memaksimalkan jumlah karakter diskrit yang digunakan.
Notts90

2
Seharusnya ditentukan lebih dari 1 byte, bukannya non-kosong : P. Atau apa yang dikatakan Notts90.
Magic Octopus Urn

Jawaban:


70

zsh, 603 594 566 561 548 440 415 399 378 370 byte

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Tergantung pada coreutils + dc.

Cobalah online!

Itu ... perjalanan.

Jawaban ini memiliki tiga bagian. 4 baris pertama menangani kasus khusus tertentu untuk menyederhanakan kode yang mengikuti. 2 baris berikutnya dan baris terakhir keduanya pada dasarnya menyelesaikan hal yang sama, tetapi tepat satu dijalankan dengan penghapusan karakter tertentu. Mereka ditulis dengan sebagian besar set karakter komplementer, sehingga menghapus setiap karakter hanya memecah satu karakter paling banyak, memungkinkan yang lain untuk terus berfungsi.

Melihat bagian pertama, kami pertama menangani

  • penghapusan baris baru dengan ec\nho \\n
  • penghapusan ruang dengan ca t<<<$'\x20'(diikuti oleh exi tuntuk menghindari menjalankan kode yang lebih baru, yang akan menghasilkan keluaran asing)
  • $penghapusan dengan d$c -e8BC6P( 8BC6= 9226adalah 36*256 + 10, dan 36 dan 10 adalah nilai byte $masing-masing dan karakter baris baru; kami menggunakan digit hex dalam desimal untuk menghindari keharusan memasukkannya dalam komentar besar di baris 6)
  • 0penghapusan dengan d0c -eKp( Kmendapatkan presisi desimal, yang secara 0default)

Di bagian selanjutnya, satu-satunya karakter yang digunakan (selain dari sampah di akhir baris kedua) adalah $'\01234567v;, spasi, dan baris baru. Dari jumlah tersebut, empat telah diperhitungkan, sehingga sisanya ( '\1234567v) tidak dapat terjadi di baris terakhir. Memperluas lolos oktal ( $'\123'mewakili karakter ASCII dengan nilai 123 8 ), kita mendapatkan:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

Baris pertama loop melalui semua karakter yang digunakan dalam program dan mencari masing-masing dalam kode sumbernya sendiri ( $0adalah nama file dari skrip yang sedang dijalankan), mencetak karakter apa pun yang tidak ditemukan.

Baris kedua terlihat sedikit aneh, dan tampaknya melakukan hal yang sama exitdengan sekelompok orang. Namun, pengodean exitsebagai oktal langsung menghasilkan $'\145\170\151\164', yang tidak mengandung 2atau 3. Kami benar-benar perlu membuat ini kurang tahan terhadap pemindahan. Ini karena jika ada '\014567vyang dihapus, melanggar baris pertama, baris kedua juga rusak, yang memungkinkan sisa kode untuk dieksekusi. Namun, kita perlu juga memutus jika 2atau 3dihapus sehingga baris 3 dan 4 dapat berjalan. Ini dicapai dengan memilih di :dan ;, yang masing-masing memiliki 2 dan 3 dalam representasi oktal mereka.

Sampah di akhir baris 2 ada di sana untuk memastikan setiap karakter ASCII yang dapat dicetak muncul setidaknya satu kali, karena cara pemeriksaan dilakukan dengan mengulangi masing-masing membutuhkan ini.

Jika exittidak dipanggil di bagian pertama (yaitu rusak oleh penghapusan salah satu '\01234567v), kita beralih ke yang kedua, di mana kita harus mencapai hal yang sama tanpa menggunakan salah satu karakter ini. Baris terakhir mirip dengan baris pertama yang didekodekan, kecuali bahwa kita dapat mengontrak rentang loop untuk menyimpan beberapa byte, karena kita sudah tahu bahwa semua karakter kecuali '\01234567vtelah tercakup. Ia juga memiliki 0# $#sebelumnya, yang berkomentar dan mencegahnya menghasilkan output yang asing jika 0atau $telah dihapus.


5
Wow, sangat mengesankan mengingat jumlah karakter berbeda yang terlibat! Sangat menantikan untuk melihat penjelasan itu.
Kevin Cruijssen

3
@KevinCruijssen di sini Anda pergi :)
Gagang pintu

1
@ Doorknob jika ini tidak memenangkan Anda 548 internet, saya tidak tahu apa. Jujur, versi 603 byte sama mengesankannya hah!
Magic Octopus Urn

3
Satu-satunya jawaban yang menarik sejauh ini.
htmlcoderexe

21

Retina , 1 byte

1

Cobalah online!

Ketika semua instance dari byte tunggal ( 1) dihapus, hasilnya adalah 1. Cukup sederhana.


6
Saya sedang menelusuri TIO untuk menemukan sesuatu seperti ini - Anda mengalahkan saya untuk itu. Btw ini adalah polyglot, bekerja dengan Snails
JayCe

IMO, jawaban ini harus ditingkatkan menjadi jawaban polyglot sebagai yang pertama (mungkin dengan daftar bahasa yang tidak lengkap selamanya), dan dua lainnya diturunkan untuk dilupakan. Oh, dan ini juga bekerja di C .

@Rogem Saya tidak yakin apa yang Anda maksud dengan "ini bekerja di C." apakah Anda memiliki kompiler C yang output 1untuk program kosong? Apapun, saya pikir jawaban yang dipermasalahkan menggunakan pendekatan dan perilaku yang berbeda. IMO jawaban polyglot hanya dijamin jika pendekatannya tetap sama. (Secara objektif, ini bukan polyglot karena kode yang sebenarnya berbeda, untuk jawaban di bawah ini.) Jangan ragu untuk memilih bagaimana Anda inginkan, tetapi jawaban yang valid adalah jawaban yang valid. Saya akan menyimpan jawaban saya apa adanya, saya tidak ingin menyimpan kumpulan jawaban di atasnya.
Conor O'Brien

11

Bahasa, 216173027061157310 byte

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Ada 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #s dan 216173027061157310 - 144115194786755540spasi.

144115617572598740 #s dan spasi mengkodekan program BF berikut:

++++++[>++++++<-]>.

Cobalah online!

144115241762960340 $s dan spasi mengkodekan program BF berikut:

+++++++[>+++++<-]>.

Cobalah online!

144115194786755540 $s dan #s menyandikan program BF berikut:

++++++++[>++++<-]>.

Cobalah online!

Sunting: Disimpan 72057832274401770 bytes berkat @Nitrodon.


Mengapa tidak menggunakan Udan byte 127? Cobalah online! Atau bahkan hanya byte nul dan soh?
Jo King

@JoKing Saya tidak tahu Uitu byte ASCII yang bisa dicetak terpendek yang bisa jadi keluaran. Saya tidak ingin menggunakan byte yang tidak diinginkan.
Neil

Bahkan tanpa mengambil keuntungan dari pembungkus sel atau karakter yang tidak dapat dicetak, Anda bisa mendapatkan ini hingga 216173027061157310 byte dengan memasukkan karakter ruang sebagai byte ketiga yang berbeda.
Nitrodon

7
Saya tidak bisa menahan diri karena "Edit: Disimpan 72057832274401770 byte ..."
Mr Lister


9

Polyglot * , 1 byte ( menunggu konfirmasi )

0

Cobalah online! (menggunakan Triangularity)

*: Ini berfungsi dalam berbagai bahasa (agak luas) (kecuali untuk esolang seperti 4,> <> dan sejenisnya dan beberapa pengecualian lainnya). Identik dengan jawaban Jelly dalam kode sumber, tetapi metode I / O berbeda - Output melalui kode keluar. Ketika seseorang menghapus 0dari kode sumber, mereka pergi dengan program kosong, yang sering tidak kesalahan dan menghasilkan kode keluar 0 di sebagian besar bahasa.



3

Unary (tidak kompetitif), 96 byte

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Ini xxddump.

Definisi yang lebih luas dari bahasa Unary memungkinkan setiap karakter dalam kode sumbernya. Tetapi saya tidak menemukan kompiler atau juru bahasa yang akan bekerja untuk ini. Jadi saya menandai jawaban ini sebagai tidak kompetitif. Jika Anda dapat menemukan yang diposting sebelum pertanyaan ini diajukan, saya akan menautkannya.


4
Ini adalah program Unary terkecil yang pernah saya lihat.
Draco18s
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.