Được mã hóa bằng số!


12

Vấn đề:

Hai đặc vụ bí mật của kẻ thù đã nghĩ ra một phương thức liên lạc tuyệt vời (dành cho bạn)!

Đây là cách quá trình mã hóa hoạt động:

1) Lấy tương đương ascii của mỗi chữ cái. (Không có dấu cách, số hoặc dấu chấm câu được gửi)

2) Đối với mỗi chữ cái trong tin nhắn, ascii tương đương với nó và chữ cái sau nó (Nếu nó tồn tại, nếu không, nó sẽ được coi là 0), được nhân lên (sản phẩm này được lưu trữ trong một mảng / danh sách) và tổng hợp (số này cũng được lưu trữ trong một danh sách khác).

3) Hai danh sách (tổng và sản phẩm) được nối với nhau (danh sách tổng, sau đó là danh sách bội, vào cùng một mảng) và được truyền đi.

Bạn cần viết chương trình nhỏ nhất có thể đảo ngược quá trình này và giải mã các tin nhắn được gửi theo định dạng này!

Ví dụ Cặp đầu vào và đầu ra:

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

Đây là , vì vậy giải pháp nhỏ nhất trong byte sẽ thắng.

Thông báo lỗi được cho phép.

Chương trình của bạn có thể được cung cấp một danh sách / mảng 1 chiều hoặc chuỗi được phân tách bằng dấu phẩy, nếu bạn chỉ định trong bài gửi của mình. Mặc định là một mảng / danh sách.


1
Tại sao danh sách bội số thậm chí còn có? Chỉ cần một khoản tiền là đủ thông tin.
orlp

1
@orlp có thể cho phép nhiều cơ hội chơi golf hơn? :)
Jonathan Allan

1
@orlp oh không, bạn tha hồ vui vẻ!
Erik the Outgolfer

@Jonathan ALLan là chính xác, một phần. Tôi muốn hai đặc vụ bí mật xuất hiện siêu ngu ngốc, để họ thêm những phần không cần thiết vào mã Code của họ. Nó cũng thêm một số chương trình có thể có thể đi ra.
iPhoenix

@orlp Chỉ cần bội số là không đủ, phải không?
ericw31415

Câu trả lời:


5

Husk , 7 6 byte

mcĠ≠←½

Hãy thử trực tuyến! Theo tài liệu mnày, không cần thiết hàng đầu , nhưng dường như có một lỗi hiện tại.

Chỉnh sửa: -1 byte nhờ Zgarb!

Giải trình:

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

Tôi nghĩ rằng `-có thể . Hành vi của cthực sự trông giống như một lỗi.
Zgarb

@Zgarb Đó là một cách thực tế để thực hiện bất bình đẳng. Đây có phải là tài liệu ở đâu đó?
Laikoni

Nó nằm trên trang Semantics của Husk Wiki.
Zgarb

1
Có vẻ như bạn đã thay đổi lời giải thích của mình, nhưng không phải là đoạn mã thực tế. :)
iPhoenix

@iPhoenix Cảm ơn, tôi đã sửa nó.
Laikoni

8

Brainfuck , 66 byte

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

Đầu vào là chuỗi được mã hóa. Giả sử các ô có kích thước vô hạn và 0 trên EOF.

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

,[>>>+<[-<+>>-<]<[->+<],] 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 byte

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

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

Giải trình

  • fst.span(<245)lấy tất cả các số từ đầu danh sách nhỏ hơn 245. Đó chỉ là các số từ phần tổng, bởi vì tổng cộng lớn nhất có thể là z + z = 122 + 122 = 244, và sản phẩm nhỏ nhất có thể là A * A = 65 * 65 = 4225.
  • scanr1(-)lấy giá trị cuối cùng của danh sách và sử dụng nó làm bộ tích lũy ban đầu. Sau đó, từ trở về trước, mỗi phần tử của danh sách được trừ bởi bộ tích lũy hiện tại và kết quả được sử dụng làm bộ tích lũy tiếp theo và được thêm vào danh sách.
  • map toEnum thay thế mỗi số trong danh sách bằng ký tự tương ứng để tạo lại chuỗi.

3

Thạch , 9 byte

œs2ḢUạ\ỌU

Hãy thử trực tuyến! hoặc Kiểm tra cả hai trường hợp thử nghiệm.

Thay thế.

Giải trình

œs2ḢUạ \ ỌU || Chương trình đầy đủ.

2s2 | | Chia thành hai phần, với phần đầu tiên dài hơn nếu cần thiết.
   | | | Lấy đầu (yếu tố đầu tiên).
    Bạn | Đảo ngược.
     ạ \ | | Tích lũy giảm bằng phép trừ.
       Ọ | | Chuyển đổi từ điểm mã sang ký tự.
        Bạn | Và đảo ngược một lần nữa.



2

Thạch , 11 byte

œs2Ḣḅ-$ÐƤAỌ

Một liên kết đơn âm lấy một danh sách các số nguyên và trả về một danh sách các ký tự.

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

Làm sao?

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

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

Lấy danh sách các số nguyên và trả về một chuỗi ký tự.

Giải trình:

←ĐĐŁ₂⁻⦋⇹          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

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


1

JavaScript (ES6), 80 byte

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


1

VB Script - 74 71 byte

(Tôi đã cố gắng giảm từ 74 xuống 71 bằng cách sử dụng While..Wend thay vì Do..Loop)

Đầu vào nằm trong một mảng a (), đầu ra nằm trong chuỗi 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

Giải trình

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.

Tôi đã thử nghiệm điều này trong một tệp vbscript với đoạn mã trên được gói như một hàm:

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

Sạch , 96 81 78 77 byte

zerolà ký tự null.
Tôi có thể lưu một byte khác nếu Clean không quá cầu kỳ về null nghĩa đen trong tệp nguồn.

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

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


Các hàm ẩn danh nói chung được chấp nhận, vì vậy nếu bạn muốn, bạn có thể bỏ f=.
Laikoni

@Laikoni Tôi không chắc về tính hợp lệ của trường hợp này, bởi vì nó cần sử dụng dấu ngoặc đơn và f=là phép gán ngắn nhất, vì vậy một lệnh gọi tối thiểu sẽ thêm hai lần nữa.
Οurous




0

Perl 6 ,  43 39  35 byte

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

Kiểm tra nó

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

Kiểm tra nó (thực hiện tương tự như trên)

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

Kiểm tra nó

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

Kiểm tra nó

Giải trình:

{[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 byte

2ä¬Å«-}çJ

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

Giải trình

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.

Bạn không cần Join.
Xù xì

@Shaggy çkhông hoàn toàn biến danh sách các ký tự thành một chuỗi. Nếu tôi hiểu đúng vấn đề, chương trình cần xuất ra một chuỗi chứ không phải danh sách các ký tự.
Wisław

0

Japt, 12 byte

Phải có một cách ngắn hơn để có được nửa đầu của mảng ...

¯UÊz)Ôån Ômd

Thử nó


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.