Dienkripsi dalam Angka!


12

Masalah:

Dua agen rahasia musuh telah menemukan metode komunikasi yang hebat (untuk Anda)!

Inilah cara kerja proses enkripsi:

1) Ambil ascii setara dari setiap huruf. (Tidak ada spasi, angka, atau tanda baca dikirim)

2) Untuk setiap huruf dalam pesan, ascii setara dengan dan sesudahnya (jika ada, jika tidak, harus dianggap 0), dikalikan (produk ini disimpan dalam array / daftar) dan dijumlahkan (nomor ini juga disimpan dalam daftar yang berbeda).

3) Dua daftar (jumlah dan produk) bergabung bersama (daftar jumlah, kemudian daftar kelipatan, ke dalam array yang sama) dan ditransmisikan.

Anda harus menulis program terkecil yang dapat membalikkan proses ini dan mendekripsi pesan yang dikirim dalam format ini!

Contoh Pasang Input dan Output:

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

Ini adalah , jadi solusi terkecil dalam byte menang.

Pesan kesalahan diizinkan.

Program Anda dapat diberikan daftar / array 1 dimensi atau string yang dipisah koma, jika Anda tentukan dalam kiriman Anda. Standarnya adalah array / daftar.


1
Mengapa daftar kelipatan ada di sana? Jumlahnya saja sudah cukup informasi.
orlp

1
@ Atau mungkin untuk memungkinkan lebih banyak peluang golf? :)
Jonathan Allan

1
@ Atau oh tidak, Anda merusak kesenangan!
Erik the Outgolfer

@ Jonathanathan Allan benar, sebagian. Saya ingin kedua agen rahasia itu tampil sangat bodoh, sehingga mereka menambahkan bagian yang tidak perlu ke "kode" mereka. Itu juga menambahkan beberapa program yang mungkin bisa keluar.
iPhoenix

@ Atlp Hanya kelipatannya saja tidak cukup, kan?
ericw31415

Jawaban:


5

Sekam , 7 6 byte

mcĠ≠←½

Cobalah online! Menurut dokumentasi, pimpinan mtidak diperlukan, tetapi saat ini sepertinya ada bug.

Sunting: -1 byte berkat Zgarb!

Penjelasan:

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

Saya pikir `-bisa . Perilaku cmemang terlihat seperti bug.
Zgarb

@Zgarb Itu cara praktis untuk menerapkan ketidaksetaraan. Apakah ini didokumentasikan di suatu tempat?
Laikoni

Itu ada di halaman Semantik Husk Wiki.
Zgarb

1
Tampaknya Anda mengubah penjelasan Anda, tetapi bukan cuplikan kode yang sebenarnya. :)
iPhoenix

@ iPhoenix Terima kasih, saya mengoreksinya.
Laikoni

8

brainfuck , 66 byte

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

Input adalah string terenkripsi. Diasumsikan sel berukuran tak terbatas dan 0 pada EOF.

Bagaimana itu bekerja:

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

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

Cobalah online!

Penjelasan

  • fst.span(<245)mengambil semua angka dari awal daftar yang lebih kecil dari 245. Itu hanya angka-angka dari bagian penjumlahan, karena penjumlahan terbesar yang mungkin z + z = 122 + 122 = 244, dan produk terkecil yang mungkin A * A = 65 * 65 = 4225.
  • scanr1(-)mengambil nilai terakhir dari daftar dan menggunakannya sebagai akumulator awal. Kemudian dari belakang ke depan setiap elemen daftar dikurangi oleh akumulator saat ini, dan hasilnya digunakan sebagai akumulator berikutnya dan dan ditambahkan ke daftar.
  • map toEnum mengganti setiap angka dalam daftar dengan karakter yang sesuai untuk membuat ulang string.

3

Jelly , 9 byte

œs2ḢUạ\ỌU

Cobalah online! atau Periksa kedua kasus uji.

Alternatif.

Penjelasan

œs2ḢUạ \ ỌU || Program lengkap.

œs2 || Dibagi menjadi dua bagian, dengan yang pertama lebih panjang jika perlu.
   Ḣ || Dapatkan kepala (elemen pertama).
    U || Membalikkan.
     ạ \ || Kumulatif dikurangi dengan pengurangan.
       Ọ || Konversi dari titik kode ke karakter.
        U || Dan mundur lagi.



2

Jelly , 11 byte

œs2Ḣḅ-$ÐƤAỌ

Tautan monadik yang mengambil daftar bilangan bulat dan mengembalikan daftar karakter.

Cobalah online!

Bagaimana?

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

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

Mengambil daftar bilangan bulat dan mengembalikan serangkaian karakter.

Penjelasan:

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

Cobalah online!


1

JavaScript (ES6), 80 byte

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


1

VB Script - 74 71 byte

(Saya berhasil mengurangi dari 74 menjadi 71 dengan menggunakan While..Wend bukannya Do..Loop)

Input dalam array a (), output dalam 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

Penjelasan

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.

Saya menguji ini dalam file vbscript dengan kode di atas dibungkus sebagai fungsi:

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

Bersih , 96 81 78 77 byte

zeroadalah karakter nol.
Saya bisa menyimpan byte lain jika Clean tidak begitu pilih-pilih tentang nulls literal dalam file sumber.

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

Cobalah online!


Fungsi anonim secara umum dapat diterima, jadi jika mau, Anda dapat menghapus f=.
Laikoni

@Laikoni Saya tidak yakin tentang validitasnya dalam hal ini, karena ini membutuhkan tanda kurung untuk digunakan sebaris, dan f=merupakan tugas terpendek, jadi pemanggilan minimal menambahkan dua.
Kamis




0

Perl 6 ,  43 39  35 byte

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

Menguji

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

Mengujinya (melakukan hal yang sama seperti di atas)

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

Menguji

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

Menguji

Penjelasan:

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

2ä¬Å«-}çJ

Cobalah online!

Penjelasan

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.

Anda tidak membutuhkan Join.
Shaggy

@Shaggy çtidak secara implisit mengubah daftar karakter menjadi string. Jika saya memahami masalahnya dengan benar, program harus mengeluarkan string dan bukan daftar karakter.
Wisław

0

Japt, 12 byte

Harus ada cara yang lebih singkat untuk mendapatkan bagian pertama dari array ...

¯UÊz)Ôån Ômd

Cobalah


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.