Nén văn bản


18

Với văn bản đã cho bên dưới, có một số từ trong văn bản lặp lại nhiều lần trong văn bản. Sử dụng bất kỳ ngôn ngữ lập trình nào để viết một mã ngắn nén văn bản để hiển thị nó. Hay nói cách khác, sử dụng số byte nhỏ nhất để hiển thị văn bản.
Văn bản là:

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
Tôi thực sự ngạc nhiên khi điều này không bị đóng lại như là một bản sao của câu hỏi Rick-Roll đó. Có phải chúng ta không làm điều đó nữa?
Jo King

1
@JoKing nó một chuỗi khác nhau. Một chút đa dạng trên cùng một thử thách đôi khi có thể là niềm vui.
moonheart08

@ moonheart08 khá chắc chắn rằng điểm đó đã bị bắn hạ trong meta.
Bạch tuộc ma thuật Urn

Câu trả lời:


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

Hãy thử trực tuyến!


1
Đó là một cách sử dụng bí danh rất thông minh !!
Giuseppe

1
Giải pháp tuyệt vời! Nó cũng đánh bại cách tiếp cận memCompress 47 + 79 = 126 byte
digEmAll

1
Ý tưởng này đã tiết kiệm cho tôi một byte khác ở đây là tốt!
Giuseppe

Wow, tôi đã không phát hiện ra rằng golf. Nó thật là tuyệt.
J.Doe

8

Thạch ,  80 73 72 68 67 61  57 byte

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

Hãy thử trực tuyến!

Làm sao?

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

Bong bóng , 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%."{.

Hãy thử trực tuyến!


2
Làm thế nào bạn cạo hết byte của một câu trả lời bubblegum?
Laikoni

2
@Laikoni, câu trả lời 73 byte ban đầu được tạo bằng gzipmức nén cao nhất ( -9) cộng với một số cạo siêu dữ liệu bằng cách sử dụng headtail, byter 71 được tạo bằng zopfli, lúc đầu tôi quên mất. Zopfli thường tạo ra các luồng DEFLATE ngắn hơn.
trứng

Vâng, tôi đã thử tới 5.000.000 lần lặp trên zopfli, nó không thể tìm thấy bất cứ điều gì qua lần lặp 71 byte trên lần lặp 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+"?"

Hãy thử trực tuyến!

In nhiều chuỗi được phân tách bằng dấu phẩy để đặt khoảng trắng ở giữa chúng.


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

Hãy thử trực tuyến!

Python 3 là translatemột công việc nặng nhọc. Sử dụng các ký tự không in được với giá trị ASCII một chữ số sẽ tiết kiệm được hai byte.


1
exittiết kiệm 1 byte cho chương trình Python 3.
Jonathan Allan

4

Thạch , 64 60 58 57 byte

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

Hãy thử trực tuyến!


Wow, đáng ngạc nhiên tương tự như một câu trả lời khác, với cùng ngôn ngữ và cùng số byte. Tôi thực sự không biết những gì đang xảy ra trong ngôn ngữ này, vậy về cơ bản mã có giống nhau không?
tox123

1
Rất nhiều sự trùng lặp trong mã là các chuỗi nén giống hệt nhau, điều này không gây ngạc nhiên.
Misha Lavrov

1
@tox hai chương trình hiện không hoạt động theo cùng một cách (mặc dù cả hai chúng tôi đã sử dụng các ý tưởng tương tự như nhau trong lịch sử sửa đổi). Cái này đang sử dụng danh sách chuỗi nén ( “...“...») để tạo thành hầu hết bốn dòng và sau đó xen kẽ ( ż) với các phần ít lặp lại (như ',\nIf'), một lần nữa với danh sách chuỗi nén; bạn có thể thấy cách tôi làm việc từ mô tả.
Jonathan Allan

3

Bash , 99

  • 4 byte được lưu nhờ @manatwork.
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

Hãy thử trực tuyến!


3
Bạn có thể di chuyển các khai báo biến sang tập quán đầu tiên của chúng bằng cách gán các mở rộng tham số giá trị mặc định: Hãy thử trực tuyến! .
manatwork

1
@manatwork Wow, tôi không biết bạn có thể làm điều đó. Khá tuyệt để có được dưới 100 - Cảm ơn! Kỹ thuật này sẽ làm cho một lời khuyên bash tốt trả lời .
Chấn thương kỹ thuật số

2

V , 99 87 byte

-12 byte: hóa ra 2 sự thay thế ngắn hơn về cơ bản giống như giải pháp của mọi người khác (ngoại trừ Bubblegum?)

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

Hãy thử trực tuyến!


2

Python 3 , 120 117 116 byte

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

Các chuỗi định dạng ngắn hơn phép cộng (129 byte) và phép nối (140 byte) .

-3 cảm ơn Jo King, -1 cảm ơn Jonathan Allen


1
Đó không phải là một chuỗi định dạng. Đó là một chuỗi định dạng. (117 byte)
Jo King

1
Các chương trình có thể xuất ra STDERR , vì vậy hãy lưu 1 bằng cách thay thế printbằng exit.
Jonathan Allan


2

Cành, 105 byte

Điều này sử dụng một sự thay thế đơn giản để điền vào các khoảng trống.

replace()Bộ lọc của Twig cho phép bạn xác định các giá trị để thay thế dưới dạng các khóa của hàm băm. May mắn thay, nó cũng hoạt động với các mảng, vì chúng có các phím số.

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

Các |raw cần thiết là tránh thoát, mà biến Where'sthànhWhere's .

Bạn có thể thử nó https://twigfiddle.com/phqpts


Vì điều này được biên dịch thành PHP, nên tương đương với PHP sẽ là:

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

Mà có thể được rút ngắn đáng kể.





1

Sạch , 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+"?"]

Hãy thử trực tuyến!



1

jq, 110 ký tự

(106 ký tự mã + 4 ký tự tùy chọn dòng lệnh)

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

Chạy mẫu:

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?

Hãy thử trực tuyến!


1

Máy chủ SQL, 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 <>


Giải pháp tốt đẹp! Một vài cách để cải thiện: đối với nhiều biến, hãy sử dụng dấu phẩy thay vì nghỉ ngơi declare; sử dụng ngắt dòng thực tế trong chuỗi thay vì char(10), trên thực tế, bạn có thể đặt ngắt dòng trực tiếp trong printcâu lệnh và loại bỏ @choàn toàn. Chọn biến được sử dụng nhiều nhất của bạn và tự sử dụng @(giá trị của nó!)
BradC

1

Stax , 60 56 byte

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

Chạy và gỡ lỗi nó


1
Đây là một byte được giải nén ngắn hơn, và điều này dường như đang đưa ra một tuyên bố sâu sắc về sự tồn tại.
Khuldraeseth na'Barya

"i am. Am i. If i am, Where's them i?" Tôi không thể ngừng cười. Đây là vàng.
đệ quy

Descartes không phải là không phải với tôi.
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

Sự trở lại cuối cùng trước khi FROMchỉ dành cho khả năng đọc, phần còn lại là một phần của nối chuỗi.

Phương pháp khác với giải pháp SQL của SeanC .




0

Màu đỏ , 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"?"]

Hãy thử trực tuyến!

Giải trình:

Công việc được thực hiện bởi chức năng rejoin, làm giảm và tham gia một khối các giá trị.

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¾Ð«‚ðì:¦

Hãy thử trực tuyến.

Giải trình:

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

Xem mẹo 05AB1E này của tôi để hiểu lý do:

  • ’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 byte

Về cơ bản chỉ cần thay đổi các từ hoặc câu lặp lại bằng số, sau đó áp dụng 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"]);

Hãy thử trực tuyến!

Hoặc là

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

Hãy thử trực tuyến!


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
Không nên $ a = 'Peter Piper chọn'?
wooshinyobject

1
Dường như không gian trong the $blàm cho bài gửi của bạn dài hơn và không hợp lệ ( TIO ).
Jonathan Frech

1
Hơn nữa, tôi nghĩ rằng bạn đang thiếu một [...]Peter Piper picked?ở đầu ra của bạn.
Jonathan Frech
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.