Chức năng giải mã

Sep 21 2020

Bạn phải viết một chương trình lấy một chuỗi được mã hóa và giải mã nó theo các quy tắc cụ thể rồi in ra. Quá trình giải mã sẽ xảy ra bằng cách thực hiện hai thao tác.

Đối số đầu vào mẫu 1 (chuỗi được mã hóa)

HGJILKBADCFE

Hoạt động 1:

Trao đổi nửa đầu của chuỗi với nửa sau, sẽ để lại cho bạn:

BADCFEHGJILK

Hoạt động 2:

Trao đổi mỗi hai ký tự với nhau chẳng hạn như hoán đổi ký tự 1 với 2, 3 với 4, v.v., sẽ để lại cho bạn chuỗi được giải mã:

ABCDEFGHIJKL

Nguyên tắc:

  • Đối số đầu vào 1 sẽ chỉ chứa các chữ cái viết hoa

  • Độ dài của Đối số đầu vào 1 sẽ từ 2 đến 100 ký tự

  • Độ dài của Đối số 1 sẽ luôn là số chẵn

  • Tốt hơn là đầu vào sẽ được lấy từ dòng lệnh (như bên dưới).

  • Một Test Case khác MPORQTSVUXWZYBADCFEHGJILKNlà đầu vào, Đầu ra làABCDEFGHIJKLMNOPQRSTUVWXYZ

Nỗ lực của tôi

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])))

Trả lời

5 Jonah Sep 21 2020 at 10:59

J , 15 byte

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

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

Thực hiện đơn giản của công thức.


Điều thú vị hơn một chút (không hữu ích cho môn chơi gôn của J, nhưng có thể đối với một người khác) là thuật toán có thể được giải quyết bằng một tổng quét:

  1. Đầu tiên, 1tiếp theo là -1 3, -1 3lặp lại cho đến hết độ dài của danh sách.
  2. Quét tổng danh sách đó.
  3. Xoay các số bằng một nửa chiều dài danh sách.
  4. Sắp xếp bản gốc theo những con số đó.

Xem TIO để biết bản demo trong J.

5 Dingus Sep 21 2020 at 10:26

Ruby -p , 48 47 byte

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

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

Thao tác 1 được xử lý bằng cách tách $_(biến toàn cục được xác định trước có chứa đầu vào) thành hai chuỗi con có độ dài bằng nhau; ~/$/cho biết độ dài của đầu vào. Sau đó, gsub /(.)(.)/,'\2\1'hoàn thành Thao tác 2 bằng cách hoán đổi từng cặp ký tự. (Với -pcờ, gsubkhông có người nhận sẽ ngầm hành động $_.)

5 Lyxal Sep 21 2020 at 11:36

05AB1E , 13 12 byte

D2äRJ2ι`s.ιJ

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

-1 nhờ một mẹo chơi gôn của @Kevin mà tôi đã xem ở một câu trả lời khác

Giải thích

D2äRJ2ι`s.ιJ
  • Sao chép đầu vào ( D)
  • Chia nó thành 2 phần ( 2ä)
  • Đảo ngược danh sách và nối nó thành một chuỗi duy nhất ( RJ)
  • Bỏ lưu chuỗi đó trên mỗi ký tự thứ hai ( 2ι)
  • Đẩy tất cả các mục từ chuỗi chưa lưu vào ngăn xếp (`` `)
  • Xen kẽ các mục đó ( .ι)
  • Và tham gia danh sách kết quả ( J)
5 Graham Sep 21 2020 at 14:15

APL + THẮNG, 24 22 byte

-2 byte cảm ơn Jo King

Lời nhắc cho đầu vào của chuỗi:

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

Hãy thử nó trực tuyến! Được phép của Dyalog Classic

5 DominicvanEssen Sep 21 2020 at 14:48

R , 78 80 79 byte

Chỉnh sửa: +2 byte nhờ Dingus vì lỗi phát hiện và -1 byte nhờ pajonk

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

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

Đầu vào được cung cấp thông qua bảng điều khiển R (có thể được coi là 'dòng lệnh' cho không gian làm việc R).
R cũng có thể được gọi từ một shell (không phải R), sử dụng giao diện Rscriptngười dùng trợ giúp, cho phép các đối số dòng lệnh trực tiếp theo sau lệnh gọi, trong trường hợp đó, một chương trình đã sửa đổi có thể có kích thước 87 byte và được gọi bằng cách sử dụng Rscript decrypt.r HGJILKBADCFE.

Tính toán vị trí của các chữ cái được giải mã, sau đó xuất ra chuỗi được sắp xếp lại.

Đã nhận xét:

 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

Thạch , 7 byte

ŒHṚFs2U

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

Tương đương 7 byte , ṙLH$s2U.

Giải trình

Œ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

Người còn lại ṙxác định nó bằng $(độ bền Hcủa chuỗi L) và sau đó làm điều tương tự cho phần thứ hai của thử thách.

3 Sisyphus Sep 21 2020 at 12:10

Python 3 , 75 byte

Chính xác như đã hỏi: đầu vào từ dòng lệnh, đầu ra tới STDOUT.

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

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


Python 2 , 52 byte

Nếu chúng ta có thể sử dụng một hàm:

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

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


Ý tưởng của tất cả những điều này là chỉ mục của \$i\$'ký tự đầu ra trong một chuỗi có độ dài \$n\$ Là:

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

Tuân theo ngữ nghĩa lập chỉ mục Python thông thường. Nếu chúng ta viết lại điều này theo kiểu lặp đi lặp lại, thì \$i\$ký tự đầu ra thứ 'là:

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

Ngắn hơn với mức độ ưu tiên nhất định là:

$$ 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 byte

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

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

Mượn ý tưởng từ Sisyphus , iký tự thứ 'của đầu ra là ký tự ở chỉ mục (i^1)-len(s)/2của đầu vào. Dưới đây, i^1là XOR với 1, mà flips các bit cuối cùng và do đó giao dịch hoán đổi thậm chí / cặp lẻ 0<->1, 2<->3, 4<->5, ...

Đây là một giải pháp thay thế không đệ quy cho cùng độ dài, mặc dù nó xuất ra một danh sách các ký tự mà tôi không chắc là được phép.

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

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

3 Noodle9 Sep 21 2020 at 19:57

C (gcc) , 73 72 70 byte

Đã tiết kiệm 2 byte nhờ Dominic van Essen !!!

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

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

Nhập một chuỗi và xuất ra giải mã.

Giải trình

Lập bản đồ chỉ mục (bắt đầu từ \$0\$đến cuối), của chuỗi đầu vào, \$s\$chiều dài \$l\$, đến đúng vị trí bằng cách di chuyển nó qua \$\frac{l}{2}+1\$địa điểm và sau đó quay lại \$2\$cho các chỉ số lẻ. Sử dụng cái này \$\mod{l}\$đưa ra chỉ số chính xác của \$s\$ cho ký tự đầu ra tiếp theo.

3 nununoisy Sep 21 2020 at 23:39

JavaScript (Node.js) , 71 65 byte

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

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

Đã tiết kiệm 6 byte nhờ @Shaggy.

Giải pháp 71 byte ban đầu:

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

Những thứ khá đơn giản ở đây - tôi đã sử dụng một hàm bên trong vì slicedù sao thì tôi cũng phải bao quanh các cuộc gọi - điều này tiết kiệm 4 byte.

2 xash Sep 21 2020 at 16:34

Brachylog , 8 byte

ḍ↔cġ₂↔ᵐc

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

Làm thế nào nó hoạt động

ḍ↔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 byte

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)

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

1 Razetime Sep 21 2020 at 11:05

Pip , 21 byte

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

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

Giải trình

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 byte

Cảm ơn con mèo trần vì -4!

Chỉnh sửa: Hoàn nguyên để sử dụng phép cộng thay vì HOẶC để tránh các vấn đề về ưu tiên toán tử.

Thay vì chia nhỏ chuỗi, hàm bắt đầu ở giữa chuỗi và bao quanh toàn bộ chuỗi đã được xử lý. Để lật mọi ký tự khác, chỉ số sẽ đảo vị trí 1s của bộ đếm.

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););}

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

Nếu chương trình hoàn toàn phải lấy từ dòng lệnh: 82 byte

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););}

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

1 Razetime Sep 21 2020 at 17:16

Stax , 10 byte

ü♠yαæ♠╟«ºñ

Chạy và gỡ lỗi nó

Thật là một thông dịch viên trực tuyến tuyệt vời.

Liên kết là phiên bản mã được giải nén.

Giải trình

;%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 byte

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

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

1 GalenIvanov Sep 21 2020 at 18:41

Hệ số , 89 byte

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

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

1 Giuseppe Sep 21 2020 at 21:50

R , 64 63 byte

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

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

Thực hiện một cách tiếp cận khác với Dominic van Essen , người đã chơi gôn một byte. Sử dụng định hình lại / lập chỉ mục ma trận để thực hiện việc đảo ngược.

Không thích:

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 byte

Nhận đầu vào dưới dạng đối số dòng lệnh.

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

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

Mintable Sep 21 2020 at 15:44

Burlesque , 17 byte

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

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

Sự miêu tả:

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 byte

éUÊz)ò mw

Thử nó

é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

Than , 13 byte

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

Hãy thử nó trực tuyến! Liên kết là phiên bản dài của mã. Giải trình:

        θ       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 byte

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

Hãy thử nó trực tuyến! Giải thích: Giai đoạn đầu tiên sử dụng nhóm cân bằng .NET để khớp càng ít ký tự càng tốt $1trong khi vẫn khớp cùng một số ký tự vào $3. $#2số gia tăng cho mỗi ký tự được so khớp thành $1và giảm cho mỗi ký tự được so khớp thành $3nhưng nó không thể giảm xuống dưới 0, do đó, $1buộc phải sử dụng nửa đầu của chuỗi để cho phép đạt đến cuối chuỗi. Giai đoạn thứ hai sau đó lật các cặp ký tự liền kề. (Cũng là những người mê nghệ thuật ASCII.)

KevinCruijssen Sep 21 2020 at 17:08

MathGolf , 10 byte

h½/xy2/mx~

Hãy thử nó trực tuyến.

Giải trình:

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 byte

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

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

valsaysReinstateMonica Sep 21 2020 at 22:52

Lua , 67 byte

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

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

Đầu tiên, chuỗi được cắt thành hai bằng cách sử dụng các subhàm và sau đó được nối lại theo thứ tự ngược lại. Sau đó, gsubđược sử dụng để hoán đổi các cặp ký tự.

att Sep 22 2020 at 05:54

Ngôn ngữ Wolfram (Mathematica) , 64 51 byte

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

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

Cổng giải pháp Python của Sisyphus

EsolangingFruit Sep 22 2020 at 14:26

CJam , 13 byte

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

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

NahuelFouilleul Sep 22 2020 at 17:07

Perl 5 -pF , 40 byte

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

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

JosiahRyanW Sep 30 2020 at 18:31

Thơ , 472 byte

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

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