Compactação de texto

18

Com o texto fornecido abaixo, há algumas palavras no texto que se repetem várias vezes no texto. Use qualquer linguagem de programação para escrever um código curto que comprima o texto para exibi-lo. Ou, em outras palavras, use o menor número de bytes para exibir o texto.
O texto é:

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?
Monolica
fonte
6
Sinceramente, estou surpreso que isso não tenha sido encerrado como uma bobagem dessa pergunta de Rick-Roll. Não estamos mais fazendo isso?
Jo King
1
@JoKing é uma string diferente. Um pouco de variedade no mesmo desafio às vezes pode ser divertido.
moonheart08
@ moonheart08 tenho certeza de que esse ponto foi abatido na meta.
Magic Octopus Urn

Respostas:

9

R , 106 bytes

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

Experimente online!

J.Doe
fonte
1
Esse é um uso muito inteligente de aliasing !!
21418 Giuseppe
1
Ótima solução! Ele também supera a abordagem memCompress 47 + 79 = 126 bytes
digEmAll
1
Essa idéia me salvou outro byte aqui também!
21418 Giuseppe
Uau, eu não vi esse golfe. Isso é muito legal.
J.Doe
8

Geléia ,  80 73 72 68 67 61  57 bytes

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

Experimente online!

Quão?

“...“...“...“...“...“...»“Ƙ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)
Jonathan Allan
fonte
5

Bubblegum , 73 71 bytes

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

Experimente online!

ovs
fonte
2
Como você raspa bytes de uma resposta de chiclete?
Laikoni 13/10/19
2
@Laikoni, a resposta original de 73 bytes foi criada usando gzipo nível de compactação mais alto ( -9), além de alguns barbeadores de metadados usando heade tail, o 71 byter é gerado usando o zopfli, que eu esqueci inicialmente. O Zopfli geralmente cria fluxos DEFLATE mais curtos.
ovs 13/10/18
Sim, eu tentei até 5.000.000 iterações sobre zopfli, não foi possível encontrar nada passado a 71 bytes na iteração 3109.
LegionMammal978
5

JavaScript (SpiderMonkey) , 114 bytes

print(`0 a1.
A1 0.
If 0 a1,
Where's the1 0?`.replace(/\d/g,n=>+n?' peck of pickled peppers':'Peter Piper picked'))

Experimente online!

Eu diria que esta resposta é de ovs , de qualquer maneira, 19 bytes salvos.

Obrigado Arnauld , economiza 3 bytes.

tsh
fonte
1
114 bytes .
Arnauld
4

Python 2 , 115 bytes

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

Experimente online!

Imprime várias strings separadas por vírgulas para colocar espaços entre elas.


Python 3 , 115 bytes

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

Experimente online!

Python 3 translatefaz o trabalho pesado. O uso de caracteres não imprimíveis com o valor ASCII de um dígito deve salvar dois bytes.

xnor
fonte
1
exiteconomiza 1 byte para o programa Python 3.
Jonathan Allan
4

Geléia , 64 60 58 57 bytes

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

Experimente online!

Dennis
fonte
Uau, surpreendentemente semelhante a outra resposta, com o mesmo idioma e a mesma contagem de bytes. Na verdade, eu não sei o que está acontecendo nesse idioma, então o código é basicamente o mesmo?
tox123
1
Muitas das sobreposições no código são as seqüências compactadas idênticas, o que não é surpreendente.
Misha Lavrov
1
@tox, os dois programas atualmente não estão funcionando da mesma maneira (embora nós dois tenhamos usado idéias semelhantes entre si no histórico de revisões). Este está usando listas de cordas compactadas ( “...“...») para formar a maioria das quatro linhas e depois intercalando ( ż) com as partes menos repetitivas (como ',\nIf'), novamente com listas de cordas compactadas; você pode ver como o meu funciona a partir da descrição.
Jonathan Allan
3

Bash , 99

  • 4 bytes salvos graças a @manatwork.
echo "${P=Peter Piper picked} a${p= peck of pickled peppers}.
A$p $P.
If $P a$p,
Where's the$p $P?"

Experimente online!

Trauma Digital
fonte
3
Você pode mover as declarações de variáveis ​​para seus primeiros usos com atribuições de expansão de parâmetros de valor padrão: Experimente on-line! .
manatwork
1
@manatwork Uau, eu não tinha ideia de que você poderia fazer isso. Muito legal para obter menos de 100 - Obrigado! Essa técnica seria uma boa resposta para as dicas do bash .
Trauma Digital
2

V , 99 87 bytes

-12 bytes: Acontece que 2 substituições são mais curtas, o que é basicamente o mesmo que a solução de todos os outros (exceto Bubblegum?)

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

Experimente online!

ბიმო
fonte
2

Python 3 , 120 117 116 bytes

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

As seqüências de formato eram mais curtas que a adição (129 bytes) e uma junção (140 bytes) .

-3 graças a Jo King, -1 graças a Jonathan Allen

Syfer Polski
fonte
1
Isso não é uma string de formato. Essa é uma string de formato. (117 bytes)
Jo King
1
Os programas podem ser enviados para STDERR , então salve 1 substituindo printpor exit.
Jonathan Allan
2

Java (JDK) , 123 bytes

v->"".format("%s a%s.%nA%2$s %1$s.%nIf %1$s a%2$s,%nWhere's the%2$s %1$s?","Peter Piper picked"," peck of pickled peppers")

Experimente online!

Olivier Grégoire
fonte
Você tem permissão para usar um argumento obrigatório como esse?
Quintec 15/10
2
@Quintec Sim , se a entrada não é utilizada
Jo rei
2

Galho, 105 bytes

Isso usa uma substituição simples para preencher as lacunas.

O replace()filtro do Twig permite definir os valores a serem substituídos como as chaves de um hash. Felizmente, ele também funciona com matrizes, pois elas têm teclas numéricas.

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

O |rawé necessário para evitar escapar, que se transformou Where'sem Where's.

Você pode experimentá-lo em https://twigfiddle.com/phqpts


Como isso é compilado no PHP, o equivalente ao PHP seria:

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

O que pode ser reduzido significativamente.

Ismael Miguel
fonte
2

Ruby , 104 bytes

/ a/=~$a="Peter Piper picked a peck of pickled peppers"
puts"#$a.
A#$' #$`.
If #$a,
Where's the#$' #$`?"

Experimente online!

GB
fonte
1

/// , 86 bytes

/1/Peter Piper picked//2/ peck of pickled peppers/1 a2.
A2 1.
If 1 a2,
Where's the2 1?

Experimente online!

Brincadeira
fonte
1

C (gcc) , 123 bytes

f(){printf("%s a%s.\nA%2$s %1$s.\nIf %1$s a%2$s,\nWhere's the%2$s %1$s?","Peter Piper picked"," peck of pickled peppers");}

Experimente online!

gastropner
fonte
1

Limpo , 166 bytes

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

Experimente online!

Furioso
fonte
1

sed , 101 100 bytes

s/^/0 a1.\nA1 0.\nIf 0 a1,\nWhere's the1 0?/
s/0/Peter Piper picked/g
s/1/ peck of pickled peppers/g

Experimente online!

-1 byte graças a @DigitalTrauma

Logern
fonte
Substitua .*por ^para salvar um byte
Digital Trauma
1

jq, 110 caracteres

(Código de 106 caracteres + opções de linha de comando de 4 caracteres)

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

Exemplo de execução:

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?

Experimente online!

homem a trabalhar
fonte
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 <> violino

SeanC
fonte
Ótima solução! Algumas maneiras de melhorar: para várias variáveis, use vírgula em vez de reafirmar declare; use uma quebra de linha real na cadeia de caracteres em vez de char(10), na verdade, você pode colocar as quebras de linha diretamente na printinstrução e eliminar @ccompletamente. Escolha a sua variável e uso mais usado @por si só (o seu válido!)
BradC
1

Stax , 60 56 bytes

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

Execute e depure

recursivo
fonte
1
Aqui está um byte mais curto, descompactado, e este parece estar fazendo uma declaração profunda sobre a existência.
Khuldraeseth na'Barya
"i am. Am i. If i am, Where's them i?" Não consigo parar de rir. Isto é ouro.
recursivo
Descartes não é nada para mim.
Khuldraeseth na'Barya
1

T-SQL, 137 bytes

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

Esse último retorno antes de FROMser apenas para legibilidade, o restante faz parte da concatenação de strings.

Método diferente da solução SQL da SeanC .

BradC
fonte
0

Kotlin , 150 bytes

var s="Peter Piper picked"
var z=" peck of pickled peppers"
var v=s+" a"+z
var x=z+" "+s
print(v+".\n"+"A"+x+".\n"+"If "+v+",\n"+"Where's the "+x+"?")

Experimente online!

Syed Hamza Hassan
fonte
0

Retina 0.8.2 , 85 bytes


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

Experimente online! A mesma ideia que todos os outros.

Neil
fonte
0

Vermelho , 116 bytes

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

Experimente online!

Explicação:

O trabalho é realizado pela rejoinfunção, que reduz e une um bloco de valores.

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 "?"
]
Galen Ivanov
fonte
0

J , 121 bytes

echo('1 a2.',CR,'A2 1.',CR,'If 1 a2,',CR,'Where''s the2 1?')rplc('1';'Peter Piper picked';'2';' peck of pickled peppers')

Experimente online!

Galen Ivanov
fonte
0

PHP , 107 bytes

<?=($a="Peter Piper picked")." a".($b=" peck of pickled peppers").".
A$b $a.
If $a a$b,
Where's the$b $a?";

Experimente online!

Luis felipe De jesus Munoz
fonte
Faltando um ponto na primeira linha.
GB
Use vírgula em vez de concatenação para salvar 4 bytes:<?=$a=...," a",$b=...,...
Titus
0

05AB1E , 78 76 74 72 bytes

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

Experimente online.

Explicação:

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

Veja esta minha dica 05AB1E para entender o porquê:

  • ’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"
Kevin Cruijssen
fonte
0

Haskell , 132 bytes

g x y=x++y++x
p=g"Peter Piper picked"
q=g" peck of pickled peppers"
a=g" ".("a"++).q
f=p(a".\nA"++p".\nIf "++a",\nWhere's the")++"?"

Experimente online!

Max Yekhlakov
fonte
0

C # (.NET Core) ,123 118 116 bytes

v=>@"0 a1.
A1 0.
If 0 a1,
Where's the1 0?".Replace("0","Peter Piper picked").Replace("1"," peck of pickled peppers")

Experimente online!

Inspirado na resposta em java de @Olivier Grégoire

5 bytes salvos por @sebbs

aloisdg diz Restabelecer Monica
fonte
0

PHP , 102 bytes

Basicamente, basta alterar as palavras ou frases do repetidor com números e, em seguida, aplicar 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"]);

Experimente online!

Ou

PHP , 144 bytes

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

Experimente online!

Francisco Hahn
fonte
0

Powershell, 99 101 bytes

$a='Peter Piper picked'
$b=' peck of pickled peppers'
"$a a$b.
A$b $a.
If $a a$b,
Where's the$b $a`?"
confuso
fonte
1
$ A = 'Peter Piper escolheu'?
wooshinyobject
1
Parece que o espaço em the $btorna seu envio mais longo e inválido ( TIO ).
Jonathan Frech
1
Além disso, acho que você está perdendo um [...]Peter Piper picked?no final da sua saída.
Jonathan Frech