Compresión de texto

18

Con el texto a continuación, hay algunas palabras en el texto que se repiten varias veces en el texto. Use cualquier lenguaje de programación para escribir un código corto que comprima el texto para mostrarlo. O, en otras palabras, use la menor cantidad de bytes para mostrar el texto.
El texto es:

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
fuente
66
Estoy sinceramente sorprendido de que esto no se haya cerrado como un engaño de esa pregunta de Rick-Roll. ¿Ya no estamos haciendo eso?
Jo King
1
@JoKing es una cadena diferente. Una pequeña variedad en el mismo desafío puede ser divertido a veces.
moonheart08
@ moonheart08 estoy bastante seguro de que ese punto fue derribado en meta.
Urna de pulpo mágico

Respuestas:

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

Pruébalo en línea!

J.Doe
fuente
1
¡Ese es un uso muy inteligente del aliasing!
Giuseppe
1
¡Gran solución! También supera el enfoque memCompress 47 + 79 = 126 bytes
digEmAll
1
¡Esta idea me salvó otro byte aquí también!
Giuseppe
Wow, no vi ese golf. Eso es muy agradable.
J.Doe
8

Gelatina ,  80 73 72 68 67 61  57 bytes

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

Pruébalo en línea!

¿Cómo?

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

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

Pruébalo en línea!

ovs
fuente
2
¿Cómo recortó bytes de una respuesta de chicle?
Laikoni
2
@Laikoni, la respuesta original de 73 bytes se creó usando gzipel nivel de compresión más alto ( -9) más algunos afeitados de metadatos usando heady tail, el byte 71 se genera usando zopfli, que inicialmente olvidé. Zopfli generalmente crea transmisiones DEFLATE más cortas.
ovs
Sí, lo he intentado hasta 5.000.000 iteraciones en zopfli, no pudo encontrar nada más allá de la de un 71 bytes de iteración 3109.
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+"?"

Pruébalo en línea!

Imprime múltiples cadenas separadas por comas para poner espacios entre ellas.


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

Pruébalo en línea!

Python 3 translatehace el trabajo pesado. El uso de caracteres no imprimibles con valor ASCII de un solo dígito debería ahorrar dos bytes.

xnor
fuente
1
exitguarda 1 byte para el programa Python 3.
Jonathan Allan
4

Jalea , 64 60 58 57 bytes

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

Pruébalo en línea!

Dennis
fuente
Wow, sorprendentemente similar a otra respuesta, con el mismo idioma y el mismo número de bytes. En realidad no sé qué está sucediendo en este idioma, entonces, ¿el código es básicamente el mismo?
tox123
1
Gran parte de la superposición en el código son las cadenas comprimidas idénticas, lo cual no es sorprendente.
Misha Lavrov
1
@tox los dos programas actualmente no funcionan de la misma manera (aunque ambos hemos usado ideas similares entre sí en la historia de las revisiones). Este está usando listas de cadenas comprimidas ( “...“...») para formar la mayoría de las cuatro líneas y luego intercalando ( ż) con las partes menos repetitivas (como ',\nIf'), nuevamente con listas de cadenas comprimidas; Puedes ver cómo funciona el mío en la descripción.
Jonathan Allan
3

Bash , 99

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

Pruébalo en línea!

Trauma digital
fuente
3
Puede mover las declaraciones de variables a sus primeros usos con la asignación de expansiones de parámetros de valor predeterminado: ¡ Pruébelo en línea! .
manatwork
1
@manatwork Wow, no tenía idea de que pudieras hacer eso. Bastante genial tener menos de 100 - ¡Gracias! Esta técnica haría una buena respuesta de bash tips .
Trauma digital
2

V , 99 87 bytes

-12 bytes: resulta que 2 sustituciones son más cortas, que es básicamente la misma que la solución de todos los demás (¿excepto Bubblegum?)

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

Pruébalo en línea!

ბიმო
fuente
2

Python 3 , 120 117 116 bytes

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

Las cadenas de formato fueron más cortas que la suma (129 bytes) y una unión (140 bytes) .

-3 gracias a Jo King, -1 gracias a Jonathan Allen

Syfer Polski
fuente
1
Esa no es una cadena de formato. Esa es una cadena de formato. (117 bytes)
Jo King
1
Los programas pueden enviarse a STDERR , así que guarde 1 reemplazándolo printcon exit.
Jonathan Allan
2

Java (JDK) , 123 bytes

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

Pruébalo en línea!

Olivier Grégoire
fuente
¿Se le permite tomar un argumento requerido como ese?
Quintec
2
@Quintec , si la entrada no se usa
Jo King
2

Ramita, 105 bytes

Esto usa un reemplazo simple para llenar los vacíos.

El replace()filtro de Twig le permite definir los valores para reemplazar como las claves de un hash. Afortunadamente, también funciona con matrices, ya que tienen teclas numéricas.

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

El |rawes necesario para evitar escapar, que se convirtió Where'sen Where's.

Puedes probarlo en https://twigfiddle.com/phqpts


Como esto se compila en PHP, el equivalente para PHP sería:

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

Que se puede acortar significativamente.

Ismael Miguel
fuente
2

Ruby , 104 bytes

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

Pruébalo en línea!

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

Pruébalo en línea!

gastropner
fuente
1

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

Pruébalo en línea!

Οurous
fuente
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

Pruébalo en línea!

-1 byte gracias a @DigitalTrauma

Logern
fuente
Reemplace .*con ^para guardar un byte
Digital Trauma
1

jq, 110 caracteres

(Código de 106 caracteres + opciones de línea de comando de 4 caracteres)

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

Ejecución de muestra:

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?

Pruébalo en línea!

hombre trabajando
fuente
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 <> violín

SeanC
fuente
Buena solución! Algunas formas de mejorar: para múltiples variables, use una coma en lugar de replantear declare; use un salto de línea real en la cadena en lugar de char(10), de hecho, puede poner los saltos de línea directamente en la printinstrucción y eliminarlos por @ccompleto. Elija la variable más utilizada y @
úsela
1

Stax , 60 56 bytes

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

Ejecutar y depurarlo

recursivo
fuente
1
Aquí hay un byte más corto sin empaquetar, y este parece estar haciendo una declaración profunda sobre la existencia.
Khuldraeseth na'Barya
"i am. Am i. If i am, Where's them i?" No puedo parar de reir. Esto es oro
recursivo
Descartes no es nada sobre mí.
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

El último retorno antes del FROMes solo para legibilidad, el resto es parte de la concatenación de cadenas.

Método diferente a la solución SQL de SeanC .

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

Pruébalo en línea!

Syed Hamza Hassan
fuente
0

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

Pruébalo en línea!

Explicación:

El trabajo lo realiza la función rejoin, que reduce y une un bloque de valores.

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

Pruébalo en línea!

Galen Ivanov
fuente
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?";

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente
Falta un punto en la primera línea.
GB
Use comas en lugar de concatenación para guardar 4 bytes:<?=$a=...," a",$b=...,...
Titus
0

05AB1E , 78 76 74 72 bytes

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

Pruébalo en línea.

Explicación:

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

Mira este 05AB1E consejo mío para entender por qué:

  • ’0 a1.\nA10.\nIf0 a1,\nW€Î's €€10?’ es "0 a1.\nA10.\nIf0 a1,\nWhere's the10?"
  • .•1~¼ ¿• es "pickled"
  • “±æ€‚ ÿÇì“ es "neck of ÿ pepper"
  • „íδŒ es "peter pipe"
  • „r¾Ð es "r picked"
Kevin Cruijssen
fuente
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")++"?"

Pruébalo en línea!

Max Yekhlakov
fuente
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")

Pruébalo en línea!

Inspirado por la respuesta java de @Olivier Grégoire

5 bytes guardados por @sebbs

aloisdg dice Reinstate Monica
fuente
0

PHP , 102 bytes

Básicamente, simplemente cambie las palabras u oraciones repetidoras con números y luego aplique 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"]);

Pruébalo en línea!

O

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

Pruébalo en línea!

Francisco Hahn
fuente
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
fuente
1
¿No debería $ a = 'Peter Piper elegido'?
wooshinyobject
1
Parece que el espacio en the $bhace que su envío sea más largo e inválido ( TIO ).
Jonathan Frech
1
Además, creo que te falta un [...]Peter Piper picked?final al final de tu salida.
Jonathan Frech