Textkomprimierung


18

Mit dem angegebenen Text unten gibt es einige Wörter im Text, die mehrmals im Text wiederholt werden. Verwenden Sie eine beliebige Programmiersprache, um einen kurzen Code zu schreiben, der den Text komprimiert, um ihn anzuzeigen. Verwenden Sie mit anderen Worten die kleinste Anzahl von Bytes, um den Text anzuzeigen.
Der Text ist:

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
Ich bin ehrlich überrascht, dass dies nicht als Betrug dieser Rick-Roll-Frage abgeschlossen wurde. Tun wir das nicht mehr?
Jo King

1
@JoKing es ist eine andere Zeichenfolge. Ein bisschen Abwechslung bei der gleichen Herausforderung kann manchmal Spaß machen.
moonheart08

@ moonheart08 ziemlich sicher, dass dieser Punkt in Meta abgeschossen wurde.
Magic Octopus Urn

Antworten:



8

Jelly ,  80 73 72 68 67 61  57 Bytes

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

Probieren Sie es online!

Wie?

“...“...“...“...“...“...»“Ƙ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

Bubblegum , 73 71 Bytes

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%."{.

Probieren Sie es online!


2
Wie haben Sie Bytes einer Kaugummi-Antwort entfernt?
Laikoni

2
@Laikoni Die ursprüngliche 73-Byte-Antwort wurde mit gzipder höchsten Komprimierungsstufe ( -9) plus einigen Metadaten erstellt , die mit headund rasiert tailwurden. Der 71-Byte-Code wird mit zopfli generiert, was ich anfangs vergessen habe. Zopfli erzeugt normalerweise kürzere DEFLATE-Streams.
Ovs

Ja, ich habe bis zu 5.000.000 Iterationen auf zopfli ausprobiert. Bei Iteration 3109 konnte nach der 71-Byte-Iteration nichts mehr gefunden werden.
LegionMammal978


4

Python 2 , 115 Bytes

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

Probieren Sie es online!

Druckt mehrere durch Kommas getrennte Zeichenfolgen, um Leerzeichen dazwischen einzufügen.


Python 3 , 115 Bytes

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

Probieren Sie es online!

Python 3 translatemacht das schwere Heben. Bei Verwendung von nicht druckbaren Zeichen mit einem einstelligen ASCII-Wert sollten zwei Bytes gespart werden.


1
exitSpeichert 1 Byte für das Python 3-Programm.
Jonathan Allan

4

Jelly , 64 60 58 57 Bytes

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

Probieren Sie es online!


Wow, überraschend ähnlich wie bei einer anderen Antwort, mit der gleichen Sprache und der gleichen Byteanzahl. Ich weiß eigentlich nicht, was in dieser Sprache passiert. Ist der Code also im Grunde derselbe?
Tox123

1
Ein Großteil der Überlappung im Code sind die identischen komprimierten Zeichenfolgen, was nicht überraschend ist.
Mischa Lawrow

1
@tox Die beiden Programme funktionieren derzeit nicht auf die gleiche Weise (obwohl wir beide in der Revisionsgeschichte ähnliche Ideen verwendet haben). Dieser verwendet komprimierte String-Listen ( “...“...»), um die meisten der vier Zeilen zu bilden, und verschachtelt ( ż) dann mit den weniger sich wiederholenden Teilen (wie ',\nIf'), wiederum mit komprimierten String-Listen. Wie meins funktioniert, können Sie der Beschreibung entnehmen.
Jonathan Allan

3

Bash , 99

  • 4 Bytes gespart dank @manatwork.
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

Probieren Sie es online!


3
Sie können die Variablendeklarationen auf ihre ersten Verwendungen verschieben, indem Sie Standardwert-Parametererweiterungen zuweisen: Probieren Sie es online aus! .
Manatwork

1
@manatwork Wow, ich hatte keine Ahnung, dass du das machen könntest. Ziemlich cool, unter 100 zu kommen - Danke! Diese Technik würde eine gute Antwort auf Bash-Tipps geben .
Digitales Trauma

2

V , 99 87 Bytes

-12 Bytes: 2 Substitutionen sind kürzer als bei allen anderen (außer Bubblegum?)

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

Probieren Sie es online!




2

Zweig, 105 Bytes

Dies nutzt einen einfachen Ersatz, um die Lücken zu füllen.

Mit dem Twig- replace()Filter können Sie die zu ersetzenden Werte als Schlüssel eines Hash definieren. Glücklicherweise funktioniert es auch mit Arrays, da diese über numerische Tasten verfügen.

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

Der |rawwird benötigt, um ein Entkommen zu vermeiden, das sich Where'sin einen verwandelt Where's.

Sie können es unter https://twigfiddle.com/phqpts ausprobieren


Da dies bis auf PHP kompiliert ist, wäre das Äquivalent für 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);

Welches kann deutlich verkürzt werden.





1

Sauber , 166 Bytes

import StdEnv,Text;f="peck of pickled";g="picked";u="peppers";p="Peter Piper";s=join" "[p,g,"a",f,u+".\nA",f,u,p,g+".\nIf",p,g,"a",f,u+",\nWhere's","the",f,u,p,g+"?"]

Probieren Sie es online!



1

jq, 110 Zeichen

(106 Zeichen Code + 4 Zeichen Befehlszeilenoptionen)

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

Probelauf:

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?

Probieren Sie es online!


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 <> Geige


Schöne lösung! Einige Möglichkeiten zur Verbesserung: Verwenden Sie für mehrere Variablen ein Komma, anstatt es neu zu schreiben declare. Verwenden Sie stattdessen einen tatsächlichen Zeilenumbruch in der Zeichenfolge. char(10)Tatsächlich können Sie die Zeilenumbrüche direkt in die printAnweisung einfügen und vollständig @centfernen. Wählen Sie Ihre am häufigsten verwendete Variable aus und verwenden Sie sie @für sich (es ist gültig!)
BradC


1

T-SQL, 137 Bytes

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

Die letzte Rückkehr vor dem FROM dient nur der Lesbarkeit, der Rest ist Teil der String-Verkettung.

Andere Methode als die SQL-Lösung von SeanC .




0

Rot , 116 Bytes

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

Probieren Sie es online!

Erläuterung:

Die Aufgabe rejoinübernimmt die Funktion, die einen Werteblock verkleinert und zusammenfügt.

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 Bytes

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

Probieren Sie es online aus.

Erläuterung:

’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)

Sehen Sie sich meinen Tipp 05AB1E an, um zu verstehen, warum:

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



0

PHP , 102 Bytes

Ändern Sie einfach die Repeater-Wörter oder -Sätze durch Zahlen und wenden Sie dann php-strtr an

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

Probieren Sie es online!

Oder

PHP , 144 Bytes

<?=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]);

Probieren Sie es online!


0

Powershell, 99 101 Bytes

$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
Sollte nicht $ a = 'Peter Piper hat ausgesucht'?
Wooshinyobject

1
Es the $bsieht so aus, als würde das Leerzeichen in Ihrem Beitrag sowohl länger als auch ungültig ( TIO ).
Jonathan Frech

1
Außerdem vermisse ich, dass Sie einen [...]Peter Piper picked?am Ende Ihrer Ausgabe haben.
Jonathan Frech
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.