해독하자!
노트
이것이 암호 해독 문제입니다. 암호화 문제는 여기 에서 찾을 수 있습니다 .
도전
과제는 아래 지정된 규칙을 사용하여 주어진 문자열을 해독하는 것입니다. 문자열에는 소문자 알파벳 , 숫자 및 / 또는 공백 만 포함 됩니다 . 입력 문자열이 어떻게 암호화되었는지 알고 싶다면 이 챌린지를 참조 하세요!
캐릭터와 동일
이제 먼저 각 문자의 "동등한"을 찾는 방법을 알아야합니다.
문자가 자음 인 경우 다음과 같은 방법으로 동일합니다.
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
복호화 규칙
두 개의 빈 문자열로 시작하여
s1및s2. 입력 문자열의 왼쪽에서 오른쪽으로 이동합니다. 처음에는 첫 번째 빈 문자열, 즉s1. 모음을 만날 때마다 두 문자열 사이를 전환합니다.입력 문자열의 현재 문자와 동일하거나 공백 인 경우 공백을 사용합니다. 이 캐릭터를라고합시다
c.c이제 오른쪽s1(s1현재 고려 중인 경우) 또는 왼쪽s2(s2현재 고려 중인 경우)에 추가됩니다.해당 문자가 모음이면 지금 다른 문자열로 전환하십시오 (
s1 <-> s2).입력 문자열의 모든 문자에 대해 2 단계 (모음의 경우 3 단계)를 반복합니다.
연결
s1하고s2결과는 해독 된 문자열입니다.
이제 문자열을 해독 해 보겠습니다.
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"
예
"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"
소문자 대신 대문자 알파벳을 사용하도록 선택할 수도 있습니다.
득점
이것은 code-golf 이므로 가장 짧은 코드가 이깁니다!
답변
젤리 , 29 바이트
ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2
디코딩 된 텍스트를 인쇄하는 전체 프로그램입니다.
온라인으로 시도하십시오!
어떻게?
ØḄ,ØẹØ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
자바 스크립트 (ES6) 112 110 109 바이트
문자 배열이 필요합니다.
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
온라인으로 시도하십시오!
어떻게?
c다음 조회 문자열에서 각 문자의 색인을 찾습니다.
0 1 2
012345678901234567890123456789
"bzcydxfwgvhtjskrlqmpnn aueoii"
문자가 없으면로 대체되는 숫자 여야합니다 9-c. 그렇지 않으면 인덱스의 최하위 비트를 반전하여 대응 문자의 위치를 얻습니다.
예 : j→ 12→ 13→s
새 문자는에 추가 a되거나 앞에 추가됩니다 b.
우리 사이를 전환 a하고 b지수가 23보다 큰 때마다 - 즉 c모음입니다.
Python, 226, 160146 바이트
온라인 시도
저는 파이썬을 처음 접했고이 도전을 해보고 싶었습니다. 람다 또는 단순화 된 코드를 사용하여 많은 부분을 개선 할 수 있다는 것을 알고 있습니다. 피드백을받을 수 있도록 코드를 보여주고 있습니다.
새로운 코딩 방법을 배우도록 도와 준 @Arnauld에게 감사드립니다. 이제 160 바이트
더 많은 입력 및 개선. 지금 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])
이전 코드 :
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')
모든 샘플 항목을 테스트하고 올바른 응답을 얻었습니다.
"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"
Retina 0.8.2 , 89 83 80 71 바이트
[aeiou]|$ $&¶
+`(¶.+)¶(.*)$ $2$1 O$^r`.\G
T`¶b-df-hj-maed\oup-tv-z_`Ro
온라인으로 시도하십시오! 링크에는 테스트 케이스가 포함됩니다. Retina 1이 필요하지 않고 Retina 0.8.2로 코딩 할 수 있다는 사실에서 알 수 있듯이 이것은 인코딩보다 쉬웠습니다. 설명 :
[aeiou]|$ $&¶
모음으로 끝나는 부분 문자열에 대한 입력을 분할합니다. 추가 분할은 문자열 끝에 강제로 두 개 이상의 행이 있도록합니다.
+`(¶.+)¶(.*)$ $2$1
첫 번째 줄은 모든 홀수 줄의 연결이고 두 번째 줄은 모든 짝수 줄의 연결이되도록 대체 줄을 함께 연결합니다.
r`.\G
마지막 (두 번째) 줄의 문자 만 일치시키는 중 ...
O$^`
.. 성냥을 뒤집어 두 번째 줄만 뒤집습니다.
T`¶b-df-hj-maed\oup-tv-z_`Ro
두 줄을 결합하고 글자를 해독하십시오. 는 Ro그 역에 음역에 문자열을 발생합니다. 중간 자음 n과 모음 i은 자신에게 매핑되므로 나열 할 필요가 없습니다. ¶특수에 대한지도는 _따라서 삭제. 첫 번째와 마지막 10 개의 자음과 첫 번째와 마지막 두 모음이 숫자를 둘러 쌉니다. ( o일반적으로 특별하므로 여기에 인용해야합니다.)
R , 190 바이트
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="")}
온라인으로 시도하십시오!
자기 메모 : 골프 텍스트 기반 도전에 대한 새로운 비 R 언어 학습 ...
댓글 :
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
C (GCC) , 144 (143) 140 바이트
-1-3 바이트
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];}
온라인으로 시도하십시오!
05AB1E , 27 26 바이트
žMIå0šÅ¡ι€S`R«žN‡žM‡žh‡
문자 목록으로 I / O.
온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 (I / O가 pretty-print에 결합 됨).
설명:
ž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)
Perl 5 -F , 110 바이트
map{push@{$o[$i]},y/0-9a-z/9876543210uzyxowvtisrqpnemlkjhagfdcb/r;$i^=/[aeiou]/}@F;say@{$o[0]},reverse@{$o[1]}
온라인으로 시도하십시오!