Codificando uma URL no brainfuck

11

Inspirado por essa pergunta , seu objetivo hoje é codificar um URL no cérebro.

Meu navegador foi invadido! A barra de localização foi transformada em um intérprete cerebral. Eu preciso de um programa que transforme uma URL em um programa de foda cerebral. Meu computador também é muito lento, por isso, se o programa brainfuck for pequeno, é melhor.

Ah, e só tenho uma aba de trabalho aberta, meu twitter. Então você só pode me enviar o programa em um tweet.


  1. Escreva um programa que caiba em um tweet (140 caracteres) em qualquer idioma que use uma string como entrada e produza um programa de foda cerebral.

  2. Este programa brainfuck será executado sem entrada e irá gerar uma saída.

  3. Esta saída será inserida na barra de localização do Google Chrome e executada.

  4. Se o comportamento do Google Chrome for idêntico ao que você obteria inserindo a sequência de entrada do número 1, a solução será válida. O redirecionamento por encurtadores de URL é considerado um comportamento diferente - permaneça pelo menos no mesmo domínio.

Você pode presumir que o intérprete de cérebro com números infinitos assinados com precisão infinita em cada célula e uma quantidade ilimitada de células.

Sua pontuação é determinada pela soma dos comprimentos dos programas de troca de cérebro gerados para codificar o seguinte conjunto de URLs:

https://www.google.com/
/codegolf/47895/
http://www.golfscript.com/golfscript/examples.html
http://en.wikipedia.org/wiki/Percent-encoding
ftp://ftp.freebsd.org/pub/FreeBSD/
https://github.com/isaacg1/pyth/blob/master/doc.txt#L92
http://ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README

Menor pontuação ganha.

orlp
fonte
Podemos assumir que a entrada seria formatada assim: http://www.google.com/ou será simplesmente google.com? (Ambos são válidos na medida em que o Google Chrome está em causa, mas a sua lista contém apenas os formulários completos) PS Eu quase tenho um desejo de escrever uma extensão para o Chrome que faz isso ...
BrainSteel
2
@BrainSteel A entrada para o seu codificador será exatamente a indicada na pergunta (cada linha é uma entrada). A saída do brainfuck pode ser qualquer formato aceito pelo Google Chrome, desde que tenha o mesmo comportamento da string de entrada original. Portanto, se seu programa leva entrada http://www.google.com/do programa brainfuck que produz saída pode google.com, www.google.com, etc, porque todos eles resultam na mesma página. Mas, por exemplo, ftp://ftp.freebsd.org/pub/FreeBSD/não é o mesmo que ftp.freebsd.org/pub/FreeBSD/.
orlp
Ah, obrigado por esclarecer! Desculpe, estou um pouco lento esta manhã.
BrainSteel
Gostaria de esclarecer que falhei e ftp://ftp.freebsd.org/pub/FreeBSD/é o mesmo que ftp.freebsd.org/pub/FreeBSD/no Google Chrome. Isso torna o desafio um pouco mais fácil do que eu pretendia, mas a vida é assim. Não vou mudar os requisitos, por isso é seguro retirar tudo antes ://.
orlp

Respostas:

7

Pitão - 118 bytes, pontuação: 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

Agora usando o fator de multiplicação algo!

Este é um algoritmo bastante simples, embora um pouco melhor que o anterior. Eu estava planejando usar o Pyth, mas com o algoritmo atual o Python se encaixa <140 bytes .

=zecz"//"=z?>z4}"www."zz=z?Pzqez\/zFNzKCNJ/^K.5 1=d\+pk+holN[?*-KZd>KZ*-ZK\-+\>*dK+++++\>*Jd"[>"*Jd"<-]>"*-K*JJd)\.=ZK

Primeiro, retira o http://usando split("//")e www.oe /no final. Em seguida, ele usa a função min para verificar qual é a melhor das três opções consideradas:

  1. Use +ou -para atualizar o valor atual da célula para o valor desejado da célula
  2. Vá para a nova célula e preencha com +'s
  3. Vá para a nova célula e use a multiplicação para atualizar, executando sqrt (n) * sqrt (n) + restante, pois o quadrado tem perímetro mínimo de área constante. http://cydathria.com/bf/bf_ex3.html

Eu sempre coloco um .para gerar cada caractere.

Uma explicação detalhada do novo código está disponível em breve. Eu meio que avaliei o golfe, especialmente a retirada www.e /o final, mas não posso me incomodar, pois estou com 20 bytes abaixo do limite.

Surpreendentemente, isso funciona nos ftp://URLs, pois esse é o chrome e o chrome transforma automaticamente ftp.freebsd.org/pub/FreeBSD/emftp://ftp.freebsd.org/pub/FreeBSD/

Planejo usar o dicionário para armazenar os valores das células e verificar se o caractere já foi criado em uma célula.


Extensão Brainfuck Omnibox

Está certo! Depois de ver o comentário do @ BrainSteel, soube que precisava fazê-lo. Isso não assumir todo o omnibox, somente quando você faz bf, tab. Além disso, como a API da omnibox é estranha, ela não me permite encaminhar o código para a omnibox, eu tenho que lidar com isso sozinho. Então, faço minha própria http://verificação e defino o URL da guia.

Como não estava com vontade de pagar os US $ 5 necessários para colocar sua extensão na loja virtual, vocês terão que instalá-la manualmente. Faça o download do zip aqui: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , descompacte, vá para a página de extensões no chrome, clique na caixa de opção do modo dev no canto superior direito e carregue a extensão descompactada.

Espero que vocês gostem! :)

Maltysen
fonte
Isso não funcionará no ftp://URL.
PurkkaKoodari
1
@ Pietu1998 foi o que pensei no começo, mas o Chrome me surpreendeu. Tente colocar ftp.freebsd.org/pub/FreeBSD/ na barra de endereços e o Chrome fará com que ele funcione ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen 19/15
@Maltysen Oops. Eu incluí intencionalmente esse URL para impedir essa otimização, mas parece que eu falhei. Esse URL é realmente diferente, mas parece que o Chrome é realmente inteligente o suficiente para reconhecer e adicionar ftp://. Ah bem.
orlp
4

C, 140 134 132 138 128 139 Bytes

263 + 816 + 911 + 955 + 827 + 1355 + 1779 = 7269 6906 bytes

Atualização: 6 bytes a menos, graças ao nutki!

Atualize novamente, 128 bytes. O código é significativamente menos legível. Agora, ele também tenta extrair o URL ftp://.

Atualize o terceiro, em 139 bytes. O código é um pouco mais legível e se livrou de um comportamento indefinido desagradável. Agora, se o nome do site for precedido por www., ele será removido. Eu tinha menos de 7k, mas acho que devo conceder a Maltysen com Pyth. Bem feito.

#define p putchar
a;main(int c,char**V){while(*V[1]++-47);*++V+=1;for(*V+=**V-'w'?0:4;c=**V;*V+=1,p(46))for(;c-a;a+=c>a?1:-1)p(c>a?43:45);}

Desvendou um pouco:

#define p putchar
a;
main(int c,char**V){
    while(*V[1]++-47);
    *++V+=1;
    for(*V+=**V-'w'?0:4;c=**V;*V+=1,p(46))
        for(;c-a;a+=c>a?1:-1)
            p(c>a?43:45);
}

Este código tem um URL na linha de comando, e converte-lo em BF usando apenas ., -e +. O código faz uma tentativa para tirar a corda do ftp://, http://, https://, e www.antes de converter a BF. Aqui está uma lista de saídas das saídas:

google.com/
codegolf.stackexchange.com/questions/47895/
golfscript.com/golfscript/examples.html
en.wikipedia.org/wiki/Percent-encoding
ftp.freebsd.org/pub/FreeBSD/
github.com/isaacg1/pyth/blob/master/doc.txt#L92
ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README
BrainSteel
fonte
Que tal usar um loop interno: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)deve funcionar.
nutki
@nutki Impressive! Obrigado!
BrainSteel
"Observe que, se pudermos assumir que nenhum URL começa com algo além de http: //, https: // ou ftp: //, podemos remover 10 bytes desta solução." Sua solução precisa funcionar apenas para o conjunto de dados acima, portanto, você pode assumir o que quiser, desde que o conjunto de dados ainda seja tratado corretamente /
orlp
@orlp Hooray! Isso soa como 12 bytes para brincar! Obrigado por este desafio, tem sido muito divertido!
BrainSteel
4

Brainfuck, 77 bytes, Pontuação = 31647

Pontuação é a soma de codepoint+4para cada personagem.

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

(Usa implementação BF com EOF = 0.)

Exemplo:

input:
!bar

output:
+++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]
randomra
fonte
0

JavaScript (ES6) - 137 bytes, pontuação - 7413

Este usa apenas ., +e -. Você pode testá-lo no console do Firefox.

B=s=>[...s.replace(/^h.+\/\//,'')].map((c,i,a)=>(v=i?c[C]()-a[i-1][C]():c[C='charCodeAt']())?'-+'[v>0|0].repeat(v>0?v:-v):'').join('.')+'.'

Este é o meu contador de pontuação:

[
    'https://www.google.com/',
    'http://codegolf.stackexchange.com/questions/47895/',
    'http://www.golfscript.com/golfscript/examples.html',
    'http://en.wikipedia.org/wiki/Percent-encoding',
    'ftp://ftp.freebsd.org/pub/FreeBSD/',
    'https://github.com/isaacg1/pyth/blob/master/doc.txt#L92',
    'http://ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README'
].map(B).join('').length
core1024
fonte