Chiffré en chiffres!


12

Le problème:

Deux agents secrets ennemis ont conçu une merveilleuse méthode de communication (pour vous)!

Voici comment fonctionne le processus de cryptage:

1) Prenez les équivalents ascii de chaque lettre. (Aucun espace, chiffre ou ponctuation n'est envoyé)

2) Pour chaque lettre du message, l'équivalent ascii de celle-ci et la lettre qui la suit (si elle existe, si ce n'est pas le cas, elle doit être considérée comme 0), sont multipliées (ce produit est stocké dans un tableau / liste) et additionné (ce nombre est également stocké dans une liste différente).

3) Les deux listes (des sommes et des produits) sont réunies (la liste des sommes, puis la liste des multiples, dans le même tableau) et transmises.

Vous devez écrire le plus petit programme capable d'inverser ce processus et de décrypter les messages envoyés dans ce format!

Exemples de paires d'entrée et de sortie:

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

Il s'agit de , donc la plus petite solution en octets l'emporte.

Les messages d'erreur sont autorisés.

Votre programme peut recevoir soit une liste / un tableau unidimensionnel, soit une chaîne séparée par des virgules, si vous le spécifiez dans votre soumission. La valeur par défaut est un tableau / liste.


1
Pourquoi la liste des multiples existe-t-elle même? Juste les sommes, c'est assez d'informations.
orlp

1
@orlp peut-être pour permettre plus de possibilités de golf? :)
Jonathan Allan

1
@orlp oh non, vous avez gâché le plaisir!
Erik the Outgolfer le

@JonathanAllan est correct, partiellement. Je voulais que les deux agents secrets apparaissent super stupides, afin qu'ils ajoutent des parties inutiles à leur «code». Il ajoute également d'autres programmes possibles qui peuvent sortir.
iPhoenix

@orlp Juste les multiples ne suffisent pas, non?
ericw31415

Réponses:


5

Husk , 7 6 octets

mcĠ≠←½

Essayez-le en ligne! Selon la documentation, le début mne devrait pas être nécessaire, mais il semble y avoir un bogue actuellement.

Edit: -1 octet grâce à Zgarb!

Explication:

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

Je pense que c'est `-possible . Le comportement de cressemble en effet à un bug.
Zgarb

@Zgarb C'est un moyen pratique de mettre en œuvre des inégalités. Est-ce documenté quelque part?
Laikoni

C'est sur la page sémantique de Husk Wiki.
Zgarb

1
Il semble que vous ayez changé votre explication, mais pas l'extrait de code lui-même. :)
iPhoenix

@iPhoenix Merci, je l'ai corrigé.
Laikoni

8

brainfuck , 66 octets

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

L'entrée est la chaîne chiffrée. Suppose des cellules de taille infinie et 0 sur EOF.

Comment ça fonctionne:

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

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

Essayez-le en ligne!

Explication

  • fst.span(<245)prend tous les nombres du début de la liste qui sont inférieurs à 245. Ce ne sont que les nombres de la partie de sommation, car la plus grande sommation possible est z + z = 122 + 122 = 244et le plus petit produit possible est A * A = 65 * 65 = 4225.
  • scanr1(-)prend la dernière valeur de la liste et l'utilise comme accumulateur initial. D'arrière en avant, chaque élément de la liste est soustrait par l'accumulateur actuel et le résultat est utilisé comme accumulateur suivant et ajouté à une liste.
  • map toEnum remplace chaque numéro de la liste par le caractère correspondant pour recréer la chaîne.




2

Gelée , 11 octets

œs2Ḣḅ-$ÐƤAỌ

Un lien monadique prenant une liste d'entiers et renvoyant une liste de caractères.

Essayez-le en ligne!

Comment?

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

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

Prend une liste d'entiers et renvoie une chaîne de caractères.

Explication:

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

Essayez-le en ligne!


1

JavaScript (ES6), 80 octets

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


1

Script VB - 74 71 octets

(J'ai réussi à réduire de 74 à 71 en utilisant While..Wend au lieu de Do..Loop)

L'entrée est dans un tableau a (), la sortie est dans la chaîne 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

Explication

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.

J'ai testé cela dans un fichier vbscript avec le code ci-dessus enveloppé comme une fonction:

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

Nettoyer , 96 81 78 77 octets

zeroest le caractère nul.
Je pourrais enregistrer un autre octet si Clean n'était pas aussi pointilleux sur les valeurs nulles littérales dans le fichier source.

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

Essayez-le en ligne!


Les fonctions anonymes sont généralement acceptables, donc si vous le souhaitez, vous pouvez supprimer le f=.
Laikoni

@Laikoni Je ne suis pas sûr de la validité de cela dans ce cas, car il a besoin de parenthèses pour être utilisé en ligne, et f=c'est l'affectation la plus courte, donc une invocation minimale en ajoute deux de toute façon.
Janurous




0

Perl 6 ,  43 39  35 octets

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

Essaye-le

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

Testez-le (fait la même chose que ci-dessus)

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

Essaye-le

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

Essaye-le

Explication:

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

2ä¬Å«-}çJ

Essayez-le en ligne!

Explication

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.

Vous n'avez pas besoin de l' Jhuile.
Shaggy

@Shaggy çne transforme pas implicitement la liste de caractères en chaîne. Si je comprends bien le problème, le programme doit produire une chaîne et non une liste de caractères.
Wisław

0

Japt, 12 octets

Il doit y avoir un moyen plus court pour obtenir la première moitié du tableau ...

¯UÊz)Ôån Ômd

Essayez-le


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.