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?

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:



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)

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!


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


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.


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!


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!


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!


2

Python 3 , 120 117 116 bajtów

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

Ciągi formatujące były krótsze niż dodawanie (129 bajtów) i a łączenie (140 bajtów) .

-3 dzięki Jo King, -1 dzięki Jonathan Allen


1
To nie jest ciąg formatu. To ciąg formatu. (117 bajtów)
Jo King

1
Programy mogą wyświetlać dane wyjściowe w STDERR , więc zapisz 1, zastępując printje exit.
Jonathan Allan


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ć.





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!



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!


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


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

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 .




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



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"



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!


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
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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.