Стиснення тексту


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
Я чесно здивований, що це питання не було закрито як обдурення цього питання про Рік-Ролла. Хіба ми цього більше не робимо?
Джо Кінг

1
@JoKing це є інший рядком. Невелике розмаїття на одному й тому ж виклику часом може бути цікавим.
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
Це дуже розумне використання псевдоніму !!
Джузеппе

1
Чудове рішення! Він також обіграє підхід memCompress 47 + 79 = 126 байт
digEmAll

1
Ця ідея врятувала мені ще один байт тут , як добре!
Джузеппе

Нічого собі, я не помітив цього гольфу. Це справді приємно.
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
Як ви обстригали байти відповіді міхура?
Лайконі

2
@Laikoni оригінал 73 байт відповіді була створена за допомогою gzipна найвищому рівні стиснення ( -9) плюс деякі гоління з використанням метаданих headі tail, 71 byter генерується з допомогою zopfli, який я спочатку забув про. Zopfli зазвичай створює коротші потоки DEFLATE.
ов

Так, я спробував до 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's translate робить важкий підйом. Використання символів, що не друкуються, з одноцифровим значенням ASCII, має зберегти два байти.


1
exitзберігає 1 байт для програми Python 3.
Джонатан Аллан

4

Желе , 64 60 58 57 байт

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

Спробуйте в Інтернеті!


Нічого собі, напрочуд схожий на іншу відповідь, з тією ж мовою та тим самим числом байтів. Я насправді не знаю, що відбувається цією мовою, тому код в основному однаковий?
tox123

1
Багато перекриття в коді - однакові стислі рядки, що не дивно.
Міша Лавров

1
@tox обидві програми наразі не працюють однаково (хоча ми обидва використовували подібні ідеї, як і одна в історії ревізій). Цей використовується за допомогою стислих списків рядків ( “...“...») для формування більшості чотирьох рядків, а потім переплетення ( ż) з менш повторюваними частинами (наприклад ',\nIf'), знову ж таки зі стислими списками рядків; ви можете бачити, як працює шахта з опису.
Джонатан Аллан

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
@manatwork Нічого собі, я не здогадувався, що ти можеш це зробити. Досить круто, щоб отримати менше 100 - Дякую! Цей прийом дозволив би відповісти гарними порадами .
Цифрова травма


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 байт) та об'єднання (140 байт) .

-3 подяки Джо Кінгу, -1 подяка Джонатану Аллену


1
Це не рядок формату. Це рядок формату. (117 байт)
Джо Кінг

1
Програми можуть виводити на STDERR , тому збережіть 1, замінивши printна exit.
Джонатан Аллан


2

Гілочка, 105 байт

Для заповнення прогалин використовується проста заміна.

replace()Фільтр Twig дозволяє визначити значення для заміни як ключі хеша. На щастя, він також працює з масивами, оскільки у них є цифрові клавіші.

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

|rawНеобхідно , щоб уникнути втечі, який перетворився Where'sв Where'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

Стакс , 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"?"]

Спробуйте в Інтернеті!

Пояснення:

Робота виконується rejoinфуніціоном, який зменшує і приєднується до блоку значень.

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 = 'Пітер Пайпер вибрав'?
wooshinyobject

1
Виглядає так, ніби простір у the $bвашій подачі як довший, так і недійсний ( TIO ).
Джонатан Фрех

1
Крім того, я думаю, що ви не вистачаєте [...]Peter Piper picked?на кінці виходу.
Джонатан Фрех
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.