골프 줄


22

나는 항상 문자열 압축이 필요한 과제에 대한 해답을 제시하지 못했습니다 . 주된 이유는 문자열 압축 도구 를 효과적으로 사용해야한다는 것을 모르기 때문 입니다.

이런 이유로이 질문을 게시했습니다. 다른 팁 질문과는 달리, 이는 언어 별 의미가 아니므로 모국어로 된 팁을 생각할 수 있으면 게시 할 수 있습니다 (언어를 지정하면). 일반적인 팁도 높이 평가됩니다.

그렇다면 문자열 압축 도구를 최대한 활용하려면 어떻게해야합니까?

답변:


9

기본 변환 (CJam)

널 바이트로 시작하지 않는 ASCII 문자열을 인코딩하는 쉬운 방법은 기본 128에서 정수로 변환 한 다음 기본 256으로 변환하는 것입니다.

128b256b:c              e# Prints encoded string.
128b256b:c`"256b128b:c" e# Prints encoded string with decoder.

7 비트를 사용하여 각 ASCII 문자를 인코딩합니다.

원래 문자열이 소문자로만 구성되고 a로 시작하지 않는 경우 로 매핑 "a...z"하여 [0 ... 25]시작한 다음 위와 같이 진행할 수 있습니다.

'afm26b256b:c               e# Prints encoded string.
'afm26b256b:c`"256b26b'af+" e# Prints encoded string with decoder.

마지막으로 원래 문자열에 고유 한 문자가 거의없는 경우 (ASCII 아트에서 일반적 임) 일반적으로 알파벳을 명시 적으로 지정하는 것이 좋습니다.

예를 들면 다음과 같습니다.

" +-/\|"f#6b256b:c                       e# Prints encoded string.
" +-/\|"f#6b256b:c`"256b6b"" +-/\|"`"f=" e# Prints encoded string with decoder.

경험상 원래 문자열의 첫 번째 문자 는 알파벳 의 두 번째 문자가되고, 원래 문자열의 다음 고유 문자는 알파벳의 첫 번째 문자가되고, 원래 문자열의 다음 고유 문자가됩니다. 알파벳의 세 번째 문자, 알파벳의 네 번째 문자가 될 원래 문자열의 다음 고유 문자 등

마지막 예제의 인코더는 다음과 같이 작동합니다.

" +-/\|"f# e# Replace each character by its index in that string.
6b256b     e# Convert from base 6 (length of the alphabet) to base 256.
:c         e# Cast each digit to character.

마지막 예의 디코더는 다음과 같이 작동합니다.

256b6b     e# Convert from base 256 to base 6.
" +-/\|"f= e# Replace each digit by the corresponding character of the alphabet.

2
좀 더 구체적으로 설명하자면, 원래 문자열의 첫 번째 문자가 알파벳의 두 번째 문자가되고 원래 문자열의 다음 고유 문자가 알파벳의 첫 번째 문자가 되길 원합니다. ...
Peter Taylor

@PeterTaylor가 추가되었습니다. 감사!
Dennis

9

일부 구조는 있지만 간단한 수식 (예 : 노래 가사)이없는 더 큰 콜로 모고 로프 복잡성 질문은 일반적으로 문법 기반 접근 방식의 이점이 있습니다. 본질적으로 반복되는 부분 문자열을 추출하여 어떻게 든 인코딩합니다. 이것은 상당히 제한적인 문법을 사용하여 Lempel-Ziv가하는 일입니다. 보다 일반적인 문법을 사용하면 규칙을 인코딩하는 방법을 알아야합니다. 예를 들어 여기서 "오프셋 인코딩"은 규칙 수 ( n) 만큼 각 소스 바이트를 오프셋 하고 규칙에 바이트 1를 할당 n하고 규칙 0을 구분 하기 위해 바이트를 사용하며 바이트를 i평가 된 규칙 으로 반복해서 대체 하는 "오프셋 인코딩" i입니다. 마지막으로 n각 바이트에서 빼서 오프셋을 취소합니다 .

실제로 다양한 접근 방식을 구현 하는 Java 프로그램작성했습니다 .

대부분의 접근 방식은 2 단계 프로세스를 따릅니다. 첫 번째 단계에서 문자열은 문법으로 변환되어 문자열을 생성합니다. 두 번째 단계에서는 문법이 GolfScript 프로그램으로 변환됩니다. 제 1 위상은 크게 구현 Charikar 리먼 류, Panigrahy, 프라 바카, 사 하이, Shelat (2005)에 근거 작은 문법 문제 IEEE 트랜잭션, 51 (7), 2554년에서 2576년까지에, 정보 이론.

또한 Lempel-Ziv 방식, 기본 인코딩 방식 및 런 길이 인코딩 방식을 포함하며 가장 짧은 프로그램을 제공하는 방식을 식별합니다.


0

스탁스

에서 STAX 코드 골프 언어, 호출 도움이 작은 도구 거기에 문자열 리터럴 압축기 . 나는 그것이 어떻게 작동하는지 정확히 알지 못하지만 그것이 어떻게 작동하는지 알 수 있는 또 다른 곳 이 있습니다. 문자열을 숫자로 변환 한 다음 Base 256으로 변환합니다. CP437 이며 복사를 위해 0x00 및 0xFF로 변환됩니다. PackedStax입니다. 문자열 리터럴 압축기로 문자열을 변환 한 다음 압축하여 압축 할 수 있습니다.

이 프로세스를 사용하여 "이 문자열은 32 바이트입니다"라는 문자열을 v * "A]-| W4]} 3"%로 변환 할 수 있습니다 (압축 된 문자열은 일반적으로 역 따옴표로 묶여 Stax의 일반 문자열 간의 차이를 나타냅니다. ) 그리고 마지막으로 üvìë! [┴╩qJu ← ▓α]에서 18 바이트의 압축 / 감소를 절반 이상으로합니다.

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