숫자로 암호화!


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.