Codifica di un URL in brainfuck


11

Ispirato da questa domanda , il tuo obiettivo oggi è codificare un URL in brainfuck.

Il mio browser è stato violato! La barra degli indirizzi è stata trasformata in un interprete brainfuck. Ho bisogno di un programma che trasforma un URL in un programma brainfuck. Anche il mio computer è molto lento, quindi se il programma brainfuck è piccolo è meglio.

Oh, e ho solo una scheda di lavoro lasciata aperta, il mio twitter. Quindi puoi inviarmi il programma solo in un tweet.


  1. Scrivi un programma che si inserisce in un tweet (140 caratteri) in qualsiasi lingua che accetta una stringa come input e genera un programma brainfuck.

  2. Questo programma brainfuck verrà eseguito senza input e genererà un output.

  3. Questo output verrà inserito nella barra degli indirizzi di Google Chrome ed eseguito.

  4. Se il comportamento di Google Chrome è identico al comportamento che otterresti immettendo la stringa di input dal numero 1, la soluzione è valida. Il reindirizzamento tramite abbreviazioni di URL è considerato un comportamento diverso: rimanere almeno sullo stesso dominio.

Si può presumere che l'interprete brainfuck abbia numeri interi con precisione infinita in ogni cella e un numero illimitato di celle.

Il tuo punteggio è determinato dalla somma delle lunghezze dei programmi brainfuck generati per codificare il seguente set di 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

Il punteggio più piccolo vince.


Possiamo supporre che l'input sia formattato in questo modo: http://www.google.com/o lo sarà mai semplicemente google.com? (Entrambi sono validi per quanto riguarda Google Chrome, ma il tuo elenco contiene solo i moduli completi) PS Ho quasi voglia di scrivere un'estensione per Chrome che faccia questo ...
BrainSteel

2
@BrainSteel L'ingresso per il tuo codificatore sarà esattamente come indicato nella domanda (ogni riga è un ingresso). L'output di Brainfuck può essere in qualsiasi formato accettato da Google Chrome, purché abbia lo stesso comportamento della stringa di input originale. Così, se il programma prende in ingresso http://www.google.com/il programma brainfuck si produce un output maggio google.com, www.google.com, ecc, perché tutti risultato nella stessa pagina. Ma per esempio ftp://ftp.freebsd.org/pub/FreeBSD/non è lo stesso di ftp.freebsd.org/pub/FreeBSD/.
orlp

Ah, grazie per il chiarimento! Scusa, sono un po 'lento stamattina.
BrainSteel

Vorrei chiarire che ho fallito, e questo ftp://ftp.freebsd.org/pub/FreeBSD/è effettivamente lo stesso ftp.freebsd.org/pub/FreeBSD/di Google Chrome. Questo rende la sfida un po 'più semplice di quanto pensassi, ma questa è la vita. Non cambierò i requisiti, quindi è sicuro rimuovere qualsiasi cosa prima ://.
orlp

Risposte:


7

Pyth - 118 byte, punteggio: 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

Ora usando l'algo di moltiplicazione dei fattori!

Questo è un algoritmo piuttosto semplice, sebbene leggermente migliore di quelli sopra. Avevo intenzione di usare Pyth, ma con l'attuale algoritmo Python si adatta a <140 byte .

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

Prima elimina http://usando split("//")e www.e /alla fine. Quindi utilizza la funzione min per verificare qual è la migliore delle tre opzioni considerate:

  1. Utilizzare +o -per aggiornare il valore della cella corrente al valore della cella desiderato
  2. Vai alla nuova cella e solo riempire con +s'
  3. Vai alla nuova cella e usa la moltiplicazione per aggiornare eseguendo sqrt (n) * sqrt (n) + resto poiché square ha un perimetro minimo di area costante. http://cydathria.com/bf/bf_ex3.html

Ho quindi sempre messo un .output per ogni carattere.

Una spiegazione dettagliata del nuovo codice è in arrivo. Ho quasi assecondato il golf, in particolare lo stripping di www.e /alla fine, ma non posso essere disturbato dal momento che sono di 20 byte sotto il limite.

Questo funziona sorprendentemente sulle ftp://urls poiché questo è cromo e cromo rende automaticamente ftp.freebsd.org/pub/FreeBSD/inftp://ftp.freebsd.org/pub/FreeBSD/

Ho in programma di utilizzare un dizionario per memorizzare i valori della cella e vedere se il personaggio è già stato creato in una cella.


Estensione Brainfuck Omnibox

Giusto! Dopo aver visto il commento di @ BrainSteel, ho capito che dovevo farlo. Ciò non tiene su tutta l'omnibox, solo quando lo fai bf, tab. Inoltre, poiché l'apn omnibox è strano, non mi consente di inoltrare il codice all'omnibox, devo gestirlo da solo. Quindi faccio il mio http://controllo e quindi impostare l'URL della scheda.

Dal momento che non avevo voglia di pagare $ 5 necessari per mettere la tua estensione sul webstore, dovrete installarlo manualmente. Basta scaricare la zip da qui: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , decomprimere, accedere alla pagina delle estensioni in Chrome, fare clic sulla casella di opzione della modalità di sviluppo in alto a destra e caricare l'estensione non compressa.

Spero vi piaccia ragazzi! :)


Questo non funzionerà ftp://sull'URL.
PurkkaKoodari,

1
@ Pietu1998 è quello che ho pensato all'inizio, ma Chrome mi ha sorpreso. Prova a inserire ftp.freebsd.org/pub/FreeBSD/ nella barra degli indirizzi e Chrome lo farà ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen

@Maltysen Oops. Avevo incluso intenzionalmente quell'URL per impedire questa ottimizzazione, ma sembra che abbia fallito. Questo URL è davvero diverso, ma sembra che Chrome sia davvero abbastanza intelligente da riconoscere e aggiungere ftp://. Oh bene.
orlp

4

C, 140 134 132 138 128 139 byte

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

Aggiornamento: 6 byte in meno, grazie a nutki!

Aggiorna di nuovo, 128 byte. Il codice è significativamente meno leggibile. Ora tenta anche di eliminare l'URL di ftp://.

Aggiorna il terzo, a 139 byte. Il codice è un po 'più leggibile e si è sbarazzato di alcuni comportamenti non definiti malevoli. Ora, se il nome del sito è preceduto da www., viene rimosso. Ho ottenuto meno di 7k, ma penso di dover concedere a Maltysen con Pyth. Molto bene.

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

Svelato un po ':

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

Questo codice ha un URL nella riga di comando, e la converte in BF utilizzando solo ., -e +. Il codice fa un tentativo di togliere la stringa di ftp://, http://, https://e www.prima della conversione in BF. Ecco un elenco di output degli output:

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

Che ne dici di usare un ciclo interno: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)dovrebbe funzionare.
Nutki,

@nutki Impressive! Grazie!
BrainSteel

"Nota che se non possiamo supporre che nessun URL inizi con qualcosa di diverso da http: //, https: // o ftp: //, possiamo eliminare 10 byte da questa soluzione." La tua soluzione deve funzionare solo per il set di dati sopra riportato, quindi puoi assumere quello che vuoi, purché il set di dati verrà comunque gestito correttamente /
orlp

@orlp Hooray! Sembrano 12 byte con cui giocare! Grazie per questa sfida, è stato molto divertente!
BrainSteel

4

Brainfuck, 77 byte, punteggio = 31647

Il punteggio è la somma di codepoint+4per ogni personaggio.

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

(Utilizza l'implementazione di BF con EOF = 0.)

Esempio:

input:
!bar

output:
+++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]

0

JavaScript (ES6) - 137 byte, punteggio - 7413

Questo utilizza solo ., +e -. Puoi provarlo nella console di 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('.')+'.'

Questo è il mio contatore dei punteggi:

[
    '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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.