ฟังก์ชันถอดรหัส
คุณต้องเขียนโปรแกรมที่รับสตริงที่เข้ารหัสและถอดรหัสตามกฎเฉพาะจากนั้นพิมพ์ออกมา การถอดรหัสจะเกิดขึ้นโดยการดำเนินการสองอย่าง
ตัวอย่างอาร์กิวเมนต์อินพุต 1 (สตริงที่เข้ารหัส)
HGJILKBADCFE
ปฏิบัติการ 1:
สลับครึ่งแรกของสตริงกับครึ่งหลังซึ่งจะทำให้คุณได้รับสิ่งต่อไปนี้
BADCFEHGJILK
ปฏิบัติการ 2:
สลับทุกอักขระสองตัวซึ่งกันและกันเช่นการสลับอักขระ 1 กับ 2, 3 กับ 4 เป็นต้นซึ่งจะทำให้คุณมีสตริงที่ถอดรหัสแล้ว:
ABCDEFGHIJKL
แนวทาง:
Input Argument 1 จะมีเฉพาะตัวอักษรตัวพิมพ์ใหญ่
ความยาวของ Input Argument 1 จะอยู่ระหว่าง 2 ถึง 100 อักขระ
ความยาวของ Input Argument 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])))
คำตอบ
J , 15 ไบต์
[:,_2|.\-:@#|.]
ลองออนไลน์!
การใช้สูตรอย่างตรงไปตรงมา
สิ่งที่น่าสนใจกว่าเล็กน้อย (ไม่เป็นประโยชน์สำหรับการเล่นกอล์ฟ J แต่อาจเป็นภาษาอื่น) คืออัลกอริทึมสามารถแก้ไขได้ด้วยผลรวมการสแกน:
- ขั้นแรกให้
1ทำตาม-1 3ด้วย-1 3ซ้ำจนถึงความยาวของรายการ - สแกนรวมรายการนั้น
- หมุนตัวเลขครึ่งหนึ่งของความยาวรายการ
- จัดเรียงต้นฉบับตามตัวเลขเหล่านั้น
ดู TIO สำหรับการสาธิตใน J.
ทับทิม -p , 48 47 ไบต์
$_=$_[l= ~/$//2,l]+$_[0,l];gsub /(.)(.)/,'\2\1'
ลองออนไลน์!
การดำเนินการ 1 ได้รับการจัดการโดยการแยก$_(ตัวแปรส่วนกลางที่กำหนดไว้ล่วงหน้าซึ่งมีอินพุต) เป็นสองสตริงย่อยที่มีความยาวเท่ากัน ~/$/ให้ความยาวของอินพุต จากนั้นgsub /(.)(.)/,'\2\1'ดำเนินการที่ 2 ให้เสร็จสมบูรณ์โดยการสลับตัวละครแต่ละคู่ (ด้วย-pแฟล็กgsubโดยไม่มีผู้รับดำเนินการโดยปริยาย$_)
05AB1E , 13 12 ไบต์
D2äRJ2ι`s.ιJ
ลองออนไลน์!
-1 ขอบคุณเคล็ดลับการเล่นกอล์ฟโดย @Kevin ฉันเห็นคำตอบอื่น
อธิบาย
D2äRJ2ι`s.ιJ
- ทำสำเนาอินพุต (
D) - แบ่งออกเป็น 2 ชิ้น (
2ä) - ย้อนกลับรายการและรวมเป็นสตริงเดียว (
RJ) - คลายสตริงนั้นในทุกอักขระที่สอง (
2ι) - ดันรายการทั้งหมดจากสตริงที่ไม่ได้รับการบันทึกลงบนสแต็ก (`` `)
- แทรกรายการเหล่านั้น (
.ι) - และเข้าร่วมรายการผลลัพธ์ (
J)
APL + WIN 24 22 ไบต์
-2 ไบต์ขอบคุณ Jo King
พร้อมต์สำหรับการป้อนสตริง:
,⌽n⍴⊖(⌽n←⌽2,.5×⍴s)⍴s←⎕
ลองออนไลน์! ได้รับความอนุเคราะห์จาก Dyalog Classic
R , 78 80 79 ไบต์
แก้ไข: +2 ไบต์ขอบคุณ Dingus สำหรับการตรวจจับจุดบกพร่องและ -1 ไบต์ด้วย pajonk
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 ยังสามารถเรียกจาก (ไม่ใช่-R) เปลือกใช้Rscriptผู้ช่วย front-end ซึ่งจะช่วยให้การขัดแย้งบรรทัดคำสั่งที่จะปฏิบัติตามโดยตรงโทรซึ่งในกรณีนี้เป็นโปรแกรมที่มีการปรับเปลี่ยนอาจจะเป็น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
เยลลี่ 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
อีกอันหนึ่งṙจะเริ่มต้นโดย$( Half of the string's Length) จากนั้นทำสิ่งเดียวกันสำหรับส่วนที่สองของการท้าทาย
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\$ คือ:
$$ 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) $$
Python 2 , 50 ไบต์
f=lambda s,i=0:s[i:]and s[(i^1)-len(s)/2]+f(s,i+1)
ลองออนไลน์!
ยืมความคิดจากโกเม่ที่i'ตัวละครของการส่งออกวันที่เป็นตัวละครที่ดัชนี(i^1)-len(s)/2ของท่าน นี่i^1เป็นแฮคเกอร์ด้วย1ซึ่งพลิกบิตสุดท้ายและเพื่อแลกเปลี่ยนแม้ / คู่แปลก0<->1, 2<->3, 4<->5...
นี่เป็นทางเลือกที่ไม่เรียกซ้ำสำหรับความยาวเท่ากันแม้ว่าจะแสดงรายการอักขระที่ฉันไม่แน่ใจว่าได้รับอนุญาต
lambda s:[s[(i^1)-len(s)/2]for i in range(len(s))]
ลองออนไลน์!
C (gcc) , 73 72 70 ไบต์
บันทึก 2 ไบต์ขอบคุณDominic van Essen !!!
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\$ สำหรับอักขระเอาต์พุตถัดไป
JavaScript (Node.js) ,
71
65 ไบต์
s=>(s.slice(l=s.length/2)+s.slice(0,l)).replace(/(.)(.)/g,'$2$1')
ลองออนไลน์!
บันทึก 6 ไบต์ขอบคุณ @Shaggy
โซลูชัน 71 ไบต์ดั้งเดิม:
s=>(l=>s.slice(l)+s.slice(0,l))(s.length/2).replace(/(\w)(\w)/g,'$2$1')
สิ่งที่sliceค่อนข้างง่ายที่นี่ - ฉันใช้ฟังก์ชันภายในเพราะฉันต้องล้อมรอบการโทรอยู่แล้ว - ซึ่งจะช่วยประหยัด 4 ไบต์
Brachylog , 8 ไบต์
ḍ↔cġ₂↔ᵐc
ลองออนไลน์!
มันทำงานอย่างไร
ḍ↔cġ₂↔ᵐc
ḍ split in two halves
↔ reverse
c join
ġ₂ group with length two
↔ᵐ reverse each
c join
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)
ลองออนไลน์!
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
C (gcc) , 78 76 78 74 ไบต์
ขอบคุณ ceilingcat สำหรับ -4!
แก้ไข: เปลี่ยนกลับไปใช้การเพิ่มแทน 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););}
ลองออนไลน์!
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.
K (ngn / k) , 17 ไบต์
,/|'0N 2#,/|2 0N#
ลองออนไลน์!
แฟคเตอร์ 89 ไบต์
: d ( s -- s ) halves swap [ >array ] bi@ append 2 group [ reverse ] map concat >string ;
ลองออนไลน์!
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
bash + sed, 57 ไบต์
รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
<<<"${1:${#1}/2}${1:0:${#1}/2}" sed 's/\(.\)\(.\)/\2\1/g'
ลองออนไลน์!
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
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
ถ่าน 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
Retina 0.8.2 , 36 ไบต์
((.)+?)((?<-2>.)+)$ $3$1 (.)(.) $2$1
ลองออนไลน์! คำอธิบาย: ขั้นตอนแรกใช้ .NET สมดุลกลุ่มจะมีการแข่งขันเป็นตัวละครน้อยที่สุดเข้ามาในขณะที่ยังคงตรงกับหมายเลขเดียวกันของตัวละครเข้าไปใน$1 การเพิ่มขึ้นสำหรับแต่ละอักขระที่จับคู่และลดลงสำหรับอักขระแต่ละตัวที่จับคู่แต่ไม่สามารถลดลงต่ำกว่าศูนย์ได้ดังนั้นจึงถูกบังคับให้ใช้ครึ่งแรกของสตริงเพื่อให้ถึงจุดสิ้นสุดของสตริง ขั้นตอนที่สองจะพลิกคู่ของอักขระที่อยู่ติดกัน (รวมถึงศิลปะ ASCII ด้วย)$3$#2$1$3$1
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"
สีแดง 89 ไบต์
func[s][move/part s tail s(length? s)/ 2
rejoin collect[foreach[b a]s[keep rejoin[a b]]]]
ลองออนไลน์!
Lua , 67 ไบต์
a=...b=#a//2print(((a:sub(b+1)..a:sub(1,b)):gsub('(.)(.)','%2%1')))
ลองออนไลน์!
ขั้นแรกสตริงจะถูกตัดออกเป็นสองส่วนโดยใช้subฟังก์ชันจากนั้นต่อกลับในลำดับย้อนกลับ จากนั้นgsubใช้เพื่อสลับคู่ของอักขระ
ภาษา Wolfram (Mathematica) , 64 51 ไบต์
#[[#+UnitStep@#&@Array[#+(-1)^#&,L=Tr[1^#],-L/2]]]&
ลองออนไลน์!
พอร์ตของโซลูชัน Python ของ Sisyphus
CJam , 13 ไบต์
q2/::\_,2//:\
ลองออนไลน์!
Perl 5 -pF , 40 ไบต์
for$p("."x(@F/2),"."){s/($p)($p)/$2$1/g}
ลองออนไลน์!
บทกวี 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
ลองออนไลน์!