Chức năng giải mã
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
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:
- Đầ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. - Quét tổng danh sách đó.
- Xoay các số bằng một nửa chiều dài danh sách.
- Sắp xếp bản gốc theo những con số đó.
Xem TIO để biết bản demo trong J.
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 $_.)
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)
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
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
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.
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) $$
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!
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.
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.
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
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!
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
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!
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.
K (ngn / k) , 17 byte
,/|'0N 2#,/|2 0N#
Hãy thử nó trực tuyến!
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!
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
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!
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
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
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
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.)
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"
Đỏ , 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!
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ự.
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
CJam , 13 byte
q2/::\_,2//:\
Hãy thử nó trực tuyến!
Perl 5 -pF , 40 byte
for$p("."x(@F/2),"."){s/($p)($p)/$2$1/g}
Hãy thử nó trực tuyến!
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!