Compressione del testo


18

Con il testo indicato di seguito, ci sono alcune parole nel testo che si ripetono più volte nel testo. Utilizzare qualsiasi linguaggio di programmazione per scrivere un codice breve che comprime il testo per visualizzarlo. O in altre parole, utilizzare il minor numero di byte per visualizzare il testo.
Il testo è:

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
Sono sinceramente sorpreso che questo non sia stato chiuso come una fregatura di quella domanda Rick-Roll. Non lo stiamo più facendo?
Jo King,

1
@JoKing è una stringa diversa. Una piccola varietà sulla stessa sfida può essere divertente a volte.
moonheart08,

@ moonheart08 abbastanza sicuro che quel punto sia stato abbattuto in meta.
Magic Octopus Urn,

Risposte:



8

Gelatina ,  80 73 72 68 67 61  57 byte

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

Provalo online!

Come?

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

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

Provalo online!


2
Come hai rasato i byte di una risposta bubblegum?
Laikoni,

2
@Laikoni la risposta originale di 73 byte è stata creata utilizzando gzipil livello di compressione più elevato ( -9) più alcuni rasatura di metadati usando heade tail, il 71 byter è generato usando zopfli, che inizialmente mi ero dimenticato. Zopfli di solito crea flussi DEFLATE più brevi.
Ovs,

Sì, ho provato fino a 5.000.000 di iterazioni su zopfli, non è riuscito a trovare nulla oltre quello a 71 byte su iterazione 3109.
LegionMammal978


4

Python 2 , 115 byte

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

Provalo online!

Stampa più stringhe separate da virgole per inserire spazi tra loro.


Python 3 , 115 byte

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

Provalo online!

Python 3's translatefa il sollevamento pesante. L'uso di caratteri non stampabili con valore ASCII a una cifra dovrebbe salvare due byte.


1
exitsalva 1 byte per il programma Python 3.
Jonathan Allan,

4

Gelatina , 64 60 58 57 byte

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

Provalo online!


Wow, sorprendentemente simile a un'altra risposta, con la stessa lingua e lo stesso numero di byte. In realtà non so cosa stia succedendo in questa lingua, quindi il codice è sostanzialmente lo stesso?
tox123

1
Gran parte della sovrapposizione nel codice sono le stringhe compresse identiche, il che non sorprende.
Misha Lavrov,

1
@tox attualmente i due programmi non funzionano allo stesso modo (sebbene entrambi abbiamo usato idee simili tra loro nella storia delle revisioni). Questo utilizza elenchi di stringhe compresse ( “...“...») per formare la maggior parte delle quattro righe e quindi interleaving ( ż) con le parti meno ripetitive (come ',\nIf'), sempre con elenchi di stringhe compresse; puoi vedere come funziona il mio dalla descrizione.
Jonathan Allan,

3

Bash , 99

  • 4 byte salvati grazie 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?"

Provalo online!


3
È possibile spostare le dichiarazioni delle variabili nei loro primi utilizzi con l'assegnazione di espansioni di parametri con valori predefiniti: provare online! .
arte

1
@manatwork Wow, non avevo idea che tu potessi farlo. Abbastanza bello da ottenere sotto i 100 - Grazie! Questa tecnica darebbe una buona risposta ai suggerimenti bash .
Trauma digitale

2

V , 99 87 byte

-12 byte: risulta che 2 sostituzioni sono più brevi, sostanzialmente uguale alla soluzione di tutti gli altri (tranne Bubblegum?)

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

Provalo online!


2

Python 3 , 120 117 116 byte

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

Le stringhe di formato erano più brevi dell'aggiunta (129 byte) e di un join (140 byte) .

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


1
Questa non è una stringa di formato. Questa è una stringa di formato. (117 byte)
Jo King

1
I programmi possono essere inviati a STDERR , quindi salvare 1 sostituendolo printcon exit.
Jonathan Allan,


2

Ramoscello, 105 byte

Questo utilizza una semplice sostituzione per colmare le lacune.

Il replace()filtro di Twig ti consente di definire i valori da sostituire come chiavi di un hash. Fortunatamente, funziona anche con le matrici, in quanto hanno tasti numerici.

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

La |rawè necessaria per evitare fuoriuscita, che si è Where'sin Where's.

Puoi provarlo su https://twigfiddle.com/phqpts


Poiché questo è compilato in PHP, l'equivalente per PHP sarebbe:

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

Che può essere abbreviato in modo significativo.


2

Rubino , 104 byte

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

Provalo online!




1

Pulito , 166 byte

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

Provalo online!


1

sed , 101 100 byte

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

Provalo online!

-1 byte grazie a @DigitalTrauma


Sostituisci .*con ^per salvare un byte
Digital Trauma

1

jq, 110 caratteri

(Codice 106 caratteri + opzioni riga comandi 4 caratteri)

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

Esecuzione di esempio:

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?

Provalo online!


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 <> violino


Bella soluzione! Alcuni modi per migliorare: per più variabili usare una virgola invece di riformulare declare; usa un'interruzione di riga effettiva nella stringa anziché char(10), infatti puoi inserire le interruzioni di riga direttamente printnell'istruzione ed eliminarle del @ctutto. Scegli la tua variabile più usata e @
usala


1

T-SQL, 137 byte

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

L'ultimo ritorno prima del FROMè solo per leggibilità, il resto fa parte della concatenazione di stringhe.

Metodo diverso rispetto alla soluzione SQL di SeanC .




0

Rosso , 116 byte

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

Provalo online!

Spiegazione:

Il lavoro viene svolto dalla rejoinfunzione, che riduce e unisce un blocco di valori.

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

J , 121 byte

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

Provalo online!


0

PHP , 107 byte

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

Provalo online!


Manca un punto nella prima riga.
GB,

Usa la virgola anziché la concatenazione per salvare 4 byte:<?=$a=...," a",$b=...,...
Tito

0

05AB1E , 78 76 74 72 byte

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

Provalo online.

Spiegazione:

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

Vedi questo mio suggerimento 05AB1E per capire perché:

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



0

PHP , 102 byte

Fondamentalmente basta cambiare le parole o le frasi del ripetitore con i numeri, quindi applicare 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"]);

Provalo online!

O

PHP , 144 byte

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

Provalo online!


0

Powershell, 99 101 byte

$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
$ A = 'Peter Piper ha scelto'?
wooshinyobject,

1
Sembra che lo spazio in the $brende la presentazione sia più lunga e non valida ( TIO ).
Jonathan Frech,

1
Inoltre, penso che manchi a [...]Peter Piper picked?alla fine del tuo output.
Jonathan Frech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.