Şifresini Çözelim!

Aug 22 2020

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ı

  1. İki boş dizeyle başlıyorsunuz, onları arayalım s1ve s2. Giriş dizesinin soldan sağına doğru hareket edeceğiz. Başlangıçta, ilk boş dizgeyi, yani s1. Bir sesli harfle karşılaştığımızda iki dizge arasında geçiş yapacağız.

  2. 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ğında s1 (biz düşünüyorsanız s1şu anda) veya soluna s2 (biz düşünüyorsanız s2şu anda).

  3. Bu karakter bir sesli harf ise, şimdi diğer dizeye geçin ( s1 <-> s2).

  4. Giriş dizesindeki her karakter için 2. adımı (ve ünlüler için 3. adımı) tekrarlayın.

  5. Concatenate s1ve s2sonuç, ş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

5 JonathanAllan Aug 22 2020 at 02:48

Jöle , 29 bayt

ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2

Çözülmüş metni yazdıran tam bir program.

Çevrimiçi deneyin!

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
4 Arnauld Aug 22 2020 at 03:06

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

Çevrimiçi deneyin!

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: j1213s

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

4 JoeFerndz Aug 22 2020 at 16:44

Python, 226, 160 146 bayt

Çevrimiçi Deneyin

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"
2 Neil Aug 22 2020 at 06:50

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.)

2 DominicvanEssen Aug 27 2020 at 01:51

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="")}

Çevrimiçi deneyin!

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
2 gastropner Aug 22 2020 at 08:26

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];}

Çevrimiçi deneyin!

KevinCruijssen Aug 24 2020 at 13:59

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)
Xcali Sep 04 2020 at 05:45

Perl 5 -F , 110 bayt

map{push@{$o[$i]},y/0-9a-z/9876543210uzyxowvtisrqpnemlkjhagfdcb/r;$i^=/[aeiou]/}@F;say@{$o[0]},reverse@{$o[1]}

Çevrimiçi deneyin!