Metin sıkıştırma


18

Aşağıda verilen metinle, metinde metinde birkaç kez tekrarlanan bazı kelimeler vardır. Metni görüntülemek için sıkıştıran kısa bir kod yazmak için herhangi bir programlama dilini kullanın. Başka bir deyişle, metni görüntülemek için en az sayıda bayt kullanın.
Bu metin:

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
Dürüst olmak gerekirse bu Rick-Roll sorusunun bir kopyası olarak kapanmadı. Bunu artık yapmıyor muyuz?
Jo King

1
Bunu @JoKing olan farklı bir dize. Aynı meydan okumadaki biraz çeşitlilik bazen eğlenceli olabilir.
moonheart08

@ moonheart08 bu noktanın meta olarak vurulduğundan emin.
Sihirli Ahtapot Urn

Yanıtlar:



8

Jöle ,  80 73 72 68 67 61  57 bayt

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

Çevrimiçi deneyin!

Nasıl?

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

Sakız , 73 71 bayt

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

Çevrimiçi deneyin!


2
Bir sakız cevabının baytını nasıl tıraş ettin?
Laikoni

2
@Laikoni cevap bayt orijinal 73 kullanılarak oluşturuldu gzipen yüksek sıkıştırma seviyesinde (on -9) artı kullanarak bazı meta tıraş headve tail71 Byter Başlangıçta unutmuşum zopfli kullanılarak oluşturulur. Zopfli genellikle daha kısa DEFLATE akışları oluşturur.
ovs

Evet, zopfli'de 5.000.000'e kadar yineleme denedim, yineleme 3109'daki 71 baytlıktan sonra hiçbir şey bulamadı.
LegionMammal978


4

Python 2 , 115 bayt

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

Çevrimiçi deneyin!

Aralarına boşluk koymak için virgülle ayrılmış birden çok dize yazdırır.


Python 3 , 115 bayt

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

Çevrimiçi deneyin!

Python 3'ler translateağır kaldırma yapıyor. Tek haneli ASCII değeri olan yazdırılamayan karakterlerin kullanılması iki bayt kaydetmelidir.


1
exitPython 3 programı için 1 bayt kaydeder.
Jonathan Allan

4

Jöle , 64 60 58 57 bayt

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

Çevrimiçi deneyin!


Vay canına, şaşırtıcı bir şekilde başka bir cevaba benzer, aynı dil ve aynı bayt sayısı. Aslında bu dilde neler olduğunu bilmiyorum, bu yüzden kod temelde aynı mı?
tox123

1
Koddaki çakışmaların çoğu, aynı olmayan sıkıştırılmış dizelerdir, bu şaşırtıcı değildir.
Misha Lavrov

1
@tox iki program şu anda aynı şekilde çalışmıyor (her ikimiz de revizyonlar tarihinde birbirimizle benzer fikirler kullandık). Bu “...“...», dört satırın çoğunu oluşturmak için sıkıştırılmış dize listelerini ( ) kullanır ve daha sonra tekrar sıkıştırılmış dize listeleriyle żdaha az tekrarlayan parçalarla (gibi ',\nIf') interleaving ( ) kullanır ; benimkinin nasıl çalıştığını açıklamadan görebilirsiniz.
Jonathan Allan

3

darbe , 99

  • @Manatwork sayesinde 4 bayt tasarruf edildi.
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

Çevrimiçi deneyin!


3
Değişken bildirimlerini varsayılan değer parametresi genişletmeleri ata ile ilk kullanımlarına taşıyabilirsiniz: Çevrimiçi deneyin! .
manatwork

1
@manatwork Vay canına, bunu yapabileceğine dair hiçbir fikrim yoktu. 100 yaşın altında olmak çok güzel - Teşekkürler! Bu teknik iyi bir bash ipuçları cevap verecektir .
Dijital Travma

2

V , 99 87 bayt

-12 bayt: 2 sübstitüsyonun daha kısa olduğu ortaya çıkıyor, bu da temel olarak herkesin çözümüyle aynı (Bubblegum?)

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

Çevrimiçi deneyin!


2

Piton 3 , 120 117 116 bayt

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

Biçim dizeleri ekleme (129 bayt) ve birleştirme (140 bayt) değerinden daha kısaydı .

Jo King sayesinde -3, Jonathan Allen sayesinde -1


1
Bu bir biçim dizesi değil. Bu bir biçim dizgisi. (117 bayt)
Jo King

1
Programlar mayıs standart hataya çıktı , bu yüzden değiştirerek 1 tasarrufu printile exit.
Jonathan Allan


2

Dal, 105 bayt

Bu, boşlukları doldurmak için basit bir değiştirme kullanır.

Twig'in replace()filtresi, değiştirilecek değerleri bir karma anahtarları olarak tanımlamanızı sağlar. Neyse ki, sayısal anahtarları olduğu için dizilerle de çalışır.

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

|rawDöndü, hangi kaçan önlemek için gereklidir Where'siçine Where's.

Bunu https://twigfiddle.com/phqpts adresinde deneyebilirsiniz


Bu PHP'ye derlendiğinden, PHP için eşdeğer:

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

Hangi önemli ölçüde kısaltılabilir.





1

Temiz , 166 bayt

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

Çevrimiçi deneyin!



1

jq, 110 karakter

(106 karakter kod + 4 karakter komut satırı seçeneği)

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

Örnek çalışma:

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?

Çevrimiçi deneyin!


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


Güzel çözüm! İyileştirmenin birkaç yolu: birden çok değişken için yeniden ifade etmek yerine virgül kullanın declare; yerine dize içinde gerçek satır sonu kullanmak char(10), aslında sen doğrudan satır sonlarını koyabilirsiniz printtablosu ve ortadan @ctamamen. En çok kullandığınız değişkeni seçin ve @kendi başına kullanın (geçerli!)
BradC


1

T-SQL, 137 bayt

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

Bu son dönüş FROM yalnızca okunabilirlik içindir, geri kalanı dize birleştirmesinin bir parçasıdır.

SeanC'nin SQL çözümünden farklı bir yöntem .




0

Kırmızı , 116 bayt

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

Çevrimiçi deneyin!

Açıklama:

İş, rejoinbir değer bloğunu azaltan ve birleştiren işlev tarafından yapılır .

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 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

Nedenini anlamak için bu 05AB1E ipucuma bakın :

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



0

PHP , 102 bayt

Temel olarak tekrarlayıcı kelimeleri veya cümleleri sayılarla değiştirin ve sonra php-strtr uygulayın

<?=strtr("0 a 1.
A 1 0.
If 0 a 1,
Where's the 1 0?",["Peter Piper picked","peck of pickled peppers"]);

Çevrimiçi deneyin!

Veya

PHP , 144 bayt

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

Çevrimiçi deneyin!


0

Powershell, 99 101 bayt

$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 aldı' değil mi?
wooshinyobject

1
Görünüşe göre bu alan the $b, başvurunuzu hem daha uzun hem de geçersiz kılıyor ( TIO ).
Jonathan Frech

1
Dahası, [...]Peter Piper picked?çıktınızın sonunda bir eksik olduğunu düşünüyorum .
Jonathan Frech
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.