ฟังก์ชันถอดรหัส

Sep 21 2020

คุณต้องเขียนโปรแกรมที่รับสตริงที่เข้ารหัสและถอดรหัสตามกฎเฉพาะจากนั้นพิมพ์ออกมา การถอดรหัสจะเกิดขึ้นโดยการดำเนินการสองอย่าง

ตัวอย่างอาร์กิวเมนต์อินพุต 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])))

คำตอบ

5 Jonah Sep 21 2020 at 10:59

J , 15 ไบต์

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

ลองออนไลน์!

การใช้สูตรอย่างตรงไปตรงมา


สิ่งที่น่าสนใจกว่าเล็กน้อย (ไม่เป็นประโยชน์สำหรับการเล่นกอล์ฟ J แต่อาจเป็นภาษาอื่น) คืออัลกอริทึมสามารถแก้ไขได้ด้วยผลรวมการสแกน:

  1. ขั้นแรกให้1ทำตาม-1 3ด้วย-1 3ซ้ำจนถึงความยาวของรายการ
  2. สแกนรวมรายการนั้น
  3. หมุนตัวเลขครึ่งหนึ่งของความยาวรายการ
  4. จัดเรียงต้นฉบับตามตัวเลขเหล่านั้น

ดู TIO สำหรับการสาธิตใน J.

5 Dingus Sep 21 2020 at 10:26

ทับทิม -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 ไบต์

-2 ไบต์ขอบคุณ Jo King

พร้อมต์สำหรับการป้อนสตริง:

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

ลองออนไลน์! ได้รับความอนุเคราะห์จาก Dyalog Classic

5 DominicvanEssen Sep 21 2020 at 14:48

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

อีกอันหนึ่งṙจะเริ่มต้นโดย$( Half of the string's Length) จากนั้นทำสิ่งเดียวกันสำหรับส่วนที่สองของการท้าทาย

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\$ คือ:

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

ลองออนไลน์!

ยืมความคิดจากโกเม่ที่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))]

ลองออนไลน์!

3 Noodle9 Sep 21 2020 at 19:57

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\$ สำหรับอักขระเอาต์พุตถัดไป

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

ลองออนไลน์!

บันทึก 6 ไบต์ขอบคุณ @Shaggy

โซลูชัน 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 ไบต์

ขอบคุณ 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););}

ลองออนไลน์!

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 การเพิ่มขึ้นสำหรับแต่ละอักขระที่จับคู่และลดลงสำหรับอักขระแต่ละตัวที่จับคู่แต่ไม่สามารถลดลงต่ำกว่าศูนย์ได้ดังนั้นจึงถูกบังคับให้ใช้ครึ่งแรกของสตริงเพื่อให้ถึงจุดสิ้นสุดของสตริง ขั้นตอนที่สองจะพลิกคู่ของอักขระที่อยู่ติดกัน (รวมถึงศิลปะ ASCII ด้วย)$3$#2$1$3$1

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

ลองออนไลน์!

พอร์ตของโซลูชัน Python ของ Sisyphus

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

ลองออนไลน์!