Deskripsi
Caesar Shift adalah cipher monoalphabetic yang sangat sederhana di mana setiap huruf diganti dengan yang setelah itu dalam alfabet. Contoh:
Hello world! -> IFMMP XPSME!
( IBSLR, EGUFV!
adalah output untuk tantangan yang sebenarnya, ini adalah contoh dari pergeseran oleh 1.)
Seperti yang Anda lihat, spasi dan tanda baca tetap tidak terputus. Namun, untuk mencegah menebak pesan, semua huruf ditulis dengan huruf besar. Dengan menggeser kembali surat-surat itu, pesan itu diartikan, nyaman, tetapi juga sangat mudah diuraikan oleh orang lain yang seharusnya tidak tahu apa arti pesan itu.
Jadi, kami akan sedikit membantu Caesar dengan menggunakan bentuk sandi canggihnya: Caesar Shift yang Bergeser Sendiri !
Tantangan
Tugas Anda adalah menulis program atau fungsi, yang, diberi string untuk dienkripsi, mengeluarkan string terenkripsi yang sesuai dengan input. Caesar Shift canggih berfungsi seperti ini:
1. Compute letter differences of all adjacent letters:
1.1. Letter difference is computed like this:
Position of 2nd letter in the alphabet
-Position of 1st letter in the alphabet
=======================================
Letter difference
1.2. Example input: Hello
H - e|e - l|l - l|l - o
7 - 5|5 - 12|12 - 12|12 - 15 Letter differences: 3; -7; 0; -3
=3| =-7| =0| =-3
2. Assign the letters continously a letter difference from the list,
starting at the second letter and inverting the differences:
2.1. 2nd letter: first difference, 3rd letter: second difference, etc.
2.2. The first letter is assigned a 1.
2.3. Example input: Hello with differences 3; -7; 0; -3
Letter || Value
=======||======
H || 1
E || -3
L || 7
L || 0
O || 3
3. Shift the letters by the value x they have been assigned:
3.1. In case of a positive x, the letter is shifted x letters to the right.
3.2. In case of a negative x, the letter is shifted |x| letters to the left.
3.3. In case of x = 0, the letter is not shifted.
3.4. If the shift would surpass the limits of the alphabet, it gets wrapped around
Example: Y + Shift of 2 --> A
3.5. Example input: See the table under 2.3.
|| || Shifted
Letter || Value || Letter
=======||=======||=========
H || 1 || I
E || -3 || B Program output:
L || 7 || S IBSLR
L || 0 || L
O || 3 || R
Spasi dan simbol khusus lainnya, seperti tanda baca dilewati dalam proses ini. Dijamin bahwa program Anda akan diberikan string yang hanya berisi karakter ASCII yang dapat dicetak. Output dari fungsi / program Anda hanya harus dalam huruf besar.
Ini adalah kode-golf , jadi celah standar berlaku, dan semoga jawaban tersingkat dalam byte menang!
sumber
E
-3
?ZEN
, misalnya.Z
digeser 1 adalah ...A
? (sebagai catatan, jawaban 05AB1E berubahZ
menjadiA
)RELIEF
danRELIES
untuk menyandikan hasil yang samaSRSFAG
?Jawaban:
05AB1E ,
282724 byteCobalah online!
Penjelasan
sumber
IBSLR, EGUFV!
untukHello, World!
, apakah itu benar? Apakah OP hanya mengacaukan contoh itu?Python 3 , 100 byte
Cobalah online!
b
melacak kode ASCII huruf terakhir, atau awalnya nol; rumusnyac+c-(b or~-x)
berarti huruf dengan kode ASCIIc
akan bergeserc-b
jikab
tidak nol, danc-(c-1) == +1
jikab
nol (untuk huruf pertama).b
tidak akan pernah menjadi nol lagi, karena string dijamin terdiri dari karakter ASCII yang dapat dicetak .Akhirnya,
64<c<91
periksa apakahc
huruf ASCII huruf besar, dan(…-65)%26+65
kembalikan semuanya ke dalamA-Z
jangkauan.ovs menyimpan satu byte. Terima kasih!
sumber
05AB1E ,
323029 byteCobalah online!
sumber
ES6 (Javascript), 138 byte:
http://jsbin.com/manurenasa/edit?console
sumber
MATL , 27 byte
Cobalah online!
Saya pikir ini adalah yang terpendek yang bisa saya dapatkan, tetapi ada banyak varietas yang berbeda karena ada banyak penggunaan ulang 'variabel' (ada 3
t
(duplikasi), dan 2w
operasi (swap), clipboardH
digunakan, dan itupun masih ada duplikat1Y2
...). Sayangnya, saya tidak bisa menyimpan byte denganM
clipboard otomatis .Lebih dari setengah dari program ini didedikasikan untuk membuatnya menjadi huruf besar dan mengabaikan karakter non-alfabet - hanya sandi tidak lebih dari 13 byte ( Coba online! )
sumber
Perl,
9089Meskipun bahasa non-codegolf jarang kompetitif, kita dapat mencapai di bawah 100;)
Saya telah memutuskan untuk ungolf ini:
@a = split//,<>;
Mengambil input dari STDIN, menyimpan daftar karakter (dengan baris baru!) Di @a.say uc(++$a[0])
Output huruf besar digeser dengan 1. Ternyata Anda bisa menambah huruf dalam perl jika Anda menggunakan awalan ++. Ini adalah mutator ofc.2*ord($a[$_+1])-ord($a[$_])+!$_
Kita diminta untuk mengambil karakter pada x, dan menambahkan perbedaan + (x- (x-1)). Ya itu 2x - (x-1). Namun: Saya mengubah huruf pertama! Jadi saya harus memperbaiki kesalahan itu, karenanya+!$_
, yang akan mengoreksi karena telah mengurangi satu terlalu banyak pada posisi 0 (hanya case! $ _ Tidak undef). Kami kemudianuc chr
mendapatkan huruf besar dari nilai ASCII yang dihitung.map{ ... } $#a-2
-$#a
adalah posisi untuk mengakses elemen array terakhir. Karena saya menambahkan yang saya inginkan$#a-1
, tetapi karena baris baru dari input perlu diabaikan, ini$#a-2
.Ini digabungkan dengan huruf pertama, dan kita selesai :)
sumber
Perl 5
-F
,737774 byteCobalah online!
sumber
Hello, World!
harus menghasilkanIBSLR, EGUFV!
, bukanIBSLR, XGUFV!
.PHP,
10698 bytecukup jahat satu itu ... jika tidak
base_convert
selama itu (atauctype_alpha
) ...tapi saya mendapatkannya di bawah 100. puas.
Jalankan sebagai pipa dengan
-nR
atau coba online .sumber
JavaScript (Node.js) ,
86838781 byteCobalah online!
sumber