เข้ารหัสเป็นตัวเลข!


12

ปัญหา:

ตัวแทนลับของศัตรูสองคนได้คิดค้นวิธีการสื่อสารที่ยอดเยี่ยม (สำหรับคุณ)!

นี่คือวิธีการทำงานของการเข้ารหัส:

1) ใช้การเปรียบเทียบ ASCII ของตัวอักษรแต่ละตัว (ไม่มีการเว้นวรรคตัวเลขหรือเครื่องหมายวรรคตอน)

2) สำหรับตัวอักษรแต่ละตัวในข้อความจำนวน ascii ที่เท่ากันของมันและตัวอักษรที่อยู่ด้านหลัง (หากมีอยู่หากไม่เป็นเช่นนั้นควรถือว่าเป็น 0) จะถูกคูณ (ผลิตภัณฑ์นี้จะถูกเก็บไว้ในอาร์เรย์ / รายการ) และสรุป (หมายเลขนี้ถูกจัดเก็บในรายการอื่นด้วย)

3) ทั้งสองรายการ (จากผลรวมและผลิตภัณฑ์) ถูกรวมเข้าด้วยกัน (รายการผลรวมจากนั้นรวมรายการหลายรายการเข้าไปในอาร์เรย์เดียวกัน) และส่ง

คุณต้องเขียนโปรแกรมที่เล็กที่สุดที่สามารถย้อนกลับกระบวนการนี้และถอดรหัสข้อความที่ส่งในรูปแบบนี้!

ตัวอย่างอินพุตและเอาต์พุตคู่:

[173, 209, 216, 219, 198, 198, 225, 222, 208, 100, 7272, 10908, 11664, 11988, 9657, 9657, 12654, 12312, 10800, 0] -> “HelloWorld”
[131, 133, 164, 195, 197, 99, 4290, 4422, 6499, 9506, 9702, 0] -> “ABCabc”

นี่คือดังนั้นทางออกที่เล็กที่สุดในหน่วยไบต์ชนะ

อนุญาตข้อความผิดพลาด

โปรแกรมของคุณสามารถกำหนดให้เป็นอาร์เรย์รายการ / 1 มิติหรือสตริงที่คั่นด้วยเครื่องหมายจุลภาคหากคุณระบุในการส่งของคุณ ค่าเริ่มต้นคืออาร์เรย์ / รายการ


1
ทำไมถึงมีรายการทวีคูณถึงที่นั่น? แค่จำนวนเงินก็เพียงพอแล้วสำหรับข้อมูล
orlp

1
@ หรืออาจจะช่วยให้โอกาสในการเล่นกอล์ฟมากขึ้น? :)
Jonathan Allan

1
@ หรือไม่โอ้คุณทำให้เสียความสนุก!
Erik the Outgolfer

@JonathanAllan ถูกต้องบางส่วน ฉันต้องการให้ตัวแทนลับสองคนนั้นดูโง่มาก ๆ เพื่อที่พวกเขาจะเพิ่มส่วนที่ไม่จำเป็นลงใน "รหัส" ของพวกเขา นอกจากนี้ยังเพิ่มโปรแกรมที่เป็นไปได้เพิ่มเติมที่สามารถออกมาได้
iPhoenix

@ หรือเพียงแค่ทวีคูณไม่พอใช่มั้ย
ericw31415

คำตอบ:


5

Husk , 7 6 ไบต์

mcĠ≠←½

ลองออนไลน์! ตามเอกสารอธิบายmไม่ควรมีผู้นำแต่ดูเหมือนจะมีข้อผิดพลาดในขณะนี้

แก้ไข: -1 ไบต์ขอบคุณ Zgarb!

คำอธิบาย:

     ½ -- split input list into half
    ←  -- take first list
  Ġ≠   -- subtract each list element from the previous one
mc     -- convert list of code points to string

ผมคิดว่าอาจจะเป็น`- พฤติกรรมของcข้อผิดพลาดดูเหมือนแน่นอน
Zgarb

@Zgarb นั่นเป็นวิธีการที่นำไปปฏิบัติได้จริง เอกสารนี้อยู่ที่ไหนสักแห่ง?
Laikoni

มันอยู่ในหน้าอรรถศาสตร์ของ Husk Wiki
Zgarb

1
ดูเหมือนว่าคุณจะเปลี่ยนคำอธิบาย แต่ไม่ใช่ข้อมูลโค้ดจริง :)
iPhoenix

@iPhoenix ขอบคุณฉัน correted มัน
Laikoni

8

brainfuck , 66 ไบต์

,[>>>+<[-<+>>-<]<[->+<],]>[<<,>>[-<+>]<-]<<<[>[-<->>+<]<<]>.>>[.>]

อินพุตเป็นสตริงที่เข้ารหัส ถือว่าเซลล์ขนาดไม่ จำกัด และ 0 ใน EOF

มันทำงานอย่างไร:

,[>>>+<[-<+>>-<]<[->+<],] Gets input and the number of characters divided by 2
>[<<,>>[-<+>]<-]<<< Remove the second half of the string (the multiplication part)
[>[-<->>+<]<<] Subtract each character from the previous one, while keeping a copy of the previous one.
>.>>[.>] Print the characters

5

Haskell , 45 35 ไบต์

map toEnum.scanr1(-).fst.span(<245)

ลองออนไลน์!

คำอธิบาย

  • fst.span(<245)ใช้เวลาจำนวนทั้งหมดจากจุดเริ่มต้นของรายการที่มีขนาดเล็กกว่า 245 บรรดาเป็นเพียงตัวเลขจากส่วนหนึ่งบวกเพราะบวกที่เป็นไปได้ที่ใหญ่ที่สุดคือและผลิตภัณฑ์ที่มีขนาดเล็กที่สุดที่เป็นไปได้คือz + z = 122 + 122 = 244A * A = 65 * 65 = 4225
  • scanr1(-)ใช้ค่าสุดท้ายของรายการและใช้เป็นตัวสะสมเริ่มต้น จากนั้นกลับไปข้างหน้าแต่ละองค์ประกอบของรายการจะถูกลบโดยตัวสะสมปัจจุบันและผลลัพธ์จะถูกใช้เป็นตัวสะสมตัวถัดไปและและเพิ่มลงในรายการ
  • map toEnum แทนที่แต่ละหมายเลขในรายการด้วยอักขระที่เกี่ยวข้องเพื่อสร้างสตริงใหม่

3

เยลลี่ขนาด 9 ไบต์

œs2ḢUạ\ỌU

ลองออนไลน์! หรือตรวจสอบทั้งสองกรณีทดสอบ

ทางเลือก

คำอธิบาย

œs2ḢUạ \ ỌU || โปรแกรมเต็มรูปแบบ

œs2 || แบ่งออกเป็นสองส่วนโดยส่วนแรกจะยาวขึ้นถ้าจำเป็น
   Ḣ || รับส่วนหัว (องค์ประกอบแรก)
    U | | ย้อนกลับ
     ạ \ || ลดการสะสมโดยการลบ
       Ọ || แปลงจากรหัสจุดเป็นตัวอักษร
        U | | และย้อนกลับมาอีกครั้ง



2

เยลลี่ 11 ไบต์

œs2Ḣḅ-$ÐƤAỌ

ลิงก์ monadic ที่รับรายการจำนวนเต็มและส่งคืนรายการของอักขระ

ลองออนไลน์!

อย่างไร?

œs2Ḣḅ-$ÐƤAỌ - Link: list of integers     e.g. [210,211,201,101,10989,11100,10100,0]
  2         - literal two                     2
œs          - split into equal parts          [[210,211,201,101],[10989,11100,10100,0]]
   Ḣ        - head                            [210,211,201,101]
       ÐƤ   - for postfixes:                  [210,211,201,101],[211,201,101],[201,101],[101]
      $     -   last two links as a monad:
     -      -     literal minus one           -1
    ḅ       -     convert from base           -99              ,111          ,-100      ,101
         A  - absolute value (vectorises)     [99,111,100,101]
          Ọ - convert to ordinal (vectorises) "code"

1

Pyt , 60ไบต์

←ĐĐŁ₂⁻⦋⇹ĐŁřĐŁ₂>*ž0`ŕĐĐŁ⁻⦋3ȘĐ4Ș3Ș4Ș÷⇹ĐŁřĐŁ<*žĐŁ⁻łŕ⇹Đ3Ș⇹÷Á↔áƇǰ

รับรายการจำนวนเต็มและส่งคืนสตริงอักขระ

คำอธิบาย:

←ĐĐŁ₂⁻⦋⇹          Gets the ASCII code of the last character
ĐŁřĐŁ₂>*ž         Gets the list of products and removes the 0 from the end of the list
0`ŕ ...  ł        Loops (0 is there so that the length can be removed from the stack)
ĐĐŁ⁻⦋              Gets the last product
3ȘĐ4Ș3Ș4Ș÷        Divides by the last ASCII code obtained
⇹ĐŁřĐŁ<*ž         Removes the last element from the array
ĐŁ⁻ł              Gets the length of the array - 1 (if 0, then exit loop - the last entry still has to be processed)
ŕ⇹Đ3Ș⇹÷           Divides the remaining product by the last ASCII code obtained           
Á↔á               Converts to array of ints
Ƈǰ                Converts to string of ASCII characters

ลองออนไลน์!


1

JavaScript (ES6), 80 ไบต์

a=>String.fromCharCode(...eval(`for(a.splice(i=a.length/2);--i;a[i-1]-=a[i])a`))


1

สคริปต์ VB - 74 71 ไบต์

(ฉันจัดการเพื่อลดจาก 74 เป็น 71 โดยใช้ขณะที่ .. ไปแทน Do..Loop)

อินพุตอยู่ในอาร์เรย์ a () เอาต์พุตอยู่ในสตริง d

d="":p=0:n=(UBound(a)+1)/2:While n>0:n=n-1:t=a(n)-p:d=Chr(t)&d:p=t:Wend

คำอธิบาย

d=""          '// initialize the output string
p=0          '// initialize the ansii of following char (working back from last char)
n=(Ubound(a)+1)/2 '// the index of the last summed pair + 1 (base 0)
While n>0    '// begin loop working back from last summed pair
n=n-1        '// move back 1 char
t=a(n)-p     '// calculate the ansii by subtracting the ansii of following char
d=Chr(t)&d   '// prepend the char to output
p=t          '// this char becomes the following char for next
Wend         '// repeat etc.

ฉันทดสอบนี้ในไฟล์ vbscript ด้วยรหัสข้างต้นห่อเป็นฟังก์ชั่น:

dim s
Dim arr()
s = Split("173, 209, 216, 219, 198, 198, 225, 222, 208, 100, 7272, 10908, 11664, 11988, 9657, 9657, 12654, 12312, 10800, 0", ",")
ReDim arr(UBound(s))
Dim x 
For x = 0 To UBound(s)
    arr(x) = cint(s(x))
Next 

msgbox "=" & d(arr)



Private Function d(a())
d="":p=0:n=(UBound(a)+1)/2:While n>0:n=n-1:t=a(n)-p:d=Chr(t)&d:p=t:Wend
End Function

1

ทำความสะอาด , 96 81 78 77 77 ไบต์

zeroเป็นตัวละคร null
ฉันสามารถบันทึกอีกหนึ่งไบต์ได้หาก Clean ไม่พิถีพิถันเกี่ยวกับ nulls ตัวอักษรในไฟล์ต้นฉบับ

import StdEnv
f=init o foldr(\a t=[toChar a-t!!0:t])[zero]o takeWhile((>)245)

ลองออนไลน์!


f=ฟังก์ชั่นที่ไม่ระบุชื่อที่อยู่ในการได้รับการยอมรับโดยทั่วไปดังนั้นหากคุณต้องการคุณสามารถวาง
Laikoni

@Laikoni ฉันไม่แน่ใจเกี่ยวกับความถูกต้องของมันในกรณีนี้เพราะมันจำเป็นต้องใช้วงเล็บในแบบอินไลน์และf=เป็นการมอบหมายที่สั้นที่สุด
Janurous




0

Perl 6 ,  43 39  35 bytes

{[~] [R,](produce *R-*,[R,] .[^*/2])».chr}

ทดสอบมัน

{[~] [R,]([\[&(*R-*)]] [R,] .[^*/2])».chr}

ทดสอบ (ทำเหมือนด้านบน)

{[~] [R,]([\R[&(*R-*)]] .[^*/2])».chr}

ทดสอบมัน

{[R~] [\R[&(*R-*)]](.[^*/2])».chr}

ทดสอบมัน

คำอธิบาย:

{[R~] [\R[&(*R-*)]](.[^*/2])».chr}

{                                }      # block lambda with parameter `$_`

      [\R[&(*R-*)]](.[^*/2])            # turn sums back into ordinals (reversed)

                    .[^*/2]             # first half of `$_` (implicit method call)
            *R-*                        # lambda, reverse of *-*
         [&(    )]                      # use it as an infix operator
                                        # (same as R- except left associative)
        R                               # reverse arguments and associativity
                                        # (same as - except right associative)
      [\          ](       )            # produce values `[\+] 1,2,3` => `(1,3,6)`
                                        # uses associativity to determine direction
                                        # `[\**] 1,2,3` => `(3,8,1)`

                            ».chr       # call `.chr` method on all values
                                        # (possibly concurrently)

 [R~]                                   # concatenate in reverse
                                        # (shorter than `join '', reverse …`)

0

05AB1E , 9 ไบต์

2ä¬Å«-}çJ

ลองออนไลน์!

คำอธิบาย

2ä        # Split input list in two (equal if possible) parts.
  ¬       # Push head(a).
   Å«-}   # Cumulative reduce the list by subtraction (from the right).
       ç  # Convert each integer in the list to its corresponding ASCII char.
        J # Join list together to string.

คุณไม่ต้องการJน้ำมัน
Shaggy

@Shaggy çไม่ได้แปลงรายการอักขระเป็นสตริงโดยปริยาย หากฉันเข้าใจปัญหาอย่างถูกต้องโปรแกรมจำเป็นต้องส่งออกสตริงไม่ใช่รายการอักขระ
Wisław


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.