숫자로 암호화!


12

문제 :

두 명의 적 비밀 요원이 멋진 (당신을 위해) 의사 소통 방법을 고안했습니다!

암호화 프로세스의 작동 방식은 다음과 같습니다.

1) 각 문자의 ASCII 문자를 사용하십시오. (공백, 숫자 또는 문장 부호가 전송되지 않습니다)

2) 메시지의 각 문자에 대해 해당 문자와 ​​그에 해당하는 문자 (존재하는 경우 0으로 간주되어야 함)와 그에 해당하는 문자가 곱해집니다 (이 제품은 배열 / 목록에 저장 됨) 합산됩니다 (이 번호는 다른 목록에도 저장 됨).

3) (합계와 상품의) 두리스트가 합쳐지고 (합계리스트, 그 다음에 복수리스트, 같은 배열로) 전송됩니다.

이 프로세스를 취소하고이 형식으로 전송 된 메시지를 해독 할 수있는 가장 작은 프로그램을 작성해야합니다!

입력 및 출력 쌍 예 :

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

이것은 이므로 바이트 단위의 가장 작은 솔루션이 이깁니다.

오류 메시지가 허용됩니다.

제출에 지정하면 프로그램에 1 차원 배열 또는 쉼표로 구분 된 문자열을 제공 할 수 있습니다. 기본값은 배열 / 목록입니다.


1
왜 배수 목록이 있습니까? 합계만으로도 충분한 정보입니다.
orlp

1
@orlp는 더 많은 골프 기회를 허용할까요? :)
Jonathan Allan

1
@ orlp 오, 당신은 재미를 망치고!
Outgolfer Erik

@JonathanAllan은 부분적으로 정확합니다. 나는 두 비밀 요원이 매우 어리석게 나타나서 불필요한 부분을“코드”에 추가하기를 원했습니다. 또한 나오는 더 많은 가능한 프로그램을 추가합니다.
iPhoenix

@orlp 단지 배수로 충분하지 않습니다.
ericw31415

답변:


5

껍질 , 7 6 바이트

mcĠ≠←½

온라인으로 사용해보십시오! 문서에 따르면 선행 m은 필요하지 않지만 현재 버그가있는 것 같습니다.

편집 : Zgarb 덕분에 -1 바이트!

설명:

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

나는 `-될 수 있다고 생각 한다 . c실제로 동작은 버그처럼 보입니다.
Zgarb

@Zgarb 그것은 불평등을 구현하는 실용적인 방법입니다. 이것은 어딘가에 기록되어 있습니까?
Laikoni

Husk Wiki 의 시맨틱 페이지 에 있습니다.
Zgarb

1
설명을 변경했지만 실제 코드 스 니펫 자체는 변경하지 않은 것 같습니다. :)
iPhoenix

@iPhoenix 감사합니다.
Laikoni

8

brainfuck , 66 바이트

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

입력은 암호화 된 문자열입니다. 무한 크기의 셀을 가정하고 EOF에서 0을 가정합니다.

작동 방식 :

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

하스켈 , 45 35 바이트

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

온라인으로 사용해보십시오!

설명

  • fst.span(<245)목록의 시작 부분에서 245보다 작은 모든 숫자를 사용합니다. 가능한 가장 큰 합계는 z + z = 122 + 122 = 244이고 가능한 가장 작은 곱은 이므로 합계 부분의 숫자 입니다 A * A = 65 * 65 = 4225.
  • scanr1(-)목록의 마지막 값을 가져 와서 초기 누산기로 사용합니다. 그런 다음 앞뒤로 목록의 각 요소를 현재 누산기에 의해 빼고 결과를 다음 누산기로 사용하여 목록에 추가합니다.
  • map toEnum 문자열을 다시 만들기 위해 목록의 각 숫자를 해당 문자로 바꿉니다.

3

젤리 , 9 바이트

œs2ḢUạ\ỌU

온라인으로 사용해보십시오! 또는 두 테스트 사례를 모두 확인하십시오.

대안.

설명

œs2ḢUạ \ ỌU || 전체 프로그램.

–s2 || 필요한 경우 첫 번째 부분이 더 긴 두 부분으로 나눕니다.
   Ḣ || 머리를 가져옵니다 (첫 번째 요소).
    U || 역.
     ạ \ || 빼기로 누적 감소.
       Ọ || 코드 포인트에서 문자로 변환하십시오.
        U || 그리고 다시 반전하십시오.



2

젤리 , 11 바이트

œs2Ḣḅ-$ÐƤAỌ

정수 목록을 가져와 문자 목록을 반환하는 모나드 링크.

온라인으로 사용해보십시오!

어떻게?

œ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 바이트

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

정수 목록을 가져와 문자열을 반환합니다.

설명:

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

온라인으로 사용해보십시오!


1

자바 스크립트 (ES6), 80 바이트

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


1

VB 스크립트 -74 71 바이트

(Do..Loop 대신 While..Wend를 사용하여 74에서 71로 줄였습니다.)

입력은 배열 a ()에 있고 출력은 문자열 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

설명

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.

위 코드를 함수로 래핑하여 vbscript 파일에서 이것을 테스트했습니다.

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

클린 , 96 81 78 77 바이트

zero널 문자입니다.
Clean이 소스 파일의 리터럴 널에 대해 까다 롭지 않은 경우 다른 바이트를 저장할 수 있습니다.

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

온라인으로 사용해보십시오!


익명 함수는 일반적으로 허용되므로 원하는 경우을 (를) 삭제할 수 있습니다 f=.
Laikoni

@Laikoni 나는 괄호를 인라인으로 사용해야 f=하고 가장 짧은 할당 이기 때문에이 경우의 유효성에 대해 확신하지 못 하므로 최소한의 호출로 어쨌든 두 개가 추가됩니다.
OUurous




0

펄 6 ,  43 39  35 바이트

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

그것을 테스트

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

테스트 (위와 동일)

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

그것을 테스트

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

그것을 테스트

설명:

{[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 바이트

2ä¬Å«-}çJ

온라인으로 사용해보십시오!

설명

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.

당신은 J오인이 필요하지 않습니다 .
얽히고 설킨

@Shaggy ç는 문자 목록을 암시 적으로 문자열로 바꾸지 않습니다. 문제를 올바르게 이해하면 프로그램은 문자 목록이 아닌 문자열을 출력해야합니다.
Wisław


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.