Зашифрованы в цифрах!


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
Почему список кратных даже там? Просто суммы достаточно информации.
orlp

1
@orlp может быть, чтобы дать больше возможностей для игры в гольф? :)
Джонатан Аллан

1
@ или нет, ты испортил веселье!
Эрик Outgolfer

@JonathanAllan правильно, частично. Я хотел, чтобы два секретных агента казались супер глупыми, чтобы они добавляли ненужные части в свой «код». Он также добавляет еще несколько возможных программ, которые могут выйти.
iPhoenix

@orlp Просто множителей недостаточно, верно?
ericw31415

Ответы:


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 Это практический способ реализации неравного. Это где-то задокументировано?
Лайкони


1
Кажется, вы изменили свое объяснение, но не сам фрагмент кода. :)
iPhoenix

@iPhoenix Спасибо, я исправил это.
Лайкони

8

брейкфук , 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 = 244и наименьшее возможное произведение A * A = 65 * 65 = 4225.
  • scanr1(-)берет последнее значение из списка и использует его в качестве начального аккумулятора. Затем сзади-вперед каждый элемент списка вычитается текущим аккумулятором, а результат используется в качестве следующего аккумулятора и добавляется в список.
  • map toEnum заменяет каждое число в списке соответствующим символом, чтобы воссоздать строку.

3

Желе , 9 байт

œs2ḢUạ\ỌU

Попробуйте онлайн! или Проверьте оба теста.

Альтернатива.

объяснение

œs2ḢUạ \ ỌU || Полная программа.

œs2 || Разделите на две части, причем первая будет длиннее, если это необходимо.
   Ḣ || Получить голову (первый элемент).
    U || Задний ход.
     ạ \ || Совокупное уменьшение путем вычитания.
       Ọ || Конвертировать из кодовых точек в символы.
        U || И снова поменять.



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

Пыть , 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 Script - 74 71 байт

(Мне удалось сократить с 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 не был так требователен к буквальным нулям в исходном файле.

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

Попробуйте онлайн!


Анонимные функции в целом приемлемы, поэтому, если вы хотите, вы можете удалить f=.
Лайкони

@ Laikoni Я не уверен в правильности этого в этом случае, потому что для этого нужны встроенные скобки, и f=это самое короткое назначение, поэтому минимальный вызов добавляет два в любом случае.
Οurous




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 çнеявно превращает список символов в строку. Если я правильно понимаю проблему, программе необходимо вывести строку, а не список символов.
Вислав


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.