Encodage d'une URL dans brainfuck

11

Inspiré par cette question , votre objectif aujourd'hui est de coder une URL en brainfuck.

Mon navigateur a été piraté! La barre d'emplacement a été transformée en un interprète enculé. J'ai besoin d'un programme qui transforme une URL en un programme de brainfuck. Mon ordinateur est également très lent, donc si le programme brainfuck est petit, c'est mieux.

Oh et je n'ai qu'un seul onglet de travail ouvert, mon twitter. Vous ne pouvez donc m'envoyer le programme que dans un tweet.


  1. Écrivez un programme qui tient dans un tweet (140 caractères) dans n'importe quelle langue qui prend une chaîne en entrée et génère un programme brainfuck.

  2. Ce programme de brainfuck sera exécuté sans entrée et générera une sortie.

  3. Cette sortie sera insérée dans la barre d'emplacement de Google Chrome et exécutée.

  4. Si le comportement de Google Chrome est identique au comportement que vous obtiendriez en saisissant la chaîne d'entrée à partir de # 1, alors la solution est valide. La redirection par raccourcisseurs d'URL est considérée comme un comportement différent - restez au moins sur le même domaine.

Vous pouvez supposer que l'interprète brainfuck a des entiers signés de précision infinie dans chaque cellule et un nombre illimité de cellules.

Votre score est déterminé par la somme des longueurs des programmes brainfuck générés pour coder l'ensemble d'URL suivant:

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

Le plus petit score l'emporte.

orlp
la source
Pouvons-nous supposer que l'entrée serait formatée comme ceci: http://www.google.com/ou le sera-t-elle jamais simplement google.com? (Les deux sont valables en ce qui concerne Google Chrome, mais votre liste ne contient que les formulaires complets) PS J'ai presque envie d'écrire une extension pour chrome qui fait cela ...
BrainSteel
2
@BrainSteel L'entrée de votre encodeur sera exactement comme indiqué dans la question (chaque ligne est une entrée). La sortie du brainfuck peut être n'importe quel format accepté par Google Chrome, tant qu'il a le même comportement que la chaîne d'entrée d'origine. Donc , si votre programme prend entrée http://www.google.com/du programme brainfuck elle produit sortie peut google.com, www.google.com, etc, car ils ont tous fait la même page. Mais par exemple, ce ftp://ftp.freebsd.org/pub/FreeBSD/n'est pas la même chose que ftp.freebsd.org/pub/FreeBSD/.
orlp
Ah, merci d'avoir clarifié! Désolé, je suis un peu lent ce matin.
BrainSteel
Je tiens à préciser que j'ai échoué, et c'est en ftp://ftp.freebsd.org/pub/FreeBSD/effet la même chose que ftp.freebsd.org/pub/FreeBSD/dans Google Chrome. Cela rend le défi un peu plus facile que je ne le pensais, mais telle est la vie. Je ne changerai pas les exigences, il est donc sûr de simplement retirer quoi que ce soit avant ://.
orlp

Réponses:

7

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

Maintenant, en utilisant l'algo de multiplication des facteurs!

Il s'agit d'un algorithme assez simple, bien que légèrement meilleur que les précédents. Je prévoyais d'utiliser Pyth, mais avec l'algorithme actuel, Python convient à <140 octets .

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

Il enlève d'abord le http://en utilisant split("//")et lewww. et /à la fin. Il utilise ensuite la fonction min pour vérifier quelle est la meilleure des trois options envisagées:

  1. Utilisation + ou -pour mettre à jour la valeur de cellule actuelle à la valeur de cellule souhaitée
  2. Aller à la nouvelle cellule et remplir juste avec +« s
  3. Accédez à une nouvelle cellule et utilisez la multiplication pour mettre à jour en faisant sqrt (n) * sqrt (n) + reste, car le carré a un périmètre minimum d'aire constante. http://cydathria.com/bf/bf_ex3.html

J'ai ensuite toujours mis un .pour sortir chaque char.

Une explication détaillée du nouveau code sera bientôt disponible. J'ai en quelque sorte à moitié joué au golf, en particulier auwww. et /la fin, mais je ne peux pas être dérangé car j'ai 20 octets sous la limite.

Cela fonctionne étonnamment sur les ftp://urls car il s'agit de chrome et le chrome fait automatiquementftp.freebsd.org/pub/FreeBSD/ transforme enftp://ftp.freebsd.org/pub/FreeBSD/

Je prévois d'utiliser ensuite un dictionnaire pour stocker les valeurs des cellules et voir si le caractère a déjà été créé dans une cellule.


Extension Brainfuck Omnibox

C'est vrai! Après avoir vu le commentaire de @ BrainSteel, j'ai su que je devais le faire. Cela ne prend pas sur toute omnibox, que lorsque vous faites bf, tab. De plus, comme l'api omnibox est bizarre, cela ne me permet pas de transmettre le code à l'omnibox, je dois le gérer moi-même. Je fais donc ma propre http://vérification, puis je définis l'URL de l'onglet.

Comme je n'ai pas envie de payer les 5 $ nécessaires pour mettre votre extension sur la boutique en ligne, vous devrez l'installer manuellement. Téléchargez simplement le zip à partir d'ici: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , décompressez, accédez à la page des extensions en chrome, cliquez sur la case d'option du mode dev en haut à droite et charger l'extension déballée.

J'espère que vous apprécierez! :)

Maltysen
la source
Cela ne fonctionnera pas sur l' ftp://URL.
PurkkaKoodari
1
@ Pietu1998, c'est ce que je pensais au début, mais Chrome m'a surpris. Essayez de mettre ftp.freebsd.org/pub/FreeBSD/ dans votre barre d'adresse et Chrome le fera ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen
@Maltysen Oups. J'avais intentionnellement inclus cette URL pour empêcher cette optimisation, mais il semble que j'ai échoué. Cette URL est en effet différente, mais il semble que Chrome soit en effet assez intelligent pour reconnaître et ajouter ftp://. Tant pis.
orlp
4

C, 140 134 132 138 138 128 139 Octets

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

Mise à jour: 6 octets de moins, grâce à nutki!

Mettre à jour à nouveau, 128 octets. Le code est nettement moins lisible. Il tente maintenant de supprimer l'URL deftp:// .

Mettez à jour le troisième, à 139 octets. Le code est un peu plus lisible et s'est débarrassé de certains mauvais comportements indéfinis. Maintenant, si le nom du site est précédé de www., il est supprimé. J'ai moins de 7k, mais je pense que je dois concéder à Maltysen avec Pyth. Bien joué.

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

Démêlé un peu:

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

Ce code prend une URL à la ligne de commande, et le convertit en BF en utilisant uniquement ., -et +. Le code fait une tentative pour enlever la chaîne de ftp://, http://, https://, et www.avant la conversion de BF. Voici une liste des sorties des sorties:

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
la source
Que diriez-vous d'utiliser une boucle intérieure: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)devrait fonctionner.
nutki
@nutki Impressive! Je vous remercie!
BrainSteel
"Notez que si nous supposons qu'aucune URL ne commence par autre chose que http: //, https: // ou ftp: //, nous pouvons supprimer 10 octets de cette solution." Votre solution ne doit fonctionner que pour l'ensemble de données ci-dessus, vous pouvez donc supposer ce que vous voulez, tant que l'ensemble de données sera toujours géré correctement /
orlp
@orlp Hourra! Cela ressemble à 12 octets pour jouer avec! Merci pour ce défi, ça a été très amusant!
BrainSteel
4

Brainfuck, 77 octets, score = 31647

Le score est la somme de codepoint+4pour chaque personnage.

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

(Utilise l'implémentation BF avec EOF = 0.)

Exemple:

input:
!bar

output:
+++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]
randomra
la source
0

JavaScript (ES6) - 137 octets, score - 7413

Cela utilise uniquement ., +et -. Vous pouvez le tester dans la console 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('.')+'.'

Voici mon compteur de score:

[
    '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
la source