Kompresi teks


18

Dengan teks yang diberikan di bawah ini, ada beberapa kata dalam teks yang berulang beberapa kali dalam teks. Gunakan bahasa pemrograman apa pun untuk menulis kode pendek yang memampatkan teks untuk menampilkannya. Atau dengan kata lain, gunakan jumlah byte terkecil untuk menampilkan teks.
Teksnya adalah:

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
Jujur saya terkejut ini tidak ditutup sebagai penipu dari pertanyaan Rick-Roll. Apakah kita tidak melakukan itu lagi?
Jo King

1
@ Mengajaknya adalah string yang berbeda. Variasi kecil pada tantangan yang sama terkadang menyenangkan.
moonheart08

@ moonheart08 cukup yakin bahwa titik itu ditembak jatuh dalam meta.
Magic Octopus Mm

Jawaban:


9

R , 106 byte

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

Cobalah online!


1
Itu adalah penggunaan aliasing yang sangat pintar !!
Giuseppe

1
Solusi hebat! Ini mengalahkan juga pendekatan memCompress 47 + 79 = 126 byte
digEmAll

1
Gagasan ini menyelamatkan saya byte lain di sini juga!
Giuseppe

Wow, saya tidak melihat golf itu. Bagus sekali.
J.

8

Jelly ,  80 73 72 68 67 61  57 byte

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

Cobalah online!

Bagaimana?

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

Cobalah online!


2
Bagaimana Anda mencukur byte jawaban permen karet?
Laikoni

2
@Laikoni jawaban asli 73 byte dibuat menggunakan gzippada tingkat kompresi tertinggi ( -9) ditambah beberapa pencukuran metadata menggunakan headdan tail, byter 71 dihasilkan menggunakan zopfli, yang awalnya saya lupa. Zopfli biasanya membuat aliran DEFLATE yang lebih pendek.
Ovs

Ya, saya sudah mencoba hingga 5.000.000 iterasi pada zopfli, tidak dapat menemukan sesuatu yang melewati 71-byte pada iterasi 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+"?"

Cobalah online!

Mencetak beberapa string yang dipisahkan koma untuk menempatkan spasi di antaranya.


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

Cobalah online!

Python 3 translatemelakukan angkat berat. Menggunakan karakter yang tidak dapat dicetak dengan nilai ASCII satu digit harus menghemat dua byte.


1
exitmenghemat 1 byte untuk program Python 3.
Jonathan Allan

4

Jelly , 64 60 58 57 byte

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

Cobalah online!


Wow, sangat mirip dengan jawaban lain, dengan bahasa yang sama dan jumlah byte yang sama. Saya sebenarnya tidak tahu apa yang terjadi dalam bahasa ini, jadi apakah kode dasarnya sama?
tox123

1
Banyak tumpang tindih dalam kode adalah string terkompresi yang identik, yang tidak mengejutkan.
Misha Lavrov

1
@tox kedua program saat ini tidak bekerja dengan cara yang sama (meskipun kami berdua telah menggunakan ide yang sama satu sama lain dalam sejarah revisi). Yang ini menggunakan daftar string terkompresi ( “...“...») untuk membentuk sebagian besar dari empat baris dan kemudian interleaving ( ż) dengan bagian-bagian yang kurang berulang (seperti ',\nIf'), lagi dengan daftar string terkompresi; Anda dapat melihat cara kerja saya dari deskripsi.
Jonathan Allan

3

Bash , 99

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

Cobalah online!


3
Anda bisa memindahkan deklarasi variabel ke penggunaan pertama mereka dengan menetapkan perluasan parameter nilai default: Coba online! .
manatwork

1
@manatwork Wow, saya tidak tahu Anda bisa melakukan itu. Cukup keren untuk mencapai di bawah 100 - Terima kasih! Teknik ini akan membuat jawaban bash tips yang baik .
Trauma Digital

2

V , 99 87 byte

-12 byte: ternyata 2 substitusi lebih pendek yang pada dasarnya sama dengan solusi orang lain (kecuali Bubblegum?)

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

Cobalah online!




2

Ranting, 105 byte

Ini menggunakan pengganti sederhana untuk mengisi kekosongan.

replace()Filter Twig memungkinkan Anda untuk menentukan nilai yang akan diganti sebagai kunci hash. Untungnya, ini juga berfungsi dengan array, karena mereka memiliki kunci numerik.

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

The |rawdiperlukan untuk menghindari melarikan diri, yang ternyata Where'smenjadi Where's.

Anda dapat mencobanya di https://twigfiddle.com/phqpts


Karena ini dikompilasi ke PHP, padanan untuk PHP adalah:

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

Yang dapat dipersingkat secara signifikan.


2

Ruby , 104 byte

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

Cobalah online!




1

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

Cobalah 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

Cobalah online!

-1 byte terima kasih kepada @DigitalTrauma


Ganti .*dengan ^untuk menyimpan byte
Digital Trauma

1

jq, 110 karakter

(106 karakter kode + 4 opsi opsi baris perintah)

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

Contoh dijalankan:

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?

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


Solusi bagus! Beberapa cara untuk meningkatkan: untuk beberapa variabel gunakan koma alih-alih menyatakan kembali declare; gunakan pemecah baris aktual dalam string sebagai ganti char(10), pada kenyataannya Anda bisa menempatkan pemecah baris secara langsung dalam printpernyataan dan menghilangkan @cseluruhnya. Pilih variabel yang paling sering Anda gunakan dan gunakan @sendiri (valid!)
BradC


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

Pengembalian terakhir sebelum FROMhanya untuk dibaca, sisanya adalah bagian dari rangkaian string.

Metode yang berbeda dari solusi SQL SeanC .




0

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

Cobalah online!

Penjelasan:

Pekerjaan itu dilakukan oleh fungsi rejoin, yang mengurangi dan bergabung dengan blok nilai.

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 byte

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

Cobalah online.

Penjelasan:

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

Lihat tip tambang 05AB1E ini untuk memahami alasannya:

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



0

PHP , 102 byte

Pada dasarnya hanya mengubah kata atau kalimat pengulang dengan angka, dan kemudian menerapkan 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"]);

Cobalah online!

Atau

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

Cobalah 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
Bukankah seharusnya $ a = 'Peter Piper mengambil'?
wooshinyobject

1
Tampaknya ruang di the $bmembuat kiriman Anda lebih panjang dan tidak valid ( TIO ).
Jonathan Frech

1
Selain itu, saya pikir Anda kehilangan nilai [...]Peter Piper picked?akhir.
Jonathan Frech
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.