Сжатие текста


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 почти уверен, что эта точка была сбита мета.
Волшебная Урна Осьминога

Ответы:


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а tail71 байт генерируется с использованием zopfli, о котором я изначально забыл. Zopfli обычно создает более короткие потоки DEFLATE.
овс

Да, я пробовал до 5 000 000 итераций на zopfli, он не смог найти ничего, кроме 71-байтовой, на итерации
3109.


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.
Джонатан Аллан

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
Вы можете переместить объявления переменных к их первому использованию с помощью назначения расширений параметров по умолчанию: Попробуйте онлайн! ,
manatwork

1
@manatwork Wow, я понятия не имел, что вы могли бы сделать это. Довольно круто, чтобы попасть под 100 - Спасибо! Эта техника даст хороший совет .
Цифровая травма

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 байт) и объединения (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+'?'

дб <> скрипка


Отличное решение! Несколько способов улучшить: для нескольких переменных используйте запятую вместо повторения declare; используйте вместо строки фактический разрыв строки char(10), фактически вы можете поместить разрывы строк непосредственно в printоператор и @cполностью исключить их. Выберите наиболее часто используемую переменную и используйте @ее самостоятельно (она действительна!)
BradC

1

Stax , 60 56 байт

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

Запустите и отладьте его


1
Вот один байт, распакованный короче, и этот, кажется, делает глубокое заявление о существовании.
Халдрасет на'Барья

"i am. Am i. If i am, Where's them i?" Я не могу перестать смеяться. Это золото.
рекурсивный

Декарт на меня не похож.
Халдрасет на'Барья

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.