Compression de texte

18

Avec le texte ci-dessous, il y a quelques mots dans le texte qui se répètent plusieurs fois dans le texte. Utilisez n'importe quel langage de programmation pour écrire un code court qui comprime le texte pour l'afficher. Ou en d'autres termes, utilisez le plus petit nombre d'octets pour afficher le texte.
Le texte est:

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
la source
6
Je suis honnêtement surpris que cela n'ait pas été fermé en tant que dupe de cette question Rick-Roll. Ne faisons-nous plus cela?
Jo King du
1
@JoKing il est une autre chaîne. Une petite variété sur le même défi peut parfois être amusante.
moonheart08
@ moonheart08 à peu près sûr que ce point a été abattu dans la méta.
Urne de poulpe magique

Réponses:

9

R , 106 octets

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

Essayez-le en ligne!

J.Doe
la source
1
C'est une utilisation très intelligente de l'aliasing !!
Giuseppe
1
Excellente solution! Il bat également l'approche memCompress 47 + 79 = 126 octets
digEmAll
1
Cette idée m'a sauvé un autre octet ici aussi!
Giuseppe
Wow, je n'ai pas repéré ce golf. C'est vraiment sympathique.
J.Doe
8

Gelée ,  80 73 72 68 67 61  57 octets

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

Essayez-le en ligne!

Comment?

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

Bubblegum , 73 71 octets

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

Essayez-le en ligne!

ovs
la source
2
Comment avez-vous rasé les octets d'une réponse bubblegum?
Laikoni
2
@Laikoni la réponse originale de 73 octets a été créée en utilisant gziple niveau de compression le plus élevé ( -9) plus un rasage de métadonnées en utilisant headet tail, le 71 octet est généré en utilisant zopfli, que j'ai initialement oublié. Zopfli crée généralement des flux DEFLATE plus courts.
2018
Ouais, j'ai essayé jusqu'à 5 000 000 d'itérations sur zopfli, il n'a rien trouvé après celui de 71 octets sur l'itération 3109.
LegionMammal978
5

JavaScript (SpiderMonkey) , 114 octets

print(`0 a1.
A1 0.
If 0 a1,
Where's the1 0?`.replace(/\d/g,n=>+n?' peck of pickled peppers':'Peter Piper picked'))

Essayez-le en ligne!

Je dirais que cette réponse est de ovs , de toute façon, 19 octets enregistrés.

Merci Arnauld , enregistre 3 octets.

tsh
la source
1
114 octets .
Arnauld
4

Python 2 , 115 octets

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

Essayez-le en ligne!

Imprime plusieurs chaînes séparées par des virgules pour mettre des espaces entre elles.


Python 3 , 115 octets

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

Essayez-le en ligne!

Python 3 translatefait le gros du travail. L'utilisation de caractères non imprimables avec une valeur ASCII à un chiffre devrait économiser deux octets.

xnor
la source
1
exitenregistre 1 octet pour le programme Python 3.
Jonathan Allan
4

Gelée , 64 60 58 57 octets

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

Essayez-le en ligne!

Dennis
la source
Wow, étonnamment similaire à une autre réponse, avec la même langue et le même nombre d'octets. Je ne sais pas vraiment ce qui se passe dans cette langue, donc le code est-il fondamentalement le même?
tox123
1
Une grande partie du chevauchement dans le code provient des chaînes compressées identiques, ce qui n'est pas surprenant.
Misha Lavrov
1
@tox, les deux programmes ne fonctionnent actuellement pas de la même manière (bien que nous ayons tous les deux utilisé des idées similaires dans l'histoire des révisions). Celui-ci utilise des listes de chaînes compressées ( “...“...») pour former la plupart des quatre lignes, puis entrelace ( ż) avec les parties les moins répétitives (comme ',\nIf'), toujours avec des listes de chaînes compressées; vous pouvez voir comment fonctionne la mienne dans la description.
Jonathan Allan
3

Frapper , 99

  • 4 octets enregistrés grâce à @manatwork.
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

Essayez-le en ligne!

Traumatisme numérique
la source
3
Vous pouvez déplacer les déclarations de variables à leurs premières utilisations avec des extensions de paramètre de valeur par défaut: essayez-le en ligne! .
manatwork
1
@manatwork Wow, je ne savais pas que tu pouvais faire ça. Assez cool pour avoir moins de 100 ans - Merci! Cette technique ferait une bonne réponse aux conseils bash .
Digital Trauma
2

V , 99 87 octets

-12 octets: il s'avère que 2 substitutions sont plus courtes, ce qui est fondamentalement la même que la solution de tout le monde (sauf Bubblegum?)

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

Essayez-le en ligne!

ბიმო
la source
2

Python 3 , 120 117 117 116 octets

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}?")

Les chaînes de format étaient plus courtes que l' addition (129 octets) et une jointure (140 octets) .

-3 merci à Jo King, -1 merci à Jonathan Allen

Syfer Polski
la source
1
Ce n'est pas une chaîne de format. C'est une chaîne de format. (117 octets)
Jo King
1
Les programmes peuvent sortir sur STDERR , donc enregistrez 1 en remplaçant printpar exit.
Jonathan Allan
2

Java (JDK) , 123 octets

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

Essayez-le en ligne!

Olivier Grégoire
la source
Êtes-vous autorisé à prendre un argument requis comme ça?
Quintec
2
@Quintec Oui , si l'entrée n'est pas utilisée
Jo King
2

Brindille, 105 octets

Cela utilise un simple remplacement pour combler les lacunes.

Twig's replace() filtre vous permet de définir les valeurs à remplacer comme les clés d'un hachage. Heureusement, cela fonctionne également avec les tableaux, car ils ont des touches numériques.

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

le |raw est nécessaire pour éviter de s'échapper, qui s'est transformé Where'sen Where's.

Vous pouvez l'essayer https://twigfiddle.com/phqpts


Étant donné que cela est compilé en PHP, l'équivalent pour PHP serait:

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

Ce qui peut être raccourci de manière significative.

Ismael Miguel
la source
2

Rubis , 104 octets

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

Essayez-le en ligne!

GB
la source
1

C (gcc) , 123 octets

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");}

Essayez-le en ligne!

gastropner
la source
1

Nettoyer , 166 octets

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

Essayez-le en ligne!

Οurous
la source
1

sed , 101 100 octets

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

Essayez-le en ligne!

-1 octet grâce à @DigitalTrauma

Logern
la source
Remplacer .*par ^pour enregistrer un octet
Digital Trauma
1

jq, 110 caractères

(Code de 106 caractères + options de ligne de commande de 4 caractères)

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

Exemple d'exécution:

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?

Essayez-le en ligne!

homme au travail
la source
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 <> violon

SeanC
la source
Bonne solution! Quelques améliorations: pour plusieurs variables, utilisez une virgule au lieu de la reformuler declare; utilisez un saut de ligne réel dans la chaîne au lieu de char(10), en fait, vous pouvez placer les sauts de ligne directement dans l' printinstruction et les éliminer @ccomplètement. Choisissez votre variable la plus utilisée et utilisez-la @seule (c'est valable!)
BradC
1

Stax , 60 56 octets

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

Exécuter et déboguer

récursif
la source
1
Voici un octet plus court déballé, et celui-ci semble faire une déclaration profonde sur l'existence.
Khuldraeseth na'Barya
"i am. Am i. If i am, Where's them i?" Je ne peux pas m'arrêter de rire. C'est de l'or.
récursif
Descartes n'est pas rien sur moi.
Khuldraeseth na'Barya
1

T-SQL, 137 octets

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

Ce dernier retour avant le FROM est pour la lisibilité uniquement, les autres font partie de la concaténation de chaîne.

Méthode différente de la solution SQL de SeanC .

BradC
la source
0

Kotlin , 150 octets

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

Essayez-le en ligne!

Syed Hamza Hassan
la source
0

Retina 0.8.2 , 85 octets


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

Essayez-le en ligne! Même idée que tout le monde.

Neil
la source
0

Rouge , 116 octets

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

Essayez-le en ligne!

Explication:

Le travail est effectué par la fonction rejoin, qui réduit et joint un bloc de valeurs.

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
la source
0

J , 121 octets

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

Essayez-le en ligne!

Galen Ivanov
la source
0

PHP , 107 octets

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

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
Il manque un point dans la première ligne.
GB
Utilisez une virgule au lieu de la concaténation pour économiser 4 octets:<?=$a=...," a",$b=...,...
Titus
0

05AB1E , 78 76 74 72 octets

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

Essayez-le en ligne.

Explication:

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

Consultez cette astuce 05AB1E pour comprendre pourquoi:

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

Haskell , 132 octets

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

Essayez-le en ligne!

Max Yekhlakov
la source
0

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

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

Essayez-le en ligne!

Inspiré par la réponse java de @Olivier Grégoire

5 octets enregistrés par @sebbs

aloisdg dit Réintégrer Monica
la source
0

PHP , 102 octets

Fondamentalement, il suffit de changer les mots ou les phrases du répétiteur avec des nombres, puis d'appliquer 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"]);

Essayez-le en ligne!

Ou

PHP , 144 octets

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

Essayez-le en ligne!

Francisco Hahn
la source
0

Powershell, 99 101 octets

$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
la source
1
Ne devrait pas $ a = 'Peter Piper picked'?
wooshinyobject
1
Il semble que l'espace dans the $bvotre soumission soit à la fois plus long et invalide ( TIO ).
Jonathan Frech
1
De plus, je pense qu'il vous manque un [...]Peter Piper picked?à la fin de votre sortie.
Jonathan Frech