텍스트 압축


18

아래 주어진 텍스트를 사용하면 텍스트에 여러 번 반복되는 단어가 있습니다. 텍스트를 압축하여 표시하는 간단한 코드를 작성하려면 프로그래밍 언어를 사용하십시오. 즉, 가장 작은 바이트 수를 사용하여 텍스트를 표시하십시오.
본문은 :

Peter Piper picked a peck of pickled peppers.
A peck of pickled peppers Peter Piper picked.
If Peter Piper picked a peck of pickled peppers,
Where's the peck of pickled peppers Peter Piper picked?

6
솔직히 이것이 Rick-Roll 질문의 속임수로 닫히지 않았다는 것에 놀랐습니다. 우리는 더 이상 그렇게하지 않습니까?
Jo King

1
그것을 @JoKing하는 것입니다 다른 문자열입니다. 같은 도전에 약간의 다양성이 때로는 재미있을 수 있습니다.
moonheart08

@ moonheart08 꽤 요점은 메타에서 격추되었다는 것을 확신합니다.
매직 문어 Urn

답변:


9

R , 106 바이트

"["=gsub
cat(1["Peter Piper picked",2[" peck of pickled peppers","1 a2.
A2 1.
If 1 a2,
Where's the2 1?"]])

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


1
그것은 매우 영리한 앨리어싱 사용입니다!
Giuseppe

1
훌륭한 솔루션! 그것은 또한 memCompress 접근 방식 47 + 79 = 126 바이트를
이깁니다

1
이 아이디어는 여기에 또 다른 바이트를 저장했습니다 !
Giuseppe

와우, 나는 그 골프를 발견하지 않았다. 정말 좋습니다.
J.Doe

8

젤리 ,  80 73 72 68 67 61  57 바이트

“¡ŀṪ]ṃ{yṁ“Ñ3$ṘW5Ḍż⁸¢Hŀ“³ḌM“¡FỊİg“ÑɲʋØƥþƈƘ}“ṣɠ»“Ƙ9~ḷ’ṃFḊ”?

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

어떻게?

“...“...“...“...“...“...»“Ƙ9~ḷ’ṃFḊ”? - Main Link: no arguments
“...“...“...“...“...“...»            - list of compressed strings
                                     -   = [" Peter Piper picked",
                                     -      " peck of pickled peppers",
                                     -      ".\nA",
                                     -      ".\nIf",
                                     -      ",\nWhere's the",
                                     -      " a"]
                         “Ƙ9~ḷ’      - base 250 literal X = 2331781969
                               ṃ     - base decompress - i.e. use the list of strings as if
                                     -   they were the digits [1,2,3,4,5,0]
                                     -   X in base 6 is [1,0,2,3,2,1,4,1,0,2,5,2,1], so:
                                     -   [" Peter Piper picked",
                                     -    " a",
                                     -    " peck of pickled peppers",
                                     -    ".\nA"," peck of pickled peppers",
                                     -    " Peter Piper picked",
                                     -    ".\nIf",
                                     -    " Peter Piper picked",
                                     -    " a",
                                     -    " peck of pickled peppers",
                                     -    ",\nWhere's the",
                                     -    " peck of pickled peppers",
                                     -    " Peter Piper picked"]
                                F    - flatten
                                 Ḋ   - dequeue (remove the leading space)
                                  ”? - literal '?' character (causes print of previous)
                                     - implicit print (of the '?' character)

5

풍선 껌 , 73 71 바이트

00000000: 0b48 2d49 2d52 08c8 2c00 9205 99c9 d9a9  .H-I-R..,.......
00000010: 290a 890a 05a9 c9d9 0af9 6960 819c d414  ).........i`....
00000020: 20bf 0028 5fac c7e5 884b 4a01 d31c 3d2e   ..(_....KJ...=.
00000030: cf34 0552 8cd7 e10a cf48 2d4a 552f 5628  .4.R.....H-JU/V(
00000040: c948 25c1 227b 00                        .H%."{.

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


2
풍선 껌 답변의 바이트를 어떻게 줄이셨습니까?
Laikoni

2
@Laikoni는 않음 바이트 일본어 73 사용하여 만들어진 gzip높은 압축 레벨 (상 -9) 플러스하여 일부 메타 면도 head하고 tail, 71 byter I가 처음 약 깜빡 zopfli을 이용하여 생성된다. Zopfli는 일반적으로 더 짧은 DEFLATE 스트림을 만듭니다.
ovs

예, zopfli에서 최대 5,000,000 회까지 반복을 시도했지만 3109 회에서 71 바이트를 초과하는 항목을 찾을 수 없었습니다.
LegionMammal978


4

파이썬 2 , 115 바이트

a="Peter Piper picked"
b=" peck of pickled peppers"
print a,"a%s.\nA"%b+b,a+".\nIf",a,"a%s,\nWhere's the"%b+b,a+"?"

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

쉼표로 구분 된 여러 문자열을 인쇄하여 그 사이에 공백을 넣습니다.


파이썬 3 , 115 바이트

print("1 a2.\nA2 1.\nIf 1 a2,\nWhere's the2 1?".translate({49:"Peter Piper picked",50:" peck of pickled peppers"}))

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

파이썬 3 translate은 많은 노력을 기울입니다. 한 자리 ASCII 값으로 인쇄 할 수없는 문자를 사용하면 2 바이트가 절약됩니다.


1
exitPython 3 프로그램에 1 바이트를 저장합니다.
조나단 앨런

4

젤리 , 64 60 58 57 바이트

“¡ŀṪ]ṃ{yṁ“Ñ3$ṘW5Ḍż⁸¢Hŀ»j⁾ a,Ṛẋ2ż“³ḌM“¡FỊİg“ÑɲʋØƥþƈƘ}»FḊ”?

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


와우, 놀랍게도 같은 언어와 같은 바이트 수를 가진 다른 답변과 유사합니다. 실제로이 언어에서 무슨 일이 일어나고 있는지 알지 못하므로 코드는 기본적으로 동일합니까?
tox123

1
코드에서 겹치는 부분은 동일한 압축 문자열이므로 놀랍지 않습니다.
Misha Lavrov

1
@tox 두 프로그램은 현재 같은 방식으로 작동하지 않습니다 (우리 둘 다 개정 기록에서 서로 비슷한 아이디어를 사용했지만). 이것은 압축 문자열 목록 ( “...“...»)을 사용 하여 네 줄의 대부분을 형성 한 다음 ż덜 반복적 인 부분 (예 ',\nIf':)과 다시 압축 문자열 목록으로 인터리빙 ( ) 합니다. 설명에서 내 작동 방식을 확인할 수 있습니다.
Jonathan Allan

3

배쉬 , 99

  • @manatwork 덕분에 4 바이트가 절약되었습니다.
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

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


3
기본값 매개 변수 확장을 지정하여 변수 선언을 첫 번째 사용법으로 이동할 수 있습니다. 온라인으로 사용해보십시오! .
manatwork

1
@manatwork 와우, 당신이 할 수있을 줄 몰랐어요. 100 세 미만인 것은 매우 시원합니다-감사합니다! 이 기술은 좋은 bash 팁을 만들 입니다.
Digital Trauma


2

파이썬 (3) , 120 (117) 116 바이트

a,b="Peter Piper picked"," peck of pickled peppers"
exit(f"{a} a{b}.\nA{b} {a}.\nIf {a} a{b},\nWhere's the{b} {a}?")

형식 문자열addition (129 bytes)join (140 bytes) 보다 짧았습니다 .

Jo King 덕분에 -3, Jonathan Allen 덕분에 -1


1
형식 문자열이 아닙니다. 그건 형식 문자열. (117 바이트)
Jo King

1
프로그램이 STDERR로 출력 될 수 있으므로로 교체 print하여 1을 저장하십시오 exit.
Jonathan Allan


2

나뭇 가지, 105 바이트

이것은 간단한 교체를 사용하여 공백을 채 웁니다.

나뭇 가지 replace()필터를 사용하면 해시의 키로 대체 할 값을 정의 할 수 있습니다. 운 좋게도 숫자 키가 있으므로 배열에서도 작동합니다.

{{"0a1.
A1 0.
If 0 a1,
Where's the1 0?"|replace(["Peter Piper picked"," peck of pickled peppers"])|raw}}

|raw설정되어있는 탈출 방지하기 위해 필요 Where'sWhere's.

https://twigfiddle.com/phqpts에서 시도해 볼 수 있습니다


이것은 PHP로 컴파일되기 때문에 PHP와 동등한 것은 다음과 같습니다.

<?php
    $array = array("Peter Piper picked", " peck of pickled peppers");
    $string = "0 a1.
A1 0.
If 0 a1,
Where's the1 0?";

    echo str_replace(array_keys($array), $array, $string);

상당히 단축 될 수 있습니다.







1

jq, 110 자

(106 자 코드 + 4 자 명령 행 옵션)

"1 a2.
A2 1.
If 1 a2,
Where's the2 1?"|gsub("1";"Peter Piper picked")|gsub("2";" peck of pickled peppers")

샘플 실행 :

bash-4.4$ jq -nr '"1 a2.
A2 1.
If 1 a2,
Where'"'"'s the2 1?"|gsub("1";"Peter Piper picked")|gsub("2";" peck of pickled peppers")'
Peter Piper picked a peck of pickled peppers.
A peck of pickled peppers Peter Piper picked.
If Peter Piper picked a peck of pickled peppers,
Where's the peck of pickled peppers Peter Piper picked?

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


1

SQL 서버, 211

declare @a char(18)='Peter Piper picked'
declare @b char(24)=' peck of pickled peppers'
declare @c char=char(10)
print @a+' a'+@b+'.'+@c+'A'+@b+' '+@a+'.'+@c+'If '+@a+' a'+@b+','+@c+'Where''s the'+@b+' '+@a+'?'

db <> 바이올린


좋은 해결책! 개선 할 몇 가지 방법 : 여러 변수의 경우 쉼표 대신 쉼표를 사용하십시오 declare. 대신 문자열에 실제 줄 바꿈을 사용하십시오. 실제로 줄 바꿈을 명령문에 char(10)직접 넣고 완전히 print제거 할 수 @c있습니다. 가장 많이 사용되는 변수를 선택 @하고 자체적으로 사용하십시오 (유효합니다)
BradC

1

Stax , 60 56 바이트

╣lF╤╨┴+Y╟W╪▄,○F«↑•L°T»`┼◄ü√}x![Ñ$Θ☼²qσQ¼▬ôZ¡▄╙╥⌂å╛►¶▓&╗s

실행 및 디버깅


1
여기에 1 바이트 더 짧은 포장 풀기가 있고, 이것은 존재에 대해 심오한 진술을하는 것 같습니다.
Khuldraeseth na'Barya

"i am. Am i. If i am, Where's them i?" 나는 웃음을 멈출 수 없다. 이것은 금입니다.
재귀

데카르트는 나에게 아무런 의미가 없습니다.
Khuldraeseth na'Barya

1

T-SQL, 137 바이트

SELECT p+a+k+'.
A'+k+' '+p+'.
If '+p+a+k+',
Where''s the'+k+' '+p+'?'
FROM(SELECT'Peter Piper picked'p,' a'a,' peck of pickled peppers'k)b

마지막 반환 FROM은 가독성을위한 것이며 나머지는 문자열 연결의 일부입니다.

SeanC의 SQL 솔루션과 다른 방법 .




0

빨강 , 116 바이트

prin rejoin[a:"Peter Piper picked"" a"b:" peck of pickled peppers"".^/A"b" "a".^/If "a" a"b",^/Where's the"b" "a"?"]

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

설명:

작업은 rejoinfuncion에 의해 수행되며 값 블록을 줄이고 결합시킵니다.

prin rejoin [                      ; print the reduced (evaluated) and joined block
    a: "Peter Piper picked"        ; save the text to a
    " a"                           ; literal " a"
    b: " peck of pickled peppers"  ; save the text to b
    ".^/A"                         ; literal newline followed by "A"
    b                              ; " peck of pickled peppers" 
    " "                            ; literal " "
    a                              ; "Peter Piper picked"
    ".^/If "                       ; literal ".^/If "
    a                              ; "Peter Piper picked"
    " a"                           ; literal " a"
    b                              ; " peck of pickled peppers" 
    ",^/Where's the"               ; literal "," folowwed by a newline by "Where's the"  
    b                              ; " peck of pickled peppers"      
    " "                            ; literal " "
    a                              ; "Peter Piper picked" 
    "?"                            ; literal "?"
]



0

05AB1E , 78 76 74 72 바이트

’0 a1.
A10.
If0 a1,
W€Î's €€10?’TS.•1~¼ ¿•“±æ€‚ ÿÇì“'p0ǝ„íδŒ™„r¾Ð«‚ðì:¦

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

설명:

’0 a1.
A10.
If0 a1,
W€Î's €€10?’              # String "0 a1.\nA10.\nIf0 a1,\nWhere's the10?"
TS                        # 10 to digits: ["1","0"]
.•1~¼ ¿•                  # String "pickled"
        “±æ€‚ ÿÇì“        # String "neck of ÿ pepper", where the "ÿ" will 
                          # automatically be replaced with the top value of the stack
                  'p0ǝ    # Replace the character at index 0 with a "p":
                          #  "peck of pickled pepper"
„íδŒ                     # String "peter pipe"
     ™                    # Titlecased: "Peter Pipe"
      „r¾Ð                # String "r picked"
          «               # Merge them together: "Peter Piper pickled"
           ‚              # Pair them together:
                          #  ["peck of pickled pepper","Peter Piper pickled"]

            ðì            # Prepend a space before each:
                          #  [" peck of pickled pepper"," Peter Piper pickled"]
              :           # Replace the ["1","0"] with this list of strings
               ¦          # Remove the leading space (and output implicitly)

이유를 이해하려면 이 05AB1E 팁을 참조하십시오 .

  • ’0 a1.\nA10.\nIf0 a1,\nW€Î's €€10?’ 이다 "0 a1.\nA10.\nIf0 a1,\nWhere's the10?"
  • .•1~¼ ¿• 이다 "pickled"
  • “±æ€‚ ÿÇì“ 이다 "neck of ÿ pepper"
  • „íδŒ 이다 "peter pipe"
  • „r¾Ð 이다 "r picked"



0

PHP , 102 바이트

기본적으로 리피터 단어 또는 숫자로 문장을 변경 한 다음 php-strtr 을 적용 하십시오.

<?=strtr("0 a 1.
A 1 0.
If 0 a 1,
Where's the 1 0?",["Peter Piper picked","peck of pickled peppers"]);

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

또는

PHP , 144 바이트

<?=strtr("0 1 25 a 3 of 2l5 4.
A 3 of 2l5 4 0 1 25.
If 0 1 25 a 3 of 2l5 4,
Where's the 3 of 2l5 4 0 1 25?",[Peter,Piper,pick,peck,peppers,ed]);

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


0

파워 쉘, 99 101 바이트

$a='Peter Piper picked'
$b=' peck of pickled peppers'
"$a a$b.
A$b $a.
If $a a$b,
Where's the$b $a`?"

1
$ a = 'Peter Piper picked'해서는 안됩니까?
wooshinyobject

1
공간이 the $b제출물을 더 길고 유효하지 않은 것처럼 보입니다 ( TIO ).
Jonathan Frech

1
또한, 나는 당신이 [...]Peter Piper picked?당신의 출력의 끝에 누락 된 것으로 생각합니다 .
Jonathan Frech
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.