Berikut adalah huruf-huruf alfabet bahasa Inggris sesuai frekuensi:
e t a o i n s h r d l c u m w f g y p b v k j x q z
Artinya, e
adalah surat yang paling sering digunakan, dan z
merupakan yang paling tidak umum. (Data dari Wikipedia .)
Tantangan Anda adalah mengambil beberapa teks ber-ROT, seperti:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Ini adalah teks "thisisaverysecretmessagessatisethsveryureecafe dan safe" yang "dienkripsi" melalui ROT-21 (setengah dari 42). Program Anda, menggunakan tabel frekuensi di atas, harus dapat menentukan seberapa banyak setiap karakter diputar dan teks aslinya.
(Jika Anda tidak terbiasa dengan ROT-n, pada dasarnya mengubah setiap karakter dengan n
. Misalnya, dalam ROT-2 a -> c, b -> d, ..., x -> z, y -> a, z -> b
,.)
Bagaimana, Anda bertanya? Algoritma (sangat naif) yang harus Anda gunakan adalah:
- untuk setiap
n
dari0
ke25
inklusif, menerapkan ROT--n
ke string masukan. (Negatifn
karena kami ingin membalik enkripsi. ROT--n
setara dengan ROT-26-n
, jika itu lebih mudah.) - konversi setiap string input ke angka dengan menambahkan frekuensi relatif dari karakter.
e
is0
,t
is1
,a
is2
, etc. Misalnya, angka yang sesuai untuk string"hello"
adalah 7 + 0 + 10 + 10 + 3 = 30. - temukan string yang memiliki angka terkait terendah.
- output string itu dan yang sesuai
n
.
Aturan:
- input bisa masuk akal (STDIN, argumen fungsi, dari file, dll.), dan demikian juga dapat output (STDOUT, nilai pengembalian fungsi, ke file, dll.)
- Anda dapat menggunakan algoritma yang berbeda, asalkan selalu menghasilkan hasil yang identik. Misalnya, memiliki
z
0 dane
25 dan memilih angka tertinggi juga oke. - jika dua string memiliki skor yang identik, Anda dapat memilih untuk mengeluarkan salah satu (atau keduanya). Ini adalah kasus tepi dan Anda tidak harus menjelaskannya.
- ini kode-golf , jadi kode terpendek dalam byte akan menang!
Kasus uji:
Input: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Keluaran:21 thisisaverysecretmessagethatisverysecureandsafe
Input: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Keluaran:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Input: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Keluaran:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Input: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Keluaran:2 hereisthefinaltestcasethatyoumustdecrypt
Jika Anda bertanya-tanya, ini adalah JSFiddle dari kode uji JavaScript yang saya tulis, yang berhasil mendekripsi semua kasus uji yang saya berikan.
sumber
wtaad
harus memberi0 wtaad
sebagai hasilnya, danvszzc
harus memberi25 wtaad
sebagai hasilnya.Jawaban:
GolfScript - 87
Cheat di sini adalah membangun setiap rotasi secara bersamaan. Karena kita perlu mengulang setiap ROT kemudian setiap karakter, mari kita lewati semua karakter, iris seluruh alfabet, lalu rapatkan. Dari sana, lanjutkan seperti yang diharapkan: hitung skor untuk setiap ROT dan pilih minimum.
Golf ekstra:
Hanya sedikit bermain golf:
sumber
Haskell -
192175Lari
sumber
[1,1,1,1]
, dan ini akan memberikan urutan yang sama. Memetakan dan menjumlahkan kemudian menjadiconcatMap
yang dapat ditulis secara ringkas menggunakan daftar pemahaman. Dikombinasikan dengan beberapa trik lain, saya menyingkatnya menjadi 152 chars:main=interact(\s->snd$minimum[([1|x<-r,_<-fst$span(/=x)"etaoinshrdlcumwfgypbvkjxqz"],show(26-n)++' ':r)|n<-[0..25],r<-[[([x..'z']++['a'..])!!n|x<-s]]])
.GolfScript,
112108102100 karakterSaya tidak senang dengan pengulangan dengan mendekripsi ulang pada akhirnya, tapi meh.
Tidak digabungkan (jika itu masuk akal: P) dan versi yang sedikit lebih tua:
sumber
echo
menempatkan baris baru secara default, yang diambil oleh penerjemah.JavaScript (205)
Saya pikir masih bisa bermain golf sedikit lagi, jadi sarannya disambut!
Beberapa catatan membantu memahami solusinya
m
,,n
dano
lacak skor tertinggi.u
danw
melacak karakter dan hasil nilai, masing-masing untuk saat inii
(a+a)
membantu mencegah overflow ketika membungkus masa laluz
, dan lebih pendek daripada melakukannya%26
Bukti: http://jsfiddle.net/J9ZyV/5/
sumber
indexOf
variabel.C # + Linq -
273264Sebagai fungsi yang mengambil string input dan mengembalikan string yang di-decode & offset (sesuai kebutuhan):
Tidak dikoleksi dengan komentar:
Little test driver (ingat untuk mengkompilasi referensi
System.Core
untuk Linq):Memberi:
sumber
Tuple<string,int> d
Tuple<int,string>f(string x){return Enumerable.Range(0,25).Select(n=>Tuple.Create(26-n,string.Concat(x.Select(c=>(char)((c-97+n)%26+97))))).OrderBy(t=>(t.Item2.Select(c=>"etaoinshrdlcumwfgypbvkjxqz".IndexOf(c))).Sum()).First();}
Range(0, 26)
, bukan25
.dg -
137130129128 byteContoh:
Kode tidak dikunci:
sumber
c - 97
dan(0..26)
?dg
sebelumnya. Bisakah Anda memberikan tautan?J - 92 char
Sedikit bebek jelek, tapi berhasil. Menghasilkan angka dan kemudian string, pada dua baris.
Jika Anda ingin mereka berada di jalur yang sama, terpisah ruang, ini hanya mencapai 93 char , tetapi mengambil rute yang lebih buruk.
Penjelasan untuk
(/:'ctljapqhewvknfdsyigbmuoxrz')
: Dalam kata kerja ini, kami beroperasi pada nilai huruf sebagai A = 0, B = 1, C = 2, dll. Untuk menyandikan nilai huruf dari stringetaoinshrdlcumwfgypbvkjxqz
, cara terpendek sebenarnya adalah dengan mengambil permutasi sortir untuk ini string yang aneh. Ini karena A berada pada indeks 4, B pada indeks 19, C pada 0, D pada 14, dan seterusnya; maka permutasi semacam adalah4 19 0 14 8 13 ...
ketika Anda menilai (/:
) itu, dan Anda mendapatkan nilai angka untuketaoin...
.Pemakaian:
sumber
q, 97
.
sumber
APL - 70 karakter
Contoh:
Saya yakin ada cara untuk mengompres ini lebih lanjut, dan saya mengundang pengguna APL lain untuk mencari solusi untuk itu.
sumber
Python 188
sumber
Perl: 256 karakter (ditambah baris baru untuk keterbacaan) termasuk tabel frekuensi:
Teks disediakan seperti ini:
Lepaskan 12 char jika Anda ingin memanggang nilai ord (a) dan panjang @f
sumber
Elm - 465
Tidak akan memenangkan penghargaan golf apa pun, tetapi itu membuat halaman web statis yang menampilkan daftar formulir
[(rotation number, rotated string)]
saat Anda mengetik.Catatan: belum bekerja di sini tetapi Anda dapat menyalin-menempelkannya ke editor resmi dan menjalankannya.
sumber
Python 2, 171
sumber