การบีบอัดข้อความ


18

ด้วยข้อความที่ระบุด้านล่างมีคำบางคำในข้อความที่ซ้ำหลายครั้งในข้อความ ใช้ภาษาการเขียนโปรแกรมเพื่อเขียนรหัสย่อที่บีบอัดข้อความเพื่อแสดง หรือกล่าวอีกนัยหนึ่งให้ใช้จำนวนไบต์ที่น้อยที่สุดเพื่อแสดงข้อความ
ข้อความคือ:

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
ฉันประหลาดใจโดยสุจริตว่านี่ไม่ได้ถูกปิดเพราะเป็นคำถามของ Rick-Roll เราไม่ได้ทำอย่างนั้นอีกหรือ
โจคิง

1
@ โจกิ้งมันเป็นสตริงที่แตกต่างกัน ความหลากหลายเล็กน้อยในความท้าทายเดียวกันอาจเป็นเรื่องสนุกในบางครั้ง
moonheart08

@ moonheart08 ค่อนข้างแน่ใจว่าจุดนั้นถูกยิงในเมตาดาต้า
Magic Octopus Urn

คำตอบ:


9

R , 106 ไบต์

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

ลองออนไลน์!


1
นั่นคือการใช้นามแฝงที่ฉลาดมาก !!
Giuseppe

1
สุดยอดทางออก! นอกจากนี้ยังใช้วิธี memCompress 47 + 79 = 126 bytes
digEmAll

1
ความคิดนี้ช่วยฉันอีกไบต์ที่นี่ด้วย!
Giuseppe

ว้าวฉันไม่เห็นว่าเล่นกอล์ฟ นั่นเป็นสิ่งที่ดีจริงๆ
J.Doe

8

เยลลี่ ,  80 73 72 68 67 61  57 ไบต์

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

ลองออนไลน์!

อย่างไร?

“...“...“...“...“...“...»“Ƙ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 ไบต์

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

ลองออนไลน์!


2
คุณโกนคำตอบแบบทาสีบนไบต์ได้อย่างไร
Laikoni

2
@Laikoni คำตอบ 73 ไบต์ดั้งเดิมถูกสร้างขึ้นโดยใช้gzipระดับการบีบอัดสูงสุด ( -9) บวกกับการโกนข้อมูลเมตาบางส่วนheadและtail71 byter ถูกสร้างขึ้นโดยใช้ zopfli ซึ่งตอนแรกฉันลืมไปแล้ว Zopfli มักจะสร้างกระแส DEFLATE ที่สั้นกว่า
ovs

ใช่ฉันได้ลองซ้ำแล้วซ้ำอีกมากถึง 5,000,000 ครั้งบน zopfli มันไม่พบอะไรเลยที่ผ่านมา 71 ไบต์ในการทำซ้ำ 3109
LegionMammal978


4

Python 2 , 115 ไบต์

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

ลองออนไลน์!

พิมพ์สตริงที่คั่นด้วยเครื่องหมายจุลภาคหลายตัวเพื่อใส่ช่องว่างระหว่างกัน


Python 3 , 115 ไบต์

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

ลองออนไลน์!

Python 3 translateทำการยกของหนัก การใช้อักขระที่ไม่สามารถพิมพ์ได้ด้วยค่า ASCII หนึ่งหลักควรประหยัดสองไบต์


1
exitบันทึก 1 ไบต์สำหรับโปรแกรม Python 3
Jonathan Allan

4

เจลลี่ , 64 60 58 57 ไบต์

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

ลองออนไลน์!


ว้าวคล้ายกับคำตอบอื่นอย่างน่าประหลาดใจด้วยภาษาเดียวกันและนับไบต์เดียวกัน จริง ๆ แล้วฉันไม่รู้ว่าเกิดอะไรขึ้นในภาษานี้รหัสก็เป็นพื้นฐานเดียวกัน
tox123

1
การทับซ้อนกันในโค้ดจำนวนมากเป็นสตริงที่บีบอัดเหมือนกันซึ่งไม่น่าแปลกใจ
Misha Lavrov

1
@tox ขณะนี้โปรแกรมทั้งสองไม่ทำงานในลักษณะเดียวกัน (แม้ว่าเราทั้งคู่จะใช้แนวคิดที่คล้ายกันในประวัติศาสตร์ของการแก้ไข) รายการนี้ใช้รายการสตริงที่บีบอัด ( “...“...») เพื่อจัดทำสี่บรรทัดส่วนใหญ่แล้วแทรกสอด ( ż) ด้วยส่วนที่ซ้ำซ้อนน้อยลง (เช่น',\nIf') อีกครั้งด้วยรายการสตริงที่บีบอัด คุณสามารถดูวิธีการทำงานของฉันจากคำอธิบาย
Jonathan Allan

3

ทุบตี , 99

  • บันทึกได้ 4 ไบต์ด้วย @manatwork
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

ลองออนไลน์!


3
คุณสามารถย้ายการประกาศตัวแปรไปยังการใช้งานครั้งแรกด้วยการกำหนดพารามิเตอร์การขยายค่าเริ่มต้น: ลองออนไลน์! .
จัดการ

1
@ การบริหารงานว้าวฉันไม่รู้ว่าคุณจะทำเช่นนั้นได้ สวยเท่ห์ในการรับต่ำกว่า 100 - ขอบคุณ! เทคนิคนี้จะทำให้คำตอบเคล็ดลับดีๆทุบตี
Digital Trauma

2

V , 99 87 ไบต์

-12 ไบต์: ปรากฎว่าการแทนที่ 2 ครั้งจะสั้นกว่าซึ่งโดยพื้นฐานแล้วเหมือนกับการแก้ปัญหาของคนอื่น (ยกเว้น Bubblegum?)

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

ลองออนไลน์!


2

Python 3 , 120 117 116 ไบต์

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

สตริงรูปแบบก็สั้นกว่านอกจาก (129 bytes)และเข้าร่วม (140 bytes)

-3 ขอบคุณ Jo King, -1 ขอบคุณ Jonathan Allen


1
นั่นไม่ใช่สตริงรูปแบบ นั่นคือสตริงรูปแบบ (117 ไบต์)
Jo King

1
โปรแกรมอาจส่งออกไปยัง STDERRดังนั้นประหยัด 1 โดยแทนที่printด้วยexitด้วย
Jonathan Allan


2

Twig, 105 ไบต์

สิ่งนี้ใช้การแทนที่แบบง่ายเพื่อเติมช่องว่าง

replace()ตัวกรองของทวิกช่วยให้คุณสามารถกำหนดค่าที่จะแทนที่เป็นกุญแจของแฮช โชคดีที่มันยังทำงานร่วมกับอาร์เรย์เนื่องจากมีปุ่มตัวเลข

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

|rawเป็นสิ่งจำเป็นเพื่อหลีกเลี่ยงการหลบหนีซึ่งเปิดWhere'sWhere'sเข้าไป

คุณสามารถลองได้ที่https://twigfiddle.com/phqpts


ตั้งแต่นี้ถูกคอมไพล์ลงใน PHP, เทียบเท่าสำหรับ PHP จะเป็น:

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

ซึ่งสามารถทำให้สั้นลงได้อย่างมาก







1

jq, 110 ตัวอักษร

(ตัวเลือกบรรทัดคำสั่งรหัส 106 อักขระ + 4 อักขระ)

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

วิ่งตัวอย่าง:

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?

ลองออนไลน์!


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


ทางออกที่ดี! กี่วิธีที่จะปรับปรุง: สำหรับตัวแปรหลายคนใช้เครื่องหมายจุลภาคแทนกระทบdeclare; ใช้ตัวแบ่งบรรทัดจริงในสตริงแทนchar(10)ในความเป็นจริงคุณสามารถใส่ตัวแบ่งบรรทัดในprintคำสั่งโดยตรงและกำจัด@cทั้งหมด เลือกตัวแปรที่ใช้มากที่สุดและใช้@ด้วยตัวเอง (ใช้ได้จริง!)
BradC

1

Stax , 60 56 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง


1
นี่คือหนึ่งไบต์ที่สั้นกว่าที่คลายแพ็คออกและอันนี้ดูเหมือนจะทำให้คำแถลงที่ลึกซึ้งเกี่ยวกับการดำรงอยู่
Khuldraeseth na'Barya

"i am. Am i. If i am, Where's them i?" ฉันไม่สามารถหยุดหัวเราะได้ นี่คือทองคำ
เรียกซ้ำ

เดส์การ์ตส์ไม่ใช่คนไม่มีอะไรเลยสำหรับฉัน
Khuldraeseth na'Barya

1

T-SQL, 137 ไบต์

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

การส่งคืนครั้งสุดท้ายก่อนที่FROMจะมีไว้สำหรับการอ่านเท่านั้นส่วนที่เหลือเป็นส่วนหนึ่งของการต่อสตริง

วิธีการที่แตกต่างจากวิธีการแก้ปัญหาของ SQL SeanC




0

สีแดง 116 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

งานทำโดยrejoinfuncion ซึ่งจะลดและรวมบล็อกของค่า

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 ไบต์

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

ลองออนไลน์

คำอธิบาย:

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

ดูเคล็ดลับ 05AB1E ของฉันเพื่อทำความเข้าใจว่าทำไม:

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



0

PHP , 102 ไบต์

โดยทั่วไปเพียงแค่เปลี่ยนคำหรือประโยคที่มีตัวนับซ้ำแล้วใช้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"]);

ลองออนไลน์!

หรือ

PHP , 144 ไบต์

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

ลองออนไลน์!


0

Powershell, 99 101 ไบต์

$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 เลือก'
wooshinyobject

1
ดูเหมือนว่าช่องว่างในthe $bทำให้การส่งของคุณทั้งยาวและไม่ถูกต้อง ( TIO )
Jonathan Frech

1
นอกจากนี้ฉันคิดว่าคุณพลาด[...]Peter Piper picked?จุดสิ้นสุดของผลลัพธ์ของคุณ
Jonathan Frech
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.