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?
Monolica
sumber
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!

J.Apakah
sumber
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)
Jonathan Allan
sumber
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!

ovs
sumber
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
5

JavaScript (SpiderMonkey) , 114 byte

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

Cobalah online!

Saya akan mengklaim jawaban ini dari ovs , bagaimanapun, 19 byte disimpan.

Terima kasih Arnauld , menghemat 3 byte.

tsh
sumber
1
114 byte .
Arnauld
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.

Tidak
sumber
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!

Dennis
sumber
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!

Trauma Digital
sumber
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!

ბიმო
sumber
2

Java (JDK) , 123 byte

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

Cobalah online!

Olivier Grégoire
sumber
Apakah Anda diizinkan mengambil argumen yang diperlukan seperti itu?
Quintec
2
@ Quintec Ya , jika inputnya tidak digunakan
Jo King
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.

Ismael Miguel
sumber
2

Ruby , 104 byte

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

Cobalah online!

GB
sumber
1

/// , 86 byte

/1/Peter Piper picked//2/ peck of pickled peppers/1 a2.
A2 1.
If 1 a2,
Where's the2 1?

Cobalah online!

Jo King
sumber
1

C (gcc) , 123 byte

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

Cobalah online!

gastropner
sumber
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!

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

Logern
sumber
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!

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

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

Stax , 60 56 byte

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

Jalankan dan debug itu

rekursif
sumber
1
Berikut ini satu byte lebih pendek dari paket, dan yang ini sepertinya membuat pernyataan yang mendalam tentang keberadaan.
Khuldraeseth na'Barya
"i am. Am i. If i am, Where's them i?" Saya tidak bisa berhenti tertawa. Ini emas.
Rekursif
Descartes tidak apa-apa pada saya.
Khuldraeseth na'Barya
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 .

BradC
sumber
0

Kotlin , 150 byte

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

Cobalah online!

Syed Hamza Hassan
sumber
0

Retina 0.8.2 , 85 byte


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

Cobalah online! Gagasan yang sama seperti orang lain.

Neil
sumber
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 "?"
]
Galen Ivanov
sumber
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')

Cobalah online!

Galen Ivanov
sumber
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?";

Cobalah online!

Luis felipe De jesus Munoz
sumber
Tidak ada titik di baris pertama.
GB
Gunakan koma alih-alih gabungan untuk menghemat 4 byte:<?=$a=...," a",$b=...,...
Titus
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"
Kevin Cruijssen
sumber
0

Haskell , 132 byte

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

Cobalah online!

Max Yekhlakov
sumber
0

C # (.NET Core) ,123 118 116 byte

v=>@"0 a1.
A1 0.
If 0 a1,
Where's the1 0?".Replace("0","Peter Piper picked").Replace("1"," peck of pickled peppers")

Cobalah online!

Terinspirasi oleh jawaban java @Olivier Grégoire

5 byte disimpan oleh @sebbs

aloisdg kata Reinstate Monica
sumber
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!

Francisco Hahn
sumber
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`?"
mazzy
sumber
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