자바 스크립트 (ES6), 3.143 (81 바이트 저장, 664 바이트 프로그램)
R='replace',S=String.fromCharCode,T=c=>c.charCodeAt(),U='toUpperCase',V='0000000',W=(a,b,c=2)=>a.toString(c).slice(b),X=x=>'0b'+x,Y=a=>[...a].reverse().join``,Z=/[^]/g
C=s=>S(...((Y(q=s[U]()[R](/[^A-Z]/g,m=''))==q?(q=q.slice(0,p=-~q.length/2),p%1&&10):11)+q[R](Z,x=>W(T(x),2))+111+s[R](Z,c=>/[a-z]/.test(c)?W("00",m,m=1):m+(/[A-Z]/.test(c,m='')?"01":W(c<'!'?2:T(c)+384)))+V).match(/(?!0+$).{8}/g).map(X))
D=s=>{s=s[R](Z,c=>W(256+T(c),1))+V;M=r=>(s=s[R](p=s.match(`^${r}|`)[0],''),p);for([,a]=M`1.|0`,t=u=i='';!M`111`;)t+=W(X(M`.{5}`)-~8,0,36);for(t+=W(Y(t),a?a/0:1);p;)u+=M`0(?=00)|00?1`?(c=t[i++])?+p[1]?c[U]():c:'':M`10`?' ':M`11`&&S(X(M`.{7}`));return u+W(t,i)}
이 프로그램 (및 채점 시스템)에 상당히 만족 했으므로 약간의 설명을하겠습니다.
기본 아이디어는 입력을 비트 열로 압축 한 다음 8 비트의 각 세트를 바이트로 압축하는 것입니다. 설명을 위해 비트 문자열을 조작하겠습니다.
비트 문자열은 여러 섹션으로 구분 될 수 있습니다.
input -> Taco Cat.
output -> 0101000000100011011111110100001100100011101011100000000
0 | 10100 00001 00011 01111 111 | 01 00001 10 01 0001 110101110
header | letter data | styling data
헤더는 매우 간단한 매핑입니다.
0 -> odd-length palindrome
10 -> even-length palindrome
11 -> non-palindrome
문자 데이터도 매우 간단합니다. 먼저 모든 비 문자가 문자열에서 추출되고 모든 문자가 대문자로 변환됩니다. 결과 문자열이 회문이면 반전 된 절반이 제거됩니다. 그런 다음이 매핑이 적용됩니다.
A -> 00001
B -> 00010
C -> 00011
D -> 00100
...
Z -> 11010
이 섹션은로 끝납니다 111
. 그 후 대문자 / 소문자 데이터와 비 문자를 저장하는 스타일링 데이터가 제공됩니다. 이것은 다음과 같이 작동합니다.
01 -> next letter as uppercase
0...01 (n 0s) -> next (n-1) letters as lowercase
10 -> space
11xxxxxxx -> character with code point 0bxxxxxxx
위에서 보여준 예를 통해
header: 0 -> palindrome
letter data: 10100 00001 00011 01111 111 -> taco
styling data:
01 -> T
00001 -> aco
10 -> <space>
01 -> C
0001 -> at
110101110 -> .
비트 문자열의 끝에 도달하면 문자 데이터의 나머지 모든 문자가 결과에 추가됩니다. 이렇게하면 마지막 작업을 수행 할 필요 000...001
가 없으며 문자열에서이 비트를자를 수 있습니다.
테스트 사례 진행 :
tacocat -> 3 bytes (-4)
24 bits: 010100000010001101111111
toohottohoot -> 5 bytes (-7)
35 bits: 10101000111101111010000111110100111
todderasesareddot -> 7 bytes (-10)
49 bits: 0101000111100100001000010110010000011001100101111
amanaplanacanalpanama -> 8 bytes (-13)
59 bits: 00000101101000010111000001100000110000001011100000100011111
wasitacaroracatisaw? -> 11 bytes (-9)
84 bits: 010111000011001101001101000000100011000011001001111111000000000000000000001110111111
Bob -> 2 bytes (-1)
16 bits: 0000100111111101
IManAmRegalAGermanAmI -> 13 bytes (-8)
98 bits: 00100101101000010111000001011011001000101001110000101100111010100010100101000001010100000010100101
DogeeseseeGod -> 7 bytes (-6)
54 bits: 000100011110011100101001011001100101111010000000000101
A Santa at NASA -> 8 bytes (-7)
63 bits: 100000110011000010111010100000011110110010000011000011001010101
Go hang a salami! I'm a lasagna hog. -> 20 bytes (-16)
154 bits: 1000111011110100000001011100011100001100110000101100000010110101001111010011000000110001100000000111010000110011101001110011000110000000001100000111010111
wasitacaroraratisaw?
것과 반증이다