Mari Dekripsi!
Catatan
Ini adalah tantangan dekripsi. Tantangan enkripsi dapat ditemukan di sini .
Tantangan
Tantangannya adalah mendekripsi string yang diberikan, menggunakan aturan seperti yang ditentukan di bawah ini. String hanya akan berisi huruf kecil , angka , dan / atau spasi kosong . Jika Anda ingin tahu bagaimana string input telah dienkripsi, lihat tantangan ini!
Setara dengan Karakter
Sekarang, pertama-tama Anda perlu mengetahui cara menemukan "padanan" dari setiap karakter.
Jika karakter tersebut adalah konsonan, berikut cara menemukannya padanan:
1) List all the consonants in alphabetical order
b c d f g h j k l m n p q r s t v w x y z
2) Get the position of the consonant you are finding the equivalent of.
3) The equivalent is the consonant at that position when starting from the end.
Misalnya: 'h' dan 't' adalah ekuivalen satu sama lain karena 'h', 't' berada di posisi ke-6 dari awal dan akhir masing-masing.
Prosedur yang sama diikuti untuk menemukan padanan vokal / angka. Anda mencantumkan semua vokal atau angka (mulai dari 0) secara berurutan dan menemukan padanannya.
Diberikan di bawah ini adalah daftar padanan dari semua karakter:
b <-> z
c <-> y
d <-> x
f <-> w
g <-> v
h <-> t
j <-> s
k <-> r
l <-> q
m <-> p
n <-> n
a <-> u
e <-> o
i <-> i
0 <-> 9
1 <-> 8
2 <-> 7
3 <-> 6
4 <-> 5
Aturan Dekripsi
Anda mulai dengan dua string kosong, sebut saja
s1dans2. Kami akan bergerak dari kiri ke kanan dari string input. Pada awalnya, kami akan mempertimbangkan string kosong pertama, yaitus1. Kami akan beralih di antara dua string setiap kali kami menemukan vokal.Kami mengambil setara dengan karakter saat ini dari string input, atau spasi kosong jika itu adalah spasi kosong. Sebut saja karakter ini
c.csekarang ditambahkan di sebelah kanans1(jika kita sedang mempertimbangkans1saat ini) atau di sebelah kiris2(jika kita sedang mempertimbangkans2saat ini).Jika karakter itu adalah vokal, alihkan ke string lain sekarang (
s1 <-> s2).Ulangi langkah 2 (dan 3 untuk vokal) untuk setiap karakter dalam string input.
Menggabungkan
s1dans2dan hasilnya adalah string yang didekripsi.
Sekarang izinkan saya mendekripsi string untuk Anda.
String = "htioj ixej uy "
Initially, s1 = s2 = ""
Current: s1
Moving left to right
"h" -> "t" (s1 = "t")
"t" -> "h" (s1 = "th")
"i" -> "i" (s1 = "thi")
Vowel encountered. Switching to s2 now.
"o" -> "e" (s2 = "e")
Vowel encountered. Switching to s1 now.
"j" -> "s" (s1 = "this")
" " -> " " (s1 = "this ")
"i" -> "i" (s1 = "this i")
Vowel encountered. Switching to s2 now.
"x" -> "d" (s2 = "de") [Note that when dealing with s2, we append to the left]
"e" -> "o" (s2 = "ode")
Vowel encountered. Switching to s1 now.
"j" -> "s" (s1 = "this is"
" " -> " " (s1 = "this is ")
"u" -> "a" (s1 = "this is a")
Vowel encountered. Switching to s2 now.
"y" -> "c" (s2 = "code")
" " -> " " (s2 = " code")
Now, append s1 and s2 to get:
"this is a code"
Output -> "this is a code"
Contoh
"wqcjmc" -> "flyspy"
"toek" -> "hero"
"toyike" -> "heroic"
"uo" -> "ae"
"uoz" -> "abe"
"htoo jmuy" -> "the space"
"uh68v8x " -> "a d1g13t"
"fo78i d" -> "we xi12"
"htioj ixej uy " -> "this is a code"
"jea ceeac hnx8x vni kokhj jiuth xoqqc xohmcky" -> "so you really decrypted this string d1dnt you"
Anda juga dapat memilih untuk menggunakan huruf besar, bukan huruf kecil.
Penilaian
Ini adalah kode-golf , jadi kode terpendek menang!
Jawaban
Jelly , 29 byte
ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2
Program lengkap yang mencetak teks yang diterjemahkan.
Cobalah secara online!
Bagaimana?
ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2 - Main Link: list, S
ØḄ - consonant characters
Øẹ - vowel characters
, - pair
ØD - digit characters
ṭ - tack -> ["bcd...","aeiou","012..."]
$ - last two links as a monad: U - upend -> ["...dcb","uoiea","...210"] , - pair -> [["bcd...","aeiou","012..."],["...dcb","uoiea","...210"]] F€ - flatten each -> ["bcd...aeiou012...","...dcbuoiea...210"] y - translate S using that map µ - new monadic chain (i.e. f(A=that)) Øẹ - vowel characters e€ - (for c in A) exists in (vowels)? Ż - prepend a zero œṗ - partition (A) before truthy elements (of that) µ - new monadic chain (i.e. f(that)) ...e.g.: f(["thi","e","s i","do","s a","c "]) $ - last two links as a monad:
Ṛ - reverse ["c ","s a","do","s i","e","thi"]
U - upend [" c","a s","od","i s","e","iht"]
; - concatenate ["thi","e","s i","do","s a","c "," c","a s","od","i s","e","iht"]
m2 - mod-2 slice ["thi", "s i", "s a", ," c", "od", "e" ]
- implicit, smashing print -> this is a code
JavaScript (ES6), 112 110 109 bytes
Mengharapkan array karakter.
s=>s.map(c=>(C="bzcydxfwgvhtjskrlqmpnn aueoii",c=C[j=C.search(c)^1]||9-c,+s?b=c+b:a+=c,s^=j>23),a=b='')&&a+b
Cobalah secara online!
Bagaimana?
Kami mencari indeks setiap karakter cdalam string pencarian berikut:
0 1 2
012345678901234567890123456789
"bzcydxfwgvhtjskrlqmpnn aueoii"
Jika karakter tidak ditemukan, itu harus berupa digit yang diganti dengan 9-c. Jika tidak, kita mendapatkan posisi karakter pendamping dengan membalik indeks yang paling tidak signifikan.
Misalnya: j→ 12→ 13→s
Karakter baru bisa ditambahkan aatau ditambahkan ke b.
Kami beralih di antara adan bkapan pun indeksnya lebih besar dari 23 - yaitu cvokal.
Python, 226, 160146 byte
Cobalah secara Online
Saya cukup baru mengenal python dan ingin mencoba tantangan ini. Saya tahu banyak dari ini dapat ditingkatkan menggunakan lambda atau kode yang disederhanakan. Saya menunjukkan kode saya sehingga saya bisa mendapatkan umpan balik.
Terima kasih kepada @Arnauld karena telah membantu saya mempelajari cara baru untuk membuat kode. Sekarang 160 byte
Lebih banyak masukan dan penyempurnaan. Sekarang di 146.
def k(y):
x='aueoiibzcydxfwgvhtjskrlqmpnn0918273645 '
s=1
b=['']*2
for i in y:n=x.find(i);b[s]+=x[n+1-2*(n%2)];s^=n<6
print(b[1]+b[0][::-1])
Kode Lama:
def k(y):
x='aueoiibzcydxfwgvhtjskrlqmpnn0918273645 '
s=1
b=c=''
def a(t):
m=n+1 if n%2==0 else n-1;t+=x[m];return t
for i in y:
n=x.find(i)
if s:
b=a(b)
else:
c=a(c)
if n<=5:s=not s
b+=c[::-1]
print(b)
k('wqcjmc')
k('toek')
k('toyike')
k('uo')
k('uoz')
k('htoo jmuy')
k('uh68v8x ')
k('fo78i d')
k('htioj ixej uy ')
k('jea ceeac hnx8x vni kokhj jiuth xoqqc xohmcky')
Menguji semua item sampel dan mendapatkan respons yang benar.
"wqcjmc" -> "flyspy"
"toek" -> "hero"
"toyike" -> "heroic"
"uo" -> "ae"
"uoz" -> "abe"
"htoo jmuy" -> "the space"
"uh68v8x " -> "a d1g13t"
"fo78i d" -> "we xi12"
"htioj ixej uy " -> "this is a code"
"jea ceeac hnx8x vni kokhj jiuth xoqqc xohmcky" -> "so you really decrypted this string d1dnt you"
Retina 0.8.2 , 89 83 80 71 byte
[aeiou]|$ $&¶
+`(¶.+)¶(.*)$ $2$1 O$^r`.\G
T`¶b-df-hj-maed\oup-tv-z_`Ro
Cobalah secara online! Tautan termasuk kasus uji. Ini ternyata lebih mudah daripada pengkodean, seperti yang ditunjukkan oleh fakta bahwa saya dapat mengkodekannya di Retina 0.8.2 daripada memerlukan Retina 1. Penjelasan:
[aeiou]|$ $&¶
Pisahkan input pada substring yang diakhiri dengan vokal. Perpecahan ekstra dipaksa di ujung string sehingga setidaknya ada dua baris.
+`(¶.+)¶(.*)$ $2$1
Gabungkan garis-garis alternatif bersama-sama, sehingga garis pertama adalah rangkaian dari semua garis ganjil dan garis kedua adalah penggabungan semua garis genap.
r`.\G
Mencocokkan hanya karakter pada baris (kedua) terakhir ...
O$^`
.. membalikkan korek api, sehingga hanya membalik baris kedua.
T`¶b-df-hj-maed\oup-tv-z_`Ro
Gabungkan kedua baris tersebut dan dekode huruf-hurufnya. The Romenyebabkan string untuk mentransliterasi ke nya terbalik. Konsonan tengah ndan ipeta vokal untuk diri mereka sendiri jadi tidak perlu dicantumkan. The ¶peta untuk khusus _sehingga menghapusnya. Sepuluh konsonan pertama dan terakhir dan dua vokal pertama dan terakhir kemudian mengelilingi angka. ( oBiasanya hal itu istimewa sehingga harus dikutip di sini.)
R , 190 byte
function(i,`/`=strsplit){a=el(" 01234aeibcdfghjklmnpqrstvwxyziou98765 "/"")
names(a)=rev(a)
j=k=""
for(l in a[el(i/"")]){if(T)j=c(j,l)else k=c(l,k)
if(grepl(l,"aeiou"))T=!T}
cat(j,k,sep="")}
Cobalah secara online!
Catatan untuk diri sendiri: pelajari tantangan berbasis teks baru, non- R , bahasa ke golf ...
Berkomentar:
decrypt=function(i,
`/`=strsplit){ # use infix '/' as alias to strsplit function
a=el(" 01234aeibcdfghjklmnpqrstvwxyziou98765 "/"")
# a=vector of characters with equivalents at reverse index
names(a)=rev(a) # name characters by equivalent
j=k="" # initialize j,k as empty strings
for(l in a[el(i/"")]){ # for each input letter (split using /), find its equivalent l
if(T)j=c(j,l)else k=c(l,k) # if T=1 (initial value) append l to j, otherwise put it at start of k
if(grepl(l,"aeiou"))T=!T} # if it was a vowel, T=not T
cat(j,k,sep="")} # finally, output j,k
C (gcc) , 144 143 140 bytes
-1 -3 byte berkat ceilingcat
k,v,p,a;f(char*s,char*o){for(k=p=0,v=strlen(s);a=*s++;p^=1065233>>a-97&1)o[p?--v:k++]=a<33?a:a<58?105-a:"uzyxowvtisrqpnemlkjhagfdcb"[a-97];}
Cobalah secara online!
05AB1E , 27 26 byte
žMIå0šÅ¡ι€S`R«žN‡žM‡žh‡
I / O sebagai daftar karakter.
Cobalah secara online atau verifikasi semua kasus uji (dengan I / O bergabung dengan pretty-print).
Penjelasan:
žM # Push the vowels "aeiou"
Iå # Check for each character in the input-list if it's in the vowel string
# i.e. ["h","t","i","o","j"," ","i","x","e","j"," ","u","y"," "]
# → [0,0,1,1,0,0,0,1,0]
0š # Prepend a leading 0
# → [0,0,0,1,1,0,0,0,1,0]
Å¡ # Split the (implicit) input-string on the truthy values
# → [["h","t","i"],["o"],["j"," ","i"],["x","e"],["j"," ","u"],["y"," "]]
ι # Uninterleave the list of lists
# → [[["h","t","i"],["j"," ","i"],["j"," ","u"]],[["o"],["x","e"],["y"," "]]]
€S # Convert each inner list of lists to a flattened list of characters
# → [["h","t","i","j"," ","i","j"," ","u"],["o","x","e","y"," "]]
` # Push both lists of characters separated to the stack
# → ["h","t","i","j"," ","i","j"," ","u"] and ["o","x","e","y"," "]
R # Reverse the second string
# → ["h","t","i","j"," ","i","j"," ","u"] and [" ","y","e","x","o"]
« # Merge the two lists together
# → ["h","t","i","j"," ","i","j"," ","u"," ","y","e","x","o"]
žN # Push the consonants "bcdfghjklmnpqrstvwxyz"
 # Bifurcate it; short for Duplicate & Reverse copy
‡ # Transliterate the "bcdfghjklmnpqrstvwxyz" to "zyxwvtsrqpnmlkjhgfdcb"
# → ["t","h","i","s"," ","i","s"," ","u"," ","c","e","d","o"]
žM‡ # Do the same for the vowels "aeiou"
# → ["t","h","i","s"," ","i","s"," ","a"," ","c","o","d","e"]
žh‡ # And the digits "0123456789"
# → ["t","h","i","s"," ","i","s"," ","a"," ","c","o","d","e"]
# (after which the result is output implicitly)
Perl 5 -F , 110 byte
map{push@{$o[$i]},y/0-9a-z/9876543210uzyxowvtisrqpnemlkjhagfdcb/r;$i^=/[aeiou]/}@F;say@{$o[0]},reverse@{$o[1]}
Cobalah secara online!