加密数字!


12

问题:

两个敌对的秘密特工设计了一种极好的(对您来说)通信方式!

加密过程的工作原理如下:

1)取每个字母的ascii等效项。(不发送空格,数字或标点符号)

2)对于消息中的每个字母,将它和它后面的字母(如果存在,如果不存在,则应视为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
@orlp也许允许更多的高尔夫机会?:)
乔纳森·艾伦

1
@orlp哦,不,你宠坏了乐趣!
Erik the Outgolfer

@JonathanAllan部分正确。我希望这两个秘密特工显得超级愚蠢,以便他们在“代码”中添加不必要的部分。它还增加了一些可能出现的程序。
iPhoenix

@orlp仅倍数是不够的,对吗?
ericw31415 '18年

Answers:


5

外壳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'1

在Husk Wiki 的语义页面上。
Zgarb

1
似乎您更改了说明,但未更改实际的代码片段本身。:)
iPhoenix

@iPhoenix谢谢,我把它改正了。
Laikoni'1

8

头脑操,66字节

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

输入是加密的字符串。假定无限大小的像元,在EOF上为0。

怎么运行的:

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

Haskell45 35字节

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

在线尝试!

说明

  • fst.span(<245)接受列表开头的所有小于245的数字。这些仅是求和部分的数字,因为最大的可能总和为z + z = 122 + 122 = 244,最小的乘积为A * A = 65 * 65 = 4225
  • scanr1(-)获取列表的最后一个值并将其用作初始累加器。然后,从后到前,列表中的每个元素都会被当前累加器减去,结果将用作下一个累加器并添加到列表中。
  • map toEnum 用相应的字符替换列表中的每个数字以重新创建字符串。




2

果冻,11 字节

œs2Ḣḅ-$ÐƤAỌ

一个单子链接,它获取一个整数列表并返回一个字符列表。

在线尝试!

怎么样?

œ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字节

(通过使用While..Wend而不是Do..Loop,我设法将74减少到71)

输入在数组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字节

zero是空字符。
如果Clean对于源文件中的原义null不太挑剔,则可以节省另一个字节。

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

在线尝试!


通常可接受匿名函数,因此如果需要,可以删除f=
Laikoni'1

@Laikoni我不确定这种情况下的有效性,因为它需要内联使用括号,并且括号f=是最短的赋值,因此最少的调用总会增加两个。
世纪




0

Perl 6的 43 39  35个字节

{[~] [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 ç不会将字符列表隐式转换为字符串。如果我正确理解问题,则程序需要输出一个字符串而不是一个字符列表。
Wisław


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.