암호화합시다!


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'는 각각 시작과 끝에서 6 번째 위치에 있기 때문에 'h'와 't'는 서로 동등합니다.

모음 / 숫자에 해당하는 동일한 절차를 따릅니다. 모든 모음 또는 숫자 (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 2012

@dylnan 추가했습니다.
Manish Kundu

호기심이 아닌 경우-암호 해독 절차를 설명 할 수 있습니까? 암호화 기능은 ROT13 알고리즘과 같이 자체 역 기능이 아닙니다. 따라서 암호화 된 데이터를 동일한 암호 프로 시저에 전달하면 원본 텍스트를 얻지 못합니다. 감사합니다
Agnius Vasiliauskas

1
@AgniusVasiliauskas :이를 수행하는 한 가지 방법은 다음과 같습니다. 동일한 문자 변환을 적용하십시오. 2 개의 암호 해독 문자열을 유지하십시오. 문자열을 왼쪽에서 오른쪽으로 반복합니다. 모음을 처리 할 때마다 첫 번째 문자열에 문자를 추가하고 두 번째 문자열 앞에 붙는 것 사이를 번갈아 가십시오. 끝에 문자열을 병합하십시오.
Emigna

3
머지 않아 이와 같은 암호 해독에 대한 도전이있을 것이며, 그 과정을 설명하려고 노력할 것입니다
Manish Kundu

답변:


4

자바 스크립트 (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되고 이후의 반복은 계속 사용 Array됩니다. oil!

원래 접근 방식 (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
)

온라인으로 사용해보십시오!

이번에는 자세한 명시 적 동사.

설명:

c=.(u:97+i.26) 리스트를 z로 만든다

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 결과를 반환


1

면도 , 221 206 198 190 186 178 바이트

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

온라인으로 사용해보십시오!


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

각 문자 클래스를 먼저 번역 한 다음 while 루프를 시작합니다. 루프에서 다음 문자를 출력하고 모음이 있으면 조건부 문자열의 나머지를 조건부로 반전시킵니다.

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.