テキスト圧縮


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
私は、これがそのリックロールの質問のだましとして閉じられなかったことに正直に驚いています。もうやっていませんか?
ジョーキング

1
@JoKing 別の文字列です。同じチャレンジでのちょっとしたバラエティは時々楽しいものになります。
moonheart08

@ moonheart08そのポイントがメタで撃ち落とされたことをかなり確信しています。
魔法のタコ

回答:


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
これはエイリアシングの非常に賢い使用法です!!
ジュゼッペ

1
素晴らしい解決策!memCompressアプローチ47 + 79 = 126バイトにも
勝ってい

1
このアイデアにより、ここでも 1バイト節約できました!
ジュゼッペ

うわー、私はそのゴルフを見つけませんでした。それは本当にうれしいです。
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
バブルガムの回答のバイトをどのように削ったのですか?
ライコニ

2
@Laikoni答えバイトオリジナル73が使用して作成されたgzip最高の圧縮レベル(上の-9使用)に加えて、いくつかのメタデータシェービングheadtail、71 byterは私が最初に忘れzopfliを使用して生成されます。Zopfliは通常、短いDEFLATEストリームを作成します。
ovs

ええ、zopfliで最大5,000,000回の反復を試行しましたが、反復3109で71バイトを超える反復は何も見つかりませんでした。
LegionMammal978


4

Python 2 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+"?"

オンラインでお試しください!

複数のコンマで区切られた文字列を印刷して、それらの間にスペースを入れます。


Python 3、115バイト

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

オンラインでお試しください!

Python 3 translateが重荷を担います。1桁のASCII値で印刷できない文字を使用すると、2バイト節約できます。


1
exitPython 3プログラム用に1バイトを保存します。
ジョナサンアラン

4

ゼリー64 60 58 57バイト

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

オンラインでお試しください!


驚くべきことに、同じ言語と同じバイトカウントで、別の答えに似ています。私はこの言語で何が起こっているのか実際にはわかりません、それでコードは基本的に同じですか?
tox123

1
コード内の重複の多くは同一の圧縮された文字列であり、驚くことではありません。
ミシャラヴロフ

1
@toxの2つのプログラムは現在、同じようには機能していません(ただし、私たちは両方とも、改訂の歴史で互いに類似したアイデアを使用しています)。これは、圧縮された文字列リスト(“...“...»)を使用して4行のほとんどを形成し、次に圧縮された文字列リストでż繰り返しの少ない部分(など',\nIf')とインターリーブします。説明から私の動作を確認できます。
ジョナサンアラン

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
デフォルト値を割り当てるパラメータ拡張を使用して、変数宣言を最初の使用方法に移動でき ます。オンラインで試してください!
マナトワーク

1
@manatworkうわー、あなたはそれができるとは思いもしませんでした。100歳未満になるのはかなりクール-ありがとう!このテクニックは良いbashのヒントに答えるでしょう。
デジタル外傷

2

V99 87バイト

-12バイト:2つの置換がより短いことがわかります。これは基本的に他のすべてのソリューションと同じです(Bubblegumを除く?)

i1 a0.
A0 1.
If 1 a0,
Where's the0 1?Í0/ peck of pickled peppers
Í1/Peter Piper picked

オンラインでお試しください!


2

Pythonの3120の 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バイト)およびjoin(140バイト)よりも短くなりました。

-3ジョー・キングに感謝、-1ジョナサン・アレンに感謝


1
それはフォーマット文字列ではありません。それはフォーマット文字列です。(117バイト)
ジョーキング

1
プログラムはSTDERR出力される可能性があるため、に置き換えprintて1を保存しexitます。
ジョナサンアラン


2

小枝、105バイト

これは、単純な置換を使用してギャップを埋めます。

Twigの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 Server、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

スタックス60 56 バイト

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

実行してデバッグする


1
ここだ 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"?"]

オンラインでお試しください!

説明:

ジョブはrejoin、値のブロックを削減して結合する関数によって実行されます。

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

05AB1E78 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]);

オンラインでお試しください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.