숨겨진 메시지를 해독하십시오!


11

소개

어느 날 갑자기 컴퓨터에 경고가 표시 될 때 CIA 사무실에서 휴식을 취했습니다. 귀하의 프로그램은 방금 수백 개의 코딩 된 메시지를 가로 채었습니다! 빠른 검사를 통해 인코딩 규칙을 알 수 있지만 빠른 디코딩을 위해서는 프로그램이 필요합니다.

도전

쉼표로 구분 된 문자열 목록이 제공됩니다. 각 문자열에는 다음 중 하나가 포함됩니다.

  • 코딩 된 메시지의 일부
    • 형식 이 아닌 경우 코드화 된 메시지의 일부입니다 a=b. 그것은 참고 입니다 있는지 확인하여 메시지의 일부 ab=c. 이 문자열을 코드화 된 메시지에 추가하십시오.
  • 인코딩 체계의 일부
    • 이 형식은 a=b입니다. 즉, 메시지의 모든 a가 b로 교체되어야합니다. 는 일 수 있습니다 a==. 즉, 모든 a를 =로 바꾸어야합니다.

그런 다음 프로그램은 찾은 체계를 사용하여 디코딩 된 메시지를 출력해야합니다.

기타 정보 : 입력은 문자열 분리를위한 쉼표 만 포함합니다. ! 1 # 등과 같은 다른 문자를 포함 할 수 있습니다. 대문자는 포함하지 않습니다. 디코딩 정보 비트는 서로 디코딩하지 않습니다. 메시지 만 디코딩 정보의 영향을받습니다. 각 캐릭터마다 한 번의 교체 만 제공됩니다. 예 : 아니오"io,"i=u","i=g"

입력:"ta","y=s","y","a=e","b=t","b"," ","j","j=1"

산출:test 1

입력:"z=p","zota","g=e","yugkb","y=t","u=o","k=s","li","fg","b=="

산출:potatoes=life

입력:"p","=","==n","ot","p=a","hiz","i=e","z=r"

산출:another

이것은 이므로 바이트 단위의 최단 답변이 승리합니다!


오 예, 미안합니다! 편집
pydude

예를 들어 전이성 및 원형도 "massega","e=a","a=e"는 어떻습니까?
Jonathan Allan

1
비트의 디코딩 정보는 서로 디코딩하지 않는다. 메시지 만 디코딩 정보의 영향을받습니다.
pydude

1
또한 각 캐릭터에 대해 한 번의 교체 만 제공됩니다. 예 : no"io,"i=u","i=g"
pydude

1
감사합니다.이 정보를 사양에 추가하는 것이 좋습니다.
Jonathan Allan

답변:


1

젤리 , 19 바이트

ḊṖ⁼“=”
ÇÐfKm2yÇÐḟF$

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

어떻게?

ḊṖ⁼“=” - Link 1, isMappngElement?: string
Ḋ      - dequeue
 Ṗ     - pop
   “=” - char-list,['=']
  ⁼    - equal?

ÇÐfKm2yÇÐḟF$ - Main link: list of strings
 Ðf          - filter keep:
Ç            -     last link (1) as a monad
   K         - join with spaces
    m2       - modulo 2 slice (every other character)
           $ - last two links as a monad:
        Ðḟ   -     filter discard:
       Ç     -         last link (1) as a monad
          F  -     flatten
      y      - translate right according to the mapping of left

매우 흥미로운 것은 m2 "modulo 2 slice"는 무엇을 의미합니까?
Magic Octopus Urn

m왼쪽의 모든 오른쪽 요소를 취하는 2 차원 원자입니다. 예를 들어 여기에서는 ['x','=','y','<space>','a','=','b']m2yield가 ['x','y','a','b']됩니다. (* 대신 반사를 추가 할 때 right가 0이 아닌 경우)
Jonathan Allan

5

파이썬 3, 98

lambda l:''.join(x*('='!=x[1:-1])for x in l).translate({'='!=x[1:-1]or ord(x[0]):x[2:]for x in l})

lambda함수는 문자열 목록 (입력)을 수신하고 문자열 (디코딩 된 메시지)을 반환합니다.

예 :

>>> f(['ta', 'y=s', 'y', 'a=e', 'b=t', 'b', ' ', 'j', 'j=1'])
'test 1'
>>> f(['z=p', 'zota', 'g=e', 'yugkb', 'y=t', 'u=o', 'k=s', 'li', 'fg', 'b=='])
'potatoes=life'
>>> f(['p', '=', '==n', 'ot', 'p=a', 'hiz', 'i=e', 'z=r'])
'another'

당신이 필요합니까 : -1 또는 의지 : 2 작동합니까?
DSM

1
@DSM 나는 때문에 필요한 것 같아요 '=' == x[1:2]사실이 될 것이기 때문 x = 'a=bc'인코딩 방식의 일부가 아닌 인
vaultah

1
아, 좋은 지적이야!
DSM

2

하스켈, 85 바이트

f x=[(a,b)|[a,'=',b]<-x]
h x=map(\v->maybe v id$lookup v$f x)$concat[c|c<-x,[]==f[c]]

용법

>h ["p","=","==n","ot","p=a","hiz","i=e","z=r"]
>"another"

기술

f 조회 테이블을 작성합니다.

concat[c|c<-x,[]==f[c]] 메시지를 추출합니다.

map(\v->maybe v id$lookup v$f x) 조회를 수행합니다.


2

JavaScript (ES6), 87 바이트

(l,s='',d={})=>l.map(v=>/.=./.test(v)?d[v[0]]=v[2]:s+=v)&&[...s].map(c=>d[c]||c).join``

<input id=a oninput="try{b.innerText=((l,s='',d={})=>l.map(v=>/.=./.test(v)?d[v[0]]=v[2]:s+=v)&&[...s].map(c=>d[c]||c).join``)(eval(`[${a.value}]`))}catch(e){}"/>
<p id=b />


1

레티 나, 84 82 77 74 바이트

쉼표로 구분 된 목록을 입력으로 사용합니다. 후행 줄 바꿈 참고

^ | $
,,
+`, (. =.) (,. *)
$ 2 $ 1
M! &`(.). * ,,. * \ 1 =. |. +,
%`(.). *, $ |. * (.)
$ 1 $ 2
\ n |,

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

설명:

먼저 폼의 모든 표현을 .=.문자열의 끝으로 옮기고 이중 쉼표 ( ,,) 로 메시지와 구분 합니다. 다음 단계에서 앞에있는 각 문자가 ,,일치 하는지 확인하여 모든 인코딩을 찾을 수 있습니다 =.. 이것은 M!&`(.).*,,.*\1=.|.+,그러한 모든 일치 항목을 찾아서 줄 바꿈으로 구분 된 문자열 목록에 배치합니다. 그런 다음 인코딩되지 않은 문자 하나 또는 인코딩 된 버전의 문자 만 포함하도록 각 문자열을 수정합니다. 마지막으로 모든 줄 바꿈과 쉼표를 빈 문자열로 바꾸어 출력 형식을 정돈합니다.


0

배치, 188 바이트

@echo off
set/pm=
set c=
for %%s in (%m%)do call:c %%s "%%c%%%%~s" not
for %%s in (%m%)do call:c %%s "%%c:%%~s%%"
echo %c%
exit/b
:c
set s=%~1
if %3 "%s:~1,1%"=="=" call set c=%~2

설명 : 문자열 목록을 두 번 반복합니다 ( forCSV 형식의 문자열이 편리함 ). 처음으로를 =두 번째 문자로 포함하지 않은 문자열을 찾아서 결과에 연결합니다. 두 번째 =로, 두 번째 문자로를 포함하는 문자열을 찾고 대체를 수행합니다. (더 편리하게, 대체는 이미 배치 형식입니다.)



0

PHP, 89 87 바이트

두 가지 버전 :

while(a&$s=$argv[++$i])3==strlen($s)&"="==$s[1]?$t[$s[0]]=$s[2]:$m.=$s;echo strtr($m,$t);
while(a&$s=$argv[++$i])preg_match("#^.=.$#",$s)?$t[$s[0]]=$s[2]:$m.=$s;echo strtr($m,$t);

명령 행 인수에서 입력을받습니다. 로 실행하십시오 -nr.

  • 에 대한 매개 변수를 작성하는 인수를 반복합니다 strtr
    (인수에 포함 된 경우 변환 =, 기타 메시지).
  • 수행하십시오 strtr.

0

05AB1E , 31 바이트

vy'=åyg3Q&iyˆyS}})øJÁ¨`¹¯KJ.Ás‡

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

vy              }
  '=åyg3Q&                      # See if it's length 3 with an equals in the mid.
          iyˆyS                 # If so, add to global array, split into chars.
               } 
                 )øJÁ¨`         # Transpose, join, and remove the middle =.
                       ¹¯KJ     # Push original input without decryption key.
                           .Ás‡ # Shift stack to the right, swap and transliterate.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.