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?

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!


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)

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!


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


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.


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!


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!


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!


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


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

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.





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!



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!


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


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

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 .




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


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!


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"



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!


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.