Hãy mã hóa nó!


12

Thử thách

Thách thức là mã hóa một chuỗi nhất định, sử dụng các quy tắc như được chỉ định dưới đây. Chuỗi sẽ chỉ chứa bảng chữ cái chữ thường , chữ số và / hoặc khoảng trắng .

Tương đương của một nhân vật

Bây giờ, trước tiên bạn sẽ cần biết cách tìm "tương đương" của mỗi nhân vật.

Nếu ký tự là phụ âm, đây là cách tìm tương đương:

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.

ví dụ: 'h' và 't' là tương đương của nhau vì 'h', 't' ở vị trí thứ 6 từ đầu và cuối tương ứng.

Quy trình tương tự được thực hiện để tìm ra nguyên âm / chữ số tương đương. Bạn liệt kê tất cả các nguyên âm hoặc các chữ số (bắt đầu từ 0) theo thứ tự và tìm tương đương.

Đưa ra dưới đây là danh sách tương đương của tất cả các nhân vật:

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

Quy tắc mã hóa

1) Bạn bắt đầu di chuyển từ bên trái và đi về phía bên phải.

2) Nếu ký tự là một phụ âm / chữ số, thì tương đương của nó được lấy và nếu đó là một khoảng trắng, thì một khoảng trống được lấy.

3) Nếu ký tự là nguyên âm, bạn lấy nó tương đương và bắt đầu di chuyển theo hướng ngược lại. Ví dụ: nếu bạn đang di chuyển sang phải và gặp nguyên âm, hãy mã hóa ký tự đó sau đó bỏ qua ký tự không được mã hóa ngoài cùng bên phải và bắt đầu mã hóa theo hướng bên trái và ngược lại.

4) Bạn không nên xem xét một nhân vật ở cùng một vị trí hai lần. Các bước nên được theo dõi cho đến khi tất cả các ký tự trong đầu vào được bảo hiểm.

5) Tổng số ký tự trong đầu vào (bao gồm cả khoảng trắng) phải bằng tổng số ký tự trong đầu ra.

Xin lưu ý rằng các ký tự được mã hóa xuất hiện trong đầu ra theo thứ tự chúng được mã hóa.

Bây giờ hãy để tôi mã hóa một chuỗi cho bạn.

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"

Ví dụ

"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 "

Bạn cũng có thể chọn sử dụng bảng chữ cái viết hoa thay vì chữ thường.

Chấm điểm

Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng!


1
Bước 3 là một chút không rõ ràng liên quan đến chuyển hướng. Tôi nghĩ bạn nên nói điều gì đó như "Nếu bạn đang di chuyển sang phải và gặp nguyên âm, hãy mã hóa ký tự đó sau đó bỏ qua ký tự không được mã hóa ngoài cùng bên phải và bắt đầu mã hóa theo hướng bên trái." (Nếu đó là những gì bạn có ý nghĩa). Tôi nghĩ bạn cũng nên xác định rõ ràng rằng các ký tự được mã hóa xuất hiện trong đầu ra theo thứ tự chúng được mã hóa.
dylnan

@dylnan Thêm vào đó.
Manish Kundu

Chỉ tò mò - Bạn có thể mô tả quy trình giải mã không? Bởi vì chức năng mã hóa không phải là nghịch đảo của riêng nó (như trong ROT13 algo). Vì vậy, nếu chúng tôi chuyển dữ liệu được mã hóa vào cùng một quy trình mật mã - chúng tôi sẽ không nhận được văn bản gốc. Cảm ơn
Ag Pa Vasiliauskas

1
@AgniusVasiliauskas: Một cách làm sẽ là: Áp dụng các phép biến đổi nhân vật tương tự. Giữ 2 chuỗi giải mã. Vòng qua chuỗi từ trái sang phải. Thay thế giữa các ký tự nối vào chuỗi đầu tiên và thêm vào chuỗi thứ hai mỗi khi bạn xử lý nguyên âm. Hợp nhất các chuỗi ở cuối.
Biểu tượng

3
Sẽ sớm có một thử thách giải mã tương tự, trong đó tôi sẽ cố gắng giải thích quy trình
Manish Kundu

Câu trả lời:


4

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

-28 byte Cảm ơn 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

Hãy thử trực tuyến!

Trong lần lặp đầu tiên, Stringnó sẽ được thay đổi Arrayvà các lần lặp tiếp theo sẽ tiếp tục sử dụng Array. Võngà!

Cách tiếp cận gốc (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):"")

&không làm việc cho một số số nhưng &&làm việc. Cảm ơn.
Shieru Asakoto

Ồ vâng, tôi đã không tìm thấy một phương pháp để tối ưu hóa điều đó và bạn đã làm nó! Cảm ơn!
Shieru Asakoto

3
124 byte bằng cách sử dụng cùng một chuỗi cho tất cả các chữ cái và áp dụng thêm một số golf.
Arnauld

Wow rực rỡ! Tôi đã không nghĩ đến việc kết hợp các chuỗi AT ALL
Shieru Asakoto

q=="0"|+qthực tế là ngắn hơn 1 byte so với q>" "&&1/q.
Arnauld

3

05AB1E , 22 byte

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

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

žhžMžN)UvćXJXíJ‡D?žMsåiRlà những gì tôi đã nghĩ để cải thiện, nhưng không thể cắt XJXiJgiảm đủ.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Tôi cũng có một ý tưởng tương tự DJsíJmà cũng không hiệu quả lắm.
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);}

Hãy thử trực tuyến!


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
)

Hãy thử trực tuyến!

Một động từ rõ ràng dài dòng lần này.

Giải trình:

c=.(u:97+i.26) lập danh sách az

v=.'aeiou' lập danh sách các nguyên âm

-. loại bỏ các nguyên âm khỏi danh sách các chữ cái

d=.u:48+i.10 lập danh sách các chữ số

g=.;"0|. một động từ tiện ích để tạo một danh sách các cặp ký hiệu thay thế được đóng hộp

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

a=.'' một danh sách để lưu trữ kết quả

while.*#y do.a=.a,{.y rplc(g c),(g d),g v trong khi độ dài của danh sách> 0 lấy một ký hiệu, thay thế nó và nối nó vào kết quả

y=.|.^:({:a e.v)}.y thả một biểu tượng từ đầu danh sách và nếu biểu tượng là nguyên âm, đảo ngược danh sách

end.kết thúc whilevòng lặp

a trả về kết quả


1

Sạch , 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

Hãy thử trực tuyến!


0

Võng mạc , 78 byte

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

V`

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

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

Hoán đổi từng nhân vật với tương đương của nó.

/[aeiou]/{

Lặp lại trong khi một nguyên âm vẫn còn.

*>0L`.*?[aeiou]

Xuất văn bản lên nguyên âm.

0`.*?[aeiou]

Xóa văn bản lên nguyên âm.

V`

Đảo ngược văn bản còn lại. Khi không còn nguyên âm, đây sẽ là đầu ra hoàn toàn, tuy nhiên với mục đích của các trường hợp thử nghiệm, tiêu đề sẽ xuất văn bản ở cuối mỗi dòng.


0

Stax , 24 byte

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

Chạy nó

Đây là đại diện ascii của cùng một chương trình.

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

Nó dịch từng lớp ký tự trước, sau đó bắt đầu một vòng lặp while. Trong vòng lặp, nó xuất ký tự tiếp theo và đảo ngược điều kiện phần còn lại của chuỗi nếu gặp nguyên âm.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.