복호화 기능

Sep 21 2020

암호화 된 문자열을 사용하여 특정 규칙에 따라 해독 한 다음 인쇄하는 프로그램을 작성해야합니다. 해독은 두 가지 작업을 수행하여 발생합니다.

샘플 입력 인수 1 (암호화 된 문자열)

HGJILKBADCFE

작업 1 :

문자열의 첫 번째 절반을 두 번째 절반으로 바꾸면 다음이 남습니다.

BADCFEHGJILK

작업 2 :

문자 1을 2로, 3을 4로 바꾸는 등 두 문자를 서로 바꾸면 해독 된 문자열이 남게됩니다.

ABCDEFGHIJKL

지침 :

  • 입력 인수 1에는 대문자 만 포함됩니다.

  • 입력 인수 1의 길이는 2 ~ 100 자 사이입니다.

  • 입력 인수 1의 길이는 항상 짝수입니다.

  • 가급적 입력은 명령 줄에서 가져옵니다 (아래처럼).

  • 또 다른 테스트 케이스 MPORQTSVUXWZYBADCFEHGJILKN는 입력이고 출력은ABCDEFGHIJKLMNOPQRSTUVWXYZ

나의 시도

import sys
_,a=sys.argv
b=len(a)//2
s=a[b:]+a[:b]
print(''.join(x+y for x,y in zip(s[1::2],s[::2])))

답변

5 Jonah Sep 21 2020 at 10:59

J , 15 바이트

[:,_2|.\-:@#|.]

온라인으로 시도하십시오!

공식의 간단한 구현.


약간 더 흥미로운 것은 (J 골프에는 도움이되지 않지만 다른 언어에는 도움이 될 수 있음) 알고리즘이 스캔 합계로 해결할 수 있다는 것입니다.

  1. 먼저 걸릴 1다음 -1 3으로, -1 3리스트의 길이까지 반복.
  2. 그 목록을 합산하십시오.
  3. 목록 길이의 절반으로 숫자를 회전합니다.
  4. 해당 번호에 따라 원본을 정렬하십시오.

J의 데모는 TIO를 참조하십시오.

5 Dingus Sep 21 2020 at 10:26

Ruby -p , 48 47 바이트

$_=$_[l= ~/$//2,l]+$_[0,l];gsub /(.)(.)/,'\2\1'

온라인으로 시도하십시오!

연산 1은 $_(입력을 포함하는 미리 정의 된 전역 변수) 길이가 같은 두 개의 하위 문자열로 분할 하여 처리됩니다 . ~/$/입력의 길이를 제공합니다. 그런 다음 gsub /(.)(.)/,'\2\1'각 문자 쌍을 교체하여 작업 2를 완료합니다. ( -p플래그를 사용하면 gsub수신자가 없으면 암시 적으로에서 작동합니다 $_.)

5 Lyxal Sep 21 2020 at 11:36

05AB1E , 13 12 바이트

D2äRJ2ι`s.ιJ

온라인으로 시도하십시오!

-1 @Kevin의 골프 팁 덕분에 다른 답변에서 보았습니다.

설명

D2äRJ2ι`s.ιJ
  • 입력 복제 ( D)
  • 2 개의 청크로 분할 ( 2ä)
  • 목록을 반대로하고 단일 문자열 ( RJ) 로 결합합니다.
  • 두 번째 문자 ( 2ι) 마다 해당 문자열을 인터리브 해제
  • 인터리브되지 않은 문자열의 모든 항목을 스택 (```)으로 푸시
  • 해당 항목 삽입 ( .ι)
  • 그리고 결과 목록 ( J)에 가입합니다.
5 Graham Sep 21 2020 at 14:15

APL + WIN, 24 22 바이트

-Jo King 덕분에 2 바이트

문자열 입력 프롬프트 :

,⌽n⍴⊖(⌽n←⌽2,.5×⍴s)⍴s←⎕

온라인으로 시도하십시오! Dyalog Classic 제공

5 DominicvanEssen Sep 21 2020 at 14:48

R , 78 80 79 바이트

편집 : 버그 발견을위한 Dingus 덕분에 +2 바이트, pajonk 덕분에 -1 바이트

n=nchar(s<-scan(,''));o=1:n;cat(substring(s,p<-(o+n/2-2+2*o%%2)%%n+1,p),sep='')

온라인으로 시도하십시오!

R 콘솔을 통해 제공되는 입력 (R 작업 공간의 '명령 줄'로 간주 될 수 있음).
R은 Rscript헬퍼 프런트 엔드를 사용하여 (R이 아닌) 셸에서 호출 할 수도 있습니다 . 이는 명령 줄 인수가 호출을 직접 따라갈 수 있도록합니다.이 경우 수정 된 프로그램은 87 바이트가 되고 Rscript decrypt.r HGJILKBADCFE.

디코딩 된 문자의 위치를 ​​계산 한 다음 재 배열 된 문자열을 출력합니다.

댓글 :

 n=nchar(                   # n = number of characters in...
         s<-scan(,''));     # s = the input.
 o=1:n;                     # o = sequence from 1 to n
 p=                         # p = positions of decoded characters:
   (o+n/2-1                 #   - reverse the first & second halves of o
                            #     by adding n/2-1
                            #     (will be fixed with final modulo below) 
         +2*o%%2-1)         #   - then add 2 at every odd position
                            #     and subtract 1 from all, so in effect
                            #     adding to odds & subtracting from evens
                   %%n      #   - all modulo n
                      +1    #   - add 1 to get 1-based indices
 cat(                       # output:
   substring(s,p,p),sep='') #   characters of s from positions p to p
3 HyperNeutrino Sep 21 2020 at 09:44

젤리 , 7 바이트

ŒHṚFs2U

온라인으로 시도하십시오!

7 바이트, ṙLH$s2U.

설명

ŒHṚFs2U  Main Link
ŒH       Split into two halves of similar length
  Ṛ      Reverse the order (swap the two halves)
   F     Flatten back into a single string
    s2   Slice into chunks of length 2
      U  Reverse each chunk
         Output is implicitly as one string

다른 하나 ṙ는 $( H현의 길이의 alf)에 의해 그것을 otates L하고 도전의 두 번째 부분에 대해 동일한 작업을 수행합니다.

3 Sisyphus Sep 21 2020 at 12:10

Python 3 , 75 바이트

요청한대로 정확히 : 명령 줄에서 입력, STDOUT에 출력.

import sys
_,s=sys.argv
i=1
while s[i:]:print(end=s[i-len(s)//2]);i+=3|i%-2

온라인으로 시도하십시오!


Python 2 , 52 바이트

함수를 사용할 수 있다면 :

f=lambda s,i=1:s[i:]and s[i-len(s)/2]+f(s,i+3-i%2*4)

온라인으로 시도하십시오!


이 모든 것의 개념은 \$i\$길이 문자열의 '번째 출력 문자 \$n\$ is :

$$ i - \frac{n}{2} + (-1)^i $$

일반적인 Python 인덱싱 의미 체계를 따릅니다. 이것을 반복적으로 다시 작성하면 \$i\$'번째 출력 문자는 다음과 같습니다.

$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3 - 4(i\%2) $$

특정 우선 순위로 더 짧습니다.

$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3|(i\%-2) $$

3 xnor Sep 21 2020 at 17:11

Python 2 , 50 바이트

f=lambda s,i=0:s[i:]and s[(i^1)-len(s)/2]+f(s,i+1)

온라인으로 시도하십시오!

Sisyphus 에서 아이디어를 빌려서 i출력 의 '번째 문자 (i^1)-len(s)/2는 입력 색인 에있는 문자 입니다. 여기서, i^1와 XOR이다 1마지막 비트 뒤집 및 교환하므로, 짝수 / 홀수 쌍 0<->1, 2<->3, 4<->5, ...

허용되지 않는 문자 목록을 출력하지만 동일한 길이에 대한 비재 귀적 대안이 있습니다.

lambda s:[s[(i^1)-len(s)/2]for i in range(len(s))]

온라인으로 시도하십시오!

3 Noodle9 Sep 21 2020 at 19:57

C (gcc) , 73 72 70 바이트

Dominic van Essen 덕분에 2 바이트 절약 !!!

i;l;f(char*s){for(i=1;(l=strlen(s))/i;)putchar(s[(i+l/2-++i%2*2)%l]);}

온라인으로 시도하십시오!

문자열을 입력하고 복호화를 출력합니다.

설명

인덱스 매핑 ( \ 에서 시작)$0\$끝까지), 입력 문자열의 \$s\$길이 \$l\$, \ 위로 이동하여 올바른 위치로 이동합니다.$\frac{l}{2}+1\$장소 후 다시 \$2\$이상한 인덱스의 경우. 이것을 사용하여 \$\mod{l}\$\ 의 올바른 색인을 제공합니다.$s\$ 다음 출력 문자를 위해.

3 nununoisy Sep 21 2020 at 23:39

JavaScript (Node.js) , 71 65 바이트

s=>(s.slice(l=s.length/2)+s.slice(0,l)).replace(/(.)(.)/g,'$2$1')

온라인으로 시도하십시오!

@Shaggy 덕분에 6 바이트가 절약되었습니다.

기존 71 바이트 솔루션 :

s=>(l=>s.slice(l)+s.slice(0,l))(s.length/2).replace(/(\w)(\w)/g,'$2$1')

여기에 아주 간단한 것- slice어쨌든 호출 을 둘러싸 야했기 때문에 내부 함수를 사용했습니다 -이것은 4 바이트를 절약합니다.

2 xash Sep 21 2020 at 16:34

Brachylog , 8 바이트

ḍ↔cġ₂↔ᵐc

온라인으로 시도하십시오!

작동 원리

ḍ↔cġ₂↔ᵐc
ḍ        split in two halves
 ↔       reverse
  c      join
   ġ₂    group with length two
     ↔ᵐ  reverse each
       c join 
1 aidan0626 Sep 21 2020 at 10:08

Python 3 , 91 바이트

a=input();x=len(a)//2;b=a[x:]+a[:x];c=''
for i in range(0,len(b),2):c+=b[i+1]+b[i]
print(c)

온라인으로 시도하십시오!

1 Razetime Sep 21 2020 at 11:05

Pip , 21 바이트

RV_M(JRV(a<>#a/2)<>2)

온라인으로 시도하십시오!

설명

RV_M(JRV(a<>#a/2)<>2)
        (a<>#a/2)     split input into parts of size length/2
     JRV              reverse the list, and join it to string
                 <>2  split the joined string into parts of size 2
RV_M                  reverse each of those parts
                      implicit output
1 ErikF Sep 21 2020 at 13:45

C (gcc) , 78 76 78 74 바이트

-4에 대한 Ceilingcat에게 감사드립니다!

편집 : 연산자 우선 순위 문제를 피하기 위해 OR 대신 더하기를 사용하도록 되돌 렸습니다.

문자열을 분할하는 대신 함수는 문자열의 중간에서 시작하여 처리 된 전체 문자열을 감 쌉니다. 다른 모든 문자를 뒤집기 위해 인덱스는 카운터의 1s 위치를 반전합니다.

f(s,i,j)char*s;{for(i=strlen(s),j=0;write(1,s+(i/2+j++/2*2+j%2)%i,j<i););}

온라인으로 시도하십시오!

프로그램이 반드시 명령 줄에서 가져와야하는 경우 : 82 바이트

main(i,s,j)char**s;{for(i=strlen(*++s),j=0;write(1,*s+(i/2+j++/2*2+j%2)%i,j<i););}

온라인으로 시도하십시오!

1 Razetime Sep 21 2020 at 17:16

Stax , 10 바이트

ü♠yαæ♠╟«ºñ

실행 및 디버그

정말 멋진 온라인 통역사입니다.

링크는 압축 해제 된 코드 버전입니다.

설명

;%h/r$2/Frp ; copy input % get it's length h halve it / split input into parts of that size r reverse $      join to string
      2/    split into parts of size 2
        F   for each element in the resulting array:
         rp reverse, and print without newline.
1 GalenIvanov Sep 21 2020 at 17:48

K (ngn / k) , 17 바이트

,/|'0N 2#,/|2 0N#

온라인으로 시도하십시오!

1 GalenIvanov Sep 21 2020 at 18:41

요소 , 89 바이트

: d ( s -- s ) halves swap [ >array ] bi@ append 2 group [ reverse ] map concat >string ;

온라인으로 시도하십시오!

1 Giuseppe Sep 21 2020 at 21:50

R , 64 63 바이트

m=matrix;intToUtf8(m(m(utf8ToInt(scan(,"")),,2)[,2:1],2)[2:1,])

온라인으로 시도하십시오!

한 바이트 골프를 쳤던 Dominic van Essen 과 는 다른 접근 방식 을 취했습니다. 역전을 수행하기 위해 매트릭스 모양 변경 / 인덱싱을 사용합니다.

미 골프 :

s <- utf8ToInt(scan(,""))		# read input and convert to a list of byte values
m <- matrix(s,,2)			# convert to a Nx2 matrix, filling down by columns
m <- m[,2:1]				# reverse the columns of the matrix (flip the halves)
m <- matrix(m,2)			# convert to an Nx2 matrix, filling down by the columns
m <- m[2:1,]				# reverse the rows (swap adjacent characters)
intToUtf8(m)				# convert back to string
1 nununoisy Sep 23 2020 at 03:28

bash + sed, 57 바이트

입력을 명령 줄 인수로받습니다.

<<<"${1:${#1}/2}${1:0:${#1}/2}" sed 's/\(.\)\(.\)/\2\1/g'

온라인으로 시도하십시오!

Mintable Sep 21 2020 at 15:44

Burlesque , 17 바이트

iRsa2./!!2co)<-++

온라인으로 시도하십시오!

기술:

iR               # Generate all rotations of the input string
  sa             # Duplicate and get length (which equals string length)
    2./          # Divide by two
       !!        # And grab the string that's been rotated that many times
         2co     # Split the rotated string into chunks of two
            <-   # Reverse each chunk
              ++ # Join together and implicitly output
Shaggy Sep 21 2020 at 15:48

Japt -P , 9 바이트

éUÊz)ò mw

시도 해봐

éUÊz)ò mw     :Implicit input of string U
é             :Rotate right by
 UÊ           :  Length of U
   z          :  Floor divided by 2
    )         :End rotate
     ò        :Partitions of length 2
       m      :Map
        w     :  Reverse
              :Implicitly join and output
Neil Sep 21 2020 at 16:49

차콜 , 13 바이트

⭆⪪⪫⮌⪪θ⊘Lθω²⮌ι

온라인으로 시도하십시오! 링크는 자세한 코드 버전입니다. 설명:

        θ       Input string
       L        Length
      ⊘         Halved
    ⪪θ          Split input string into substrings of this length
   ⮌            Reverse
  ⪫      ω      Join together
 ⪪        ²     Split into substrings of length 2
⭆               Map over substrings and join
            ι   Current substring
           ⮌    Reversed
                Implicitly print
Neil Sep 21 2020 at 17:00

Retina 0.8.2 , 36 바이트

((.)+?)((?<-2>.)+)$ $3$1 (.)(.) $2$1

온라인으로 시도하십시오! 설명 : 첫 번째 단계에서는 .NET 밸런싱 그룹을 사용하여 가능한 한 적은 $1수의 문자를에 일치시키면서 동일한 수의 문자를에 일치시킵니다 $3. $#2일치하는 각 문자에 대해 증가하고 일치하는 각 문자에 대해 $1감소 $3하지만 0 미만으로 감소 할 수 없으므로 $1문자열의 끝에 도달 할 수 있도록 문자열의 전반부를 소비해야합니다. 두 번째 단계는 인접한 캐릭터 쌍을 뒤집습니다. (또한 ASCII 아트 bewbs.)

KevinCruijssen Sep 21 2020 at 17:08

MathGolf , 10 바이트

h½/xy2/mx~

온라인으로 시도하십시오.

설명:

h           # Get the length of the (implicit) input-string (without popping)
            #  i.e. "HGJILKBADCFE" → "HGJILKBADCFE" and 12
 ½          # Halve this length
            #  → "HGJILKBADCFE" and 6
  /         # Split the string into parts of that size
            #  → ["HGJILK","BADCFE"]
   x        # Reverse this pair
            #  → ["BADCFE","HGJILK"]
    y       # Join it back together to a string
            #  → "BADCFEHGJILK"
     2/     # Split it into parts of size 2
            #  → ["BA","DC","FE","HG","JI","LK"]
       m    # Map over each pair:
        x   #  Reverse the pair
            #  → ["AB","CD","EF","GH","IJ","KL"]
         ~  # Pop and push all strings separated to the stack
            #  → "AB", "CD", "EF", "GH", "IJ", and "KL"
            # (after which the entire stack joined together is output implicitly)
            #  → "ABCDEFGHIJKL"
GalenIvanov Sep 21 2020 at 17:29

빨간색 , 89 바이트

func[s][move/part s tail s(length? s)/ 2
rejoin collect[foreach[b a]s[keep rejoin[a b]]]]

온라인으로 시도하십시오!

valsaysReinstateMonica Sep 21 2020 at 22:52

Lua , 67 바이트

a=...b=#a//2print(((a:sub(b+1)..a:sub(1,b)):gsub('(.)(.)','%2%1')))

온라인으로 시도하십시오!

먼저 sub함수를 사용하여 문자열을 두 개로 자른 다음 역순으로 다시 연결합니다. 그런 다음 gsub문자 쌍을 바꾸는 데 사용됩니다.

att Sep 22 2020 at 05:54

Wolfram 언어 (Mathematica) , 64 51 바이트

#[[#+UnitStep@#&@Array[#+(-1)^#&,L=Tr[1^#],-L/2]]]&

온라인으로 시도하십시오!

Sisyphus의 Python 솔루션 포트

EsolangingFruit Sep 22 2020 at 14:26

CJam , 13 바이트

q2/::\_,2//:\

온라인으로 시도하십시오!

NahuelFouilleul Sep 22 2020 at 17:07

Perl 5 -pF , 40 바이트

for$p("."x(@F/2),"."){s/($p)($p)/$2$1/g}

온라인으로 시도하십시오!

JosiahRyanW Sep 30 2020 at 18:31

시적 , 472 바이트

DECODING THINGS:A BRIEFING
o,o,hello!i am agent Q
nah,Q`s chosen by an infamous phoney
a misprint!oh,sorry!am i sorry
i am agent J.W,tech/A.I hacker
i see a piece o code,i am trying at a means on how i decode it
what i am doing:i am laying all A-Z clearly along a pathway
midway,put in zeros(O,O)cause J.W needs it to split em
i shift em in tandem,i get B,A
lastly,if it leaves you a letter,it is moved
o,then i am doing A-Z again,it is taken to a shift
ah ha!spying is EZ

온라인으로 시도하십시오!