Codierung einer URL in Brainfuck

11

Inspiriert von dieser Frage ist es heute Ihr Ziel, eine URL in Brainfuck zu kodieren.

Mein Browser wurde gehackt! Die Positionsleiste wurde in einen Brainfuck-Interpreter verwandelt. Ich brauche ein Programm, das eine URL in ein Brainfuck-Programm verwandelt. Mein Computer ist auch sehr langsam. Wenn das Brainfuck-Programm klein ist, ist es besser.

Oh, und ich habe nur noch einen Arbeits-Tab offen, meinen Twitter. Sie können mir das Programm also nur in einem Tweet senden.


  1. Schreiben Sie ein Programm, das in einen Tweet (140 Zeichen) in einer beliebigen Sprache passt, die eine Zeichenfolge als Eingabe verwendet und ein Brainfuck-Programm ausgibt.

  2. Dieses Brainfuck-Programm wird ohne Eingabe ausgeführt und generiert eine Ausgabe.

  3. Diese Ausgabe wird in die Positionsleiste von Google Chrome eingefügt und ausgeführt.

  4. Wenn das Verhalten von Google Chrome mit dem Verhalten identisch ist, das Sie durch Eingabe der Eingabezeichenfolge von Nummer 1 erhalten würden, ist die Lösung gültig. Die Umleitung durch URL-Shortener wird als unterschiedliches Verhalten angesehen. Bleiben Sie mindestens in derselben Domain.

Sie können davon ausgehen, dass der Brainfuck-Interpreter in jeder Zelle ganzzahlige Ganzzahlen mit unendlicher Genauigkeit und eine unbegrenzte Anzahl von Zellen hat.

Ihre Punktzahl wird durch die Summe der Längen der Brainfuck-Programme bestimmt, die zum Codieren der folgenden URLs generiert wurden:

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

Die kleinste Punktzahl gewinnt.

orlp
quelle
Dürfen wir annehmen, dass die Eingabe so formatiert wird: http://www.google.com/oder wird es jemals einfach sein google.com? (Beide sind für Google Chrome gültig, aber Ihre Liste enthält nur die vollständigen Formulare.) PS Ich habe fast den Wunsch, eine Erweiterung für Chrome zu schreiben, die dies tut ...
BrainSteel
2
@BrainSteel Die Eingabe für Ihren Encoder entspricht genau den Angaben in der Frage (jede Zeile ist eine Eingabe). Die Ausgabe des Brainfucks kann ein beliebiges Format sein, das von Google Chrome akzeptiert wird, sofern es dasselbe Verhalten wie die ursprüngliche Eingabezeichenfolge aufweist. Also , wenn Ihr Programm eine Eingabe nimmt http://www.google.com/das Gehirnfick Programm erzeugt es kann Ausgang google.com, www.google.comusw., weil sie alle Ergebnis in der gleichen Seite. Aber zum Beispiel ftp://ftp.freebsd.org/pub/FreeBSD/ist nicht das gleiche wie ftp.freebsd.org/pub/FreeBSD/.
Orlp
Ah, danke für die Klarstellung! Entschuldigung, ich bin heute Morgen etwas langsam.
BrainSteel
Ich möchte klarstellen, dass ich versagt habe, und das ftp://ftp.freebsd.org/pub/FreeBSD/ist in der Tat das gleiche wie ftp.freebsd.org/pub/FreeBSD/in Google Chrome. Das macht die Herausforderung ein bisschen einfacher als ich beabsichtigt hatte, aber so ist das Leben. Ich werde die Anforderungen nicht ändern, daher ist es sicher, vorher nur etwas auszuziehen ://.
Orlp

Antworten:

7

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

Jetzt mit dem Faktor Multiplikation algo!

Dies ist ein ziemlich einfacher Algorithmus, obwohl er etwas besser ist als die oben genannten. Ich hatte vor, Pyth zu verwenden, aber mit dem aktuellen Algorithmus passt Python <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

Es entfernt zuerst das http://mit split("//")und das www.und /am Ende. Anschließend wird mit der Funktion min überprüft, welche der drei in Betracht gezogenen Optionen die beste ist:

  1. Verwenden Sie +oder -, um den aktuellen Zellenwert auf den gewünschten Zellenwert zu aktualisieren
  2. Gehe in eine neue Zelle und fülle sie einfach mit +'s
  3. Gehen Sie zu einer neuen Zelle und verwenden Sie die Multiplikation zum Aktualisieren, indem Sie sqrt (n) * sqrt (n) + Rest ausführen, da das Quadrat einen minimalen Umfang der konstanten Fläche hat. http://cydathria.com/bf/bf_ex3.html

Ich setze dann immer ein, .um jedes Zeichen auszugeben.

Eine ausführliche Erklärung des neuen Codes folgt in Kürze. Ich habe das Golfen halbherzig bewertet, besonders das Strippen www.und das /am Ende, aber ich kann mich nicht darum kümmern, da ich 20 Bytes unter dem Limit bin.

Das funktioniert überraschend auf dem ftp://Urls , da dies Chrom und Chrom macht automatisch ftp.freebsd.org/pub/FreeBSD/inftp://ftp.freebsd.org/pub/FreeBSD/

Ich plane, als nächstes ein Wörterbuch zu verwenden, um die Zellenwerte zu speichern und zu sehen, ob das Zeichen bereits in einer Zelle erstellt wurde.


Brainfuck Omnibox-Erweiterung

Das ist richtig! Nachdem ich den Kommentar von @ BrainSteel gesehen hatte, wusste ich, dass ich ihn machen musste. Dies nimmt nicht die gesamte Omnibox über, nur wenn Sie das tun bf, tab. Da die Omnibox-API seltsam ist, kann ich den Code nicht an die Omnibox weiterleiten. Ich muss mich selbst darum kümmern. Also http://überprüfe ich es selbst und setze dann die URL des Tabs.

Da ich nicht die 5 Dollar bezahlen wollte, die nötig sind, um Ihre Erweiterung in den Webstore zu stellen, müssen Sie sie manuell installieren. Laden Sie einfach die Zip- Datei von hier herunter: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , entpacken Sie, gehen Sie auf die Erweiterungsseite in Chrome, klicken Sie oben rechts auf das Optionsfeld für den Erweiterungsmodus und Laden Sie die entpackte Erweiterung.

Hoffe euch gefällt es! :) :)

Maltysen
quelle
Dies funktioniert nicht mit der ftp://URL.
PurkkaKoodari
1
@ Pietu1998 das habe ich mir zuerst gedacht, aber Chrome hat mich überrascht. Versuchen Sie, ftp.freebsd.org/pub/FreeBSD/ in Ihre Adressleiste einzugeben, und Chrome macht es ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen
@ Malsensen Ups. Ich habe diese URL absichtlich eingefügt, um diese Optimierung zu verhindern, aber es sieht so aus, als wäre ich gescheitert. Diese URL ist zwar anders, aber Chrome scheint tatsächlich intelligent genug zu sein, um sie zu erkennen und hinzuzufügen ftp://. Naja.
Orlp
4

C, 140 134 132 138 128 139 Bytes

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

Update: 6 Bytes weniger, dank Nutki!

Erneut aktualisieren, 128 Bytes. Code ist deutlich weniger lesbar. Es wird nun auch versucht, die URL zu ftp://entfernen.

Aktualisieren Sie die dritte mit 139 Bytes. Code ist ein bisschen lesbarer und hat ein böses undefiniertes Verhalten beseitigt. Wenn dem Site-Namen ein vorangestellter Site-Name vorangestellt ist www., wird er entfernt. Ich bin unter 7 km gefahren, aber ich denke, ich muss Maltysen mit Pyth nachgeben. Gut gemacht.

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

Ein bisschen entwirrt:

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

Dieser Code nimmt eine URL in der Befehlszeile, und wandelt sie in BF nur unter Verwendung von ., -, und +. Der Code macht einen Versuch , die Kette von Streifen ftp://, http://, https://, und , www.bevor BF umwandelt. Hier ist eine Liste der Ausgänge der Ausgänge:

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
quelle
Wie wäre es mit einer inneren Schleife: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)sollte funktionieren.
Nutki
@nutki beeindruckend! Vielen Dank!
BrainSteel
"Beachten Sie, dass wir 10 Bytes aus dieser Lösung löschen können, wenn wir annehmen, dass keine URL mit etwas anderem als http: //, https: // oder ftp: // beginnt." Ihre Lösung muss nur für den obigen Datensatz funktionieren, sodass Sie davon ausgehen können, was Sie wollen, solange der Datensatz noch korrekt behandelt wird /
orlp
@orlp Hurra! Das klingt nach 12 Bytes zum Spielen! Vielen Dank für diese Herausforderung, es hat großen Spaß gemacht!
BrainSteel
4

Brainfuck, 77 Bytes, Score = 31647

Punktzahl ist die Summe codepoint+4für jeden Charakter.

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

(Verwendet die BF-Implementierung mit EOF = 0.)

Beispiel:

input:
!bar

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

JavaScript (ES6) - 137 Bytes, Punktzahl - 7413

Dies nutzt nur ., +und -. Sie können es in der Firefox-Konsole testen.

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('.')+'.'

Dies ist mein Punktezähler:

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