pengantar
Enigma adalah salah satu mesin sandi rotor elektro-mekanis pertama yang digunakan dalam Perang Dunia II. Itu berarti bahwa setelah satu huruf dikodekan, itu akan mengubah kunci untuk huruf berikutnya. Ini dianggap tidak bisa dipecahkan oleh Jerman, karena ruang utama yang sangat besar. Bahkan pemaksaan kasar hampir tidak mungkin. Namun, ada kesalahan desain dalam Enigma. Mengenkripsi surat tidak akan pernah menghasilkan sendiri. Itu berarti bahwa surat itu A
dapat mengenkripsi ke setiap huruf kecuali surat itu A
.
Mari kita ambil contoh pesan kode:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
Kata khas Jerman adalah WETTERBERICHT
, atau laporan cuaca dalam bahasa Inggris. Dengan prinsip di atas, kita dapat menentukan di mana lokasi kata itu mungkin:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Ini tidak mungkin, karena I
tidak dapat dienkripsi ke dirinya sendiri, jadi kami pindah ke 1 tempat:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Ini juga tidak mungkin, jadi kami pindah lagi ke tempat lain:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Ini lagi tidak mungkin. Bahkan, kemungkinan yang pertama kali terjadi WETTERBERICHT
adalah:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
^
13
Jadi, kami mengembalikan posisi 0-diindeks dari kemungkinan pertama, yaitu 13 .
Tugas
- Diberikan pesan kode dan kata, cari indeks kemungkinan yang pertama kali muncul .
- Asumsikan bahwa hanya karakter alfabet huruf besar dasar yang akan digunakan (
ABCDEFGHIJKLMNOPQRSTUVWXYZ
). - Jika tidak ada kemunculan yang ditemukan, Anda dapat menampilkan bilangan bulat negatif , karakter, atau tidak sama sekali (misalnya
-1
,X
). - Masukan dapat diterima sebagai argumen, pada baris baru yang terpisah, daftar atau apa pun.
- Ini adalah kode-golf , jadi pengiriman dengan jumlah byte paling sedikit menang!
Uji kasus
Input: BHGEFXWFTIUPITHHLPETTTCLOEWOELM, WETTERBERICHT
Output: 13
Input: ABCDEFGHIJKL, HELLO
Output: 0
Input: EEEEEEEEEEEE, HELLO
Output: -1
Input: XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF, DEUTSCHLAND
Output: 11
Input: HKKH, JJJJJ
Output: -1
E
tidak akan pernah menghasilkanE
. Itulah yang menjadi tantangan seluruh ini.Jawaban:
Pyth, 14 byte
Saya tidak yakin apakah ini OK tetapi jika input tidak mungkin, tidak ada yang ditulis untuk stdout dan kesalahan pembagian nol ditulis ke stderr. Mengambil input pada 2 baris, yang kedua dikelilingi oleh tanda kutip.
Penjelasan:
Coba di sini!
sumber
JavaScript, 40
Dengan menggunakan
replace
, ini memetakan input plaintext ke dalam ekspresi reguler bentuk/[^H][^E][^L][^L][^O]/
(misalnya, untuk input plaintextHELLO
) dan kemudian menggunakansearch
untuk menguji indeks pertama dari substring ciphertext yang cocok dengan regex itu. Regex ini berarti "pola di mana karakter pertama tidakH
, karakter kedua tidakE
, dll."$&
adalah urutan khusus untukreplace
output yang menggantikan nilai yang cocok denganreplace
argumen pertama (dalam hal ini, setiap karakter tunggal cocok dengan/./
).sumber
$&
! Terima kasih telah mengajarkan sesuatu kepada saya hari ini.$'
dalam proses meneliti jawaban ini, yang menyediakan" bagian dari string yang mendahului / mengikuti substring yang cocok "Turing Machine Simulator - 15660 bytes (Tidak Bersaing)
Tidak dapat memiliki tantangan Enigma tanpa menggunakan kode mesin.
Uji di sini
Gambaran singkat:
sumber
SWI-Prolog, 115 byte
Contoh penggunaan:
a(`ABCDEFGHIJKL`,`HELLO`,R).
. Ini menggunakan string kode karakter yang dideklarasikan dengan backticks. Jawabannya disatukan denganR
. Jika tidak ada kecocokan yang ditemukan, ini menghasilkanfalse.
.Penjelasan:
Coba di sini
sumber
Ruby,
9179 byteMengutuk Anda,
Enumerator
! Mengapa saya harus mengkonversi dari string ke array ke Enumerator ke array dan membuang byte yang berharga? > :(sumber
[*...]
sebagai alternatif golf untuk #to_a adalah sentuhan yang bagus.CJam,
1716 byteCoba di sini .
Terima kasih kepada @PeterTaylor karena telah menghemat satu byte.
Penjelasan:
sumber
array block #
dapat menyelamatkan Anda char:ll:A,ew{A.=:+!}#
ew
(membuat irisan), yang lainnya hanya mengikuti.MATL , 27 byte
Contohnya
Penjelasan
sumber
Haskell, 72 byte
Penggunaan:
h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"
->11
.Pendekatan rekursif sederhana: jika kata
w
dapat ditempatkan di awal strings
, kembalikan penghitung indeksi
, ulangi dengani
kenaikan dan ekors
. Berhenti dan kembali-1
jika panjangnyas
kurang dari panjangw
.sumber
Python 2.7, 111 karakter
Mencoba semua posisi awal (a) dan memeriksa semua huruf yang cocok (menggunakan pemahaman daftar). Ia mengembalikan "Tidak Ada" (Python "NULL") jika tidak ada yang ditemukan (untuk loop berakhir dan tidak ada yang dikembalikan, yang secara default adalah "Tidak Ada".
Testsuite:
sumber
def d(c,s): for a in range(len(c)): if a not in[a+(c+s)[a+i:].index(l)for i,l in enumerate(s)]:return a
Brachylog , 48 byte
Ini adalah terjemahan langsung dari jawaban Prolog saya. The
brachylog_main/2
predikat dihasilkan mengharapkan daftar dua kode karakter string dengan string kode pertama sebagai masukan, dan mengembalikan indeks sebagai output, misalnyabrachylog_main([`ABCDEFGHIJKL`,`HELLO`],R).
.Penjelasan
sumber
Japt, 12 byte (tidak kompetitif)
Aku butuh bantuan untuk yang ini.
sumber
.search
? facepalmUàVr'."[^$&]
untuk 12.PHP - 155 byte
Simpan sebagai
crack.php
dan jalankan dengan argumen di baris perintah. Misalnya:sumber
for($r=-1;$i<strlen($p=$argv[1])-$l=strlen($q=$argv[2]);$i++)if(levenshtein($q,substr($p,$i,$l),2,1,2)==$l&&$r=$i)break;echo"$r↵";
levenshtein
, tapi mungkin iterasi langsung dalam iterasi bisa melakukannya dalam lebih sedikit byte.JavaScript,
129121118119 *118 bytew
adalah pesan kode,t
adalah string tes. Ini tidak menggunakan regex, tetapi hanya membandingkan huruf per huruf, menggeser string uji (yaitu "WETTERBERICHT") dengan menambahkan spasi sebelum itu. Mudah dan membosankan.* test case tanpa korek api tidak berfungsi, sekarang tidak berfungsi
sumber
𝔼𝕊𝕄𝕚𝕟, 14 karakter / 25 byte
Try it here (Firefox only).
Kudos to @apsillers untuk idenya.
Penjelasan
sumber
TeaScript, 14 byte
20Mirip dengan @aspillers, solusi JavaScript yang cerdas .
Non-bersaing karena ini menggunakan fitur yang dibuat setelah kontes ini.
Penjelasan
sumber
$&
bekerja di tempat${l}
?Ruby,
4336 bytesunting: Interpolasi string di dalam interpolasi string di dalam regex, ya.
Pendekatan malas: menerjemahkan kata ke regex "negatif" -
=~
Operator mengerjakan sisanya.Uji:
sumber
Python 3 , 79 byte
Cobalah online!
sumber
05AB1E , 14 byte
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Jolf , 14 byte
Coba di sini!
sumber
Perl, 38 + 1 = 39 byte
di mana input terlihat seperti:
Ini adalah ide yang sama dengan javascript.
sumber
Java, 136 Karakter
Solusi berbasis regex yang terinspirasi oleh versi JavaScript apsillers .
sumber
Brachylog (v2), 16 byte
Cobalah online!
Brachylog biasanya sangat pandai gagal ketika memecahkan sesuatu tidak mungkin.
Ini bukan salah satu dari waktu-waktu itu.
(mengambil input sebagai daftar
[message, word]
. Header mencetak semuanya dengan sangat bagus tetapi output dari predikat sebenarnya hanyalah angka jika berhasil)bʰ↙.Plᵐ≥₁∧Pz₁≠ᵐ∧
tampaknya berfungsi dengan baik untuk jumlah byte yang sama.sumber
C ++ (gcc) ,
160153150 byteCobalah online!
sumber
goto
dan tanpa semua bug ...Perl 5 , 46 byte
Menggunakan ide regex @apsillers.
Cobalah online!
sumber