Não somos estranhos ao código do golfe, você conhece as regras, e eu também


252

Escreva o programa mais curto que imprima a letra inteira de "Never Gonna Give You Up" de Rick Astley.

Regras:

  • É necessário que a letra seja impressa exatamente como aparece no pastebin * acima. Aqui está o despejo bruto: http://pastebin.com/raw/wwvdjvEj
  • Não pode confiar em nenhum recurso externo - todas as letras devem ser geradas por / incorporadas no código.
  • Nenhum uso de algoritmos de compactação existentes (por exemplo, gzip / bzip2), a menos que você inclua o algoritmo completo em seu código.
  • Use qualquer idioma, o código mais curto vence.

Atualização, 1º de junho de 2012:
Para soluções que contenham texto não ASCII, o tamanho da sua solução será contado em bytes, com base na codificação UTF-8. Se você usar pontos de código que não podem ser codificados em UTF-8, sua solução não será considerada válida.

Atualização, 7 de junho de 2012:
Obrigado a todos por suas soluções impressionantes! Aceitarei a resposta mais curta amanhã à tarde. No momento, a resposta do GolfScript de Peter Taylor está ganhando, então aproveite algumas melhorias se você quiser vencê-lo! :)

* Há um erro de digitação no Pastebin (linha 46, "saber" deve ser "conhecido"). Você pode replicá-lo ou não, a seu critério.


4
@ w0lf Você está correto. Eu só digitalizei as letras para verificar sua precisão, devo ter perdido essa. Eu aceito "saber" ou "conhecido".
Polinomial

10
Mais de 26k visualizações em apenas 3 dias. WOW ...
Gaffi

9
Como no mundo isso gerou tantas opiniões e votos? O que quer que ele tenha feito, eu vou fazer engenharia reversa.
PhiNotPi

39
@PhiNotPi Boa sorte, engenharia reversa "Jeff Atwood twittando você".
breadbox

9
A restrição com UTF-8 não faz sentido. E se meu código for menor quando codificado como UTF-16 ou como Latin-1? Você deve contar o número de bytes ou o número de caracteres, mas deixe a codificação até o autor.
Timwi

Respostas:


81

Ruby 576 557 556 (552) chars && PHP 543 chars

Outra solução de busca e substituição. Observe que esta forma de solução é essencialmente um código de compactação baseado em gramática http://en.wikipedia.org/wiki/Grammar-based_code Confira http://www.cs.washington.edu/education/courses/csep590a/07au /lectures/lecture05small.pdf para um exemplo simples de entender a compactação.

Eu escrevi as regras de substituição para que o caractere inicial de cada substituição seja calculado (eles estão em ordem ASCII sequencial); ele não precisa estar presente nos dados de transição.

i=44
s="We; n7trangMsL8loT63Ke rules5s8d8I
AJull commit4nt'sChatFKink: of6CHldn'tRetKisJrom<ny@Ruy-/A= if?<sk 42DS'tLE 4?;Lo8bli=L7ee..
O,R1)O,R001)/-.."
"
I justCannaLE?2Gotta >u=Msta=.|
Ng1Nlet? downNrun<rH=5desMt?N>cryNsayRoodbyeNtE< lie5hurt?|

We'T3n each@Jor s8lSg6r hear9<ch: but6;Lo7hyL7BInsideCe both3Cha9Ro: S
We3KeRa45we;QplB|1)O)NgiT, nPgiT
(G|iT? up| howFJeel:
| know|me|<= |
YH|8s|o |t's been|ing|'re| a|nd|make? | yH| othM|A|ay it
| w|D|ell| I'm|G|ou|I| f|Lh| t|er|
NP|
(Ooh|eTrQ|RSna | g|on|ve".scan(/[^|]+/){s.gsub!((i+=1).chr,$&)}
puts s

notas de implementação

  • A solução acima tem 556 caracteres, mas obtém 552 com a remoção de novas linhas do código-fonte. É uma pontuação um pouco melhor do que a solução original de 556 caracteres que obtive 554.
  • Eu uso "conhecido" em vez de "saber"; isso torna a repetição do verso idêntica e deve melhorar a compressão
  • Originalmente, otimizei as regras pesquisando repetidamente a substituição que resultaria na maior redução no tamanho do código atual. No entanto, descobri que as regras de substituição de RiderOfGiraffe eram (ligeiramente) melhores que as minhas, então agora estou usando uma versão modificada de suas regras.
  • Passei um tempo reorganizando as regras para que um único passe de substituição possa descomprimir tudo.
  • Devido ao caractere inicial calculado nas regras de substituição, minha lista de regras possui uma regra para todos os caracteres em um intervalo ASCII contíguo. Descobri que ter algumas regras de substituição "fictícias" era melhor para o tamanho do código do que ter todas as regras reais e codificar uma substituição de correção de texto final.
  • Este exemplo é pequeno o suficiente para que você provavelmente possa escrever com sucesso um programa para encontrar o conjunto de regras ideal (menor custo total). Eu não esperaria que isso resultasse em reduções de tamanho de mais do que alguns bytes.

implementação mais antiga

Esta implementação mais antiga possui 576 caracteres e começou com regras de substituição da implementação bash / sed do ugoren. Ignorando a renomeação da variável de substituição, minhas primeiras 28 substituições são exatamente iguais às executadas no programa da ugoren. Adicionei mais alguns para diminuir a contagem geral de bytes. Isso é possível porque minhas regras são representadas com mais eficiência do que aquelas na implementação da ugoren.

i=44
puts"WeM noHtraLersB loJ;6 C rules=so do $
& full commitment'sGhat<thinkDof;Gouldn'tKet this fromFny oCrKuy.
-&E if9ask me1~on't @ me:MBo bliEBHee//

3300-.//|
We'J6n each oCr forHo loL;r hear2FchDbut;MBoHhyBH7$nsideGe both6Gha2ADon
We6 CKame=weM>pl7|
$ justGanna @:1#otta 8uEerstaE/|
5?9up5let9down5runFrouE=desert:58cry5sayAodbye5@F lie=hurt:|(Ooh)5?, nI>?
(#4| how<feeliL
|t's been|(Ooh,K4|iJ9up)
|
NI>| know|ay it
|make9|: | you|
You| $'m |FE |Anna |giJ|tell|Ko| to|the|iL |nd| a| w| s|eJr|ve| g|ng|'re".split("|").inject{|m,o|m.gsub((i+=1).chr,o)}.tr('&~#$',"ADGI")

Eu não tentei otimizar as regras de substituição neste.

notas do concurso

O esquema de descompactação de busca e substituição funciona bem para este concurso, porque a maioria dos idiomas possui rotinas pré-criadas que podem fazer isso. Com uma quantidade tão pequena de texto a ser gerada, esquemas complexos de descompressão não parecem ser vencedores possíveis.

Usei apenas texto ASCII e também evitei usar caracteres ASCII não imprimíveis. Com essas restrições, cada caractere no seu código pode representar apenas um máximo de 6,6 bits de informação; isso é muito diferente das técnicas de compactação reais , nas quais você usa todos os 8 bits. Em certo sentido, não é "justo" comparar com o tamanho do código gzip / bzip2 porque esses algoritmos usarão todos os 8 bits. Um algoritmo de descompactação mais sofisticado pode ser possível se você puder incluir ASCII tradicionalmente não imprimível em suas seqüências E cada caractere não imprimível ainda será gravado no seu código como um único byte.

Solução PHP

<?=str_replace(range('-',T),split(q,"
I justCannaLE?2Gotta >u=Msta=.q
Ng1Nlet? downNrun<rH=5desMt?N>cryNsayRoodbyeNtE< lie5hurt?q

We'T3n each@Jor s8lSg6r hear9<ch: but6;Lo7hyL7BInsideCe both3Cha9Ro: S
We3KeRa45we;QplBq1)O)NgiT, nPgiT
(GqiT? upq howFJeel:
q knowqmeq<= q
YHq8sqo qt's beenqingq'req aqndqmake? q yHq othMqAqay it
q wqDqellq I'mqGqouqIq fqLhq tqerq
NPq
(OohqeTrQqRSna q gqonqve"),"We; n7trangMsL8loT63Ke rules5s8d8I
AJull commit4nt'sChatFKink: of6CHldn'tRetKisJrom<ny@Ruy-/A= if?<sk 42DS'tLE 4?;Lo8bli=L7ee..
O,R1)O,R001)/-..");

A solução acima pega o PHP de "um cara triste" e o combina com minhas regras de substituição. A resposta PHP acaba tendo o menor código de descompactação. Consulte http://ideone.com/XoW5t


Minha sedsolução certamente não pode vencê-lo. Estou trabalhando em algo que espero ter uma chance - você tem 75 bytes de sobrecarga, talvez eu o reduza (não em Ruby).
Ugoren

Eu encontro 555 bytes no seu programa (sem nova linha à direita).
res

1
O método de pontuação do OP é excluir separadores de nova linha no código-fonte ASCII, portanto, parece que isso deve marcar 554 .
res

Ótima solução! :)
Polinomial

Parece que o menor código de descompressão estava no PHP. Aqui está uma solução 543 bytes (minhas regras, usando trechos de código a partir de "um cara triste") ideone.com/XoW5t
Ed H.

73

Bash / Sed, 705 650 588 582 caracteres

Lógica :
a idéia básica é a substituição simples. Em vez de escrever, por exemplo, Never gonna give you up\nNever gonna let you downescrevo Xgive you up\nXlet you downe substituo todos Xpor Never gonna.
Isso é conseguido executando sedcom um conjunto de regras, no formulário s/X/Never gonna /g.
As substituições podem ser aninhadas. Por exemplo, Never gonnaé comum, mas também gonnaem outros contextos. Então, eu posso usar duas regras: s/Y/ gonna/ge s/X/NeverY/g.
Ao adicionar regras, partes dos textos das músicas são substituídas por caracteres únicos, tornando-as mais curtas. As regras se tornam mais longas, mas se a sequência substituída for longa e frequente, vale a pena.
O próximo passo é remover a repetição dos sedpróprios comandos. A sequência s/X/something/gé bastante repetitiva.
Para torná-lo mais curto, altero os comandos sed para que se pareçam Xsomething. Então eu uso sedpara converter isso em um sedcomando normal . O código sed 's#.#s/&/#;s#$#/g;#faz isso.
O resultado final é um sedcomando, cujos argumentos são gerados por outro sedcomando, entre aspas.
Você pode encontrar uma explicação mais detalhada neste link .

Código:

sed "`sed 's#.#s/&/#;s#$#/g#'<<Q
LMWe'veKn each o!r for-o longPr hearHzchJbutP're2o-hy2-@Insidexe bothKxhaHCJonMWeK ! game+we'reZpl@
TMI justxanna _UFGotta QuXerstaXR
RM~Squp~letqdown~runzrouX+desertU~Qcry~sayCodbye~_z lie+hurtU
E(Ooh)~S, neverZSM(GV
F how=feelingM
Ht's been
%(Ooh, gV
Vivequp)M
~MNeverZ
K know
@ay itM
Qmakeq
qU 
U you
PMYou
= I'm 
+zX 
ZCnna 
Sgive
_tell
C go
2 to
!the
Jing 
Xnd
z a
x w
- s
M\n`"<<_
We're no-trangers2 lovePK ! rules+so do I
A full commitment'sxhat=thinkJofPxouldn't get this fromzny o!r guyT
LAX ifqask meFDon't _ meU're2o bliX2-eeRRMM%%EELTRR

Notas:
O mecanismo de descompressão possui apenas 40 caracteres. Os outros 543 são a tabela de conversão e o texto compactado. bzip2compacta a música para 500 bytes (sem o mecanismo, é claro), então deve haver espaço para melhorias (embora eu não veja como adicionaria a codificação Huffman ou algo assim barato o suficiente).
<<Q(ou <<_) é usado para ler até um determinado caractere. Mas o final do script (ou expressão de aspas) é bom o suficiente. Isso às vezes causa um aviso.

Solução mais antiga e simples, 666 caracteres:

sed "
s/L/ MWe'veKn each other for so longMYour heart's been aching butMYou're too shy to say itMInside we bothK what's been going onMWeK the game+we'reZplay itM/;
s/T/MI just wanna tellU how I'm feelingMGotta makeU understandR/;
s/R/M ~giveU up~letU down~run around+desertU~makeU cry~say goodbye~tell a lie+hurtU/g;
s/E/(Ooh)~give, neverZgiveM(GV/g;
s/V/iveU up)M/g;
s/U/ you/g;
s/+/ and /g;
s/K/ know/g;
s/~/MNeverZ/g;
s/Z/ gonna /g;
s/M/\n/g
"<<Q
We're no strangers to love
YouK the rules+so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guyT
LAnd ifU ask me how I'm feeling
Don't tell meU're too blind to seeRRM M(Ooh, gV(Ooh, gVEEL TRR

Isso é ótimo, mas sua saída contém um caractere de espaço extra nas linhas em branco. Isso pode ser um problema com o recortar e colar da pastabin? Além disso, você deve ser capaz de salvar um byte, substituindo o \0com &.
breadbox 30/05

Este é o mais curto até agora e o meu favorito. Fiquei me perguntando quanto tempo levaria antes que alguém viesse com uma solução sed :) #
3060 Polynomial

@breadbox, Cut & paste, de fato, trouxe esse espaço. Eu removi, salvei 4 caracteres. Com o seu &faz 5.
ugoren 31/05

2
@res, adicionou uma explicação melhor.
precisa saber é o seguinte

1
Obrigado, esp pelo link "explicação mais detalhada"; o))))
res

72

Espaço em branco - 33115 caracteres

StackExchange chomped minha resposta, aqui está a fonte: https://gist.github.com/lucaspiller/2852385

Não é ótimo ... Acho que posso diminuir um pouco.

(Se você não souber o que é o espaço em branco: http://en.wikipedia.org/wiki/Whitespace_(programming_language) )


2
Eu estou supondo que você usou alguma ferramenta para compilar isso em espaço em branco?
evilcandybag

53
+1 por criar a solução mais longa que eu já vi no CodeGolf.
Polynomial

6
(+1) Eu posso reduzir isso para 27.493 bytes (ou 25.623 bytes se estiver usando um dos intérpretes WS menos rigorosos) apenas usando o processamento direto de caractere por caractere - essencialmente 1.943 instruções "push-and-output" , sem saltos, loops, sub-rotinas, sem valores de armazenamento / recuperação para reutilização - para que o comprimento ainda possa ser drasticamente reduzido.
res

39

JavaScript, 590 588 bytes

f="WeP nTstrangersZTloMX^Zhe rules[sTdTIqA fuFcommitment'sEhat I'mZhinkQofXEouldn'tJetZhis from anyRguy{Sn}AH ifCask me_Don'tZeFmexPZoTbliHZTsee~~qU,J`)U,Jzz`)S}{~~~q|g`|letCdown|run arouH[desertx|Lcry|sayJoodbye|teFa lie[hurtx} eachRfor sTlongXr hearVachQbutXPZoTshyZTsKInsideEe both^EhaVgoQonqWe^ZheJame[weP]plK|qNeMr]{qI justEannaZellx_Gotta LuHerstaH~z`)U)|giM, neMr]giMq(GCyouq\n`iMCup_ how I'm feelingq^ know]Jonna [ aH Z tXqYouVt's been Uq(OohTo SqqWe'M^R other Qing P'reMveLmakeCKay itqJ gHndFll E wCx ";for(i in g="CEFHJKLMPQRSTUVXZ[]^_`qxz{|}~")e=f.split(g[i]),f=e.join(e.pop())

Dependendo um pouco da maneira como a string é "impressa".

https://gist.github.com/2864108


1
Realmente brilhante.
Jim Blackler

O loop for in pode quebrá-lo nos consoles devido a funções como membros extras de g. Adicione if(g.indexOf(g[i])!=-1)antes e=para corrigi-lo.
Tesserex

3
Eu nem tenho a menor idéia de como isso funciona ... Podemos obter uma explicação?
Spedwards

1
usando with(f.split(g[i]))f=join(pop())no for..incircuito salva um byte
Oki

2
@Spedwards provavelmente feito com este programa de js1k js1k.com/2012-love/demo/1189
Oki

21

C # 879 816 789 caracteres

A primeira tentativa no CodeGolf definitivamente não é um vencedor, com certeza é válido, apesar de ser desagradável.

string e="N£give, n£give",f="(Give ! up)",g="(Ooh)",h=@"I just wanna tell ! how I'm feeling
Gotta make ! understand",i="(Ooh, give ! up)",j="N£",k=@"We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it",l="",a=String.Join("\n"+j,l,"give ! up","let ! down","run around and desert !","make ! cry","say goodbye","tell a lie and hurt !"),b=String.Join("\n",@"We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy",h,a,l,k,@"And if ! ask me how I'm feeling
Don't tell me !'re too blind to see",a,a,l,i,i,g,e,f,g,e,f,l,k,l,h,a,a,a).Replace("!","you").Replace("£","ever gonna ");

2
+1 "definitivamente não é um vencedor" -> só porque você usa C #, você já é um vencedor para mim. É uma ótima linguagem! :) BTW: você pode economizar alguns caracteres removendo os espaços ao redor dos sinais de igual.
Cristian Lupascu

3
Além disso: em vez de algo como var s1="a";var s2="b";tentar usar string s1="a",s2="b"; se você tiver mais de 2 declarações, é mais curto.
Cristian Lupascu

Você pode cortar muitos personagens colocando um espaço à frente !e retirando-o de qualquer outro lugar.
Stackstuck 7/03

17

Python, 597 589 bytes

Pode ser possível extrair mais alguns bytes:

d="""ellU wTay it
S otherRConna Qmake4 PveMndL aK'reJingHt's beenFo E gC
(OohB
Youz txKL q know9
N28 how I'm feelH
7iM4 up66)B)8giM, n2giM
(G5 you4
I justTannaxU47Gotta PuLerstaL03eMrQ2

We'M9n eachR for sElongzr hearFKchH butzJxoEshyxEsSInsideTe both9ThaFCoH on
We9xheCameqweJQplS1
8g68let4 down8runKrouLqdesert48Pcry8sayCoodbye8tUK lieqhurt40WeJ nEstrangersxEloMz9xhe rulesqsEdEI
A full commitment'sThat I'mxhinkH ofzTouldn'tCetxhis fromKnyRCuy31AL if4Ksk me7Don'txU me4JxoEbliLxEsee00
B,C6)B,C556)1300"""
for s in'UTSRQPMLKJHFECBzxq9876543210':a,b=d.split(s,1);d=b.replace(s,a)
print d

2
(+1) Muito bom. BTW, acho 588 bytes sem nova linha à direita.
res

17

BrainFuck - 9905

++++++++++[>+>+++>++++>+++++++>+++++++++>++++++++++>+++++++++++>++++++
+++++>++++++++++++<<<<<<<<<-]>>>>>---.>+.<<<-.>>>>>++++.<<.<<<<++.>>>>
>.+.<<<<<.>>>>>>+.+.--.<<----.>-.<++++++.--.>>.+.<<<<<<.>>>>>>+.<+.<<<
<<.>>>>>---.+++.>++.<<.<<<<<.>>>>++.>>.>-.<<<<<<.>>>>>----.+++.+.>>-.<
<<<<<<.>>>>>>-.<<+++.---.<<<<.>>>>>>--.+++.<---.<.>>--.<<<<<<.>>>>----
.>++.<+++.<<<<.>>>>>>.<+.<<<<<.>>>>.>.<<<<<.>>+++.<<<.>>>--------.<<.>
>>>++.>>++.<---..<<<<<.>>>>---.>+++.--..<++++++.>>-.<.<----.>+.>.<<<<<
.>>>>>-.<<<<<<.>>>>>>>.<<<+++.-------.>>+.<<<<<<.>>++++++++.<.>>>>-.<<
<<<.>>>>>>.<<+++++++.+.>+.---.<.>+++.<--.<<<<.>>>>>+.<-.<<<<<.>>>>.>>.
>+.<<<<<<.>>>>>>>.<<.>.<---.<--.>++.<<<<.>>>>>-.<<<<<<.>>>>+++.--.>>.<
<<<<<.>>>>>>.<<+++.+.>>-.<<<<<<.>>>>---.>>-.<+.--.<<<<<.>>>>-----.>+.>
>++.<<<<<<<.>>>>>+.>++.<<+++++++.---.>>--.<<<<<<.>>>>++.>>+++.>.<<<<<<
<<.>>>.<<.>>>>>-----.>.--.+.<<<<<<.>>>>>>>--.<<<------.>++++..<.<<<<.>
>>>>>.<<++++.>--..<<<<<.>>>>>>>++.<<+++.>+.<<<<<<.>>>>+++.>.>>--.<<<<<
<<.>>.<.>>>>--.<<<<<.>>>>--.-..>-.<++++.>++.<--.<<<<<.>>>--.>>>+.>-..<
<------.<<<<.>>>>>--.<.>--.<++++.<<<<.>>>>>>>++.<<++++.>+.<<<<<<.>>>>>
>.<-.<-.+.>>---.+.+.<<----.>.<+++.<<<<<..>>>+++++++.>>+.>>++.<<.>>----
.<<<<<<.>>>>++.>+.-..<------.<<<<.>>>>++++++.++.>>++++.<<----.<<<<.>>>
>>>>.<<+.>-.<<<<<<.>>>>>>.<+.<<<<<<.>>>.>>.>>+.<<.>>----.<<<<<<.>>>>++
.>-.-..<------.<<<<.>>>>>--.<++++.>>++.<<<<<<.>>>>>>>.<<+++.>+.<<<<<<.
>>>>-.>.>>--.<<-.<<<<<<.>>>.>>+.>>+.<<.>>----.<<<<<<.>>>>++.>+.-..<---
---.<<<<.>>>>>>.+++.<.<<<<<.>>>>.>>---.<+.>+++.<-.<+++.<<<<.>>>>---.>.
<+++.<<<<.>>>>.+.>>--.<<.>>-.++.<<<<<<.>>>>>>>++.<<+.>+.<<<<<<<.>>>.>>
.>>+.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>-.<.>--.<++++.<<<<
.>>>>>>>.<<++++.>+++.<<<<<<.>>>>--.>>---.>.<<<<<<<<.>>>.>>++.>>++++.<<
.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>>+.<<.>>>.<<<<<<<.>>>>+++
+++.>+..<---.--.>>>.<<<+++.<<<<<.>>>.>>.>>+++.<<.>>----.<<<<<<.>>>>++.
>.-..<------.<<<<.>>>>>>++.<<++++.>--..<<<<<.>>>>----.<<<<.>>>>>.<++++
++++.----.<<<<.>>>>----.>++.<+++.<<<<.>>>>++++.>>+.---.++.<<<<<<.>>>>>
>>.<<+.>+.<<<<<<<..>>>>--.>---.<<<.>>>>>+.<<.<<<<.>>>>>----.+++.+.>>--
.<<-.<<<<<.>>>>.----.++.+++++.<<<<.>>>>>+.>--.<<.---.>>--.<<<<<<.>>>>+
.>.>.<<<<<<.>>>>>>+.<.<<<<<.>>>>>---.+++.-.<+.<<<<<.>>>>++.>>+.>++.---
.<<<<<<.>>>>+.---.----.>>.++.<<<<<.>>>>>-.<<<<<<.>>>>+.+++..>-.<<<<<.>
>>>----.++.+++++.+.>.<--.<<<<.>>>>-----.>>++.-.<<<<<<<.>>>>.>>+.>+.<<<
<<.>>>>>---.<<+++.<<<<.>>>>>>++.<..<<<<<.>>>>>>-.<<+++.>>>++.<<<<<<<.>
>>>>>+.<.<<<<<.>>>>>>-.<<-------.>>>.<<<<<<<.>>>>++++++++.>>+.<<<<<<<.
>>>-----.>>>-.>-.<<.-----.+.<<<<.>>>>>>>--.<<<.<<<<.>>>>---.>+.>+.<<++
++++.<<<<.>>>>>----.+++.+.>>.<<<<<<<.>>>>>>>.<<<.-------.>>.<<<<<.>>>>
>-.<<<<<<.>>>>+.+++..>-.<<<<<.>>>>++.>+.<++.>-.<--.<<<<.>>>>>+.-.<<<<<
<.>>>>--.>--.<<<<.>>>>>---.+++.+.>>.<<<<<<<.>>>>>>+.<<+++.---.<<<<.>>>
>++.------.>--.<++++.<<<<.>>>>----.>+.<+++.<<<<.>>>>>>>.<<<+.<<<.>>>>>
--.<<.<<<<.>>>>++.>+.-..<------.<<<<.>>>>>++.----.<.>>>++.<<<<<<<.>>>>
++++++++.>>++.<<<<<<<.>>>--------.>>>++.<-----.<<<<.>>>>+++++.---.<<<<
.>>>>>>>.<<+.>+.<<<<<<.>>>>-----.>>--.<----.<<<<<.>>>>>++.<++++.<<<<.>
>>>+++.>++.>>--.<<<<<<<.>>++++++++.<.>>>>--.<<<<<.>>>>--.-..>-.<++++.>
++.<--.<<<<<.>>>-----.>>>+.-.<<<<.>>>>>+.<<<<<<.>>>>>>.<<--.>--..<<<<<
.>>>>>+.<.<<<<.>>>>>>>++.<<++.>+.<<<<<.>>>>>---.<<.<<<<.>>>>>>++.<..<<
<<<.>>>>---.>---.<+++++++.>++.<-----.<<<<.>>>>>>.<+.<<<<<.>>>>>>-.<<+.
.<<<<<..>>>++++++++++.>>.>>+++.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<
<<.>>>>++++++.++.>>++++.<<----.<<<<.>>>>>>>.<<+.>-.<<<<<<.>>>>>>.<+.<<
<<<<.>>>.>>.>>+.<<.>>----.<<<<<<.>>>>++.>-.-..<------.<<<<.>>>>>--.<++
++.>>++.<<<<<<.>>>>>>>.<<+++.>+.<<<<<<.>>>>-.>.>>--.<<-.<<<<<<.>>>.>>+
.>>+.<<.>>----.<<<<<<.>>>>++.>+.-..<------.<<<<.>>>>>>.+++.<.<<<<<.>>>
>.>>---.<+.>+++.<-.<+++.<<<<.>>>>---.>.<+++.<<<<.>>>>.+.>>--.<<.>>-.++
.<<<<<<.>>>>>>>++.<<+.>+.<<<<<<<.>>>.>>.>>+.<<.>>----.<<<<<<.>>>>++.>.
-..<------.<<<<.>>>>>-.<.>--.<++++.<<<<.>>>>>>>.<<++++.>+++.<<<<<<.>>>
>--.>>---.>.<<<<<<<<.>>>.>>++.>>++++.<<.>>----.<<<<<<.>>>>++.>.-..<---
---.<<<<.>>>>>>+.<<.>>>.<<<<<<<.>>>>++++++.>+..<---.--.>>>.<<<+++.<<<<
<.>>>.>>.>>+++.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>>++.<<++
++.>--..<<<<<.>>>>----.<<<<.>>>>>.<++++++++.----.<<<<.>>>>----.>++.<++
+.<<<<.>>>>++++.>>+.---.++.<<<<<<.>>>>>>>.<<+.>+.<<<<<<<..>>>.>>---.>>
+.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>++++++.++.>>++++.<<---
-.<<<<.>>>>>>>.<<+.>-.<<<<<<.>>>>>>.<+.<<<<<<.>>>.>>.>>+.<<.>>----.<<<
<<<.>>>>++.>-.-..<------.<<<<.>>>>>--.<++++.>>++.<<<<<<.>>>>>>>.<<+++.
>+.<<<<<<.>>>>-.>.>>--.<<-.<<<<<<.>>>.>>+.>>+.<<.>>----.<<<<<<.>>>>++.
>+.-..<------.<<<<.>>>>>>.+++.<.<<<<<.>>>>.>>---.<+.>+++.<-.<+++.<<<<.
>>>>---.>.<+++.<<<<.>>>>.+.>>--.<<.>>-.++.<<<<<<.>>>>>>>++.<<+.>+.<<<<
<<<.>>>.>>.>>+.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>-.<.>--.
<++++.<<<<.>>>>>>>.<<++++.>+++.<<<<<<.>>>>--.>>---.>.<<<<<<<<.>>>.>>++
.>>++++.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>>+.<<.>>>.<<<<<
<<.>>>>++++++.>+..<---.--.>>>.<<<+++.<<<<<.>>>.>>.>>+++.<<.>>----.<<<<
<<.>>>>++.>.-..<------.<<<<.>>>>>>++.<<++++.>--..<<<<<.>>>>----.<<<<.>
>>>>.<++++++++.----.<<<<.>>>>----.>++.<+++.<<<<.>>>>++++.>>+.---.++.<<
<<<<.>>>>>>>.<<+.>+.<<<<<<<..>>+.>+.>>>.<.<<<++++.<.>>>>-.++.>>+.<<---
-.<<<<.>>>>>>>.<<.>-.<<<<<<.>>>>>>.<+.<<<<---.<<.>>-.>.>>>-.<+++.<<<++
++.<.>>>>-.++.>>+.<<----.<<<<.>>>>>>>.<<.>-.<<<<<<.>>>>>>.<+.<<<<---.<
<.>>-.>.>>>-.<+++.<<<+.<<.>>>-.>>---.>>+.<<.>>----.<<<<<<.>>>>++.>.-..
<------.<<<<.>>>>++++++.++.>>++++.<<----.<<<+++.<.>>>>>.<.>>.<<.>>----
.<<<<<<.>>>>++.>+.-..<------.<<<<.>>>>++++++.++.>>++++.<<----.<<<<<.>>
----.>-------.>>++++.>>.<<----.<<<<.>>>>>>>.<<+.>-.<<<<<<.>>>>>>.<+.<<
<<+.<<.>>-.>++++++++.>>>-.<+++.<<<+.<<.>>>-.>>---.>>+.<<.>>----.<<<<<<
.>>>>++.>.-..<------.<<<<.>>>>++++++.++.>>++++.<<----.<<<+++.<.>>>>>.<
.>>.<<.>>----.<<<<<<.>>>>++.>+.-..<------.<<<<.>>>>++++++.++.>>++++.<<
----.<<<<<.>>----.>-------.>>++++.>>.<<----.<<<<.>>>>>>>.<<+.>-.<<<<<<
.>>>>>>.<+.<<<<+.<<..>>>>.>.<<<--.>>>>>+.<<.<<<<.>>>>>-----.+++.+.>>--
.<<<<<<<.>>>>.----.++.+++++.<<<<.>>>>>.>--.<<.---.>>--.<<<<<<.>>>>+.>.
>.<<<<<<.>>>>>>+.<.<<<<<.>>>>>---.+++.-.<+.<<<<<.>>>>++.>>+.>++.---.<<
<<<<.>>>>+.---.----.>>.++.<<<<<.>>>>>-.<<<<<<.>>>>+.+++..>-.<<<<<.>>>>
----.++.+++++.+.>.<--.<<<<.>>>>-----.>>++.-.<<<<<<<.>>>>.>>+.>+.<<<<<.
>>>>>---.<<+++.<<<<.>>>>>>++.<..<<<<<.>>>>>>-.<<+++.>>>++.<<<<<<<.>>>>
>>+.<.<<<<<.>>>>>>-.<<-------.>>>.<<<<<<<.>>>>++++++++.>>+.<<<<<<<.>>>
++.>>>-.>-.<<.-----.+.<<<<.>>>>>>>--.<<<.<<<<.>>>>---.>+.>+.<<++++++.<
<<<.>>>>>----.+++.+.>>.<<<<<<<.>>>>>>>.<<<.-------.>>.<<<<<.>>>>>-.<<<
<<<.>>>>+.+++..>-.<<<<<.>>>>++.>+.<++.>-.<--.<<<<.>>>>>+.-.<<<<<<.>>>>
--.>--.<<<<.>>>>>---.+++.+.>>.<<<<<<<.>>>>>>+.<<+++.---.<<<<.>>>>++.--
----.>--.<++++.<<<<.>>>>----.>+.<+++.<<<<.>>>>>>>.<<<+.<<<.>>>>>--.<<.
<<<<.>>>>++.>+.-..<------.<<<<.>>>>>++.----.<.>>>++.<<<<<<<.>>>>++++++
++.>>++.<<<<<<<..>>>.<<.>>>>>--.>+.--.+.<<<<<<.>>>>>>>--.<<<--------.>
++++..<.<<<<.>>>>>>.<<++++.>--..<<<<<.>>>>>>>++.<<+++.>+.<<<<<<.>>>>++
+.>.>>--.<<<<<<<.>>.<.>>>>--.<<<<<.>>>>--.-..>-.<++++.>++.<--.<<<<<.>>
>--.>>>+.>-..<<------.<<<<.>>>>>--.<.>--.<++++.<<<<.>>>>>>>++.<<++++.>
+.<<<<<<.>>>>>>.<-.<-.+.>>---.+.+.<<----.>.<+++.<<<<<..>>>+++++++.>>+.
>>++.<<.>>----.<<<<<<.>>>>++.>+.-..<------.<<<<.>>>>++++++.++.>>++++.<
<----.<<<<.>>>>>>>.<<+.>-.<<<<<<.>>>>>>.<+.<<<<<<.>>>.>>.>>+.<<.>>----
.<<<<<<.>>>>++.>-.-..<------.<<<<.>>>>>--.<++++.>>++.<<<<<<.>>>>>>>.<<
+++.>+.<<<<<<.>>>>-.>.>>--.<<-.<<<<<<.>>>.>>+.>>+.<<.>>----.<<<<<<.>>>
>++.>+.-..<------.<<<<.>>>>>>.+++.<.<<<<<.>>>>.>>---.<+.>+++.<-.<+++.<
<<<.>>>>---.>.<+++.<<<<.>>>>.+.>>--.<<.>>-.++.<<<<<<.>>>>>>>++.<<+.>+.
<<<<<<<.>>>.>>.>>+.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>-.<.
>--.<++++.<<<<.>>>>>>>.<<++++.>+++.<<<<<<.>>>>--.>>---.>.<<<<<<<<.>>>.
>>++.>>++++.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>>+.<<.>>>.<
<<<<<<.>>>>++++++.>+..<---.--.>>>.<<<+++.<<<<<.>>>.>>.>>+++.<<.>>----.
<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>>++.<<++++.>--..<<<<<.>>>>----.<<
<<.>>>>>.<++++++++.----.<<<<.>>>>----.>++.<+++.<<<<.>>>>++++.>>+.---.+
+.<<<<<<.>>>>>>>.<<+.>+.<<<<<<<..>>>.>>---.>>+.<<.>>----.<<<<<<.>>>>++
.>.-..<------.<<<<.>>>>++++++.++.>>++++.<<----.<<<<.>>>>>>>.<<+.>-.<<<
<<<.>>>>>>.<+.<<<<<<.>>>.>>.>>+.<<.>>----.<<<<<<.>>>>++.>-.-..<------.
<<<<.>>>>>--.<++++.>>++.<<<<<<.>>>>>>>.<<+++.>+.<<<<<<.>>>>-.>.>>--.<<
-.<<<<<<.>>>.>>+.>>+.<<.>>----.<<<<<<.>>>>++.>+.-..<------.<<<<.>>>>>>
.+++.<.<<<<<.>>>>.>>---.<+.>+++.<-.<+++.<<<<.>>>>---.>.<+++.<<<<.>>>>.
+.>>--.<<.>>-.++.<<<<<<.>>>>>>>++.<<+.>+.<<<<<<<.>>>.>>.>>+.<<.>>----.
<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>-.<.>--.<++++.<<<<.>>>>>>>.<<++++
.>+++.<<<<<<.>>>>--.>>---.>.<<<<<<<<.>>>.>>++.>>++++.<<.>>----.<<<<<<.
>>>>++.>.-..<------.<<<<.>>>>>>+.<<.>>>.<<<<<<<.>>>>++++++.>+..<---.--
.>>>.<<<+++.<<<<<.>>>.>>.>>+++.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<
<<.>>>>>>++.<<++++.>--..<<<<<.>>>>----.<<<<.>>>>>.<++++++++.----.<<<<.
>>>>----.>++.<+++.<<<<.>>>>++++.>>+.---.++.<<<<<<.>>>>>>>.<<+.>+.<<<<<
<<..>>>.>>---.>>+.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>++++++
.++.>>++++.<<----.<<<<.>>>>>>>.<<+.>-.<<<<<<.>>>>>>.<+.<<<<<<.>>>.>>.>
>+.<<.>>----.<<<<<<.>>>>++.>-.-..<------.<<<<.>>>>>--.<++++.>>++.<<<<<
<.>>>>>>>.<<+++.>+.<<<<<<.>>>>-.>.>>--.<<-.<<<<<<.>>>.>>+.>>+.<<.>>---
-.<<<<<<.>>>>++.>+.-..<------.<<<<.>>>>>>.+++.<.<<<<<.>>>>.>>---.<+.>+
++.<-.<+++.<<<<.>>>>---.>.<+++.<<<<.>>>>.+.>>--.<<.>>-.++.<<<<<<.>>>>>
>>++.<<+.>+.<<<<<<<.>>>.>>.>>+.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<
<<.>>>>>-.<.>--.<++++.<<<<.>>>>>>>.<<++++.>+++.<<<<<<.>>>>--.>>---.>.<
<<<<<<<.>>>.>>++.>>++++.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>
>>+.<<.>>>.<<<<<<<.>>>>++++++.>+..<---.--.>>>.<<<+++.<<<<<.>>>.>>.>>++
+.<<.>>----.<<<<<<.>>>>++.>.-..<------.<<<<.>>>>>>++.<<++++.>--..<<<<<
.>>>>----.<<<<.>>>>>.<++++++++.----.<<<<.>>>>----.>++.<+++.<<<<.>>>>++
++.>>+.---.++.<<<<<<.>>>>>>>.<<+.>+.

Tenho certeza de que posso melhorar um pouco ajustando-o, mas isso é muito bom por enquanto. Supondo que você não tenha nenhum problema com isso ser muito maior que o texto original.


Eu acho que você pode jogar um pouco de golfe usando o Unary.
Roman Gräf

Isso parece ...
MilkyWay90

16

Scala, 613 bytes

print(("""We'r%e %n&o &strangers9 t&9lo#ve#4
You47 know7 [th[%rules0 aZndZ 0s&d&I
A full commitment's what1 I'm 1[ink=ing= of4 wouldn't get [is from any! o[er !guy>
I just wanna <tell<]- ]you-3 how1feel=
3Gotta _make]_uZerstaZ@>
.
Ne#r$./$ gonna /g2i#]up2$let]down$run arouZ0desert-$_cry$say goodbye$< a lie0hurt-@?

We'#7n each!for s&long4r hear;t's been ;ach= but4:'r%to&:shy9say8 it
8Insid%w%bo[7 wha;going on
We7 [%game0we're/play8?AZ if]ask me3Don't < me-:bliZ9see@@

5(Ooh, g2)
556(Ooh)$gi#, ne#r/gi#^
6(G2)^^?>@@
"""/:("!#$%&Z[]^_"++('-'to'@'))){(x,c)=>val y=x.split(c);y(0)+y(1)+y.drop(2).mkString(y(1))}

Este é um algoritmo de descompressão de texto, aplicando recursivamente a regra que ~stuff~ blah ~ ~deve ser convertida stuff blah stuff stuff(ou seja, na primeira vez em que você vê um par de símbolos desconhecido, ele delimita o que copiar; depois, você preenche o valor quando o vê).

Nota: pode haver um retorno de carro extra no final, dependendo de como você conta. Se isso não for permitido, você pode soltar o último na cotação (salvando um caractere) e alterar a divisão para split(" ",-1)(gastando 3 caracteres), para 615 bytes.


Muito agradável. A compactação é um pouco melhor que a minha solução - para Nrepetições de comprimento L, você usa L+N+1caracteres, enquanto eu uso L+N+2. Mas o seu código de descompressão é de 102 caracteres, enquanto o meu é de 40.
ugoren 31/05

@ugoren - De fato; Scala é muito detalhado a esse respeito, e não há mais de 62 substituições produtivas a serem feitas. Ainda assim, achei que essa era uma abordagem interessante (como a sua).
Rex Kerr #

Interessante, mas não funciona para mim no REPL. A necessidade de fechar outra rodada termina no final; mas então funciona.
usuário desconhecido

14

589, C (apenas a função de biblioteca é putchar)

c,k;main(n){char*s="&-P;nDstrKgQsLlove>@rules<sDdD-i7Rfull commitUnMVtASTkEof> wWldNget Sis from Ky?guy10-XifYask U6doNF U5OblTdLseeG//G442201//&383letYdown3run arWnd<desQt53Bcry3sZ[odbye3F Rlie<hurt5G&7P've:n each?for sDlong>r hear=achEbut>OshyLsH7Tside P boS: V=[Eon7P@gaU<P;CplHG&7i just wKnRF56[ttRBundQstKdG/&J)3I, 9IG(-8)G&79&J, 8)G& yW& howAfeelTg7&G-&IYup&nevQ C& know&'re & X&Mbeen &7yW& oSQ &: Se & -i'm &makeY&[nnR&o &Tg &tell&\n&Zit&give&(-ooh&an& tD&t's &n't &;toD&we&er&a &th&in&me&wha&ou&Kd &5 &ay &go";for(k|=32*!n;c=*s++;c-38?n?0:c-45>48U?k=!putchar(c-k):main(c-45):n--);}
  • Tabela de regras de substituição em que caracteres no intervalo -.._ (45..90) especificam qual regra aplicar; assim, 48 regras (45, c-45> U48 no código), outros caracteres devem ser impressos

  • as regras são delimitadas pelo caractere '&' (38 no código, n é decrementado até o zero e, portanto, s aponta para a regra correta)

  • regra 0 indica que o próximo caractere deve ser maiúsculo (definindo k = 32 no código), isso libera mais espaço para adicionar um intervalo contínuo maior de caracteres para regras

  • main (..) é chamado com 1 (conforme a convenção do programa com argumento zero C) e, portanto, a regra 1 é a regra raiz

Evolução do código

  • raspou mais 9 bytes graças à sugestão de ugoren

  • eliminou outros 36 bytes, criando a tabela algoritmicamente, e não manualmente, e através da dica "'"

  • eliminou outros 15 bytes alterando a tabela de um caractere * [] para uma única sequência em que '&' delimita partes

  • raspou mais 19 bytes graças a mais dicas da ugoren

  • raspou 31 bytes adicionando mais regras, criou regras especiais para capitalizar, permitindo assim mais espaço para índices de regras.

  • eliminou 10 bytes graças a mais dicas da urgoren e aprimora ligeiramente as regras


1
*p>>4^3?putchar(*p):e(r[*p-48])
precisa saber é o seguinte

ah! obrigado, agora incluído no código.
baby-coelho

Além disso, a "\'"tradução não é necessária. "We're"é uma sequência válida. ingé um candidato melhor.
Ugoren

Boa mudança. Vários truques de golfe padrão podem ser aplicados: d(int n)-> d(n). Mude *s=='~'para *s-'~' and reverse the ?: , also saving parenthesis around ! N? ..: 0 . Using 126 instead of '~' 'é inútil, mas por quê ~?
ugoren

Além disso, você não precisa de duas funções - faça mainrecursivas. A chamada inicial é main(1), em vez de d(0), mas pode ser tratada (talvez um líder ~em s). Além disso, a melhor alternativa ~é uma guia (ascii 9 - dígito único).
ugoren

14

Perl, 724 714 883 bytes

Portanto, a mudança nas regras que penalizam o uso do tipo Latin-1 acabou com minha solução. É uma abordagem diferente o suficiente que eu odeio excluí-la, então aqui está uma versão restrita que usa apenas ASCII de 7 bits, de acordo com as novas regras, com um grande aumento de tamanho.

sub d{($d=$d{$_})?d(@$d):print for@_}sub r{%d=map{chr,($d=pop)&&[$d,pop]}0..96,113..127;&d}r"We^P nEstraKersPElo~^_-SP< 5lesMsEdEI
A3ull commitment's#hat I'mPhink9 of^_#}ldn't^?/Phis3romVny %<r^?uy
I just#azP6UhS I'm3eH9
G%ta +JTerstaT^HX5^D    1^@^U^F^CXt^E^Y^X

We'~-; each %<r3or sEloK^_r <aL's=ee8ch9=ut^_^PPoEshyPE& it
Insi.#e=%h-S#hat's=een|9 on
We-SP<^?am7we^Px pl? it
ARif]Vsk me hS I'm3eH9
Don'tP6 me]^PPoEb*RtE1e^HX5^D   1^@^U^F^CXt^E^Y^X^HX5^D 1^@^U^F^CXt^E^Y^X

(Ooh,FB)
(Ooh,FB)
(Ooh)4, n^F
(GQB)
(Ooh)4, n^F
(GQB)

We'~-; each %<r3or sEloK^_r <aL's=ee8ch9=ut^_^PPoEshyPE& it
Insi.#e=%h-S#hat's=een|9 on
We-SP<^?am7we^Px pl? it

I just#azP6UhS I'm3eH9
G%ta +JTerstaT^HX5^D    1^@^U^F^CXt^E^Y^X^HX5^D 1^@^U^F^CXt^E^Y^X^HX5^D 1^@^U^F^CXt^E^Y^X
g evuoo^?nna{0z|000000xry q~_e}`0^N[
0 Z0a  ]dnwo T~it 00RVtrgnuU0le0Q^? o0]LpJ00yaamb ehnSekKiVnMelHurFZf k es0teedn20:>il000?sto0w 0}Y0!
+XXy}rB4Cu7*^ZhdUr'|&bdMT^[
U^^e^V^QC^W/X^R;^N^Ll0.^S^K^MV6^To ^G^\8ey^]r^Bc^A^O"=~/./gs

É claro que os caracteres de controle ainda estão mutilados aqui, então você ainda desejará usar a codificação base64:

c3ViIGR7KCRkPSRkeyRffSk/ZChAJGQpOnByaW50IGZvckBffXN1YiByeyVkPW1hcHtjaHIsKCRk
PXBvcCkmJlskZCxwb3BdfTAuLjk2LDExMy4uMTI3OyZkfXIiV2UQIG5Fc3RyYUtlcnNQRWxvfh8t
U1A8IDVsZXNNc0VkRUkKQTN1bGwgY29tbWl0bWVudCdzI2hhdCBJJ21QaGluazkgb2YfI31sZG4n
dH8vUGhpczNyb21WbnkgJTxyf3V5CkkganVzdCNhelA2VWhTIEknbTNlSDkKRyV0YSArSlRlcnN0
YVQIWDUECTEAFQYDWHQFGRgKCldlJ34tOyBlYWNoICU8cjNvciBzRWxvSx9yIDxhTCdzPWVlOGNo
OT11dB8QUG9Fc2h5UEUmIGl0Ckluc2kuI2U9JWgtUyNoYXQncz1lZW58OSBvbgpXZS1TUDx/YW03
d2UQeCBwbD8gaXQKQVJpZl1Wc2sgbWUgaFMgSSdtM2VIOQpEb24ndFA2IG1lXRBQb0ViKlJ0RTFl
CFg1BAkxABUGA1h0BRkYCFg1BAkxABUGA1h0BRkYCgooT29oLEZCKQooT29oLEZCKQooT29oKTQs
IG5eRgooR1FCKQooT29oKTQsIG5eRgooR1FCKQoKV2Unfi07IGVhY2ggJTxyM29yIHNFbG9LH3Ig
PGFMJ3M9ZWU4Y2g5PXV0HxBQb0VzaHlQRSYgaXQKSW5zaS4jZT0laC1TI2hhdCdzPWVlbnw5IG9u
CldlLVNQPH9hbTd3ZRB4IHBsPyBpdAoKSSBqdXN0I2F6UDZVaFMgSSdtM2VIOQpHJXRhICtKVGVy
c3RhVAhYNQQJMQAVBgNYdAUZGAhYNQQJMQAVBgNYdAUZGAhYNQQJMQAVBgNYdAUZGApnIGV2dW9v
f25uYXswenwwMDAwMDB4cnkgcX5fZX1gMF5OWwowIFowYSAgXWRud28gVH5pdCAwMFJWdHJnbnVV
MGxlMFF/IG8wXUxwSjAweWFhbWIgZWhuU2VrS2lWbk1lbEh1ckZaZiBrIGVzMHRlZWRuMjA6Pmls
MDAwP3N0bzB3IDB9WTAhCitYWHl9ckI0Q3U3KhpoZFVyJ3wmYmRNVBsKVR5lFhFDFy9YEjsODGww
LhMLDVY2FG8gBxw4ZXkdcgJjAQ8iPX4vLi9ncw==

Como eu acho que ainda deve estar visível, apesar de ter uma DQ, eis a solução original:

sub d{($d=$d{$_})?d(@$d):print for@_}sub r{%d=map{chr,[pop,pop]}45..63,122..255;&d}r" ¯:ç5raâ08/þ; Ölesì|dçI
AÌull comm°6ntŒ3èhink1fÍýldn'tÿÙèhisÌromðny4ÿuy ju5Íaú=î9GÐ Ëäï0ï
'þœn ea}4Ìo|/â-aêÔ}ÜÚut.shy8ÎnsiÞÍeÚÐhœ3nü1n;ÿamÓwe¯ù plá
Aíifôðsk 6 9Don't= 6ô.bÕítçÏe
,ã2,ã2)Û,:õã¶Gé2)Û,:õã¶Gé
'þœ ea}4Ìo|/â-aêÔ}ÜÚut.shy8ÎnsiÞÍeÚÐhœ3nü1n;ÿamÓwe¯ù plá
 ju5Íaú=î9GÐ Ëäï0ï
g evuooÿnnaûúürþýyøeùö÷ N
õó òa dn ô ïíðwotrþit  oleôêuîéÿgnyalæpäedkaâiãòb teënØkurilðnìeeheÝtoesásw f ÑmÖñY
r'bdhÓÏÞÕ tñìïñåîÙëdÎñ× s'oüyrÁÅeyÄð(

åÞŸºrÔlñtieÈàŽý²Æ·Â­¬®Ë¹À±šßÊnuª¥Çcîµ€£©eW³¡«»¢ýÉŠ¿§ÛoOI
° I )ßee¶ rhm'Úat 
oèÜæçŒrÒÐtaÒèëo hcçseÌ
hz{àèreœn >?çèhÍemts 7~Üs<ol¯Ò"=~/./gs

A codificação base64 do script:

c3ViIGR7KCRkPSRkeyRffSk/ZChAJGQpOnByaW50IGZvckBffXN1YiByeyVkPW1hcHtjaHIsW3Bv
cCxwb3BdfTQ1Li42MywxMjIuLjI1NTsmZH1yIqCvOuc1cmHiMDgv/ps7INZsZXPsfGTnSQpBzHVs
bCBjb21tsDZudLwzjOhoaW5rMWabzf1sZG4ndP/Z6Ghpc8xyb23wbnk0/3V5lSBqdTXNYfo97jlH
0Iogy+TvMIrvCpeJJ/69biBlYX00zG+PfC/imy1h6oXUfdzadXSbLnNoeTjOlJVuc2nezWXa0Gi9
M4Vu/DFuiTv/YW3Td2Wv+SBwbOGUCkHtaWb08HNrIDYgOURvbid0PSA29C5i1e10589lCn+OLOMy
LOMyKdssOvXjtkfpMinbLDr147ZH6ZIKiSf+vSBlYX00zG+PfC/imy1h6oXUfdzadXSbLnNoeTjO
lJVuc2nezWXa0Gi9M4Vu/DFuiTv/YW3Td2Wv+SBwbOGUCpUganU1zWH6Pe45R9CKIMvk7zCK7wp/
l2cgZXZ1b2//bm5h+/r8cv79efhl+fb3IE4K9fMg8mEgZG4g9CDv7fB3b3Ry/ml0ICBvbGX06nXu
6f9nbnlhbOZw5GVka2HiaePyYiB0Zetu2Gt1cmls8G7sZWVoZd10b2Vz4XN3IGYg0W3W8VkKcidi
ZGjTz97VIHTx7O/x5e7Z62TO8dcgcydv/HlywcVlecTwKAoK5cO4vrpy1GzxdGllyOC0/bLGt8Kt
rK7LucCxqN/KbnWqpcdj7rWko6llV7Ohn6u7nqKd/cmmv5yap9uZmG9PSQqwIEkgKd9lZZa2IHJo
kG0njZOR2mF0oApv6Nzm54iLvHLShNB0YdLojOuXl28gaGPnc2XMCoeAaHp74OhyZYG9biA+P+fo
aM1lbXRzgyCCN46SftxzPG9shq/SjyI9fi8uL2dz

1
@ w0lf São 724 bytes, que se traduz em 644 caracteres UTF-8. Não tenho certeza qual deles conta, realmente.
Polynomial

1
@ Polinomial Também não sei, mas espero que alguém nos conheça e nos ilumine.
Cristian Lupascu

5
Nesse caso, acho que devem ser bytes, pois é disso que a string consiste. (É mera coincidência se o bytestream é composto inteiramente por seqüências de UTF-8 válidos.)
breadbox

11
Parece mais legível que o script Perl comum!
Agos

2
(Você sabe, eu não iria reclamar se APL foi prejudicado por ter que contar bytes em vez de caracteres ....)
breadbox

11

Python 781 731 605 579 Chars

Há muito mais e melhores respostas desde quando vi isso pela primeira vez, mas perdi muito tempo no meu script python, então vou publicá-lo de qualquer maneira, seria incrível ver sugestões para encurtá-lo ainda mais,

Edit: graças às sugestões de Ed H 2 caracteres picados, para ir mais longe, talvez eu precise reestruturar muita coisa aqui que vai levar algum tempo

s="e |nd|-We| a|-(Ooh|N| what|ive| go|ay it-|I|er|G|o |make5 |D| th| othH |A| tF|ing |nna |tell|'s been|'rS|-You|-N4| know|L5 up|PR | you|evHK>| how I'm feeling-|O, g7)|O)9gL, n4gL-(G7)|-I just wa>=53Gotta EuRHstaR-.|Q've8n eachBfor sFlong:r heart<Pch?but:;toFshy@sJInsidSwSboth8M<K?onQ8CSgame6we;go>plJ|9g79let5 down9runProuR6desHt59Ecry9sayKodbye9=P lie6hurt5-|\n|Q;nFstrangHs@love:8CSrules6sFdFI-A full commitment'sM I'mCink?of: wouldn't getCis fromPnyBguy0/AR if5Psk me3Don't = me5;toFbliR@see-..2211-/0..";i=83
exec"x,s=s.split('|',1);s=s.replace(chr(i),x);i-=1"*39
print s

Após a primeira vez que produzi manualmente a string (muito entediante), escrevi uma função para encontrar recursivamente a substituição do padrão que era mais lucrativa (nessa etapa), o que me deu uma solução, mas acabou aumentando o tamanho em 10 caracteres.

Portanto, tornei meu algoritmo um pouco menos ganancioso, em vez de fazer a classificação final apenas em 'caracteres reduzidos', classificando em uma função de 'caracteres reduzidos', 'comprimento do padrão' e 'contagens do padrão'

comprimento padrão = contagem de comprimento = contagem

rank = [(length-1)*count - length - 2] + lengthWeight * length + countWeight * count

Então eu perguntei a minha pobre laptop para executar infinitamente, atribuindo valores aleatórios para lengthWeighte countWeighte obter diferentes tamanhos de compressão final, e armazenar os dados para tamanhos mínimos de compressão em um arquivo

Em meia hora, surgiu a string acima (tentei mexer ainda mais para ver se era possível encurtar o código), e não diminuirá mais, acho que estou perdendo alguma coisa aqui.

aqui está o meu código para ele, também max_patterné muito lento (Nota: o código cospe uma string semelhante ao formulário na minha versão anterior da solução, eu trabalhei manualmente para obter o formulário atual, quer dizer manualmente, manualmente no shell python)

import itertools

global pretty
global split
split = False
pretty = False

# try to keep as much visibility as possible
def prefrange():
    return range(32,127) +  ([] if pretty else ([10, 9, 13] + [x for x in range(32) if x not in (10, 9, 13)] + [127]))

def asciichr():
    return [chr(x) for x in prefrange()]

def max_pattern(s, o, lenw, numw):
    l = len(s)
    patts = []
    for c in range(l/2+1,1,-1):
        allsub = [s[i:i+c] for i in range(0, l, c)]
        subcounts = [[a, s.count(a)] for a in allsub if len(a) == c]
        repeats = [(x, y, ((c-o)*y - o*2 - c)) for x, y in subcounts if y > 1]
        ranks = [(x, y, (z + lenw*c + numw*y)) for x,y,z in repeats if z > 0]
        patts = patts + ranks
    try:
        return sorted(patts, key=lambda k: -k[2])[0]
    except:
        return None

def sep():
    return '~~' if pretty else chr(127) + chr(127)

def newcharacter(s):
    doable = [x for x in asciichr() if x not in s]
    if len(doable) == 0:
        doable = list(set(x+y for x in asciichr() for y in asciichr() if x+y not in s and x+y != sep()))
        if len(doable) == 0:
            return None
    return doable[0]

def joined(s, l):
    one = [x for x in l if len(x)==1]
    two = [x for x in l if len(x)==2]
    return ''.join(reversed(two)) + sep() + ''.join(reversed(one)) + sep() + s

def compress(s, l=[], lenw=0, numw=0):
    newchr = newcharacter(s)
    if newchr == None:
        if not l:
            return s
        return joined(s,l)
    else:
        ptn = max_pattern(s, len(newchr), lenw, numw)
        if ptn == None:
            if not l:
                return s
            return joined(s, l)
        s = s.replace(ptn[0], newchr)
        s = ptn[0] + newchr + s
        l.append(newchr)
        return compress(s, l, lenw, numw)

def decompress(s):
    lst2, lst, s = s.split(sep(),2)
    li = [lst2[i:i+2] for i in xrange(0, len(lst2), 2)]+list(lst)
    for c in li:
        x, s = s.split(c, 1)
        s = s.replace(c, x)
    return s


def test(times):
    import random
    rnd = random.random
    tested = {(1001, 1001): (10000, 10, False),}
    org = open('text').read()
    minfound = 1000
    for i in xrange(times):
        l,n = 1001,1001
        while (l,n) in tested:
            # i guess this would be random enough    
            xr = lambda: random.choice((rnd(), rnd()+rnd(), rnd()-rnd(), rnd()*random.choice((10,100,1000)), -1*rnd()*random.choice((10,100,1000)),))
            n = xr()
            l = xr()
        sm = compress(org, l=[], lenw=l, numw=n)
        try:
            dc = decompress(sm)
        except:
            tested[l,n] = (len(sm), len(sm)/float(len(org)), 'err')
            continue
        tested[l,n] = (len(sm), len(sm)/float(len(org)), dc==org)

        if len(sm) < minfound:
            minfound = len(sm)
            open('min.txt','a').write(repr(tested[l,n])+'\n')
            print '~~~~~~~!!!!!!! New Minimum !!!!!!!~~~~'
    return tested

if __name__ == '__main__':
    import sys
    split = False
    try:
        if sys.argv[2] == 'p':
            pretty = True
    except:
        pretty = False
    org = open(sys.argv[1]).read()
    try:
        l=float(sys.argv[3])
        n=float(sys.argv[4])
    except:
        l,n=0,0
    sm = compress(org,lenw=l,numw=n)
    print 'COMPRESSED -->'
    print sm, len(sm)
    #open('new.py','w').write(sm)
    print len(sm)/float(len(org))
    print 'TRYING TO REVERT -->'
    dc = decompress(sm)
    #print dc
    print dc==org

1. Uma variável extra para \ncustará 5 caracteres e economizará 9. 2. Espaço extra em in (g,l..). 3. join(..)funciona tão bem quanto join([..])(pelo menos em 2.7).
Ugoren

126 menos caracteres, isso é divertido
Optimus

Seu programa parece ser apenas 587 bytes de comprimento (unix formatação) - um a menos que as várias respostas que são 588.
res

Obrigado por apontar para fora, realmente o meu vim acrescenta linha final para o final do arquivo de python
Optimus

Eu adicionei algumas informações sobre como estou obtendo minha solução, devo estar fazendo algo errado em algum lugar, o mínimo fica preso em algum momento, mas obviamente Ed. H fez melhor para que haja margem para melhorias.
Optimus

11

Malbolge, 12735 bytes

D'`N^?o!6}{FW1gSSR2PO)oo98[H('3}C#"?xwO*)L[Zp6WVlqpih.lkjihgI&^F\a`Y^W{[ZYX:Pt7SRQPOHGkK-CHA@d>C<;:9>=6Z:9876v43,+Op.',%*#G'&}$#"y?}_uts9qvo5sUTpong-NMib(fedFEa`_X|\[T<RQVOsSRQP2HlLKJCgAFE>=aA@">76;:9870Tu-2+*)Mn,+*#"!Efe{z!x>|utyxwpo5Vlqpih.fed*ba`&^c\[`Y}@\[TSXQuUTMLQPOHl/EDIHAeED=BA@?8\<|438765.R,r*)(L,+$j"'~D${c!x>_uzyrq7XWsl2ponmfN+LKgf_^c\"Z_^]VzZYX:VOsSRQ3IHGk.JCBAeEDCB;:9]~<5Yzy705432+0/(L,l$H('&feB"yxw={zsxq7Xnsrkjoh.lkdiba'eGcba`Y}@VUySXQPONMqQ3IHlLEJIBA@d'=BA:?87[;:z870T4-2+O/.'&JIj"'&}Cd"!x>|uzyxqpo5slk10nPf,jLKa'_dcb[!_X@VzZ<XQPOsSRQJImMFEJCBAeED=<;_?>=6|:32V05432+0)M-&+*#Gh~}|Bc!x>_{tyr8vutsrTpoh.lkjihgI&^F\[`_X|VUZSRWVOs6LQJImGLEJIBAeED&B;_?!=654X87wv4-Q1qp('&Jk)"!&}C#zb~wv{t:[qpotsrk1oQPlkd*hgfe^]#aZB^]V[ZSwWP8TSLpJ2NGkE-IBA@dDCBA:^!~654Xy705.-Q1*/.'&%Ij('&}C#"!~}|ut:[wvonm3qpongO,jLKa'eGc\[!_A@VzZYX:Pt7SRQPImM/KJIBAe?'=<;_9>=<5492V6/43,P0/('&+*#G'&feBzb~}|uts9wYXn4rqpoQPlkd*hJIe^$ba`Y}WV[Tx;:PONrLKJONGkE-IBAe(D=<A@?>7[;{z810/S-,+0/('&J$j(!E}|#z!x>|{t:xqYo5slTpingf,jLba`&^Fb[`_X|\UTx;WPUTMqQPO1GkE-IBA@dD=B;:?8\<;4981U5432+*)Mn,%Ij('~}|Bc!x}|ut:9wYunmrk1onmfN+LKa'edFEa`_X|?Uyx;WPUTMqQ3ONMFjJIHA@d'CB;:?8\6|:32V65ut,P0po'&+$#(!E%|#"y?w|{tyr8vutsrTpoh.lkjihgI&^F\[`_X|VUZSRWVOsS5QPIHGkEJIHAed>&<`@9>=<;4X876/.3210)(Lm+*#G'~}$#zy~w=u]sxq7Xtmlkji/POe+*hg`Hd]#DZ_^]Vz=SXQVUNrR43ImMLKJIH*@d>C<`#"8=<;:3Wx05.3,P0po'&+$#(!E%$#"yx>|uts9wYonm3Tpinglkd*hJIedcb[!_X@VzT<RQVOsSRQP2HlL.JIBf)?DCB;@?>7[;43Wx0/43,P0/.-m%*#GF&f${A!awv{zs9wpunsrkj0hgfejiba'eG]b[`Y}@VUy<;WVUTMqQJ2NGkKJIHA@dc&BA@?>=<5Y9216543,Pqp(Lm%I)i!~}C{cy?}v{tyr8vuWmrqji/mlejihgf_^]#a`BA]\[Tx;WPUTMqQP2NGFEiIHA)?c&<;@98\};:3W76/u3,+*N.',+$H(!g%${A!~}vu;sxwpun4rqjRnmf,MLbgf_dc\"`BXWVzyYXWP8NrRQ32NMLEDhHGF?>C<`@9876Z4321U5432+*)M-,+*ji!E}|{"y?w|utyr8potsrk1onmlkdiba'eGcba`Y}]?>ZYXQuOTSLpPIHMLEDCg*@?>=a$@9]=<;{z876/S3210/o-&J*j"!~D|{z@awv{zyr8pXn4rqjoh.-kjchgf_%cE[`Y}]\[ZSRWVOsS54JnNML.DhHA@EDCB;_"!=<5Y3y165.-Q1*/.-&Jk#"'~D|#z@x}vut:rwpun4rqjih.lkjihJI_%F\aZ_^W{>=YXWPOs65KJOHlL.JIHG@dDCB$@?>=<5Y98x6543,P0)(-,%$#(!E%|#"!x>_{tyr8vuWmrqji/mlejihgf_^]#a`BA]\[TxR:u8NSRQJImG/EJCHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}]\>=SwWP8NrLKPOHGkKJ,HG@d'=BA:?87[|{98765.R210).'K+k#G'&feB"!x}v{zs9wYXn4rTSoh.lNjibg`&G]#aC_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;yxq7utVrkji/Pledihg`&dcba`Y}W?UZYRQuONMLQJOHlkKJI+AeED=%;_?!~<5Y98x6543,P0/.-m%*#G'&f${A!awv{zs9wpunsrkj0hgfejiba'eG]b[`Y}@VUy<;WVUTMqQJ2NGkKJIHA@dc&BA@?>=<5Y9216543,P0po'&%I)(!g%${Aya}|u;:rwpun4rqjih.fN+cha`_^$ba`BX|\[ZYX:Pt7SRQPOHGkKJ,HAF?>bB$:?8=6Z:3y76/St,+O).',%$#G'~f$#"!x>|{z\xwp6tsrkpong-kjihgfH%cbDCYXW{>=YXQu8NMLpJINGLEJIBfeE'=<;:9]=<;{z870T.-2+*/.-&J*)(!~}C{cy?}v{tyr8YXnml2ji/glkdcb(f_dcbaZ~^]\U=SwQVOTMRQJImG/EJCHAe(D=B;@?>7[|:9876/.3,Pqp(',+*#G'&feBzy~w={]yxwvo5mrqj0hmlejiba'eG]b[`Y}@VUySXWPUTMqQJ2NGkEJCHA@dDCB;_987<;:9810Tu3,10).'K+$j"'~D|dz@~}_{t:xqpon4rqjRnmf,jchaf_%]Ea`_^]VzZYXQ9UNr54JnH0LKDhHGFEDCB;_?!~<;:981U/u3,+*N.-,%k)"Fg%$#"!x>v{tyrq7Xtmrk1oQPfejc)gfH%]baZ_^W{[TSwv9OTMLp3ONMLEDhBGFEDC<;_"!7[|{9870T43,+Op.-&+$)"F&f$#zy~w=^]sxqpo5srqpoQg-Njchafedc\"`_X]VzZYR:u87SLKJnNM/KDhBGF?>=aA@?!~6;:3W7wv.-2+O/o-&J$j"'~D${c!x>|{tyxq76nsrkpi/gfkdiba'HGcb[!_^@VUTx;WPUTMqQPONM/EiCHG@dDCB;_987<;:9810T.-,10)M',%$)"F&feB"!a}|u;\xqputm3qpRQ.fkdcbg`&dFEaZ~A@\[TxXQ9UTMqQPINMFjJ,HG@d'=BA:?87[;:z8765.R210/o-&J$j"'~D$dc!x>|uzyxqpo5Vlqping-kdchg`_%cE[`Y}]?>ZSRWVOsM5KoOHMFjJCHGF?cCB;@?87[;:z8765.R,1*/.-&%Ij('~}|Bc!x>_utsxqpo5mlk1onmfN+iKg`_^$E[!~^]\U=SwQVOTMRQJImMLKD,HAe?DCBA@?>7[|{92V6/.3210)(Lm+*#G'&feBzy~w={ts9wvXnm3kSohglkjiha'e^]\a`Y}@VUyYX:POTMqQJ2NMLKDhHA@dD=<`#"8=<;:3W7654-Q10/('K+$)(!EfeBzb~wv{t:[wpon4Ukji/Plkjchgf_^$bDZ_^]VzZ<Rv9OTMLpPON0/KJIHAeE>=B;:9]~654X270T.-2+*/.-&J*j"!~D${cy?}v{tyr8vuWsrqpi/mleMihgf_^]#aZ_XWVzyYXWP8NrRQ32NMLEDhHA)?cCB$@987[5{321U5u32+O)o'&J*ji'~D${c!x>_{tsrwvun4lTjih.lkjihJI_%F\aZ_^W{>=YXWPOsS54PIm0/KJCBAe(>=<A@?>=<;4Xyx65.R210).'K+k#G'&feB"b~}v<zsxwp6Wmrqping-kdcha'e^F\[`_X|\[ZYX:Pt7SRQPOHGkE-CHA@d>C<;:9>=6Z:z8765.R210)o'&J$)"!~%${A!~`v{zyr8pXnslk1onmfN+Lbgfe^]#aC_X|{[ZSXWVOsMRKoONML.DhHA)E>bB;:9]=6|49810/.R2r*).-&J*)(!&}C#c!x}v<]\xqputm3qponmfN+LKa'edFEa`_X|?Uyx;WPUTMqQJnH0FKJCHAe?>CBA:?87[|{98765.R210).'K+k#G'gfC{cy~}vu;yxwvXWsl2ponmfN+LKa'_^$#DZ_^]Vz=<XWPtT65QJn1GLEDhHGF(>C<A@9]=<;:3y76/St,+Opo'&%Ij(!~%|Bz@a}|{t:[wvun43qpRQ.-Ndcha'edFEa`_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;yxqYo5srTSihg-kMc)J`e^]#DZ_^]VzTSRQVONMqQJOHlF.JIBf)d'CB;:?8\<;492Vw5.-,+O/('&J$j(!E%e{zy?}|^]yxq7XWsrkji/mfN+ihg`H^$b[Z_^W\UySRQPtsSR43ImM/KJIBAeE>&<`@9876Z4321U5432+*)M-,+*ji!E}|{"y?w|utyr8potsrk1onmlkdiba'eGcba`Y}]?>ZYXQuOTSLpPIHMLEDCg*@?>=a$@9]=<;{z876/S3210/o-&J*j"!~D|{z@awv{zyr8pXn4rqjoh.-kjchgf_%cE[`Y}]\[ZSRWVOsS54JnNML.DhHA@EDCB;_"!=<5Y3y165.-Q1*/.-&Jk#"'~D|#z@x}vut:rwpun4rqjih.lkjihJI_%F\aZ_^W{>=YXWPOs65KJOHlL.JIHG@dDCB$@?>=<5Y98x6543,P0)(-,%$#(!E%|#"!x>_{tyr8vuWmrqji/mlejihgf_^]#a`BA]\[TxR:u8NSRQJImG/EJCHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}]\>=SwWP8NrLKPOHGkKJ,HG@d'=BA:?87[|{98765.R210).'K+k#G'&feB"!x}v{zs9wYXn4rTSoh.lNjibg`&G]#aC_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;yxq7utVrkji/Pledihg`&dcba`Y}W?UZYRQuONMLQJOHlkKJI+AeED=%;_?!~<5Y98x6543,P0/.-m%*#G'&f${A!awv{zs9wpunsrkj0hgfejiba'eG]b[`Y}@VUy<;WVUTMqQJ2NGkKJIHA@dc&BA@?>=<5Y9216543,P0po'&%I)(!g%${Aya}|u;:rwpun4rqjih.fN+cha`_^$ba`BX|\[ZYX:Pt7SRQPOHGkKJ,HAF?>bB$:?8=6Z:3y76/St,+O).',%$#G'~f$#"!x>|{z\xwp6tsrkpong-kjihgfH%cbDCYXW{>=YXQu8NMLpJINGLEJIBfe(>=a$@9]=<;{z876/S3210/o-&J*j"!~D|{z@awv{zyr8pXn4rqjoh.-kjchgf_%cE[`Y}W?UZYRQuUTS54PImGLKJIHGF?cCB$#9]=6|:32V0/432+Op.'K+k#G'&feBzb~w=^]srqpo5srqpRQ.fejiha'edFEa`_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;y[qvotsrk1inmle+LKa'eGc\[!_^@VUTxXQ9UNr54JnH0LKJIBAe?'CBA@9]~65:9870Tut,+0/(Lm+*)"!&%${Aya}|{ts9ZYotmrk1Rnglkdihg`&d]\a`_^]\UTxX:Pt7MRKJIHlLE-IBAe(D=<A:^>~6549270T432r0/.'KJ$#('~%|Bcb~w|u;yxwYXn4rqpohg-kjiba'eGc\[!_^]\[Z<Rv9UTMRKPOHlF.DhBGF?>=a;:?8=6Z:3y76/St,+O/('&%$Hi!&}${Ab~}vut:rwpun4lTpi/Plkjchgf_^$ba`_A@\[TxX:Pt7MRKJIHlL.JIBf)dDCBA#9]~65:9870T4-2+O/.-m%*#G'&f${A!awv{zs9wpunsrkj0hgfejiba'eG]b[`Y}@VUy<;WVUTMqQJ2NGkKJIHA@dc&BA@?>=<5Y9216543,P*).-,%Ij('~}|B"!~`|u;yxwvXWsl2ponmfN+LKgf_%cba`YX|\[ZSRvVOTSLQPImMLKDhB*F?>CB;_?8=<5Y9y765.-,+O/('&J$j(!E%e{zy?}|^]yxq7XWsrkji/mfN+ihg`H^$b[Z_^W\UySRQPtsSR43ImM/KJIBAeED=<;_"!=<5Y9yx65.R210)o'&J*j('~}${A!~}_{t:9wpXtsl2poQg-NMiba`&dFEa`_X|\[ZYR:u8NSRQJImG/EJCHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}]\U=YXWPt7MLKJImGLKDCHAed>=B;_"!=<5Y9216543,P*)('&J*ji'~D${cy?}v{tyr8vutVrkji/mlkjihJI_%F\aZ_^W{>=YXWPOsSRQP2NGLEDhBGF?c=B;_?>~}5Y9876v43,+O/o',+$)"Fg%|{"y?w|utyr8vXnm32poQ.lkdib(feGcba`Y}]?UTYRvPOTSRKo2NGFjD,HAeED&B;_?>~<;:3W165.-,P0)o'&J*ji!E}|{"y?w|utyr8potsrk1ongOkd*hgfe^F\"C_^W\UyYR:uOTMqQP2NGLEiIHGF?>CB;_?!~<;:981U/43,10/.-&J$j"'~De#"!~w={tyrwpun4rqpRh.Okdihgf_^$bDZ_^]VzTSRQVONMqQJOHlF.JIBf)d'CB;:?8\<;492V0vS-s+*NonK+k)('~De{z!x>_uzyrq7Xtsrkpi/POedchg`&G]#aC_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;yxqYo5srTSihg-kMc)J`e^]#aCBXW{>=YXWPOsM5Ko2HMFKJIHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}W?UZYRQuUTS54PImGLKJIHGF?cCB$#9]=<|49870Tut21*)M'&%*)(!E%$#"y?}|{zyxwpo5Vlqpih.fN+LKgf_%cba`YX|\[ZSRvVOTSLQPImMF.JIBf)(DCB;_?!~6;:981U54-s+*NonK+k)('~De{z!x>_uzyrq7Xtsrkpi/POedchg`&G]#aC_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;yxqYo5srTSihg-kMc)J`e^]#aCBXW{>=YXWPOsM5Ko2HMFKJIHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}W?UZYRQuUTS54PImGLKJIHGF?cCB$#9]=<|49870Tut21*)M'&%*)(!E%$#"y?}|{zyxwpo5Vlqpih.fN+LKgf_%cba`YX|\[ZSRvVOTSLQPImMF.JIBf)(DCB;_?!~6;:981U54-s+*NM-ml*)(!E%${cy?`v{zyr8putsrkj0hgfejiba'eGc\[!_^W{U=SwQ9UNr5QPIHMFjJ,BAe?'C<;@9]~<5Y3876/.3,Pqp(',+*#G'&feBzy~w={]yxwvo5mrqj0hmlejiba'eG]b[`Y}@VUySXWPUTMqQJ2NGkEJCHA@dDCB;_987<;:9810Tu3,10).'K+$j"'~D|dz@~}_{t:xqpon4rqjRnmf,jchaf_%]Ea`_^]VzZYXQ9UNr54JnH0LKDhHGFEDCB;_?!~<;:981U/u3,+*N.-,%k)"Fg%$#"!x>v{tyrq7Xtmrk1oQPfejc)gfH%]baZ_^W{[TSwv9OTMLp3ONMLEDhBGFEDC<;_"!7[|{9870T43,+Op.-&+$)"F&f$#zy~w=^]sxqpo5srqpoQg-Njchafedc\"`_X]VzZYR:u87SLKJnNM/KDhBGF?>=aA@?!~6;:3W7wv.-2+O/o-&J$j"'~D${c!x>|{tyxq76nsrkpi/gfkdiba'HGcb[!_^@VUTx;WPUTMqQPONM/EiCHG@dDCB;_987<;:9810T.-,10)M',%$)"F&feB"!a}|u;\xqputm3qpRQ.fkdcbg`&dFEaZ~A@\[TxXQ9UTMqQPINMFjJ,HG@d'=BA:?87[;:z8765.R210/o-&J$j"'~D$dc!x>|uzyxqpo5Vlqping-kdchg`_%cE[`Y}]?>ZSRWVOsM5KoOHMFjJCHGF?cCB;@?87[;:z8765.R,1*/.-&%Ij('~}|Bc!x>_utsxqpo5mlk1onmfN+iKg`_^$E[!~^]\U=SwQVOTMRQJImMLKD,HAe?DCBA@?>7[|{92V6/.3210)(Lm+*#G'&feBzy~w={ts9wvXnm3kSohglkjiha'e^]\a`Y}@VUyYX:POTMqQJ2NMLKDhHA@dD=<`#"8=<;:3W7654-Q10/('K+$)(!EfeBzb~wv{t:[wpon4Ukji/Plkjchgf_^$bDZ_^]VzZ<Rv9OTMLpPON0/KJIHAeE>=B;:9]~654X270T.-2+*/.-&J*j"!~D${cy?}v{tyr8vuWsrqpi/mleMihgf_^]#aZ_XWVzyYXWP8NrRQ32NMLEDhHA)?cCB$@987[5{321U5u32+O)o'&J*ji'~D${c!x>_{tsrwvun43qpohgf,jihgfH%cba`_A@\Uy<;QPONMqQP2HlL.JIBf)dD=BA@9>7[5{321U/.3,10/(LKl*)"F&feBc!x>|^]yxq7utVlkj0/mfN+LKgf_%cba`YX|\[ZSRvVOTSLQPImGLEDIBAe(D=<A@?>7[;43W76v43,+O/(n,%I)('gfCd"!xw|{zs9wvutm3qponmlkdcb(f_^$#[`_^]VzTYRv9OTMLpP21GkKD,BG@d>CBA:^>~6549270T.3,1*)ML,%k)"F&feB"!~w=^]s9wYXnml2ponmlkjiba'eGc\[!_^@VUTxXQ9UNr54JnH0LKJIBAeEDCBA:^>=<54X8x6/S3,10/.-&J*j"!~D|#zyx>v{zs9qvutsrk1Rngfkd*hJIedcb[!_A]\UZSwvPUNSLp3INGFjJI+*F?cCB$#9]~}5:32V6v43,+O/o-,+*#G'~f|{"y?}|{zsxq76tVrkji/mfN+ihg`H^$b[`Y}@VUTxX:Pt7SRQPOHGk.JCBGF?cC<A:^>=<5:3W76v43,+Op.'&%Iji!&}$#z@a`|{zsxq7uWsrkj0QPlejchg`&d]\a`_^]\UTxX:Pt7MRKJIHlLE-IBAe(D=<A:^>~6549270T432r0/.'KJ$#('~%|Bcb~w|u;y[qvotsrk1inmle+LKa'eGc\[!_^@VUTxXQ9UNr54JnH0LKJIBAe?'CBA@9]~65:9870Tut,+0/(Lm+*)"!&%${Aya}|{ts9ZYotmrk1Rnglkdihg`&d]\a`_^]\UTxX:Pt7MRKJIHlLE-IBAe(D=<A:^>~6549270T432r0/.'KJ$#('~%|Bcb~w|u;yxwYXn4rqpohg-kjiba'eGc\[!_^]\[Z<Rv9UTMRKPOHlF.DhBGF?>=a;:?8=6Z:3y76/St,+O/('&%$Hi!&}${Ab~}vut:rwpun4lTpi/Plkjchgf_^$ba`_A@\[TxX:Pt7MRKJIHlL.JIBf)dDCBA#9]~65:9870T4-2+O/.-m%*#G'&f${A!awv{zs9wpunsrkj0hgfejiba'eG]b[`Y}@VUy<;WVUTMqQJ2NGkKJIHA@dc&BA@?>=<5Y9216543,P*).-,%Ij('~}|B"!~`|u;yxwvXWsl2ponmfN+LKgf_%cba`YX|\[ZSRvVOTSLQPImMLKDhB*F?>CB;_?8=<5Y9y765.-,+O/('&J$j(!E%e{zy?}|^]yxq7XWsrkji/mfN+ihg`H^$b[Z_^W\UySRQPtsSR43ImM/KJIBAeED=<;_"!=<5Y9yx65.R210)o'&J*j('~}${A!~}_{t:9wpXtsl2poQg-NMiba`&dFEa`_X|\[ZYR:u8NSRQJImG/EJCHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}]\U=YXWPt7MLKJImGLKDCHAed>=B;_"!=<5Y9216543,P*)('&J*ji'~D${cy?}v{tyr8vutVrkji/mlkjihJI_%F\aZ_^W{>=YXWPOsSRQP2NGLEDhBGF?c=B;_?>~}5Y9876v43,+O/o',+$)"Fg%|{"y?w|utyr8vXnm32johg-Njchgf_^$\a`Y^]\UTxX:Pt7MRKJIHlLE-IBAe(D=<A:^>~6549270T432r0/.'KJ$#('~%|Bcb~w|u;yxqYo5srTSihg-kMc)J`e^]#DZ_^]VzTSRQVONMqQJOHlF.JIBf)d'CB;:?8\<;492Vw5.-,+O/('&J$j(!E%e{zy?}|^]yxq7XWsrkji/mfN+ihg`H^$b[Z_^W\UySRQPtsSR43ImM/KJIBAeE>&<`@9876Z4321U5432+*)M-,+*ji!E}|{"y?w|utyr8potsrk1onmlkdiba'eGcba`Y}]?>ZYXQuOTSLpPIHMLEDCg*@?>=a$@9]=<;{z876/S3210/o-&J*j"!~D|{z@awv{zyr8pXn4rqjoh.-kjchgf_%cE[`Y}]\[ZSRWVOsS54JnNML.DhHA@EDCB;_"!=<5Y3y165.-Q1*/.-&Jk#"'~D|#z@x}vut:rwpun4rqjih.lkjihJI_%F\aZ_^W{>=YXWPOs65KJOHlL.JIHG@dDCB$@?>=<5Y98x6543,P0)(-,%$#(!E%|#"!x>_{tyr8vuWmrqji/mlejihgf_^]#a`BA]\[TxR:u8NSRQJImG/EJCHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}]\>=SwWP8NrLKPOHGkKJ,HG@d'=BA:?87[|{98765.R210).'K+k#G'&feB"!x}v{zs9wYXn4rTSoh.lNjibg`&G]#aC_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;yxq7utVrkji/Pledihg`&dcba`Y}W?UZYRQuONMLQJOHlkKJI+AeED=%;_?!~<5Y98x6543,P0/.-m%*#G'&f${A!awv{zs9wpunsrkj0hgfejiba'eG]b[`Y}@VUy<;WVUTMqQJ2NGkKJIHA@dc&BA@?>=<5Y9216543,P0po'&%I)(!g%${Aya}|u;:rwpun4rqjih.fN+cha`_^$ba`BX|\[ZYX:Pt7SRQPOHGkKJ,HAF?>bB$:?8=6Z:3y76/St,+O).',%$#G'~f$#"!x>|{z\xwp6tsrkpong-kjihgfH%cbDCYXW{>=YXQu8NMLpJINGLEJIBfe(>=a$@9]=<;{z876/S3210/o-&J*j"!~D|{z@awv{zyr8pXn4rqjoh.-kjchgf_%cE[`Y}W?UZYRQuUTS54PImGLKJIHGF?cCB$#9]=6|:32V0/432+Op.'K+k#G'&feBzb~w=^]srqpo5srqpRQ.fejiha'edFEa`_X|?>ZYXWPt7MLKJImMFEDCgGFEDCB;_?>=<5{3W165.R2r0/.'KJ$#('~%|Bcb~w|u;y[qvotsrk1inmle+LKa'eGc\[!_^@VUTxXQ9UNr54JnH0LKJIBAe?'CBA@9]~65:9870Tut,+0/(Lm+*)"!&%${Aya}|{ts9ZYotmrk1Rnglkdihg`&d]\a`_^]\UTxX:Pt7MRKJIHlLE-IBAe(D=<A:^>~6549270T432r0/.'KJ$#('~%|Bcb~w|u;yxwYXn4rqpohg-kjiba'eGc\[!_^]\[Z<Rv9UTMRKPOHlF.DhBGF?>=a;:?8=6Z:3y76/St,+O/('&%$Hi!&}${Ab~}vut:rwpun4lTpi/Plkjchgf_^$ba`_A@\[TxX:Pt7MRKJIHlL.JIBf)dDCBA#9]~65:9870T4-2+O/.-m%*#G'&f${A!awv{zs9wpunsrkj0hgfejiba'eG]b[`Y}@VUy<;WVUTMqQJ2NGkKJIHA@dc&BA@?>=<5Y9216543,P*).-,%Ij('~}|B"!~`|u;yxwvXWsl2ponmfN+LKgf_%cba`YX|\[ZSRvVOTSLQPImMLKDhB*F?>CB;_?8=<5Y9y765.-,+O/('&J$j(!E%e{zy?}|^]yxq7XWsrkji/mfN+ihg`H^$b[Z_^W\UySRQPtsSR43ImM/KJIBAeED=<;_"!=<5Y9yx65.R210)o'&J*j('~}${A!~}_{t:9wpXtsl2poQg-NMiba`&dFEa`_X|\[ZYR:u8NSRQJImG/EJCHAeE'=B;@?>7[;49870T4t2+*)M-,+*#"!E}|{"y~w={]\xqpo5srqjoh.-kjchgf_%cE[`Y}]\U=YXWPt7MLKJImGLKDCHAed>=B;_"!=<5Y9216543,P*)('&J*ji'~D${cy?}v{tyr8vutVrkji/mlkjihJI_%F\aZ_^W{>=YXWPOsSRQP2NGLEDhBGF?c=B;_?>~}5Y9876v43,+O/o',+$)"Fg%|{"y?w|utyr8%

Experimente online.

Gerado usando as ferramentas aqui.


Woah! Uma resposta de Malbolge? Impressionante!
MilkyWay90

10

JavaScript 666 bytes

Inspirado na solução da tkazec .

Confira o post que escrevi sobre ele, ele contém todas as fontes e explica como eu criei esse código.

Você pode copiar e colar o código no console do seu navegador. Ou tente em http://jsfiddle.net/eikes/Sws4g/1/

t="We're no strangers to love|YouSrules;so do I|A full commitment's what?think7f|You wouldn't get this from anyLguy^zQnqAnd if:ask me[Don'tEme yRblind=ee{HUH_]|Qq^{x<br>{zxz||xxZKVlet:downVrun around;deseBVMcryVsay goodbyeV8a liFhuB||q eachLfor so long|Your hearPaching but|YRshy=@Inside we bothCwhaPgo7n|WeSgamFwe'reJpl@_U]^|I just wannaEyou[Gotta Munderstand](Ooh)|Z, nX|(GU[ how?feeling|ZNXXTgiveV|NTUiveK)|TeverJSCthe Rou're too QWe've9Pt's been Mmake:L other K:upJ gonna H(Ooh, gFe;E 8C9 Brt you@ay it|? I'm = to s; and : you 9 know8tell 7ing o";c="|{zxq_^][ZXVUTSRQPMLKJHFECB@?=;:987".split("");while(l=c.pop()){t=t.split(l);t=t.join(t.pop())}document.write(t)

9

Perl, 584 578 577 576 575 571 564 554 553 540

Essa solução segue a mesma abordagem básica que a maioria das outras: dada uma sequência inicial, execute substituições repetidas de partes repetidas do texto.

As regras de substituição são especificadas por um único caractere, de preferência um que não ocorra no texto de saída; portanto, uma regra de comprimento L e N vezes ocorrida economizará aproximadamente N * LNL-1 (N * L é o comprimento original de todas as ocorrências, mas o caractere de substituição ocorre N vezes e o próprio texto literal tem comprimento L e as regras são divididas por um caractere de separação.) Se os caracteres de substituição forem explicitamente especificados, a economia será reduzida para N * LNL-2. Dado que a maioria dos idiomas pode calcular um caractere com chr () ou código curto similar, a primeira abordagem tende a ser superior.

Existem algumas desvantagens em calcular o caractere de substituição, sendo a mais significativa a necessidade de um intervalo contínuo de caracteres ASCII. A saída usa principalmente letras minúsculas, mas há letras maiúsculas e pontuação suficientes para exigir a substituição de um caractere por si mesmo, remapeando alguns caracteres em um estágio de correção posteriormente ou ordenando as regras para que substituições por caracteres problemáticos ocorram anteriormente. O uso de uma linguagem que substitui o uso de expressões regulares também significa que existem dicas para caracteres que têm um significado especial em uma expressão regular:. + * \ ?

Minha abordagem original tinha 63 bytes no decodificador e 521 nas regras. Passei muito tempo otimizando as regras, o que pode ser complicado, especialmente com as regras curtas, pois elas podem se sobrepor. Eu consegui a decodificação para 55 bytes e as regras para 485 enganando a fórmula um pouco. Normalmente, uma regra de 2 caracteres que ocorre 3 vezes ou uma regra de 3 caracteres que ocorre duas vezes não economiza muito, mas existe uma brecha - que também permite criar palavras que não fazem parte da saída; )

Eu uso caracteres de controle nesta solução, portanto a solução é fornecida aqui codificada em base64.

cz09AhpuCnRyYQ8QcxIHbG8OGRwVBHJ1bGVzDRRzB2QHSQFBE3VsbCBjb21taXQIbnQXcxFoYXQs
FWluaxtvZhkRC2xkbhd0BWV0FWlzE3JvbQ1ueR8FdXkuJ0EUaWYYDXNrIAgtRG9uF3QgHiAIGBp0
bwdibGkUdAoDKysBKSkoKCcuKys9OyRjPWNociQ9LS0sczpbJGNdOigiCldlZWVlICBnb3RvIG1l
b3cHc291bmQgYXZlbmdlciB3IHQgZgwgEmhpDiciPX4vLj9cRC9nLHNwbGl0CjAsJyB5CzABWQsw
F3IEMGkPIDAga24JMG5uYSAwdGVsbDAgBmgQMCAwFhggdXAwZQ5yBW8dMHQXcyBiA24gMGF5IGl0
ATABTiIwAShPb2gwAQECFw4cbiBlYWNoHxNvciBzB2xvDxlyIGhlYXIjYWNoG2J1dBkadG8KaHkS
CiRJbnNpZGURBGIGaBwRaGEjZ28bb24BAhwVBGdhCA0Ud2UaZ28dcGwkMCYpJWcWLCBuImcWAShH
ISkwJiwFISkwbWFrZRggMAElZyElbGV0GCBkCW4lcnVuDXILFGEUZGVzEHQYJSpjcnklc2F5BW9v
ZGJ5ZSUeDSBsaWUNFGh1cnQYMCBJF20wIGgJLBMDbGkPATABSSBqdXN0EWEdHhgtRwZ0YSAqdQwQ
c3RhDCsnKVskPV06ZWd3aGlsZSQ9O3ByaW50

E aqui está uma versão um pouco mais legível (mas menos executável).

s==^B^Zn
tra^O^Ps^R^Glo^N^Y^\^U^Drules^M^Ts^Gd^GI^AA^Sull commit^Hnt^Ws^Qhat,^Uink^[of^Y^Q^Kldn^Wt^Eet^Uis^Srom^Mny^_^Euy.'A^Tif^X^Msk ^H-Don^Wt ^^ ^H^X^Zto^Gbli^Tt
^C++^A))(('.++=;$c=chr$=--,s:[$c]:("
Weeee  goto meow^Gsound avenger w t f^L ^Rhi^N'"=~/.?\D/g,split
0,' y^K0^AY^K0^Wr^D0i^O 0 kn^I0nna 0tell0 ^Fh^P0 0^V^X up0e^Nr^Eo^]0t^Ws b^Cn 0ay it^A0^AN"0^A(Ooh0^A^A^B^W^N^\n each^_^Sor s^Glo^O^Yr hear#ach^[but^Y^Zto
hy^R
$Inside^Q^Db^Fh^\^Qha#go^[on^A^B^\^U^Dga^H^M^Twe^Zgo^]pl$0&)%g^V, n"g^V^A(G!)0&,^E!)0make^X 0^A%g!%let^X d^In%run^Mr^K^Ta^Tdes^Pt^X%*cry%say^Eoodbye%^^^M lie^M^Thurt^X0 I^Wm0 h^I,^S^Cli^O^A0^AI just^Qa^]^^^X-G^Fta *u^L^Psta^L+')[$=]:egwhile$=;print

No entanto, suspeito que isso ainda não é o mínimo, como Ed H. salienta que a decodificação do php é a mais curta de 44 bytes e vi espaço para melhorias nas regras que ele está usando. Eu tenho um decodificador de 52 bytes no Perl, mas não consegui usá-lo para esta solução, pois precisava executar o intervalo inversamente.


8

PHP 730 707 caracteres

<? $ l = 'você'; $ n = 'Nunca vai'; $ z = "desista de $ l"; $ m = "
$ n $ z
$ n deixa $ l abaixo
$ n rode e desça $ l
$ n faz $ l chorar
$ n diga adeus
$ n mentir e magoar $ l

"; $ o ="
Nos conhecemos há tanto tempo
Seu coração está doendo, mas
Você é muito tímido para dizer isso
Por dentro, nós dois sabemos o que está acontecendo
Conhecemos o jogo e vamos jogar
"; $ p =" (Ooh, $ z) "; $ r =" ($ z) "; $ g =" como estou me sentindo "; $ s =" $ n dá, $ n dá "; $ t = "Eu só quero dizer $ l $ g
Preciso fazer $ l entender "; eco" Não somos estranhos para amar
Você conhece as regras e eu também
Um compromisso total é o que estou pensando
Você não conseguiria isso de nenhum outro cara
$ t
$ m $ o
E se $ l me perguntar $ g
Não me diga que estou muito cego para ver
$ m $ m
$ p
$ p
(Ooh)
$ s
$ r
(Ooh)
$ s
$ r
$ o
$ t
$ m $ m $ m ";

1
Você pode tornar isso mais curto colocando "Você" e "você" em variáveis.
Polinomial

@ PeterTaylor, esse é um erro de digitação, obrigado por se lembrar.
L0n3sh4rk

@Polynomial, done!
L0n3sh4rk

$s="Never gonna give...pode ser encurtado com $n.
Llama

1
Sugira que faça "give" uma variável também. É usado em 5 lugares.
Glen Solsberry

8

Perl - 589588583 579 576 bytes

Cada regra consiste em uma cabeça de 1 caractere, um corpo e um sublinhado. Desde que as regras possam ser cortadas no início, a cabeça da regra é substituída por seu corpo no restante do texto. O cabeçalho da primeira regra é fornecido, os cabeçotes de todas as regras a seguir são gerados a partir da variável $ i.

Como o cabeçalho da próxima regra é colocado no início do texto pela regra anterior, a última regra criará um personagem que não será mais removido. Eu tive que escolher uma variedade de nomes onde o último seria "W", para que eu pudesse remover o "W" original desde o início da letra e substituí-lo pela substituição de regra.

A codificação foi feita por um script Python usando um algoritmo simples de alpinismo.

Aqui está o código Perl:

$_="qou_on_er_Hh_ w_
(Ooh_ell_ a_ay it
_'reHoC_g0na _makeR _ve_ oth1 _ing_e ___A_t's been _o _D_4, gP)_
Yq_G_ t_I_ know_
NT_nd _ how I'm feel=
_N_O_i;R up_4)Kgi;, nTgi;
(GP)_ yq_
I just3annaH5RMGotta :und1stand
V_e;r 9_
We';Jn each<for sCl0gFr hearBach= butF8shyHCs7Insid>w>bothJ3haBgo= 0
WeJ2>gam>aLwe'r>9pl7_KgPKletR downKrun6rqLaLdes1tRK:cryKsay goodbyeKt56 li>aLhurtR
_e'r>nCstrang1sHClo;FJ2>rules6LsCdCI
A full commitment's3hat I'm2ink= ofF3qldn't get2is from6ny<guySUALifR6sk meMD0'tH5 meR8bliLtCsee
VVEEQQ
USVV";$i=48;eval"s/$1/$2/g"while s/(.)(.*?)_/chr($i++)/se;print

(Acho notável que o texto compactado contenha "hearBach": D)

E aqui o código Python que o gera:

import collections, sys
text = sys.stdin.read().replace('\r\n','\n')
text = text[1:]
names = list(["q"] + map(chr, xrange(ord('0'), ord('W'))))
done = False
name = ""
while not done:
    done = True
    best = (0, None)
    for m in xrange(1, len(text) / 2 + 1):
        counter = collections.Counter()
        for i in xrange(0, len(text) - m + 1):
            snippet=text[i:i+m]
            if not '_' in snippet:
                counter[snippet] += 1
        for snippet in counter:
            n = counter[snippet]
            gain = n * m - n - (m + 1)
            if gain > best[0]:
                actual_gain = len(text) - len(text.replace(snippet,"")) - n - (m + 1)
                if actual_gain > best[0]:
                    best=(actual_gain, snippet)
                    done=False
    if not done:
        snippet = best[1]
        try:
            lastname = name
            name = names.pop()
            while name in 'ADGION':
                text = name + '_' + text
                name = names.pop()
            while name in '?@':
                text = '_' + text
                name = names.pop()
        except:
            sys.stderr.write('Warning: out of names.\n')
            lastname = "0"
            break
        text = snippet + '_' + text.replace(snippet, name)
sys.stdout.write('$_="')
sys.stdout.write(name + text)
sys.stdout.write('";$i=' + str(ord(lastname)) + ';eval"s/$1/$2/g"while s/(.)(.*?)_/chr($i++)/se;print')

Isso é impressionante! Mas você realmente deve jogar golfe no seu Perl. Nesse pequeno snippet, você tem pelo menos cinco caracteres que podem ser reduzidos (parênteses desnecessários e similares).
breadbox

5 caracteres? Eu tenho um para usar um loop for, 2 para o eval-parens e 1 para o modificador de regex não utilizado, mas agora estou preso. (ainda antes do Optimus novamente: D)
Quasimodo

Tente usar a forma de sufixo de whilepara o loop; isso permite que você abandone os aparelhos, além dos parênteses. Outra idéia: descobrir como usar em sayvez de printfazer a saída.
breadbox

@quasimodo não é mais você não é. Só queria dizer isso uma vez: P
Optimus

2
É muito divertido, sim. Mas eu acho que realmente deve parar por aqui, eu não quero pensar em todas as horas que desperdicei sobre isso: D
Quasimodo

8

Python 2.7, 975 803 bytes

Não é o melhor - eu (agora) gostaria que o python fizesse expansões de formatação assim. Infelizmente não.

Editar: expansão simulada com sintaxe de formatação alternativa (tipo de ..)

print("""We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
{10}{8}
{11}

%s
{13}
And if you ask me{8}
Don't tell me you're too blind to see

%s
%s
{0}, {2})
{0}, {2})
{0})
{1}{12}
{9}
{0})
{1}{12}
{9}

{13}

{10}{8}
{11}

%s
%s
%s"""%tuple(['{1}{2}\n{1}{3}\n{1}{4}\n{1}{5}\n{1}{6}\n{1}{7}']*6)).format(*"(Ooh|Never gonna |give you up|let you down|run around and desert you|make you cry|say goodbye|tell a lie and hurt you\n| how I'm feeling|(Give you up)|I just wanna tell you|Gotta make you understand|give, never gonna give|We've known each other for so long\nYour heart's been aching but\nYou're too shy to say it\nInside we both know what's been going on\nWe know the game and we're gonna play it".split('|'))

7

Clojure

720 bytes / caracteres:

(Reproduzido aqui com espaço em branco extra para que você possa ver a formatação)

(let [r{\&" and "\Y"You"\0"\n"\1" you"\2" gonna"\3"give"\5" up"\6"ever"\F" how I'm feeling"\T" to"}
      s str 
      n"0N62 "
      c(s n"315"n"let1 down"n"run around&desert1"n"make1 cry"n"say goodbye"n"tell a lie&hurt10")
      p"0(Ooh, 315)"
      g"0(Give15)"
      q(s n "3, n62 3")
      o"0(Ooh)"
      w(s "0We've known each other for so long0Yr heart's been aching but0Y'reTo shyT say it0Inside we both know what's been going on0We know the game&we're2 play it0")
      u(s "I just wanna tell1F0Gotta make1 understand0")
      v"We're no strangersT love0Y know the rules&so do I0A full commitment's what I'm thinking of0Y wouldn't get this from any other guy0"
      R(s v u c w"And if1 ask meF0Don't tell me1'reTo blindT see0"c c p p o q g o q g\0 w\0 u c c c)]
  (apply s(map #(r% %)R)))      

Qual é a versão de bytes mínimos disso?
CalculadoraFeline

7

C # - 605 caracteres | T-SQL - 795 caracteres | C # - 732 caracteres | C # - 659 caracteres

A inspiração para isso veio do exemplo sed. A única grande mudança que fiz disso foi tornar as pesquisas caracteres ASCII consecutivos para que eles não precisassem ser declarados. Infelizmente, é C #, então não sei como diminuí-lo. Peguei o mesmo texto de substituição e fiz o código no T-SQL usando uma tabela temporária.

var f='#';Debug.Print("HWe've0n each o=F forCo long5r hear+@ch>but5E<oChy<C1InsideBe bo=0Bha+;o>onHWe0 =e;ame7weE8pl1|HI justBanna :4*Gotta 2u?Fsta?%|H/93up/let3down/run@rou?7desFt4/2cry/say;oodbye/:@ lie7hurt4|(Ooh)/9,nevF89H(G.|'|(|)| how6feelingH|t's been|, |(Ooh,g.|ive3up)H|HNevF8| know|ay itH|make3|4 | you|HYou| I'm |@? |;onna |give|tell| g| to|th|ing |nd| a|A| w| s|D|'re|er|G|\n"
.Split('|').Aggregate("WeE noCtrangFs< love50 =e rules7so do IHA full commitment'sBhat6=ink>of5Bouldn't;et =is from@ny o=F;uy$H#A? if3ask me*Don't : me4E<o bli?<Cee%%HH--&&#$%%",(x,t)=>x.Replace(f++.ToString(),t)));

T-SQL

CREATE TABLE #t(i int IDENTITY(35,1),t varchar(1000) COLLATE Latin1_General_CS_AS) 
DECLARE @s varchar(4000)
SET @s = REPLACE(REPLACE('
INSERT #t SELECT ''We"ve0n each o=F forCo long5r hear+@ch>but5E<oChy<C1InsideBe bo=0Bha+;o>on
We0 =e;ame7weE8pl1|
I justBanna :4*Gotta 2u?Fsta?%|
/93up/let3down/run@rou?7desFt4/2cry/say;oodbye/:@ lie7hurt4|(Ooh)/9,nevF89
(G.|"|(|)| how6feeling
|t"s been|, |(Ooh,g.|ive3up)
|
NevF8| know|ay it
|make3|4 | you|
You| I"m |@? |;onna |give|tell| g| to|th|ing |nd| a|A| w| s|D|"re|er|G'''
,'"',''''''),'|','''
INSERT #t SELECT ''')
EXEC(@s)
SET @s = 'WeE noCtrangFs< love50 =e rules7so do I
A full commitment''sBhat6=ink>of5Bouldn"t;et =is from@ny o=F;uy$
#A? if3ask me*Don"t : me4E<o bli?<Cee%%

--&&#$%%'
SELECT @s = REPLACE(@s, CHAR(#t.i), #t.t) FROM #t
PRINT @s

Segunda tentativa Esta foi uma tentativa de uma abordagem diferente. A compactação foi realizada inteiramente pelo computador, buscando as melhores substituições. As pesquisas são seqüenciais e ordenadas por tamanho, portanto, não há necessidade de pesquisas delimitadas; no entanto, o código para fazer as pesquisas foi menos eficiente do que eu pensava, por isso acabou custando 127 caracteres a mais no total! Viva e aprenda.

static void Main()
{
var o="6Gn/tr7g0s,+lo-FJrules.Ds+d+}$z8ull commit9nKLtR1ink:ofF23ldn't4et1is8rom.nyUguy]Xn_zDifC.sk 9[\"5't,I 9CM+bliDt/;^^$N<N\\<X_]^^";
for(char z='\0',y;z<12;z++)
{y='_';for(int i=0,f=333,k=65;i<z;k=y-"'?MRTQNL@(} "[i++]){
for(;y>"^]\\[ZVROB) y"[i];){
f-=k;
o=o.Replace(y--.ToString(),"AWGINODY\n,&'()e o  tve a+ser,h wou gon{ean fmeH eeS)tCowaDr oti- y3nd $~P$#3'r*ingellQ1*t's2haGtoT%4ache-@V kn> }'mBC up$(!oh Ah0 g5na K b;n $$6'-QmakeC ay it$ h>R8;lH$<T)EgB% nPgB$(|$} just27na,IC[|Ata Yund0st7d^$EgSEle= d>nErun.r3D?des0=EYcryEsay4oodbyeEtI. li*?hur= eOUfo@s+l5gF@hearWO:butFM/hy,/Z}nsid*w*bAhQLWgo:5$6Jgam*?weGVplZ".Substring(f,k));
if(y==' '){y='~';i++;}}}}
Console.WriteLine(o);
}

Terceira tentativa em C #. Dessa vez, venci com caracteres \ b, \ r, \ t. Você pode usar \ rN \ n para substituir o primeiro caractere da linha por N maiúsculo, mas ele não salvou os caracteres. Criei \ b aliases para mover o cursor para trás e depois escrever sobre o texto existente. Mas nada disso economizou espaço e, no final, eu ainda estava pior do que uma simples estratégia de busca e substituição.

static void Main()
{
    var f='*';
    Console.Write("C04EC0let8downEC0run arouKJdes>t8EC06cryEC0say goodbyeEC0tePa lie Jhurt8E|CWe'veQn each=for sLlongC7r hear?<achFbutC75HoLshyHLs;Inside we bothQ wha?<goFonCWe3ga@ Jwe51pl;|,|CI just wannaHell82CGotta 6und>stJC|(Ooh)C0:, 91:EC(4)R(GC|(Ooh, 4)C|91| gonna |how I'm feelF|QHhe |:8up|'re|make8|You| you |nev>|give|ay itC|been | oth> |er|t's |me|A|EC0|\n|D|RN|ing |G| t|I|aK|nd |o |n't |N|O|ll | know|\r"
    .Split('|')
    .Aggregate(
        "We5 nLstrang>sHLloveC73rules JsLdLICA fuPcommit@n?what I'mHhinkFofC7 wouldMgetHhis from any=guy-*C+AKif8ask @ 2CDoMteP@8\b5HoLbliKtLseeC*C*CC//..+-*C*C*",
        (x,t)=>x.Replace(f++.ToString(),t)));
}

Eu gosto da REPLACEabordagem inteligente , especialmente com o SQL dinâmico, mas existem muitas maneiras de jogar mais: Use @como variável em vez de @s, torne-a uma tabela permanente em tvez de #t(você não precisa se limpar), livrar-se da declaração COLLATE 29 caracteres e simplesmente exigir que ele seja executado em um servidor / banco de dados com o agrupamento, utilização varchar(999)ou varchar(max), toneladas de espaço em branco desnecessário em torno de sinais de igual e vírgulas, etc.
BradC

587 - o link é para pastbin devido à limitação de tamanho do comentário.
dana

7

PHP, 591 585 568 564 bytes

<?=strtr(ucwords(str_replace(range('-',a),split(q,"/3/let@d_n/runxarouPxBdese5/?cry/sayxKodbye/7VliLBhu5
q;)/4,x04
 3)q
0qneOUCq;,x3)q
ixju[TNnax7J6KttV?uPR[Nd
q4@upqgiOqrZJqxh_If`lA
qtellxq
S'O=nxeach<foUsMlXg>UheartDachAxbut>HshyEsG\sidLwLboY=FDKAxX
S:gamLB9CplGqS'rLq=QhLq
 oohqxoYRxqxkn_q
Jqmake@qxJxq\gqNdxqgXnVq'^b`nxqQMqThatqayxit
q'rLtoMqxz'mxqyouq".join(q,str_split(goexoxanvendxterwexwrxaxmeonthtxstinulsxoweea,2))),"9nM[rNgRsEloO>:r]e^BsMdMz
Vf]lxcommitWnt'sFIY\kAxof>To]dn'ZgetxYi^fromxNy<guy2-8Bif@askxW6dX'tx7mLJHbliPEs`
--11..
82---")),'x z',' (I');

Eu acho que você pode estar faltando algo no código; parece causar um erro: ideone.com/WxIpG
Cristian Lupascu

Este é o PHP 5.4. Para versões mais antigas substituir [z => xx] com array (z => xx) (e obter 590 bytes)
uma triste cara

sim, ideone.com/o8hdU funciona. Bom, +1!
Cristian Lupascu

1
Uma solução mais curto PHP (usando as regras do meu código Ruby): ideone.com/XoW5t
Ed H.

Sim, adivinhe "LOWERCASE TUDO!" afinal, foi uma péssima ideia) legal!
um cara triste

7

Ruby, 1014 bytes

Estou apenas aprendendo programação, então não vou quebrar nenhum recorde aqui. Mas, essa foi uma tarefa divertida.

def c
  wonts = ['give you up', 'let you down', 'run around and desert you', 'make you cry', 'say goodbye', 'tell a lie and hurt you']
  wonts.each do |w|
    puts "Never gonna #{w}"
  end
  b
end

def b
  puts "\n"
end

def never
  puts "Never gonna give, never gonna give
(Give you up)"
end

def v1
puts "We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand"
b
end

def v2
  puts "We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it"
end

def s1
puts "And if you ask me how I'm feeling
Don't tell me you're too blind to see"
end

def s2
b
puts "I just wanna tell you how I'm feeling
Gotta make you understand"
b
end

def soul
2.times {puts "(Ooh, give you up)"}
puts "(Ooh)"
never
puts "(Ooh)"
never
end

v1
c
v2
s1
b
c
c
soul
b
v2
s2
c
c
c

2
Algumas dicas: mudar a cada nome de variável para um nome de uma personagem, remova recuo e remover os espaços em torno de operadores
TuxCrafting

6

GolfScript (511 bytes)

Isso usa uma mudança de base para compactar os bits, por isso inclui caracteres que não estão em ASCII. No entanto, não é apropriado pontuar esses caracteres pela codificação UTF-8, porque o intérprete trata o programa como ISO-8859-1. Por esse motivo, especifiquei o comprimento em bytes, em vez de caracteres.

Codificado na base 64:

J4w1DTwkp317WvYq88CFQym52dINzC36obopJBLKCGZZHq1S+tpz79e4/JdDYS2cdIlm+LUARZ1w
wpJyGDhagRfmNaJWjOt8yZIiIFai/7cMAeKucCTyZpkYmCb/7ogGRwfR1dV0z9wEOoIFo0dudezp
ERmcWcJ7X1CUcUsVz17ScmG7T2SbTnooFFINjz7y1yW9i7k9iFTM/afWhI4A/wuqo6jPRezucfGQ
g1xcvmEsidxT+jKCaYv3Gh4lvcfMdklUNqqeQG/tMDVrk0pUQjz5CVFcJ5uYRLAPzfwQI5sUKHzO
rBZrx/hAC9MPISJPKAQLP4dU3Yy14zL/djogoBxkG1DNRMoPEtwHIZmEPwaELWshCTdS+vF+zI6X
ei7BL5bqVhXZdKGqPFjHS0+rQfHUDUfggt/AkIGfV/focklq9IXmqINpS4eroTqzCMLJQpiZiTXm
7jdu1xqm1hftTPEr/VteBOCqKIsx596o+/ZaGRi/opjley/l2bnZi4Z6L+TZsqUqyj4Pfhf4JFiw
9a/kcBffIu2yWmQGgSOeHwcyllCMvL27qtw1+CEKtuya5ITI1oRWUasTSdBWin3XBQePAWEW7dp7
qoiP1osWiicyNTZiYXNlIDE1M2Jhc2VbMF0vKDMwLHtcWzEkKV0vXDIkPSp9L1wsKXstfSslKw==

Despejo hexadecimal (saída de xxd):

0000000: 278c 350d 3c24 a77d 7b5a f62a f3c0 8543  '.5.<$.}{Z.*...C
0000010: 29b9 d9d2 0dcc 2dfa a1ba 2924 12ca 0866  ).....-...)$...f
0000020: 591e ad52 fada 73ef d7b8 fc97 4361 2d9c  Y..R..s.....Ca-.
0000030: 7489 66f8 b500 459d 70c2 9272 1838 5a81  t.f...E.p..r.8Z.
0000040: 17e6 35a2 568c eb7c c992 2220 56a2 ffb7  ..5.V..|.." V...
0000050: 0c01 e2ae 7024 f266 9918 9826 ffee 8806  ....p$.f...&....
0000060: 4707 d1d5 d574 cfdc 043a 8205 a347 6e75  G....t...:...Gnu
0000070: ece9 1119 9c59 c27b 5f50 9471 4b15 cf5e  .....Y.{_P.qK..^
0000080: d272 61bb 4f64 9b4e 7a28 1452 0d8f 3ef2  .ra.Od.Nz(.R..>.
0000090: d725 bd8b b93d 8854 ccfd a7d6 848e 00ff  .%...=.T........
00000a0: 0baa a3a8 cf45 ecee 71f1 9083 5c5c be61  .....E..q...\\.a
00000b0: 2c89 dc53 fa32 8269 8bf7 1a1e 25bd c7cc  ,..S.2.i....%...
00000c0: 7649 5436 aa9e 406f ed30 356b 934a 5442  vIT6..@o.05k.JTB
00000d0: 3cf9 0951 5c27 9b98 44b0 0fcd fc10 239b  <..Q\'..D.....#.
00000e0: 1428 7cce ac16 6bc7 f840 0bd3 0f21 224f  .(|...k..@...!"O
00000f0: 2804 0b3f 8754 dd8c b5e3 32ff 763a 20a0  (..?.T....2.v: .
0000100: 1c64 1b50 cd44 ca0f 12dc 0721 9984 3f06  .d.P.D.....!..?.
0000110: 842d 6b21 0937 52fa f17e cc8e 977a 2ec1  .-k!.7R..~...z..
0000120: 2f96 ea56 15d9 74a1 aa3c 58c7 4b4f ab41  /..V..t..<X.KO.A
0000130: f1d4 0d47 e082 dfc0 9081 9f57 f7e8 7249  ...G.......W..rI
0000140: 6af4 85e6 a883 694b 87ab a13a b308 c2c9  j.....iK...:....
0000150: 4298 9989 35e6 ee37 6ed7 1aa6 d617 ed4c  B...5..7n......L
0000160: f12b fd5b 5e04 e0aa 288b 31e7 dea8 fbf6  .+.[^...(.1.....
0000170: 5a19 18bf a298 e57b 2fe5 d9b9 d98b 867a  Z......{/......z
0000180: 2fe4 d9b2 a52a ca3e 0f7e 17f8 2458 b0f5  /....*.>.~..$X..
0000190: afe4 7017 df22 edb2 5a64 0681 239e 1f07  ..p.."..Zd..#...
00001a0: 3296 508c bcbd bbaa dc35 f821 0ab6 ec9a  2.P......5.!....
00001b0: e484 c8d6 8456 51ab 1349 d056 8a7d d705  .....VQ..I.V.}..
00001c0: 078f 0161 16ed da7b aa88 8fd6 8b16 8a27  ...a...{.......'
00001d0: 3235 3662 6173 6520 3135 3362 6173 655b  256base 153base[
00001e0: 305d 2f28 3330 2c7b 5c5b 3124 295d 2f5c  0]/(30,{\[1$)]/\
00001f0: 3224 3d2a 7d2f 5c2c 297b 2d7d 2b25 2b    2$=*}/\,){-}+%+

Como a maioria das melhores soluções, isso usa uma abordagem baseada em gramática com divisões e junções de strings para expandir a gramática. A gramática tem 30 regras e foi encontrada por uma pesquisa gananciosa.


6

JavaScript, 854 caracteres (novas linhas adicionadas para "legibilidade")

var a="We're no strangers to love:You know the rules and so do I:A full commitment's what I'm thinking of:You wouldn't get this from any other guy:I just wanna tell you how I'm feeling:Gotta make you understand:Never gonna give you up:Never gonna let you down:Never gonna run around and desert you:Never gonna make you cry:Never gonna say goodbye:Never gonna tell a lie and hurt you:We've known each other for so long:Your heart's been aching but:You're too shy to say it:Inside we both know what's been going on:We know the game and we're gonna play it:And if you ask me how I'm feeling:Don't tell me you're too blind to see:6:7:8:9:10:11:6:7:8:9:10:11:(Ooh, give you up):31:(Ooh):Never gonna give, never gonna give:(Give you up):33:34:35:12:13:14:15:16:4:5:6:7:8:9:10:11:6:7:8:9:10:11:6:7:8:9:10:11".split(':'),
i=0,x;
while(x=a[i++])console.log(a[x]||x)


5

Shive / eco ingênuo - 810 bytes

#!/bin/sh
A="ever gonna"
D=" you"
B="ive$D up"
C="$A give"
echo "We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell$D how I'm feeling
Gotta make$D understand"
f(){
echo "
N$C$D up
N$A let$D down
N$A run around and desert$D
N$A make$D cry
N$A say goodbye
N$A tell a lie and hurt$D"
}
f
g(){
echo "
We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it"
}
g
echo "And if$D ask me how I'm feeling
Don't tell me$D're too blind to see"
f
f
echo "
(Ooh, g$B)
(Ooh, g$B)
(Ooh)
N$C, n$C
(G$B)
(Ooh)
N$C, n$C
(G$B)"
g
echo
echo "I just wanna tell$D how I'm feeling
Gotta make$D understand"
f
f
f

5

JavaScript 789 caracteres

Meu javascript (imprime com "document.write ()"):

eval('f="18927993248999".replace(/1/g,"Were no strangers to love4You6тe rules and so do I4A full commitmentжs what Iжm тinking of4You wouldnжt get тis from any oтer guy4ю8/g,"I just wanna tellйhow Iжm feeling4Gotta makeйunderstand44ю9/g,"Neverгgiveйupвгletйdownвгrun around and desert youвгmakeйcryвгsay goodbyeвгtell a lie and hurt you44ю2/g,"Weжve known each oтer for so long4Your heartжs been aching but4Youжre too shy to say it4Inside we boт6whatжs been going on4We6тe game and weжreгplay it4ю7/g,"And ifйask me how Iжm feeling4Donжt tell me youжre too blind to see44ю3/g,"ц, gяц, gяц)вгgive, neverгgive4(Gяц)вгgive, neverгgive4(Gя4 ют/g,"thюя/g,"iveйup)4юй/g," you юв/g,"4Neverю4/g,"</br>юц/g,"(Oohю6/g," know юг/g," gonna юж/g,"\'");document.write(f);'.replace(/ю/g,"\").replace(/"))

Altero algumas palavras e frases comuns com letras cirílicas e depois as troquei de volta com a função replace ().

Depois de encurtar a letra, abreviei meu programa com o mesmo método e executei o código com eval ().


5

Ruby, 741 678 657 627 619 bytes

_="12/3400/5/3/200"
28.times{|i|_.gsub!'120=34589%#^*&@!/?><[]|{}:;~'[i],"We? n{strangers] love/>& the rules!s{d{I/A full commitment's}hat:thinking of/>}ouldn't~et this from;ny<guy/+I just}anna [*@/Gotta make* understand/0+=g#=let* down=run;round!desert*=make* cry=say~oodbye=[; lie!hurt*/+/N^+We've&n each<for s{long/>r heart's been;ching but/>?]{shy] say it/Inside}e both&}hat's been~oing on/We& the~ame!we?|play it/+And if*;sk me@/Don't [ me*?]{blind] see/+8899+(Ooh,~#)/+(Ooh)/N%, n%/(G#)/+^give+ive* up+ever|+ you+ know+ how:feeling+;nd +\n+'re+You+ other +tell+ to+~onna +o + w+ I'm + a+ g".split('+')[i]}
puts _

Esta é uma expansão de símbolo iterativo. Para cada um dos 28 caracteres da sequência no primeiro argumento para gsub!, todas as ocorrências desse caractere _são substituídas pela seção apropriada da segunda sequência (separada por +caracteres).


5

Python, 573 caracteres

Minha sedsolução não vai mais longe, e foi derrotada por várias pessoas, então fui para uma nova abordagem.
Infelizmente, é bom o suficiente para o lugar (a partir de agora) - Ed H. ainda está muito à minha frente .

x="WM n=straQRsF=loB7Erules3s=d=IXA full commitSnt'sKhatVFhink;of7KTldn'tUetFhis fromLny9guy.-AC if?Lsk S1Don'tFP S?<bliCF=see//X82)8002)-.//"
i=45
for r in"XXW'BHn each9for s=loQ7r hear6ach;but7<shyF=s@InsideKe bothHKha6go;onXWEgaS3weM:pl@|XI justKannaFP?1Gotta >uCRstaC/|X4g24let? down4runLrTC3desRt?4>cry4sayUoodbye4tPL lie3hurt?|2)J)4giB, n5giBX(G| howV feeliQX|iB? up|LC |XN5|eBr:|t's been |XYT|J,U| othR |Uonna |iQ |MFo=|o |make? | yT|ay itX|A|ve|nd|D|HFhe | t|G| know|I|X(Ooh| w| a|'re|N|O|ell|ng|er|me|ou| g| I'm|We|\n".split("|"):x=x.replace(chr(i),r);i+=1
print x

Notas :

  1. A idéia principal foi emprestada de Ed H. - usando caracteres consecutivos para substituição, em vez de especificá-los em cada regra de substituição.

  2. Minha maneira de lidar com os personagens que existem na música é diferente da de Ed - simplesmente traduzo cada um para si (e se for sempre seguido por algo, adicione-o também, o que só funcionou W).

  3. O código é gerado por um script que procura boas traduções. No começo, usei um algoritmo ganancioso, que simplesmente pega o que oferece a melhor redução. Então eu descobri que ajustá-lo para preferir cordas mais longas melhora um pouco. Eu acho que ainda não é o ideal.


Eu também tentei gerar a string através de um algoritmo ganancioso, que acabou adicionando 11 caracteres. Percebi que todas as soluções python convergem para uma forma ideal mais ou menos semelhante. Eu acho que combina com o 'único caminho óbvio para isso'.
Optimus

No passado, eu ocasionalmente descobri que funciona para modificar esses scripts para usar um algoritmo principalmente ganancioso, adicionando um pouco de slop para permitir aleatoriamente a seleção de uma segunda ou terceira posição e depois executá-la repetidamente procurando melhorias. (Ou se eu estou motivado o suficiente, codificar uma busca heurística como recozimento simulado.)
breadbox

Eu executei uma simulação simples modificando meu ranking de algoritmo ganancioso em uma expressão com coeficientes variáveis ​​para o comprimento do padrão e número de contagens, fiz apenas cerca de 100000 simulações (encontrar o maior padrão é muito lento) com valores aleatórios para coeficientes (entre -100 e 100 com distribuição gaussiana em torno de zero), encontrou um par que dava 15 caracteres a menos do que minha corda triturada manualmente, reduzindo minha solução para 590 caracteres. Acho que vou deixar passar da noite para o dia para ver se produz algo melhor.
Optimus

@ Optimus, acho que as duas primeiras traduções são óbvias, e você pode codificá-las. Isso acelera minha lógica de pesquisa significativamente. Minha lógica é muito lenta - ~ 30 segundos para uma única execução -, portanto, não é útil para simulação. Eu posso tentar otimizar isso.
Ugoren

@ugoren Publiquei meu código de simulação na minha resposta, ele é executado em cerca de 0,5 segundos por execução e sim, eu já faço o hardcode nos primeiros 3-4 passos, o que o reduz em cerca de 30 caracteres, parece que não consegue passar do mínimo, pode você dá uma olhada e sugere algo.
Optimus

5

Golfscript, 708 702 699 691 bytes

"Never gonna ":g;
"I just wanna tell you how"" I'm feeling":i"
Gotta make you understand"++:j;
{n"give you up
let you down
run around and desert you
make you cry
say goodbye
tell a lie and hurt you"n/{n g@}%}:^;"

We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
":_;
"We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
"j
^
_
"And if you ask me how"i"
Don't tell me you're too blind to see"
^^
n
n
"(Ooh, give you up)
"."(Ooh)
"g"give, never gonna give
(Give you up)"++.n\_
j
^^^

Posso estar perdendo alguma coisa, mas não vejo uma razão para os bloqueios. Você não pode simplesmente usar, por exemplo " I'm feeling":i;?
Peter Taylor

@ PeterTaylor Você está perfeitamente certo; os blocos são necessários apenas quando atribuo várias strings a uma variável. Muito obrigado! Isso retira 6 caracteres e me deu outra idéia que eu posso experimentar.
Cristian Lupascu

Sim, funcionou! Em vez de atribuir um bloco à variável j, designei três concatenadas para as strings (excluídas {e }, mas adicionadas ++para concatenação). Isso me permitiu declarar iinline ao compor o conteúdo de j.
Cristian Lupascu

Eu acho que você pode economizar um pouco mais, puxando uma nova linha que conduz ge para o coro usando uma única corda com novas linhas e, em seguida,n/g*
Peter Taylor

Boa ideia! Eu não poderia alterar g, pois também é usado no final (realmente possível, mas teria custado mais 1 char no final). No entanto, a abordagem de divisão / dobra para inserir g no início de cada linha é uma ótima economia de caracteres.
Cristian Lupascu

5

Java, 858 bytes

interface a{static void main(String[]A){String b="I just wanna tell you how I'm feeling\nGotta make you understand\n\n",B="Never gonna give you up\nNever gonna let you down\nNever gonna run around and desert you\nNever gonna make you cry\nNever gonna say goodbye\nNever gonna tell a lie and hurt you\n\n",c="We've known each other for so long\nYour heart's been aching but\nYou're too shy to say it\nInside we both know what's been going on\nWe know the game and we're gonna play it\n",C="(Ooh, give you up)\n",d="(Ooh)\nNever gonna give, never gonna give\n(Give you up)\n";System.out.print("We're no strangers to love\nYou know the rules and so do I\nA full commitment's what I'm thinking of\nYou wouldn't get this from any other guy\n"+b+B+c+"And if you ask me how I'm feeling\nDon't tell me you're too blind to see\n\n"+B+B+C+C+d+d+"\n"+c+"\n"+b+B+B+B);}}

Uau. Eu realmente não acho que poderia comprimir isso com força.

Ungolfed De uma forma legível por humanos:

interface a {
    static void main(String[] A) {
        String b = "I just wanna tell you how I'm feeling\n"+
                   "Gotta make you understand\n\n";

        String B = "Never gonna give you up\n"+
                   "Never gonna let you down\n"+
                   "Never gonna run around and desert you\n"+
                   "Never gonna make you cry\n"+
                   "Never gonna say goodbye\n"+
                   "Never gonna tell a lie and hurt you\n\n";

        String c = "We've known each other for so long\n"+
                   "Your heart's been aching but\n"+
                   "You're too shy to say it\n"+
                   "Inside we both know what's been going on\n"+
                   "We know the game and we're gonna play it\n";

        String C = "(Ooh, give you up)\n";

        String d = "(Ooh)\n"+
                   "Never gonna give, never gonna give\n"+
                   "(Give you up)\n";

        System.out.print(
            "We're no strangers to love\n"+
            "You know the rules and so do I\n"+
            "A full commitment's what I'm thinking of\n"+
            "You wouldn't get this from any other guy\n"+
            b+
            B+
            c+
            "And if you ask me how I'm feeling\n"+
            "Don't tell me you're too blind to see\n\n"+
            B+
            B+
            C+
            C+
            d+
            d+
            "\n"+
            c+
            "\n"+
            b+
            B+
            B+
            B
        );
    }
}

Eu bati 14 respostas com isso. Estou ficando muito bom em jogar golfe em Java, ou é apenas porque as letras dessa música são surpreendentemente fáceis de compactar?
dorukayhan

Você não pode atribuir variáveis ​​como String a = "1", b = "2"; em vez do caminho acima? Salva alguns bytes: P
Mario Ishac 23/06/16

MarDev @ Eu criei as cordas assim no programa de golfe. No entanto, fazer isso prejudica a legibilidade, então eu os fiz como String foo; String bar;quando estavam jogando golfe.
dorukayhan

Todos aqueles "Nunca vai" poderia ser otimizado, também extraindo-o em uma variável
masterX244


4

JavaScript, 1428 1451 883 * caracteres

Definitivamente não é a solução mais curta, mas aqui está.

d="(Give you up):(Ooh):(Ooh, give you up):A full commitment's what I'm thinking of:And if you ask me how I'm feeling:Don't tell me you're too blind to see:Gotta make you understand:I just wanna tell you how I'm feeling:Inside we both know what's been going on:Never gonna give you up:Never gonna give, never gonna give:Never gonna let you down:Never gonna make you cry:Never gonna run around and desert you:Never gonna say goodbye:Never gonna tell a lie and hurt you:We know the game and we're gonna play it:We're no strangers to love:We've know each other for so long:We've known each other for so long:You know the rules and so do I:You wouldn't get this from any other guy:Your heart's been aching but:You're too shy to say it:".split(/:/);"hk3l76o9bdcefojmn8g45o9bdcefo9bdcefo221a01a0oimn8go76o9bdcefo9bdcefo9bdcef".split("").map(function(i){return d[parseInt(i,25)]}).join("\n")

A lógica da solução é bem simples:

d="dictionary:of:uniqe:lines".split("/:/");
"012345".split("").map(function(i){return d[parseInt(i,25)]}).join("\n")

* É claro que a solução se torna muito mais curta ao usar linhas únicas em vez de palavras únicas.

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.