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?
Monolica
quelle
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:

9

R , 106 Bytes

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

Probieren Sie es online!

J.Doe
quelle
1
Das ist eine sehr clevere Verwendung von Aliasing !!
Giuseppe
1
Tolle Lösung! Es schlägt auch den memCompress-Ansatz 47 + 79 = 126 Bytes
digEmAll
1
Diese Idee hat mir auch hier ein weiteres Byte erspart !
Giuseppe
Wow, ich habe diesen Golf nicht gesehen. Das ist wirklich schön.
J.Doe
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)
Jonathan Allan
quelle
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!

ovs
quelle
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.

xnor
quelle
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!

Dennis
quelle
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!

Digitales Trauma
quelle
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!

ბიმო
quelle
2

Java (JDK) , 123 Byte

v->"".format("%s a%s.%nA%2$s %1$s.%nIf %1$s a%2$s,%nWhere's the%2$s %1$s?","Peter Piper picked"," peck of pickled peppers")

Probieren Sie es online!

Olivier Grégoire
quelle
Dürfen Sie so ein erforderliches Argument anführen?
Quintec
2
@Quintec Ja , wenn der Eingang nicht verwendet wird
Jo King
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.

Ismael Miguel
quelle
2

Rubin , 104 Bytes

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

Probieren Sie es online!

GB
quelle
1

C (gcc) , 123 Bytes

f(){printf("%s a%s.\nA%2$s %1$s.\nIf %1$s a%2$s,\nWhere's the%2$s %1$s?","Peter Piper picked"," peck of pickled peppers");}

Probieren Sie es online!

Gastropner
quelle
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!

Οurous
quelle
1

sed , 101 100 bytes

s/^/0 a1.\nA1 0.\nIf 0 a1,\nWhere's the1 0?/
s/0/Peter Piper picked/g
s/1/ peck of pickled peppers/g

Probieren Sie es online!

-1 Byte dank @DigitalTrauma

Logern
quelle
Ersetzen Sie .*mit ^, um ein Byte zu speichern
Digitales Trauma
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!

Mann bei der Arbeit
quelle
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

SeanC
quelle
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

Stax , 60 56 Bytes

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

Führen Sie es aus und debuggen Sie es

rekursiv
quelle
1
Hier ist ein Byte kürzer ausgepackt, und dieses scheint eine fundierte Aussage über die Existenz zu machen.
Khuldraeseth na'Barya
"i am. Am i. If i am, Where's them i?" Ich kann nicht aufhören zu lachen. Das ist Gold.
rekursiver
Descartes geht mich nichts an.
Khuldraeseth na'Barya
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 .

BradC
quelle
0

Kotlin , 150 Bytes

var s="Peter Piper picked"
var z=" peck of pickled peppers"
var v=s+" a"+z
var x=z+" "+s
print(v+".\n"+"A"+x+".\n"+"If "+v+",\n"+"Where's the "+x+"?")

Probieren Sie es online!

Syed Hamza Hassan
quelle
0

Retina 0,8,2 , 85 Bytes


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

Probieren Sie es online! Gleiche Idee wie alle anderen.

Neil
quelle
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 "?"
]
Galen Ivanov
quelle
0

J , 121 Bytes

echo('1 a2.',CR,'A2 1.',CR,'If 1 a2,',CR,'Where''s the2 1?')rplc('1';'Peter Piper picked';'2';' peck of pickled peppers')

Probieren Sie es online!

Galen Ivanov
quelle
0

PHP , 107 Bytes

<?=($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!

Luis Felipe De Jesus Munoz
quelle
In der ersten Zeile fehlt ein Punkt.
GB
Verwenden Sie Komma anstelle von Verkettung, um 4 Bytes zu speichern:<?=$a=...," a",$b=...,...
Titus
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"
Kevin Cruijssen
quelle
0

Haskell , 132 Bytes

g x y=x++y++x
p=g"Peter Piper picked"
q=g" peck of pickled peppers"
a=g" ".("a"++).q
f=p(a".\nA"++p".\nIf "++a",\nWhere's the")++"?"

Probieren Sie es online!

Max Yekhlakov
quelle
0

C # (.NET Core) ,123 118 116 Bytes

v=>@"0 a1.
A1 0.
If 0 a1,
Where's the1 0?".Replace("0","Peter Piper picked").Replace("1"," peck of pickled peppers")

Probieren Sie es online!

Inspiriert von der Java-Antwort von @Olivier Grégoire

5 Bytes von @sebbs gespeichert

aloisdg sagt Reinstate Monica
quelle
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!

Francisco Hahn
quelle
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`?"
mazzy
quelle
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