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?

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:



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)

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!


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


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.


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!


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!


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!


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


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

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.





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!



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!


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


Ó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

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 .




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



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"



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!


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.