Kompresja tekstu

18

W podanym tekście poniżej jest kilka słów w tekście, które powtarzają się kilka razy w tekście. Użyj dowolnego języka programowania, aby napisać krótki kod, który kompresuje tekst, aby go wyświetlić. Innymi słowy, użyj najmniejszej liczby bajtów, aby wyświetlić tekst.
Tekst jest:

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
źródło
6
Jestem szczerze zaskoczony, że to nie zostało zamknięte jako duplikat tego pytania Ricka. Czy już tego nie robimy?
Jo King
1
@JoKing to jest inny ciąg. Niekiedy urozmaicenie tego samego wyzwania może być zabawą.
moonheart08
@ moonheart08 całkiem pewien, że ten punkt został zestrzelony w meta.
Magic Octopus Urn

Odpowiedzi:

9

R , 106 bajtów

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

Wypróbuj online!

J.Doe
źródło
1
To bardzo sprytne użycie aliasingu !!
Giuseppe,
1
Świetne rozwiązanie! Pokonuje również podejście memCompress 47 + 79 = 126 bajtów
digEmAll
1
Ten pomysł uratował mnie kolejny bajt tutaj , jak dobrze!
Giuseppe
Wow, nie zauważyłem tego golfa. To naprawdę miłe.
J.Doe
8

Galaretka ,  80 73 72 68 67 61  57 bajtów

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

Wypróbuj online!

W jaki sposób?

“...“...“...“...“...“...»“Ƙ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
źródło
5

Bubblegum , 73 71 bajtów

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

Wypróbuj online!

ovs
źródło
2
Jak zgoliłeś bajty odpowiedzi gumy do żucia?
Laikoni,
2
@Laikoni oryginalna 73 bajtowa odpowiedź została utworzona przy użyciu gzipnajwyższego poziomu kompresji ( -9) plus niektóre golenie metadanych przy użyciu headi tail, a 71 bajtów jest generowany przy użyciu zopfli, o którym początkowo zapomniałem. Zopfli zwykle tworzy krótsze strumienie DEFLATE.
ovs
Tak, próbowałem do 5 000 000 iteracji na zopfli, nie udało się znaleźć niczego poza 71-bajtową iteracją na iteracji 3109.
LegionMammal978
5

JavaScript (SpiderMonkey) , 114 bajtów

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

Wypróbuj online!

Twierdziłbym, że ta odpowiedź pochodzi od ovs , w każdym razie zapisano 19 bajtów.

Dzięki Arnauld , oszczędza 3 bajty.

tsh
źródło
1
114 bajtów .
Arnauld
4

Python 2 , 115 bajtów

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

Wypróbuj online!

Drukuje wiele ciągów oddzielonych przecinkami, aby wstawiać spacje między nimi.


Python 3 , 115 bajtów

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

Wypróbuj online!

Python 3 translatewykonuje ciężkie podnoszenie. Używanie niedrukowalnych znaków o jednocyfrowej wartości ASCII powinno oszczędzić dwa bajty.

xnor
źródło
1
exitzapisuje 1 bajt dla programu Python 3.
Jonathan Allan
4

Galaretka , 64 60 58 57 bajtów

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

Wypróbuj online!

Dennis
źródło
Wow, zaskakująco podobne do innej odpowiedzi, z tym samym językiem i tą samą liczbą bajtów. Tak naprawdę nie wiem, co się dzieje w tym języku, więc czy kod jest zasadniczo taki sam?
tox123
1
Duża część nakładania się w kodzie to identyczne skompresowane ciągi, co nie jest zaskakujące.
Misza Ławrow
1
@tox oba programy obecnie nie działają w ten sam sposób (chociaż oboje zastosowaliśmy podobne pomysły w historii zmian). Ten używa skompresowanych list ciągów ( “...“...»), aby utworzyć większość czterech linii, a następnie przeplata ( ż) z mniej powtarzalnymi częściami (jak ',\nIf'), ponownie z listami skompresowanych ciągów; możesz zobaczyć, jak działa mój z opisu.
Jonathan Allan
3

Bash , 99

  • 4 bajty zapisane dzięki @manatwork.
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

Wypróbuj online!

Cyfrowa trauma
źródło
3
Możesz przenieść deklaracje zmiennych do ich pierwszych zastosowań, przypisując rozszerzenia parametrów wartości domyślnej: Wypróbuj online! .
manatwork
1
@manatwork Wow, nie miałem pojęcia, że ​​możesz to zrobić. Całkiem fajnie, aby zdobyć mniej niż 100 - Dzięki! Ta technika byłaby dobrą odpowiedzią na bash .
Digital Trauma
2

V , 99 87 bajtów

-12 bajtów: okazuje się, że 2 podstawienia są krótsze, co w zasadzie jest takie samo jak rozwiązanie wszystkich innych (oprócz Bubblegum?)

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

Wypróbuj online!

ბიმო
źródło
2

Java (JDK) , 123 bajty

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

Wypróbuj online!

Olivier Grégoire
źródło
Czy wolno ci wziąć taki argument?
Quintec
2
@Quintec Tak , jeśli dane wejściowe nie są używane
Jo King
2

Gałązka, 105 bajtów

Wykorzystuje to prostą zamianę do uzupełnienia braków.

replace()Filtr Twiga pozwala zdefiniować wartości do zastąpienia jako klucze skrótu. Na szczęście działa również z tablicami, ponieważ mają one klawisze numeryczne.

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

|rawJest potrzebne, aby uniknąć ucieczki, która okazała Where'ssięWhere's .

Możesz spróbować na https://twigfiddle.com/phqpts


Ponieważ jest to skompilowane do PHP, odpowiednikiem dla PHP byłoby:

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

Który można znacznie skrócić.

Ismael Miguel
źródło
2

Rubinowy , 104 bajty

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

Wypróbuj online!

GB
źródło
1

C (gcc) , 123 bajty

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

Wypróbuj online!

gastropner
źródło
1

Czysty , 166 bajtów

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

Wypróbuj online!

Obrzydliwe
źródło
1

sed , 101 100 bajtów

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

Wypróbuj online!

-1 bajt dzięki @DigitalTrauma

Logern
źródło
Wymień .*się ^zapisać bajt
Cyfrowy Trauma
1

jq, 110 znaków

(Kod 106 znaków + 4 znaki opcji wiersza poleceń)

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

Przykładowy przebieg:

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?

Wypróbuj online!

człowiek w pracy
źródło
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+'?'

skrzypce db <>

SeanC
źródło
Fajne rozwiązanie! Kilka sposobów na ulepszenie: w przypadku wielu zmiennych użyj przecinka zamiast przekształcania declare; zamiast tego użyj rzeczywistego podziału wiersza char(10), w rzeczywistości możesz wstawić podział wiersza bezpośrednio w printinstrukcji i @ccałkowicie go wyeliminować . Wybierz najczęściej używaną zmienną i użyj @jej samodzielnie (jest poprawna!)
BradC
1

Stax , 60 56 bajtów

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

Uruchom i debuguj

rekurencyjny
źródło
1
Oto jeden bajt krótszy bez rozpakowania, a ten wydaje się wydawać głębokie stwierdzenie o istnieniu.
Khuldraeseth na'Barya
"i am. Am i. If i am, Where's them i?" Nie mogę przestać się śmiać. To jest złoto.
rekurencyjny
Kartezjusz nic dla mnie nie znaczy.
Khuldraeseth na'Barya
1

T-SQL, 137 bajtów

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

Ten ostatni powrót przed FROM jest tylko do odczytu, reszta jest częścią konkatenacji łańcucha.

Inna metoda niż rozwiązanie SQL SeanC .

BradC
źródło
0

Kotlin , 150 bajtów

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

Wypróbuj online!

Syed Hamza Hassan
źródło
0

Retina 0.8.2 , 85 bajtów


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

Wypróbuj online! Ten sam pomysł jak wszyscy inni.

Neil
źródło
0

Czerwony , 116 bajtów

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

Wypróbuj online!

Wyjaśnienie:

Zadanie wykonuje funkcja rejoin, która zmniejsza i dołącza do bloku wartości.

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 Iwanow
źródło
0

J , 121 bajtów

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

Wypróbuj online!

Galen Ivanov
źródło
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?";

Try it online!

Luis felipe De jesus Munoz
źródło
Missing a point in the first line.
G B
Use comma instead of concatenation to save 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¾Ð«‚ðì:¦

Try it online.

Explanation:

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

See this 05AB1E tip of mine to understand why:

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

Try it online!

Max Yekhlakov
źródło
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")

Try it online!

Inspired by @Olivier Grégoire's java answer

5 bytes saved by @sebbs

aloisdg says Reinstate Monica
źródło
0

PHP, 102 bytes

Basically just change the repeater words or sentences with numbers, and then apply 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"]);

Try it online!

Or

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

Try it online!

Francisco Hahn
źródło
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
źródło
1
Shouldn't $a='Peter Piper picked' ?
wooshinyobject
1
It appears as though the space in the $b makes your submission both longer and invalid (TIO).
Jonathan Frech
1
Furthermore, I think you are missing a [...]Peter Piper picked? at your output's end.
Jonathan Frech