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


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
@orlp о ні, ви зіпсували забаву!
Ерік Аутгольфер

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

Це на сторінці семантики Husk Wiki.
Згарб

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

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, використовуючи while..Wend замість 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 байт

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.