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?

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:



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)

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!


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.


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!


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!


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!


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


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

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.





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!



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!


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


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

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 .




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



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"



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!


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
¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.