Tugas Anda adalah untuk mengambil string terenkripsi sebagai input, dan output string didekripsi, untuk mengungkapkan pesannya yang tersembunyi.
String, baik input maupun output, akan berisi karakter dari daftar 64 karakter ASCII ini (perhatikan spasi terdepan):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Karakter-karakter ini diberi nomor, sesuai urutan yang tercantum di atas:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Jadi, spasi adalah angka 0, !
adalah angka 1 dan ~
angka 63. Angka-angka ini dapat direpresentasikan dalam kode biner 6-bit:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
Enkripsi sangat sederhana:
Saya akan gunakan eC
untuk karakter terenkripsi, dan C
untuk karakter string asli. C(n)
adalah karakter ke-n dari string asli, sedangkan eC(n)
karakter ke-n dari string yang dienkripsi.
Anda akan menggunakan representasi biner 6-bit dari karakter. Karakter pertama adalah eC(0) = not(C(0))
. Dari sana, semua karakter akan menjadi eC(n) = xor(C(n),C(n-1))
.
Contoh:
Mari kita asumsikan string inputnya code
.
c
adalah karakter ke-38 (nol diindeks), atau100110
dalam biner. Versi terenkripsi memiliki semua bit terbalik, jadi011001 -> 25 -> '9'
(sekali lagi, nol diindeks).o
adalah karakter ke-50, atau110010
dalam biner.xor(100110, 110010) = 010100 = 20 = '4'
.d
adalah karakter ke-39, atau100111
dalam biner.xor(100111, 110010) = 010101 = 21 = '5'
.e
adalah karakter ke-40, atau101000
dalam biner.xor(101000, 100111) = 001111 = 15 = '/'
.
Jadi, jika string asli adalah code
, string terenkripsi akan menjadi 945/
.
Kasus uji:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
sumber
Jawaban:
Jelly ,
2726 byteCobalah online!
Versi alternatif, 22 byte (tidak bersaing)
Jelly akhirnya terjebak dengan permainan golf lainnya dan mendapatkan atom ASCII yang dapat dicetak , jadi ini berfungsi sekarang.
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6), 115 byte
Uji kasus
Tampilkan cuplikan kode
sumber
^
pergi ke kanan]
. Jawabannya masih bekerja dengan perubahan itu untuk kasus uji yang saya percaya.d
dari apa yang hilang?Jelly ,
3431 byte-3 byte terima kasih kepada Dennis (gunakan
ḟ
dua kali alih-alihœ-
,;
dan¤
; gunakan”~
lebih dari 63 )Tautan monadik yang mengambil dan mengembalikan daftar karakter.
* Catatan: argumen masukan untuk program Jelly memanfaatkan Python tali format, sehingga mengutip dengan
"
,'
,'''
(atau jika tidak ambigu ada mengutip) semua pilihan.Cobalah online!
Bagaimana?
Bitwise-xor tidak dapat dibalik (diberikan "nol terkemuka").
Bitwise-Not adalah xor dengan "semua yang" - dalam hal ini hanya 6 yang diperlukan, jadi 2 7 -1 = 63 .
Setelah kita membuat array atau karakter dan mencari indeks dari karakter input, decode itu sendiri hanyalah pengurangan kumulatif oleh bitwise-xor, setelah itu kita dapat mengindeks kembali ke array yang sama.
* Catatan: mencari spasi di p akan menghasilkan 64, tapi tidak apa-apa karena pengindeksan kembali ke p adalah modular sehingga menambahkan sebuah lead
1
sama dengan menambahkan 64, membawa indeks kembali ke tempat yang seharusnya).sumber
Java, 225 byte
Saya belum bermain golf di Jawa dalam waktu yang sangat lama, jadi setiap tips golf sangat dihargai.
Cobalah secara Online!
sumber
String D(String E){
menjadiE->{
(-15 byte);-1-J
bisa+~J
(-1 byte); dani=-1
bisai=0
,++
bisa dipindahkan kei++<1?
, dan kemudiani-1
menjadii-2
(-1 byte). Cobalah secara online: 208 byte05AB1E , 40 byte
Cobalah online!
Penjelasan
sumber
Kumpulan instruksi CPU x86, 235 byte
Fungsi find () dan deCript () + string abc: 171 bytes + 64 bytes = 235 assembly dengan nasmw dan compiler / library dengan Borland C compiler:
hasil:
Majelis lebih baik (untuk mengatakan yang benar saya menggunakan sistem makro, ya saya tahu itu terlalu panjang tetapi sebagai C satu + - dengan sistem makro, untuk mengatakan yang benar karena instruksi lebih sederhana itu adalah mudah menulis kode dalam perakitan bahkan tanpa membuat koreksi sebagai salah satu tulisan dalam bahasa Inggris (bukan saya))
sumber
C (gcc) , 153 byte
Cobalah online!
Golf sedikit berkurang
sumber
APL (Dyalog Unicode) , 52 byte SBCS
Membutuhkan
⎕IO←0
Cobalah online!
sumber
¨
:{C[2⊥≠\⍉~@0⍉(6/2)⊤⍵⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']}
⍵
, Anda dapat menyimpan dua byte dengan konversi ke program lengkap:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Röda ,
120100 byteCobalah online!
Saya menggunakan
l=63
trik dari jawaban JavaScript.Saat ini saya sedang bekerja pada pemendekanA
sehingga bermain golf sedang berlangsung ...sumber
Python 2 , 155 byte
Cobalah online!
sumber
PHP, 103 Bytes
Cobalah online!
PHP, 107 Bytes
Cobalah online!
PHP, 118 Bytes
Cobalah online!
sumber
Python + Numpy, 214 byte
Tidak dapat bersaing dengan solusi Python lain, meskipun menggunakan pendekatan numerik murni dan berbeda:
Sedikit penjelasan:
S=A(r(32,60)+...)
- mendefinisikan alfabet sebagai rentang kodeT=A(r(128))
- tabel hash init ukuran 128 (codepoint terbesar)T[S]=A(r(64))
- Isi tabel hash, yaitu tulis indeks 0-63 ke elemen dengan indeks ASCIIW=T[fromstring(s,"b")]
- Mengonversi input ke array & menerjemahkannya ke dalam kode baruW[0]=~W[0]
- membalikkan nilai 1W=S[bitwise_xor.accumulate(W)&63]
- gunakan metode akumulasi Numpy dengan xor untuk menghindari perulangan, reset 2 bit kiri dan terjemahkan kembali ke asciisumber
Alice , 46 byte
Cobalah online!
Penjelasan
Paruh pertama program berjalan dalam mode ordinal dan mengatur pemetaan dari angka ke karakter. Babak kedua berjalan dalam mode kardinal dan menggunakan pemetaan ini untuk memecahkan kode input.
sumber
Japt
-P
, 33 byteCobalah online!
Untuk beberapa alasan, test case keberatan dijalankan sebagai suite, jadi inilah yang kedua , ketiga , dan keempat secara individual.
Penjelasan:
sumber
APL (NARS), 72 karakter, 144 byte
Ini anggap input selalu dalam array 's' ... Untuk memahami bagaimana melakukan penguraian saya harus menulis versi perakitan pertama ... tes:
sumber
105103 byte, kode mesin (16-bit x86), 57 instruksiBerjalan: simpan ke codegolf.com, dosbox:
codegolf.com < input.bin
Bagian yang hampir terlupakan:
Howdy, ini entri kedua saya. Yang sebelumnya adalah RC4 . Selesai menggunakan HT hexeditor , tanpa compiler , tapi kali ini saya menggunakan Ctrl-a
assemble instruction
, saya masih tidak tahu apakah ini dianggap sebagai entri atau tidak.Mengapa bagaimana
Dengan cara yang sama saya mulai dengan membuat file dengan
NOP
s, kemudian saya menggunakan kembali membaca / menulis dari RC4 . Saya pertama kali menulis dengan python 'translation ladder' dari ascii ke index. dan menggunakannya dalam perakitan, membuat tangga serupa dalam arah terbalik, akhirnya saya menambahkan trik kecil untuk menangani byte pertamaDengan cara yang mirip dengan RC4, langkah terakhir adalah menghilangkan tambahan
nops
, yang membutuhkan perbaikan lompatan.Pembedahan
Sekali lagi program bergantung pada nilai register awal .
Dummy, akan dibutuhkan nanti
baca byte
berhenti jika stdin selesai
tangga yang menerjemahkan ascii ke indeks (ingatlah bahwa semua lompatan pergi ke 0x134)
xor byte demi byte sebelumnya,
SI
menunjuk ke alamat0x100
, yang awalnya berisi 0xFF dari opcode instruksi dummy di bagian atas, yang menghasilkan perilaku negate (pengingat: COM dimuat pada 0x100)batasi hasil untuk diindeks, dan simpan byte pada 0x100,
tangga dalam arah terbalik
letakkan byte di bawah [di], tulis byte ke stdout (ingatlah bahwa AH = 40h menggunakan DX sebagai alamat, tetapi ia ditempatkan di bagian atas, saat membaca byte)
keberatan bahwa stdin -> stdout dan stdout ke stdin dilakukan menggunakan inc bx / dec bx
lingkaran ^^
Alat dan sumber daya
sumber