Şifresini Çözelim!
Not
Bu, şifre çözme sorunudur. Şifreleme sorusu burada bulunabilir .
Meydan okuma
Buradaki zorluk, aşağıda belirtilen kuralları kullanarak belirli bir dizenin şifresini çözmektir. Dize yalnızca küçük harf , rakam ve / veya boşluk içerecektir . Giriş dizesinin nasıl şifrelendiğini öğrenmek istiyorsanız, bu soruna bakın !
Bir Karakterin Eşdeğeri
Şimdi, öncelikle her karakterin "eşdeğerini" nasıl bulacağınızı bilmeniz gerekir.
Karakter bir ünsüz ise, eşdeğerini bulmanın yolu budur:
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.
Örneğin: 'h' ve 't' birbirlerinin eşdeğerleridir çünkü 'h', 't' sırasıyla başlangıçtan ve sondan 6. pozisyondadır.
Ünlülerin / rakamların eşdeğerini bulmak için aynı prosedür izlenir. Tüm sesli harfleri veya rakamları (0'dan başlayarak) sırayla listeliyor ve eşdeğerini buluyorsunuz.
Aşağıda tüm karakterlerin karşılıklarının listesi verilmiştir:
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
Şifre Çözme Kuralları
İki boş dizeyle başlıyorsunuz, onları arayalım
s1ves2. Giriş dizesinin soldan sağına doğru hareket edeceğiz. Başlangıçta, ilk boş dizgeyi, yanis1. Bir sesli harfle karşılaştığımızda iki dizge arasında geçiş yapacağız.Girdi dizesinin o anki karakterinin eşdeğerini veya boşluksa bir boşluk alıyoruz. Bu karakteri arayalım
c.cŞimdi eklenir sağındas1(biz düşünüyorsanızs1şu anda) veya solunas2(biz düşünüyorsanızs2şu anda).Bu karakter bir sesli harf ise, şimdi diğer dizeye geçin (
s1 <-> s2).Giriş dizesindeki her karakter için 2. adımı (ve ünlüler için 3. adımı) tekrarlayın.
Concatenate
s1ves2sonuç, şifresi çözülmüş dizedir.
Şimdi sizin için bir dizenin şifresini çözmeme izin verin.
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"
Örnekler
"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"
Küçük harf yerine büyük harf kullanmayı da tercih edebilirsiniz.
Puanlama
Bu kod golf , bu yüzden en kısa kod kazanır!
Yanıtlar
Jöle , 29 bayt
ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2
Çözülmüş metni yazdıran tam bir program.
Nasıl?
ØḄ,ØẹØ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 bayt
Bir dizi karakter bekler.
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
Nasıl?
cAşağıdaki arama dizesinde her karakterin dizinini arıyoruz :
0 1 2
012345678901234567890123456789
"bzcydxfwgvhtjskrlqmpnn aueoii"
Karakter bulunamazsa, ile değiştirilen bir rakam olmalıdır 9-c. Aksi takdirde, endeksin en önemsiz bitini ters çevirerek karşı karakterin konumunu elde ederiz.
Örneğin: j→ 12→ 13→s
Yeni karakter ya eklenir aya da başına eklenir b.
Dizin 23'ten büyük olduğunda - yani bir sesli harf olduğunda, aralarında ave arasında geçiş yaparız .bc
Python, 226, 160 146 bayt
Python'da oldukça yeniyim ve bu zorluğu denemek istedim. Bunun çoğunun lambda veya basitleştirilmiş kod kullanılarak geliştirilebileceğini biliyorum. Geri bildirim alabilmek için kodumu gösteriyorum.
Yeni kodlama yollarını öğrenmeme yardımcı olduğu için @Arnauld'a teşekkürler. Şimdi 160 baytta
Daha fazla girdi ve iyileştirme. Şimdi 146'da.
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])
Eski Kod:
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')
Tüm örnek öğeleri test etti ve doğru yanıtı aldı.
"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 bayt
[aeiou]|$
$&¶
+`(¶.+)¶(.*)$
$2$1
O$^r`.\G
T`¶b-df-hj-maed\oup-tv-z_`Ro
Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Retina 1'i gerektirmek yerine Retina 0.8.2'de kodlayabildiğim gerçeğinin gösterdiği gibi, bu kodlamadan daha kolay oldu. Açıklama:
[aeiou]|$
$&¶
Sesli harflerle biten alt dizelere girişi bölün. En az iki satır olması için dizenin sonunda fazladan bir bölme zorlanır.
+`(¶.+)¶(.*)$
$2$1
Alternatif satırları birleştirin, böylece ilk satır tüm tek satırların birleşimi ve ikinci satır tüm çift satırların birleşimi olur.
r`.\G
Yalnızca son (ikinci) satırdaki karakterlerle eşleşiyor ...
O$^`
.. eşleşmeleri tersine çevirin, böylece yalnızca ikinci satırı tersine çevirin.
T`¶b-df-hj-maed\oup-tv-z_`Ro
İki satırı birleştirin ve harflerin kodunu çözün. RoOnun ters için transliterasyon dize neden olur. Ortadaki ünsüz nve sesli harf eşlemeleri ikendilerine ait olduğundan listelenmesi gerekmez. Spesiyale ait ¶haritalar _böylece silinir. İlk ve son 10 ünsüz ve ilk ve son iki ünlü daha sonra rakamları çevreler. ( oNormalde özeldir, bu yüzden burada alıntı yapılmalıdır.)
R , 190 bayt
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="")}
Kendime not: golf metin tabanlı zorluklar için yeni, R olmayan bir dil öğrenin ...
Yorum yaptı:
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 bayt
Tavan kedisi sayesinde -1 -3 bayt
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];}
05AB1E , 27 26 bayt
žMIå0šÅ¡ι€S`R«žN‡žM‡žh‡
Karakter listesi olarak G / Ç.
Çevrimiçi olarak deneyin veya tüm test senaryolarını doğrulayın (G / Ç oldukça baskıya katılarak).
Açıklama:
ž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 bayt
map{push@{$o[$i]},y/0-9a-z/9876543210uzyxowvtisrqpnemlkjhagfdcb/r;$i^=/[aeiou]/}@F;say@{$o[0]},reverse@{$o[1]}