The Caesar Cypher adalah nol substitusi yang sangat sederhana di mana setiap huruf digeser oleh offset tetap (looping sekitar Z ke A). Demikian pula, kita juga bisa menggunakan cypher Caesar untuk set karakter ASCII yang dapat dicetak. Ini adalah 95 karakter dari titik kode 0x20 hingga 0x7E. Untuk offset yang diberikan d
, kami memetakan titik kode C
ke
(C - 32 + d) % 95 + 32
yang menggeser semua karakter dengan a d
dan loop dari ~
ke luar angkasa. Karakter di luar rentang ini (karakter kontrol seperti baris baru, tab, dan karakter di luar rentang ASCII) tidak terpengaruh.
Anda harus menulis dua program atau fungsi (berpotensi dalam bahasa yang berbeda), yang mengambil offset d
dan string. Program pertama harus mengembalikan atau mencetak kode sandi input. Program kedua harus mengembalikan atau mencetak terbalik Caesar (yaitu menggunakan offset -d
). Anda dapat mengambil input melalui STDIN, argumen baris perintah atau argumen fungsi.
Untuk membuat segalanya lebih menarik, program kedua haruslah kode sandi Caesar dari program pertama. Yaitu, jika Anda meneruskan kode sumber dari program pertama ke dirinya sendiri, untuk beberapa offset non-nold
, output harus menjadi program kedua.
Kedua program, serta string input, harus hanya berisi karakter, baris dan tab ASCII yang dapat dicetak. Tidak ada program yang dapat berisi komentar atau membaca kode sumbernya sendiri, nama file atau ID proses secara langsung atau tidak langsung.
Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang. Karena kedua program harus memiliki ukuran yang sama, Anda hanya perlu menghitungnya sekali.
sumber
Python 2, 147
Jelas saya tidak berpikir terlalu keras tentang ini, karena akan sia-sia dengan Python. Hanya ada dua program yang terpisah, dengan yang tidak digunakan terbungkus dalam sebuah string.
Offset antara kedua program adalah 39.
Meneruskan
Menentukan fungsi Z menerima string Unicode dan offset.
Terbalik
Menentukan fungsi Saya menerima string Unicode dan offset.
sumber
Python 3 - 248 byte
Tujuan saya adalah melakukan ini sebagai satu-baris Python. Gol sukses, tapi sekarang saya tidak bisa diganggu golf.
Enkripsi:
Dekripsi:
Sunting: Diperbaiki untuk tidak memengaruhi karakter di luar rentang ASCII yang dapat dicetak
Offset dari enkripsi ke dekripsi adalah 20. Gunakan dengan memasukkan offset terlebih dahulu, kemudian string, misalnya
Penjelasan
Transformasi berikut adalah kuncinya:
Yang pertama memungkinkan penggunaan
or
, sedangkan yang kedua mengabaikan string dengan titik koma.Perhatikan bahwa
"".__doc__[2]
mengembalikan stringr
(diambil daristr
). Ini diperlukan untuk mencegah string yang dikutip tunggal dalam program dekripsi dari memiliki tanda kutip di tengah.sumber
Ruby,
131125 byteIni pengajuan saya sendiri (yang saya tulis sebelumnya sebagai bukti konsep, tetapi saya entah bagaimana berhasil melanggar aturan saya sendiri). Saya tidak menggunakan kembali kode apa pun di antara dua pengiriman (Saya ingin kalian mengalahkan ini, setelah semua), tetapi itu terdiri dari dua baris, salah satunya diubah menjadi string dengan omong kosong.
Forward cypher:
Cypher terbalik:
Kedua snippet mendefinisikan suatu fungsi (dipanggil
Y
di yang pertama, danJ
yang kedua), yang mengambil integer dan string dan mencetak string yang diubah ke STDOUT. Offset antara dua bagian kode adalah40
.sumber
oOo CODE ,
750744 bytes, semua kode yang digunakan di kedua programTerlalu lama tapi itu mungkin alat yang tepat untuk melakukan itu ...
Enkripsi:
Dekripsi:
Terjemahan Brainfuck:
oOo CODE adalah varian Brainfuck di mana hanya masalah huruf yang penting.
Dibutuhkan byte pertama dan menggunakan kode karakternya
d
(jadi baris baru berarti d = 10). Input lainnya adalah string. EOF adalah 0.sumber
GolfScript,
9564 byte, semua kode digunakan di kedua programEnkripsi:
Dekripsi:
Masukkan format:
Penjelasan
Dekripsi:
Enkripsi:
sumber
Javascript (ES7 Draft) -
167165 byteMeminjam dari penggunaan senar @feersum dan penggunaan titik koma @MartinButtner;)
Enkripsi:
Dekripsi:
Offset untuk digunakan: 55
sumber
or <empty string> and <function>
bukan hanyaor <function>
.> <> (Ikan) , 467 byte
Enkripsi:
Dekripsi:
Kedua program diimbangi oleh 3, dan mereka mengambil input dari formulir:
Offset harus 2 digit, sehingga offset 5 harus dimasukkan sebagai
05
.Ini adalah pengiriman yang panjang, tetapi hampir semua karakter non-filler digunakan oleh kedua program . Ada banyak ruang putih yang pasti bisa bermain golf, tapi saya pikir programnya akan lebih menarik dengan cara ini.
Gambar ini menyoroti karakter yang digunakan oleh kedua program.
Penjelasan
Konstruk utama yang memungkinkan ini adalah
_{} -> b~!
, yang memungkinkan melewatkan karakter acak dalam program dekripsi. Bagaimana?Secara keseluruhan, program enkripsi tidak melakukan apa-apa, tetapi program dekripsi melewatkan instruksi selanjutnya. Ini kemudian dapat diperluas ke
_{}! -> b~!$
, yang memungkinkan melewatkan karakter acak dalam enkripsi program sebagai gantinya.Selain itu, sebagian besar sisa program mendorong angka, melakukan operasi pada angka-angka itu kemudian menemukan cara untuk menghapusnya. Misalnya, satu konstruk yang bermanfaat adalah
~~ -> ""
, yang mengeluarkan dua nilai untuk program enkripsi, tetapi tidak mendorong apa pun dalam program dekripsi.> <>, 149 byte
Inilah versi yang kurang menarik, yang menggunakan fakta bahwa instruksi yang tidak dilewati adalah komentar efektif dalam bahasa 2D.
Enkripsi:
Dekripsi:
Kedua program diimbangi oleh 84, dan mengambil input dengan cara yang sama seperti di atas. Instruksi pertama memutuskan setengah dari program yang akan dijalankan, dengan
i
(input) mempertahankan aliran program ke kanan dalam program enkripsi, dan^
mengarahkan aliran program ke atas (berputar-putar dan kembali dari bawah) dalam program dekripsi.Penjelasan
Untuk separuh yang relevan dari program enkripsi (program dekripsi serupa):
Alat pengkodean
Ini tidak terkait dengan sisa posting di atas, tetapi saya pikir saya akan memposting ini karena saya perlu menggunakannya: P
sumber
Perl - 131
Dibutuhkan input dari baris perintah args.
Menggesernya dengan 26 memberi yang lain:
sumber