มาเข้ารหัสมันกันเถอะ!


12

ท้าทาย

ความท้าทายคือการเข้ารหัสสตริงที่กำหนดโดยใช้กฎตามที่ระบุไว้ด้านล่าง สตริงจะมีตัวพิมพ์เล็กตัวอักษร , ตัวเลขและ / หรือช่องว่าง

เทียบเท่าตัวละคร

ตอนนี้ก่อนอื่นคุณต้องรู้วิธีการค้นหา "เทียบเท่า" ของตัวละครแต่ละตัว

หากตัวละครเป็นพยัญชนะนี่เป็นวิธีการค้นหาว่ามันเทียบเท่า:

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.

เช่น: 'h' และ 't' เทียบเท่ากันเพราะ 'h', 't' อยู่ในตำแหน่งที่ 6 ตั้งแต่เริ่มต้นและสิ้นสุดตามลำดับ

มีการปฏิบัติตามขั้นตอนเดียวกันเพื่อหาสระ / ตัวเลขที่เทียบเท่ากัน คุณแสดงรายการสระทั้งหมดหรือตัวเลข (เริ่มต้นจาก 0) ตามลำดับและค้นหาเทียบเท่า

รับด้านล่างเป็นรายการของการเทียบเท่าของตัวละครทั้งหมด:

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

กฎของการเข้ารหัส

1) คุณเริ่มเคลื่อนที่จากด้านซ้ายและไปทางขวา

2) หากตัวละครเป็นพยัญชนะ / หลักก็จะมีการเทียบเท่าและถ้ามันเป็นพื้นที่ว่างแล้วพื้นที่ว่างจะถูกนำมา

3) ถ้าตัวละครเป็นเสียงสระคุณจะเห็นว่ามันเทียบเท่าและเริ่มเคลื่อนที่ไปในทิศทางตรงกันข้าม ตัวอย่างเช่นหากคุณย้ายไปทางขวาและพบสระให้เข้ารหัสอักขระนั้นแล้วข้ามไปยังอักขระที่ไม่ได้เข้ารหัสขวาสุดและเริ่มเข้ารหัสในทิศทางด้านซ้ายและในทางกลับกัน

4) คุณไม่ควรพิจารณาตัวละครในตำแหน่งเดียวกันสองครั้ง ควรทำตามขั้นตอนจนกว่าจะครอบคลุมตัวละครทั้งหมดในอินพุต

5) จำนวนอักขระทั้งหมดในอินพุต (รวมถึงช่องว่าง) ควรเท่ากับจำนวนอักขระทั้งหมดในเอาต์พุต

โปรดทราบว่าอักขระที่เข้ารหัสปรากฏในผลลัพธ์ตามลำดับที่ถูกเข้ารหัส

ตอนนี้ให้ฉันเข้ารหัสสตริงสำหรับคุณ

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"

ตัวอย่าง

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

คุณอาจเลือกใช้ตัวอักษรตัวพิมพ์ใหญ่แทนตัวพิมพ์เล็ก

เกณฑ์การให้คะแนน

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ!


1
ขั้นตอนที่ 3 ค่อนข้างชัดเจนเกี่ยวกับการเปลี่ยนทิศทาง ฉันคิดว่าคุณควรพูดอะไรบางอย่างเช่น "ถ้าคุณเคลื่อนไหวไปทางขวาและพบเสียงสระเข้ารหัสตัวละครนั้นแล้วข้ามไปยังตัวอักษรที่ไม่ได้เข้ารหัสขวาสุดและเริ่มเข้ารหัสในทิศทางด้านซ้าย" (ถ้านั่นคือสิ่งที่คุณหมายถึง) ฉันคิดว่าคุณควรระบุอย่างชัดเจนว่าอักขระที่เข้ารหัสปรากฏในผลลัพธ์ตามลำดับที่เข้ารหัส
dylnan

@dylnan เพิ่มว่า
Manish Kundu

เพิ่งหมดความอยากรู้ - คุณสามารถอธิบายขั้นตอนการถอดรหัสได้หรือไม่? เนื่องจากฟังก์ชั่นการเข้ารหัสไม่ใช่ตัวผกผันของตัวเอง (เช่นใน ROT13 algo) ดังนั้นหากเราส่งข้อมูลที่เข้ารหัสไปยังขั้นตอนการเข้ารหัสเดียวกัน - เราจะไม่ได้รับข้อความต้นฉบับ ขอบคุณ
Agnius Vasiliauskas

1
@AgniusVasiliauskas: วิธีหนึ่งในการทำเช่นนั้นก็คือ: ใช้การแปลงอักขระแบบเดียวกัน เก็บ 2 สายถอดรหัส วนซ้ำสตริงจากซ้ายไปขวา สลับระหว่างตัวอักษรที่ต่อท้ายกับสตริงแรกและเติมที่สองทุกครั้งที่คุณจัดการสระ รวมสตริงที่ส่วนท้าย
Emigna

3
ในไม่ช้าจะมีความท้าทายในการถอดรหัสสำหรับสิ่งเดียวกันซึ่งฉันจะพยายามอธิบายกระบวนการ
Manish Kundu

คำตอบ:


4

JavaScript (Node.js) , 173 ... 166 156 ... 124 123 ไบต์

-28 ไบต์ขอบคุณ 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

ลองออนไลน์!

ในการย้ำแรกStringจะถูกเปลี่ยนไปและการทำซ้ำที่ตามมาจะยังคงใช้Array ArrayVoila!

วิธีการดั้งเดิม (166 ไบต์):

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

โอ้ใช่ฉันไม่พบวิธีในการปรับให้เหมาะสมแล้วคุณก็ทำได้! ขอบคุณ!
Shieru Asakoto

3
124 ไบต์โดยใช้สายอักขระเดียวกันสำหรับตัวอักษรทั้งหมดและใช้การตีกอล์ฟเพิ่มเติม
Arnauld

ว้าวยอดเยี่ยม! ฉันไม่คิดว่าจะรวมสตริงทั้งหมด
Shieru Asakoto

q=="0"|+qเป็นจริง 1 q>" "&&1/qไบต์สั้นกว่า
Arnauld

3

05AB1E , 22 ไบต์

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

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

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åiRเป็นสิ่งที่ฉันคิดว่าจะปรับปรุง แต่ก็ไม่สามารถตัดXJXiJทิ้งได้
Magic Octopus Urn

@ MagicOctopusUrn: ฉันมีความคิดคล้าย ๆ กันDJsíJซึ่งไม่มีประสิทธิภาพมากเช่นกัน
Emigna


1

J , 132 ไบต์

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
)

ลองออนไลน์!

verbose verb ชัดเจนในครั้งนี้

คำอธิบาย:

c=.(u:97+i.26) ทำให้รายการ az

v=.'aeiou' ทำให้รายการของสระ

-. ลบเสียงสระออกจากรายการตัวอักษร

d=.u:48+i.10 ทำให้รายการของตัวเลข

g=.;"0|. กริยายูทิลิตี้สำหรับสร้างรายการสัญลักษณ์การเปลี่ยนคู่ชนิดบรรจุกล่อง

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

a=.'' รายการเพื่อเก็บผลลัพธ์

while.*#y do.a=.a,{.y rplc(g c),(g d),g v ในขณะที่ความยาวของรายการคือ> 0 ใช้สัญลักษณ์แทนที่มันและผนวกเข้ากับผลลัพธ์

y=.|.^:({:a e.v)}.y วางสัญลักษณ์หนึ่งอันจากจุดเริ่มต้นของรายการและถ้าสัญลักษณ์นั้นเป็นสระให้กลับรายการ

end.จบwhileห่วง

a ส่งคืนผลลัพธ์



0

เรติน่า , 78 ไบต์

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

V`

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

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

สลับแต่ละตัวละครด้วยความเท่าเทียมกัน

/[aeiou]/{

ทำซ้ำในขณะที่สระยังคงอยู่

*>0L`.*?[aeiou]

เอาท์พุทข้อความถึงสระ

0`.*?[aeiou]

ลบข้อความจนถึงสระ

V`

ย้อนกลับข้อความที่เหลือ เมื่อไม่มีเสียงสระเหลืออยู่นี่เป็นผลลัพธ์โดยปริยายอย่างไรก็ตามสำหรับวัตถุประสงค์ของกรณีทดสอบส่วนหัวจะแสดงข้อความที่ท้ายบรรทัดแต่ละบรรทัด


0

Stax , 24 ไบต์

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

เรียกใช้

นี่คือการแสดง ascii ของโปรแกรมเดียวกัน

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

มันแปลคลาสตัวละครแต่ละตัวก่อนจากนั้นก็เริ่มห่วงขณะ ในลูปมันจะออกอักขระตัวถัดไปและย้อนกลับเงื่อนไขที่เหลือของสตริงหากพบเสียงสระ

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.