Codificar una URL en brainfuck

11

Inspirado por esta pregunta , su objetivo hoy es codificar una URL en brainfuck.

¡Mi navegador ha sido pirateado! La barra de ubicación se ha convertido en un intérprete loco. Necesito un programa que convierta una URL en un programa mental. Mi computadora también es muy lenta, por lo que si el programa Brainfuck es pequeño, es mejor.

Ah, y solo tengo una pestaña de trabajo abierta, mi twitter. Así que solo puedes enviarme el programa en un tweet.


  1. Escriba un programa que se ajuste a un tweet (140 caracteres) en cualquier idioma que tome una cadena como entrada y genere un programa de brainfuck.

  2. Este programa brainfuck se ejecutará sin entrada y generará una salida.

  3. Este resultado se insertará en la barra de ubicación de Google Chrome y se ejecutará.

  4. Si el comportamiento de Google Chrome es idéntico al comportamiento que obtendría al ingresar la cadena de entrada del # 1, entonces la solución es válida. La redirección por acortadores de URL se considera un comportamiento diferente: permanezca al menos en el mismo dominio.

Puede suponer que el intérprete de brainfuck tiene enteros con infinitos signos de precisión en cada celda y una cantidad ilimitada de celdas.

Su puntaje está determinado por la suma de las longitudes de los programas de brainfuck generados para codificar el siguiente conjunto de URL:

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

El puntaje más pequeño gana.

orlp
fuente
¿Podemos suponer que la entrada se formateará de esta manera: http://www.google.com/o alguna vez será simplemente google.com? (Ambos son válidos en lo que respecta a Google Chrome, pero su lista solo contiene los formularios completos) PD: Casi deseo escribir una extensión para Chrome que haga esto ...
BrainSteel
2
@BrainSteel La entrada para su codificador será exactamente como se indica en la pregunta (cada línea es una entrada). La salida del brainfuck puede ser cualquier formato aceptado por Google Chrome, siempre que tenga el mismo comportamiento que la cadena de entrada original. Así que si su programa toma la entrada http://www.google.com/del programa brainfuck produce una salida de mayo google.com, www.google.com, etc, ya que todo el resultado en la misma página. Pero, por ejemplo, ftp://ftp.freebsd.org/pub/FreeBSD/no es lo mismo que ftp.freebsd.org/pub/FreeBSD/.
orlp
Ah, gracias por aclarar! Lo siento, estoy un poco lento esta mañana.
BrainSteel
Me gustaría aclarar que fallé, y eso ftp://ftp.freebsd.org/pub/FreeBSD/es lo mismo que ftp.freebsd.org/pub/FreeBSD/en Google Chrome. Esto hace que el desafío sea un poco más fácil de lo que pretendía, pero así es la vida. No cambiaré los requisitos, por lo que es seguro quitarse cualquier cosa antes ://.
orlp

Respuestas:

7

Pyth - 118 bytes, puntuación: 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

¡Ahora usando el factor de multiplicación algo!

Este es un algoritmo bastante simple, aunque un poco mejor que los anteriores. Estaba planeando usar Pyth, pero con el algoritmo actual Python se ajusta a <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

Primero elimina el http://mediante el uso split("//")y el www.y /al final. Luego usa la función min para verificar cuál es la mejor de las tres opciones que se consideran:

  1. Use +o -para actualizar el valor de celda actual al valor de celda deseado
  2. Ir a la nueva celda y simplemente llenar con +'s
  3. Vaya a la nueva celda y use la multiplicación para actualizar haciendo sqrt (n) * sqrt (n) + resto ya que el cuadrado tiene un perímetro mínimo de área constante. http://cydathria.com/bf/bf_ex3.html

Entonces siempre pongo un .para dar salida a cada char.

Próximamente se ofrecerá una explicación detallada del nuevo código. De alguna manera, le di media vuelta al golf, especialmente al despojarlo www.y /al final, pero no me molestan ya que tengo 20 bytes por debajo del límite.

Esto sorprendentemente funciona en las ftp://URL, ya que es cromo y el cromo se convierte automáticamente ftp.freebsd.org/pub/FreeBSD/enftp://ftp.freebsd.org/pub/FreeBSD/

Luego planeo usar un diccionario para almacenar los valores de las celdas y ver si el carácter ya está hecho en una celda.


Brainfuck Omnibox Extension

¡Así es! Después de ver el comentario de @ BrainSteel, supe que tenía que hacerlo. Esto no quiere hacerse cargo de la totalidad del cuadro multifunción, sólo cuando lo hace bf, tab. Además, dado que la api del omnibox es extraña, no me permite reenviar el código al omnibox, tengo que manejarlo yo mismo. Entonces hago mi propia http://comprobación y luego configuro la URL de la pestaña.

Como no tenía ganas de pagar los $ 5 necesarios para poner su extensión en la tienda web, tendrán que instalarla manualmente. Simplemente descargue el zip desde aquí: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , descomprima, vaya a la página de extensiones en Chrome, haga clic en el cuadro de opción de modo de desarrollo en la parte superior derecha y cargar la extensión desempaquetada.

¡Espero que lo disfruten! :)

Maltysen
fuente
Esto no funcionará en la ftp://URL.
PurkkaKoodari
1
@ Pietu1998 eso fue lo que pensé al principio, pero Chrome me sorprendió. Intente poner ftp.freebsd.org/pub/FreeBSD/ en su barra de direcciones y Chrome lo hará ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen
@Maltysen Vaya. Había incluido intencionalmente esa URL para evitar esta optimización, pero parece que fallé. Esta URL es realmente diferente, pero parece que Chrome es lo suficientemente inteligente como para reconocerla y agregarla ftp://. Oh bien.
orlp
4

C, 140 134 132 138 128 139 Bytes

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

Actualización: 6 bytes menos, ¡gracias a nutki!

Actualice nuevamente, 128 bytes. El código es significativamente menos legible. Ahora también intenta eliminar la URL de ftp://.

Actualice el tercero, a 139 bytes. El código es un poco más legible y eliminó un comportamiento indefinido desagradable. Ahora, si el nombre del sitio está precedido por www., se elimina. Tengo menos de 7k, pero creo que debo cederle a Maltysen con Pyth. Bien hecho.

#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);}

Desenredado un poco:

#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 toma una dirección URL en la línea de comandos, y la convierte en BF utilizando únicamente ., -y +. El código hace un intento de despojar a la cadena de ftp://, http://, https://, y www.antes de convertirse al BF. Aquí hay una lista de salidas de las salidas:

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
fuente
¿Qué tal el uso de un bucle interno: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)debería funcionar.
nutki
@nutki ¡Impresionante! ¡Gracias!
BrainSteel
"Tenga en cuenta que si asumimos que ninguna URL comienza con otra cosa que no sea http: //, https: // o ftp: //, podemos eliminar 10 bytes de esta solución". Su solución solo tiene que funcionar para el conjunto de datos anterior, por lo que puede asumir lo que quiera, siempre y cuando el conjunto de datos aún se maneje correctamente /
orlp
@orlp ¡Hurra! ¡Eso suena como 12 bytes para jugar! ¡Gracias por este desafío, ha sido muy divertido!
BrainSteel
4

Brainfuck, 77 bytes, Puntuación = 31647

La puntuación es la suma de codepoint+4cada personaje.

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

(Utiliza la implementación BF con EOF = 0.)

Ejemplo:

input:
!bar

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

JavaScript (ES6) - 137 bytes, puntaje - 7413

Esto solo usa ., +y -. Puedes probarlo en la consola de 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 es mi contador de puntaje:

[
    '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
fuente