때때로 여기의 질문은 ASCII 아트를 그리는 것을 요구합니다. 해당 기술에 대한 데이터를 저장하는 간단한 방법 중 하나는 RLE (run-length encoding) 입니다. 그래서:
qqqwwwwweeerrrrrtttyyyy
된다 :
3q5w3e5r3t4y
이제 큰 ASCII 아트를 그리려면 다음과 같은 데이터를 얻을 수 있습니다 (줄 바꾸기 문자 무시).
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
ASCII 아트에 사용되는 문자는 소문자 나 대문자 또는 숫자가 아니며 부호, 표시 및 기호 만 있지만 항상 인쇄 가능한 ASCII 문자 집합이됩니다.
해당 문자열에 약간의 공간을 절약하려고하므로 숫자를 대문자 문자 세트로 바꾸십시오 ( 'A'는 1, 'B'는 2가 될 때까지 'Z'는 26이 될 때까지). 캐릭터를 26 회 이상 반복하십시오. 그래서 당신은 얻을 :
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
마지막으로 일부 문자 (기호 + 기호)가 반복되는 것을 알 수 있으므로 문자열에서 3 번 이상 나타나는 그룹을 문자열의 순서 또는 모양으로 소문자 문자 집합으로 대체하지만 버퍼에 저장하면 대체 (각 대체에 대해 "group + substitution char"형식으로)하고 나머지 문자열은 그대로 둡니다. 따라서 다음 그룹은
S, (3 times)
T (4 times)
K@ (3 times)
26 개를 초과하는 그룹이 반복되지 않으므로 'a', 'b'및 'c'로 각각 대체됩니다. 마지막으로 다음을 얻습니다.
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[마지막 단계 후에 문자를 실제로 저장하는 그룹이 4 번 이상 나타나는 그룹이므로 마지막 단계는 1 바이트 만 절약합니다.]
도전
ASCII 아트를 그리기위한 RLE 데이터가 포함 된 문자열이 제공되면 (제한이 제 안됨) 설명 된대로 압축하기 위해 가능한 가장 짧은 프로그램 / 함수 / 방법을 작성하십시오. 알고리즘은 두 문자열을 인쇄 / 반환해야합니다. 첫 번째 문자열은 압축에 사용 된 사전을 포함하고 두 번째 문자열은 압축 된 문자열입니다. 주어진 순서대로 문자열을 Tuple, 배열, List 또는 기타로 반환 할 수 있습니다.
2 단계에서 문자열을 압축 할 수없는 경우 알고리즘은 빈 문자열을 첫 번째 반환 값으로 반환하고 1 단계의 결과를 두 번째 반환 값으로 반환해야합니다.
단계 1의 결과를 출력 값에 포함시킬 필요는 없습니다. 설명을 위해 예제에 포함시키기 만하면됩니다.
이것은 code-golf 이므로 각 언어에 대한 최단 답변이 이길 수 있습니다!
다른 테스트 사례
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
S,aT bK@c
아마도 S,T K@
그로부터 사소하게 추론 될 수있는 대체 문자의 이름을 명시 적으로 지정하지 않고 그대로 저장됩니다 .