이 챌린지는 2018 년 4 월 LotM 챌린지 의 일부로 , Brain-flak의 2 번째 생일을 위해 게시되었습니다.
나는 뇌-플래그 프로그램을 인코딩하는 가장 효율적인 방법이 무엇인지 생각하고있었습니다. 유효한 문자는 8 개뿐이므로 각 문자를 3 비트 시퀀스에 매핑해야합니다. 이것은 확실히 효과적이지만 여전히 매우 중복 적입니다. 인코딩 시간을 단축하기 위해 이용할 수있는 뇌 플랙 코드의 일부 기능이 있습니다.
모두 2 개의 일치하는 대괄호로 표시되는 nilads는 실제로 2가 아닌 단일 정보 단위로 작동합니다. 각 대괄호를 단일 바이트 문자로 바꾸면 데이터 손실없이 인코딩이 훨씬 작아집니다.
이것은 명확하지 않지만 모나드 의 닫는 바이트 도 중복됩니다.
'?'
다음 스 니펫에서 캐릭터가 무엇을 나타내는 지 추측 할 수 있다고 생각 하십니까?{(({}?<>?<>?
입력이 유효한 뇌-플래 크 코드라고 가정하면, 각 물음표마다 하나의 옵션 만 있습니다. 즉, 닫기 모나드 문자를 모호하게 사용하여 모든 닫는 괄호를 나타낼 수 있습니다 . 이것은 문자 집합을 작게 유지하는 이점이 있으며 허프만 인코딩을 사용하려는 경우 큰 도움이됩니다. 때문에 가까운 모나드의 캐릭터가 가장 가능성이 넓은 여백에 의해 가장 일반적인 문자 될 것입니다, 그것은 상당히 효율적인 단일 비트에 의해 표현 될 수있다.
이 두 가지 트릭을 통해 다음 알고리즘을 통해 뇌-플래 크 코드를 압축 할 수 있습니다.
모나드의 모든 닫는 브래킷을로 교체하십시오
|
. 즉, 앞에 여는 일치 항목 이없는 모든 닫는 괄호를 막대와 바꿉니다. 그래서...(({})<(()()())>{})
될 것이다
(({}|<(()()()||{}|
모든 nilad를 닫는 브래킷으로 교체하십시오. 따라서 일치하지 않는 대괄호에는 다음과 같은 매핑이 사용됩니다.
() --> ) {} --> } [] --> ] <> --> >
이제 우리의 마지막 예는 다음과 같습니다.
((}|<()))||}|
후행
|
문자를 제거하십시오 . 우리는 총 막대 수가 총({[<
문자 수와 같아야한다는 것을 알고 있으므로 누락 된 막대가 있으면이를 유추 할 수 있습니다. 따라서 예를 들면 다음과 같습니다.({({})({}[()])})
될 것이다
({(}|(}[)
오늘 당신의 도전은이 과정을 뒤집는 것입니다.
문자 만 포함 된 압축 된 뇌-플래 크 문자열이 주어지면 (){}[]<>|
, 그것을 원래의 뇌-플래 크 코드로 확장하십시오. 입력이 항상 유효한 뇌-플랙으로 확장 될 것이라고 가정 할 수 있습니다. 이는 입력의 접두어에 문자 |
이상을 포함하지 않음을 의미합니다 ({[<
.
입력에는 후행 |
문자가 포함되지 않습니다 . 이들은 맥락에서 유추되어야합니다.
평소와 같이 전체 프로그램 또는 기능을 제출할 수 있으며 입력 / 출력 형식이 허용됩니다. 그리고 이것은 code-golf 이므로 소스 코드의 길이에 따라 코드의 점수가 매겨지며 점수가 작을수록 좋습니다.
테스트 사례
다음은 몇 가지 테스트 사례입니다. 더 많은 것을 원한다면 이 파이썬 스크립트 와 Brain-Flak Wiki를 사용하여 자체 테스트 사례를 생성 할 수 있습니다 .이 테스트 사례는 대부분 테스트 사례에서 비롯됩니다.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}