Mari Dekripsi!

Aug 22 2020

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

  1. Anda mulai dengan dua string kosong, sebut saja s1dan s2. Kami akan bergerak dari kiri ke kanan dari string input. Pada awalnya, kami akan mempertimbangkan string kosong pertama, yaitu s1. Kami akan beralih di antara dua string setiap kali kami menemukan vokal.

  2. 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 kanan s1 (jika kita sedang mempertimbangkan s1saat ini) atau di sebelah kiri s2 (jika kita sedang mempertimbangkan s2saat ini).

  3. Jika karakter itu adalah vokal, alihkan ke string lain sekarang ( s1 <-> s2).

  4. Ulangi langkah 2 (dan 3 untuk vokal) untuk setiap karakter dalam string input.

  5. Menggabungkan s1dan s2dan 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

5 JonathanAllan Aug 22 2020 at 02:48

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

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

Karakter baru bisa ditambahkan aatau ditambahkan ke b.

Kami beralih di antara adan bkapan pun indeksnya lebih besar dari 23 - yaitu cvokal.

4 JoeFerndz Aug 22 2020 at 16:44

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

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

2 DominicvanEssen Aug 27 2020 at 01:51

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

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!

KevinCruijssen Aug 24 2020 at 13:59

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

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!