Criptografado em números!


12

O problema:

Dois agentes secretos inimigos criaram um maravilhoso (para você) método de comunicação!

Veja como o processo de criptografia funciona:

1) Pegue os equivalentes ascii de cada letra. (Não são enviados espaços, números ou pontuação)

2) Para cada letra na mensagem, o equivalente ascii e a letra após (se existir, se não existir, deve ser considerada 0) são multiplicados (este produto é armazenado em uma matriz / lista) e somado (esse número também é armazenado em uma lista diferente).

3) As duas listas (de somas e produtos) são reunidas (a lista de somas e depois a lista de múltiplos na mesma matriz) e transmitidas.

Você precisa escrever o menor programa capaz de reverter esse processo e descriptografar as mensagens enviadas neste formato!

Exemplo de pares de entrada e saída:

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

Isso é , então a menor solução em bytes vence.

Mensagens de erro são permitidas.

Seu programa pode receber uma lista / matriz unidimensional ou uma sequência separada por vírgula, se você especificar no seu envio. O padrão é uma matriz / lista.


1
Por que a lista de múltiplos está lá? Apenas as somas são informações suficientes.
orlp 7/01/18

1
@orlp talvez permita mais oportunidades de golfe? :)
Jonathan Allan

1
@ orlp oh não, você estragou a diversão!
Erik the Outgolfer

@JonathanAllan está correto, parcialmente. Eu queria que os dois agentes secretos parecessem super estúpidos, para que adicionassem partes desnecessárias ao seu "código". Ele também adiciona mais alguns programas possíveis que podem ser lançados.
IPhoenix

@orlp Apenas os múltiplos não são suficientes, certo?
precisa saber é o seguinte

Respostas:


5

Casca , 7 6 bytes

mcĠ≠←½

Experimente online! De acordo com a documentação, o líder mnão deve ser necessário, mas parece haver um bug no momento.

Edit: -1 byte graças ao Zgarb!

Explicação:

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

Eu acho que `-pode ser . O comportamento de cfato parece um bug.
Zgarb 07/01

@ Zgarb Essa é uma maneira prática de implementar desigual. Isso está documentado em algum lugar?
Laikoni

Está na página de Semântica do Husk Wiki.
Zgarb 07/01

1
Parece que você mudou sua explicação, mas não o próprio trecho de código. :)
iPhoenix

@iPhoenix Obrigado, corrigi-o.
Laikoni

8

brainfuck , 66 bytes

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

Entrada é a cadeia criptografada. Assume células com tamanho infinito e 0 no EOF.

Como funciona:

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

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

Experimente online!

Explicação

  • fst.span(<245)pega todos os números do início da lista menores que 245. Esses são apenas os números da parte da soma, porque a maior soma possível é z + z = 122 + 122 = 244e o menor produto possível A * A = 65 * 65 = 4225.
  • scanr1(-)pega o último valor da lista e o usa como acumulador inicial. Em seguida, de trás para frente, cada elemento da lista é subtraído pelo acumulador atual e o resultado é usado como o próximo acumulador e adicionado a uma lista.
  • map toEnum substitui cada número na lista pelo caractere correspondente para recriar a sequência.




2

Gelatina , 11 bytes

œs2Ḣḅ-$ÐƤAỌ

Um link monádico que obtém uma lista de números inteiros e retorna uma lista de caracteres.

Experimente online!

Quão?

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

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

Pega uma lista de números inteiros e retorna uma sequência de caracteres.

Explicação:

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

Experimente online!


1

JavaScript (ES6), 80 bytes

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


1

Script VB - 74 71 bytes

(Consegui reduzir de 74 para 71 usando While..Wend em vez de Do.Loop)

A entrada está em um array a (), a saída está na string 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

Explicação

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.

Eu testei isso em um arquivo vbscript com o código acima agrupado como uma função:

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

Limpo , 96 81 78 77 bytes

zeroé o caractere nulo.
Eu poderia salvar outro byte se o Clean não fosse tão exigente quanto aos nulos literais no arquivo de origem.

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

Experimente online!


As funções anônimas são geralmente aceitáveis; portanto, se você quiser, pode soltar o f=.
Laikoni

@Laikoni Não tenho certeza sobre a validade disso, neste caso, porque ele precisa de parênteses para ser usado em linha e f=é a tarefa mais curta; portanto, uma chamada mínima adiciona duas de qualquer maneira.
Οurous




0

Perl 6 ,  43 39  35 bytes

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

Teste-o

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

Teste (faça o mesmo que acima)

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

Teste-o

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

Teste-o

Explicação:

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

2ä¬Å«-}çJ

Experimente online!

Explicação

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.

Você não precisa do Join.
Salsicha

O @Shaggy çnão transforma implicitamente a lista de caracteres em uma string. Se eu entendi o problema corretamente, o programa precisa gerar uma string e não uma lista de caracteres.
Wisław 17/01/19

0

Japonês, 12 bytes

Tem que haver uma maneira mais curta de obter a primeira metade da matriz ...

¯UÊz)Ôån Ômd

Tente


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.