Mari Enkripsi Ini!

12

Tantangan

Tantangannya adalah mengenkripsi string yang diberikan, menggunakan aturan seperti yang ditentukan di bawah ini. String hanya akan berisi huruf kecil , digit , dan / atau spasi kosong .

Setara dengan Karakter

Sekarang, pertama Anda perlu tahu bagaimana menemukan "setara" dari setiap karakter.

Jika karakternya adalah konsonan, ini adalah cara untuk menemukan itu setara:

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 setara 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 / digit. Anda mencantumkan semua vokal atau digit (mulai dari 0) secara berurutan dan menemukan yang setara.

Diberikan di bawah ini adalah daftar yang setara 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 Enkripsi

1) Anda mulai bergerak dari kiri dan ke kanan.

2) Jika karakternya adalah konsonan / digit, maka ekuivalennya diambil dan jika itu adalah ruang kosong, maka ruang kosong diambil.

3) Jika karakternya adalah vokal, Anda mengambilnya setara dan mulai bergerak ke arah yang berlawanan. Misalnya, jika Anda bergerak ke kanan dan menemukan vokal, mengenkripsi karakter itu kemudian lompat ke karakter paling tidak terenkripsi dan mulai mengenkripsi di arah kiri, dan sebaliknya.

4) Anda tidak harus mempertimbangkan karakter di posisi yang sama dua kali. Langkah-langkah harus diikuti sampai semua karakter dalam input tercakup.

5) Jumlah total karakter dalam input (termasuk spasi kosong) harus sama dengan jumlah total karakter dalam output.

Harap dicatat bahwa karakter terenkripsi muncul dalam output sesuai urutan dienkripsi.

Sekarang izinkan saya mengenkripsi string untuk Anda.

String = "tre d1go3t is"
Moving left to right
"t" -> "h"
"r" -> "k"
"e" -> "o"
Vowel encountered. Now moving right to left.
"s" -> "j"
"i" -> "i"
Vowel encountered. Now moving left to right.
" " -> " "
"d" -> "x"
"1" -> "8"
"g" -> "v"
"o" -> "e"
Vowel encountered. Now moving right to left.
" " -> " "
"t" -> "h"
"3" -> "6"

Output -> "hkoji x8ve h6"

Contohnya

"flyspy" -> "wqcjmc"
"hero" -> "toek"
"heroic" -> "toyike"
"ae" -> "uo"
"abe" -> "uoz"
"the space" -> "htoo jmuy"
"a d1g13t" -> "uh68v8x "
"we xi12" -> "fo78i d"
"this is a code" -> "htioj ixej uy "

Anda juga dapat memilih untuk menggunakan huruf besar alih-alih huruf kecil.

Mencetak gol

Ini , jadi kode terpendek menang!

Manish Kundu
sumber
1
Langkah 3 agak tidak jelas sehubungan dengan beralih arah. Saya pikir Anda harus mengatakan sesuatu seperti "Jika Anda bergerak ke kanan dan menemukan vokal, mengenkripsi karakter itu kemudian lewati karakter paling tidak terenkripsi dan mulai mengenkripsi ke arah kiri." (Jika itu yang Anda maksud). Saya pikir Anda juga harus menentukan secara eksplisit bahwa karakter terenkripsi muncul di output dalam urutan di mana mereka dienkripsi.
dylnan
@dylnan Menambahkan itu.
Manish Kundu
Hanya ingin tahu - Bisakah Anda menggambarkan prosedur dekripsi? Karena fungsi enkripsi bukan kebalikannya sendiri (seperti pada ROT13 algo). Jadi jika kita meneruskan data terenkripsi ke prosedur sandi yang sama - kita tidak akan mendapatkan teks aslinya. Terima kasih
Agnius Vasiliauskas
1
@AgniusVasiliauskas: Salah satu cara untuk melakukannya adalah: Menerapkan transformasi karakter yang sama. Simpan 2 dekripsi string. Lingkarkan tali ke kiri-ke-kanan. Bergantian antara menambahkan karakter ke string pertama dan menambahkan ke yang kedua setiap kali Anda menangani vokal. Gabungkan string di bagian akhir.
Emigna
3
Akan segera ada tantangan dekripsi untuk hal yang sama, di mana saya akan mencoba menjelaskan prosesnya
Manish Kundu

Jawaban:

4

JavaScript (Node.js) , 173 ... 166 156 ... 124 123 byte

-28 byte Terima kasih Arnauld

f=([q,...s])=>q?(c="aeioubcdfghjklmpqrstvwxyz",t=c.search(q),q=="0"|+q?9-q:~t?c[(t<5?4:29)-t]:q)+f(~t&&t<5?s.reverse():s):s

Cobalah online!

Dalam iterasi pertama Stringakan diubah menjadi Array, dan iterasi selanjutnya akan terus digunakan Array. Voa!

Pendekatan Asli (166 byte):

f=(s,i=0,r=s.length,d=1,c="bcdfghjklmnpqrstvwxyz",v="aeiou")=>(d^=!!(t=~v.search(q=s[d?i:r])),q<"0"|q>"9"?c[20-c.search(q)]||v[5+t]||q:9-q)+(i<r-1?f(s,i+d,r-!d,d):"")
Shieru Asakoto
sumber
&tidak bekerja untuk beberapa angka tetapi &&berhasil. Terima kasih.
Shieru Asakoto
Oh ya, saya tidak menemukan metode untuk mengoptimalkan itu dan Anda berhasil! Terima kasih!
Shieru Asakoto
3
124 byte dengan menggunakan string yang sama untuk semua huruf dan menerapkan lebih banyak golf.
Arnauld
Wow, brilian! Saya tidak berpikir untuk menggabungkan string AT ALL
Shieru Asakoto
q=="0"|+qsebenarnya 1 byte lebih pendek dari q>" "&&1/q.
Arnauld
3

05AB1E , 22 byte

vćžN‡žM‡žh‡D?žMsåiR

Cobalah online! atau sebagai Test suite

Penjelasan

v                        # for each char in input
 ć                       # extract the head of the current string (initially input)
  žN‡                   # transform consonants
      žM‡               # transofrm vowels
          žh‡           # transform numbers
              D?         # print a copy of the current char
                žMsåi    # if the current char is a vowel
                     R   # reverse the rest of the string
Emigna
sumber
žhžMžN)UvćXJXíJ‡D?žMsåiRadalah apa yang saya pikirkan untuk perbaikan, tetapi tidak bisa mengurangi XJXiJcukup.
Magic Octopus Mm
@ MagicOctopusUrn: Saya punya ide serupa DJsíJyang juga tidak terlalu efektif.
Emigna
1

C, 196 byte

#define C(k,m)for(i=m;i--;)k[i]-c||putchar(k[m+~i],r^=m==5);
r;p(c,i){C("bcdfghjklmnpqrstvwxyz",21)C("0123456789",10)C("aeiou",5)C(" ",1)}f(S){char*s=S,*t=s+strlen(s);for(r=1;s<t;)p(r?*s++:*--t);}

Cobalah online!

Steadybox
sumber
1

J , 132 byte

f=:3 :0
c=.(u:97+i.26)-.v=.'aeiou'
d=.u:48+i.10
g=.;"0|.
a=.''
while.*#y do.a=.a,{.y rplc(g c),(g d),g v
y=.|.^:({:a e.v)}.y
end.a
)

Cobalah online!

Kata kerja eksplisit kata kerja kali ini.

Penjelasan:

c=.(u:97+i.26) membuat daftar az

v=.'aeiou' membuat daftar vokal

-. menghapus vokal dari daftar huruf

d=.u:48+i.10 membuat daftar digit

g=.;"0|. kata kerja utilitas untuk membuat daftar pasangan kotak simbol pengganti

   g d
┌─┬─┐
│0│9│
├─┼─┤
│1│8│
├─┼─┤
│2│7│
├─┼─┤
│3│6│
├─┼─┤
│4│5│
├─┼─┤
│5│4│
├─┼─┤
│6│3│
├─┼─┤
│7│2│
├─┼─┤
│8│1│
├─┼─┤
│9│0│
└─┴─┘

a=.'' daftar untuk menyimpan hasilnya

while.*#y do.a=.a,{.y rplc(g c),(g d),g v sedangkan panjang daftar adalah> 0 mengambil simbol, ganti dan tambahkan ke hasilnya

y=.|.^:({:a e.v)}.y letakkan satu simbol dari awal daftar dan jika simbol itu vokal, balik daftar

end.mengakhiri whileloop

a mengembalikan hasilnya

Galen Ivanov
sumber
1

Bersih , 221 206 198 190 186 178 byte

import StdEnv
r=reverse
l=['bcdfghjklm01234aeou56789pqrstvwxyz']
$s#(a,b)=span(\e=all((<>)e)['aeiou'])s
|s>[]=[j\\e<-a++b%(0,0),i<-['in ':l]&j<-['in ':r l]|e==i]++ $(init(r b))=s

Cobalah online!

Suram
sumber
0

Retina , 78 byte

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b
/[aeiou]/{*>0L`.*?[aeiou]
0`.*?[aeiou]

V`

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b

Tukar setiap karakter dengan padanannya.

/[aeiou]/{

Ulangi saat vokal tetap.

*>0L`.*?[aeiou]

Keluarkan teks hingga vokal.

0`.*?[aeiou]

Hapus teks hingga vokal.

V`

Balikkan teks yang tersisa. Ketika tidak ada vokal yang tersisa, ini kemudian secara implisit menghasilkan, namun untuk keperluan kasus uji, header mengeluarkan teks pada akhir setiap baris.

Neil
sumber
0

Stax , 24 byte

╥j•td╢Ä;Sµ*ûⁿvÉ╫î▓J o╩π╗

Menjalankannya

Berikut ini adalah representasi ascii dari program yang sama.

VcGVdGVvGwB]qVvs#!Hv*c}cr\$|t

Ini menerjemahkan masing-masing kelas karakter terlebih dahulu, kemudian memulai loop sementara. Dalam loop, ini menghasilkan karakter berikutnya, dan secara kondisional membalikkan sisa string jika sebuah vokal ditemukan.

VcG                             Push lowercase consonants and jump to trailing }
   VdG                          Push digits and jump to trailing }
      VvG                       Push lowercase vowels and jump to trailing }
         wB]qVvs#!Hv*c          While; run this block until popped value is falsy
          B]                    Split first character off string 
            q                   Output with no newline; keep on the stack
             Vvs#               1 if letter is a vowel, 0 otherwise
                 !Hv            Not, Double, then Decrement
                                    -1 for vowels, 1 otherwise
                    *           Multiply string. -1 causes reversal       
                     c          Copy value to be popped as while condition
                      }         Jump target from above.  Return when done.
                       cr\$     Copy, reverse, zip, and flatten.
                           |t   Translate: use string as a character map
                                    for replacements
rekursif
sumber