Sayılarla Şifreli!


12

Sorun:

İki düşman gizli ajanı harika bir iletişim yöntemi sizin için tasarladı!

Şifreleme işlemi şu şekilde çalışır:

1) Her bir mektubun ascii eşdeğerini alın. (Boşluk, sayı veya noktalama işareti gönderilmez)

2) Mesajdaki her harf için, onun ascii eşdeğeri ve arkasından gelen harf (Varsa, yoksa, 0 olarak düşünülmelidir) çarpılır (bu ürün bir dizide / listede saklanır) ve toplanır (bu sayı farklı bir listede de saklanır).

3) İki liste (toplamların ve ürünlerin) bir araya getirilir (toplamlar listesi, ardından katlar listesi, aynı diziye) ve iletilir.

Bu işlemi tersine çevirebilecek en küçük programı yazmanız ve bu biçimde gönderilen mesajların şifresini çözmeniz gerekir!

Örnek Giriş ve Çıkış Çiftleri:

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

Bu , bu yüzden bayttaki en küçük çözüm kazanır.

Hata mesajlarına izin verilir.

Gönderiminizde belirtirseniz, programınıza bir liste / 1 boyutlu dizi veya virgülle ayrılmış bir dize verilebilir. Varsayılan, bir dizi / listedir.


1
Neden katların listesi orada? Sadece toplamlar yeterli bilgi.
orlp

1
@orlp belki daha fazla golf fırsatına izin vermek için? :)
Jonathan Allan

1
@orlp oh hayır, eğlenceyi şımarttın!
Outgolfer Erik

@JonathanAllan kısmen doğru. İki gizli ajanın “aptal” larına gereksiz parçalar eklemeleri için süper aptal görünmelerini istedim. Ayrıca, ortaya çıkabilecek daha fazla program da ekler.
iPhoenix

@orlp Sadece katlar yeterli değil, değil mi?
ericw31415

Yanıtlar:


5

Kabuk , 7 6 bayt

mcĠ≠←½

Çevrimiçi deneyin! Belgelere göre, liderlere mihtiyaç duyulmamalıdır, ancak şu anda bir hata var gibi görünüyor.

Düzenleme: Zgarb sayesinde -1 bayt!

Açıklama:

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

Bence `-olabilir . Gerçekten davranış cbir hata gibi görünüyor.
Zgarb

@Zgarb Bu eşitsiz uygulama için pratik bir yol. Bu bir yerde belgelendi mi?
Laikoni

Başladı Semantik Sayfanın Husk Wiki'nin.
Zgarb

1
Açıklamanızı değiştirdiğiniz anlaşılıyor, ancak gerçek kod snippet'inin kendisi değil. :)
iPhoenix

@iPhoenix Teşekkürler, ben aldım.
Laikoni

8

beyin , 66 bayt

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

Girdi, şifrelenmiş dizedir. EOF üzerinde sonsuz büyüklükte hücreler ve 0 olduğunu varsayar.

Nasıl çalışır:

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

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

Çevrimiçi deneyin!

açıklama

  • fst.span(<245)listenin başlangıcından 245'ten küçük olan tüm sayıları alır. Bunlar yalnızca toplama kısmındaki rakamlardır, çünkü mümkün olan en büyük toplama z + z = 122 + 122 = 244ve mümkün olan en küçük ürün A * A = 65 * 65 = 4225.
  • scanr1(-)listenin son değerini alır ve ilk akümülatör olarak kullanır. Daha sonra, listenin her bir elemanı mevcut akümülatör tarafından çıkarılır ve sonuç bir sonraki akümülatör olarak kullanılır ve bir listeye eklenir.
  • map toEnum dizeyi yeniden oluşturmak için listedeki her sayıyı karşılık gelen karakterle değiştirir.




2

Jöle , 11 bayt

œs2Ḣḅ-$ÐƤAỌ

Tamsayıların listesini alıp karakterlerin listesini döndüren monadik bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

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

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

Tamsayıların listesini alır ve bir dizi karakter döndürür.

Açıklama:

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

Çevrimiçi deneyin!


1

JavaScript (ES6), 80 bayt

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


1

VB Komut Dosyası - 74 71 bayt

(Do..Loop yerine While..Wend kullanarak 74'ten 71'e indirmeyi başardım)

Girdi a () dizisinde, çıktı d dizesinde

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

açıklama

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.

Bir fonksiyon olarak sarılmış yukarıdaki kod ile bir vbscript dosyasında test:

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

Temiz , 96 81 78 77 bayt

zeroboş karakterdir.
Temiz kaynak dosyasındaki değişmez değerlerle ilgili çok seçici olmasaydı başka bir bayt kaydedebilirdim.

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

Çevrimiçi deneyin!


Anonim işlevler genel olarak kabul edilebilir, bu yüzden isterseniz bırakabilirsiniz f=.
Laikoni

@Laikoni Bu durumda bunun geçerliliğinden emin değilim, çünkü satır içi kullanmak için ebeveyn yapıştırıcılara ihtiyaç duyuyor ve f=en kısa ödev, bu yüzden minimal bir çağırma yine de iki tane ekliyor.
Οurous




0

Perl 6 ,  43 39  35 bayt

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

Dene

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

Test edin (yukarıdakiyle aynıdır)

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

Dene

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

Dene

Açıklama:

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

2ä¬Å«-}çJ

Çevrimiçi deneyin!

açıklama

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.

JOin'e ihtiyacınız yok .
Shaggy

@Shaggy ç, karakter listesini örtük olarak bir dizeye dönüştürmez. Sorunu doğru anlarsam, programın karakter listesi değil, bir dize çıkarması gerekir.
Wisław

0

Japt, 12 bayt

Dizinin ilk yarısını almanın daha kısa bir yolu olmalı ...

¯UÊz)Ôån Ômd

Dene


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.