Zaszyfrowane w liczbach!

12

Problem:

Dwóch tajnych agentów wroga opracowało wspaniałą (dla ciebie) metodę komunikacji!

Oto jak działa proces szyfrowania:

1) Weź ekwiwalenty ascii każdej litery. (Nie są wysyłane spacje, liczby ani znaki interpunkcyjne)

2) Dla każdej litery w wiadomości, jej ekwiwalent ascii i litera po niej (jeśli istnieje, jeśli nie, należy ją uznać za 0), są mnożone (ten produkt jest przechowywany w tablicy / liście) i zsumowane (liczba ta jest również zapisana na innej liście).

3) Dwie listy (sum i produktów) są łączone (lista sum, a następnie lista wielokrotności, w tej samej tablicy) i przesyłane.

Musisz napisać najmniejszy program, który może odwrócić ten proces i odszyfrować wiadomości wysłane w tym formacie!

Przykładowe pary wejść i wyjść:

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

To jest , więc wygrywa najmniejsze rozwiązanie w bajtach.

Komunikaty o błędach są dozwolone.

Twój program może otrzymać albo listę / tablicę 1-wymiarową, albo ciąg oddzielony przecinkami, jeśli określisz to w swoim zgłoszeniu. Domyślnie jest to tablica / lista.

iPhoenix
źródło
1
Dlaczego nawet lista mnożników tam jest? Same kwoty to wystarczająca ilość informacji.
orlp
1
@orlp może pozwolić na więcej możliwości gry w golfa? :)
Jonathan Allan
1
@orlp o nie, zepsułeś zabawę!
Erik the Outgolfer
@JonathanAllan jest częściowo poprawny. Chciałem, aby dwaj tajni agenci wyglądali na super głupich, aby dodali niepotrzebne części do swojego „kodu”. Dodaje także więcej możliwych programów, które mogą wyjść.
iPhoenix
@orlp Tylko wielokrotności to za mało, prawda?
ericw31415

Odpowiedzi:

5

Łuska , 7 6 bajtów

mcĠ≠←½

Wypróbuj online! Zgodnie z dokumentacją prowadzenie mnie powinno być potrzebne, ale wydaje się, że obecnie występuje błąd.

Edycja: -1 bajt dzięki Zgarb!

Wyjaśnienie:

     ½ -- split input list into half
    ←  -- take first list
  Ġ≠   -- subtract each list element from the previous one
mc     -- convert list of code points to string
Laikoni
źródło
Myślę, że `-może być . Zachowanie crzeczywiście wygląda jak błąd.
Zgarb,
@Zgarb To praktyczny sposób na wdrożenie nierównego. Czy to gdzieś jest udokumentowane?
Laikoni
Jest na stronie Semantics na Husk Wiki.
Zgarb,
1
Wygląda na to, że zmieniłeś wyjaśnienie, ale nie sam fragment kodu. :)
iPhoenix
@iPhoenix Dzięki, poprawiłem to.
Laikoni
8

pieprzenie mózgu , 66 bajtów

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

Dane wejściowe to zaszyfrowany ciąg. Przyjmuje komórki o nieskończonej wielkości i 0 na EOF.

Jak to działa:

,[>>>+<[-<+>>-<]<[->+<],] 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
Jo King
źródło
5

Haskell , 45 35 bajtów

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

Wypróbuj online!

Wyjaśnienie

  • fst.span(<245)pobiera wszystkie liczby z początku listy, które są mniejsze niż 245. Są to tylko liczby z części sumowania, ponieważ największym możliwym sumowaniem jest z + z = 122 + 122 = 244, a najmniejszym możliwym produktem A * A = 65 * 65 = 4225.
  • scanr1(-)pobiera ostatnią wartość z listy i używa jej jako akumulatora początkowego. Następnie od tyłu do przodu każdy element listy jest odejmowany przez bieżący akumulator, a wynik jest wykorzystywany jako następny akumulator i dodawany do listy.
  • map toEnum zastępuje każdą liczbę na liście odpowiednim znakiem, aby odtworzyć ciąg.
Laikoni
źródło
3

Galaretka , 9 bajtów

œs2ḢUạ\ỌU

Wypróbuj online! lub Sprawdź oba przypadki testowe.

Alternatywny.

Wyjaśnienie

œs2ḢUạ \ ỌU || Pełny program

œs2 || Podziel się na dwie części, w razie potrzeby pierwsza będzie dłuższa.
   Ḣ || Zdobądź głowę (pierwszy element).
    U || Rewers.
     ạ \ || Skumulowane zmniejszenie przez odjęcie.
       Ọ || Konwertuj z punktów kodowych na znaki.
        U || I znów do tyłu.
Pan Xcoder
źródło
2

Python 2 , 92 bajty

lambda C:"".join(chr(sum((-1)**i*C[j+i]for i in range(len(C)/2-j)))for j in range(len(C)/2))

Wypróbuj online!

Jonathan Frech
źródło
2

Galaretka , 11 bajtów

œs2Ḣḅ-$ÐƤAỌ

Monadyczny link pobierający listę liczb całkowitych i zwracający listę znaków.

Wypróbuj online!

W jaki sposób?

œ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"
Jonathan Allan
źródło
1

Pyt , 60 bajtów

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

Pobiera listę liczb całkowitych i zwraca ciąg znaków.

Wyjaśnienie:

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

Wypróbuj online!

mudkip201
źródło
1

JavaScript (ES6), 80 bajtów

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

darrylyeo
źródło
1

Skrypt VB - 74 71 bajtów

(Udało mi się zmniejszyć z 74 do 71, używając While..Wend zamiast Do..Loop)

Dane wejściowe znajdują się w tablicy a (), dane wyjściowe są w ciągu 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

Wyjaśnienie

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.

Przetestowałem to w pliku vbscript z powyższym kodem opakowanym jako funkcja:

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
JohnRC
źródło
1

Czysty , 96 81 78 77 bajtów

zerojest znakiem zerowym.
Mógłbym zapisać kolejny bajt, gdyby Clean nie był tak wybredny w odniesieniu do dosłownych zer w pliku źródłowym.

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

Wypróbuj online!

Obrzydliwe
źródło
Funkcje anonimowe są ogólnie dopuszczalne, więc jeśli chcesz, możesz je upuścić f=.
Laikoni
@Laikoni Nie jestem pewien, czy jest to ważne w tym przypadku, ponieważ wymaga użycia nawiasów w wierszu i f=jest najkrótszym zadaniem, więc minimalne wywołanie i tak dodaje dwa.
ousurous
1

Perl 5 , 39 + 2 ( -ap) = 41 bajtów

$#F/=2;$\=chr($p=-$p+pop@F).$\while@F}{

Wypróbuj online!

Xcali
źródło
1

C (gcc) , 90 89 bajtów

  • Zapisano bajt dzięki pułapowi cat ; s+=(i%2?-1:1)*...<~> s-=~(i%2*-2).
D(C,l,j,s,i)int*C;{for(j=~0;++j<l/2;putchar(s))for(s=i=0;i+j<l/2;)s-=~(i%2*-2)*C[i+++j];}

Wypróbuj online!

Jonathan Frech
źródło
0

Standardowy ML (MLton) , 85 84 82 bajtów

fun!(x::r)=if x>244then[]else(fn z::s=>x-z::z::s|_=>[x])(!r);implode o map chr o!;

Wypróbuj online!

Nie golfowany:

fun g (x::r) =
   if   x > 244
   then []
   else case g r of
          z::s => x-z :: z :: s
        |  []  => [x]

val f = implode o map chr o g

Wypróbuj online!

Laikoni
źródło
0

Perl 6 ,  43 39  35 bajtów

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

Sprawdź to

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

Przetestuj to (robi to samo co powyżej)

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

Sprawdź to

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

Sprawdź to

Wyjaśnienie:

{[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 …`)
Brad Gilbert b2gills
źródło
0

05AB1E , 9 bajtów

2ä¬Å«-}çJ

Wypróbuj online!

Wyjaśnienie

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.
Wisław
źródło
Nie potrzebujesz Join.
Shaggy
@Shaggy çnie zmienia jednak domyślnie listy znaków w ciąg znaków. Jeśli dobrze rozumiem problem, program musi wypisać ciąg znaków, a nie listę znaków.
Wisław
0

Japt, 12 bajtów

Musi być krótszy sposób na uzyskanie pierwszej połowy tablicy ...

¯UÊz)Ôån Ômd

Spróbuj

Kudłaty
źródło
0

Python 2 , 70 bajtów

l,j,s=input(),0,'';n=len(l)/2
while n:n-=1;j=l[n]-j;s=chr(j)+s
print s

Wypróbuj online!

mdahmoune
źródło