在Brainfuck中编码URL


11

受这个问题的启发,您今天的目标是用头脑风暴对URL进行编码。

我的浏览器被黑了!位置栏已经变成了一个让人烦恼的解释器。我需要一个将URL转换为“笨蛋”程序的程序。我的电脑也很慢,所以如果Brainfuck程序很小,那就更好了。

哦,我的Twitter上只有一个工作选项卡处于打开状态。因此,您只能通过推文向我发送该程序。


  1. 用任何以字符串作为输入并输出“脑力激荡”程序的语言编写适合于tweet(140个字符)的程序。

  2. 该Brainfuck程序将在没有输入的情况下运行,并将生成输出。

  3. 此输出将插入到Google Chrome浏览器的位置栏中,并执行。

  4. 如果Google Chrome的行为与您输入的#1输入字符串所获得的行为相同,则该解决方案有效。URL缩短程序的重定向被认为是不同的行为-至少保持在同一域中。

您可能会认为Brainfuck解释器在每个单元格中都有无限精度的有符号整数,并且单元格的数量不受限制。

您的分数取决于为编码以下URL集而生成的Brainfuck程序的总长度:

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

得分最低者获胜。


我们是否可以假设输入将采用以下格式:http://www.google.com/或者仅仅是google.com?(就Google Chrome而言,两者均有效,但您的列表仅包含完整的表格)PS我几乎希望为chrome编写一个扩展程序来做到这一点……
BrainSteel15年

2
@BrainSteel编码器的输入将与问题中所述完全相同(每行是一个输入)。Brainfuck的输出可以是Google Chrome接受的任何格式,只要它的行为与原始输入字符串相同即可。所以,如果你的程序需要输入http://www.google.com/的brainfuck程序它产生可以输出google.comwww.google.com等等,因为它们都产生相同的页面。但例如ftp://ftp.freebsd.org/pub/FreeBSD/与不一样ftp.freebsd.org/pub/FreeBSD/
orlp 2015年

啊,谢谢你的澄清!抱歉,今天早上我有点慢。
BrainSteel

我想澄清一下我失败了,ftp://ftp.freebsd.org/pub/FreeBSD/的确与ftp.freebsd.org/pub/FreeBSD/Google Chrome浏览器相同。这使挑战比我预期的要容易一些,但这就是生活。我不会更改要求,因此可以安全地删除之前的任何内容://
orlp

Answers:


7

Pyth-118字节,得分:154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

现在使用因子乘法算法!

这是一个非常简单的算法,尽管比上述算法要好一些。我打算使用Pyth,但是使用当前算法,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

它第一条带出http://通过使用split("//")www./结尾。然后,它使用min函数检查所考虑的三个选项中哪一个是最好的:

  1. 使用+-将当前单元格值更新为所需的单元格值
  2. 进入新的细胞,并用刚补+
  3. 转到新单元格,并通过乘以sqrt(n)* sqrt(n)+余数使用乘法进行更新,因为正方形的最小周长为恒定面积。http://cydathria.com/bf/bf_ex3.html

然后,我总是放一个.输出每个字符。

新代码的详细说明即将推出。我有点打高尔夫球,特别是最后的剥皮www.和打滑,/但是我不被打扰,因为我在限制以下20字节。

这令人惊讶的作品上ftp://的网址,因为这是Chrome和Chrome会自动ftp.freebsd.org/pub/FreeBSD/进入ftp://ftp.freebsd.org/pub/FreeBSD/

我计划接下来使用字典来存储单元格值,并查看字符是否已在单元格中完成。


Brainfuck多功能框扩展

那就对了!在看到@BrainSteel的评论后,我知道我必须这样做。仅当您执行时bf,它不会接管整个多功能框tab。另外,由于omnibox api很奇怪,因此它不能让我将代码转发到omnibox,我必须自己处理它。因此,我自己进行http://检查,然后设置选项卡的url。

由于我不想支付将扩展程序放到网上商店所需的5美元,因此你们将不得不手动安装它。只需从此处下载zip:https : //drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view? usp =sharing,解压缩,进入chrome扩展页面,单击右上角的开发人员模式选项框,然后加载解压缩的扩展程序。

希望你们喜欢!:)


这不适用于ftp://URL。
PurkkaKoodari 2015年

1
@ Pietu1998就是我最初的想法,但是Chrome让我感到惊讶。尝试在地址栏中输入ftp.freebsd.org/pub/FreeBSD/,Chrome会将其设置为ftp:// ftp.freebsd.org/pub/FreeBSD/
Maltysen 2015年

@Maltysen糟糕。我故意包含该URL以防止此优化,但看来我失败了。该URL确实有所不同,但是Chrome确实足够聪明,可以识别和添加ftp://。那好吧。
orlp

4

C,140 134 132 138 128 139个字节

263 + 816 + 911 + 955 + 827 + 1355 + 1779 = 7269 6906字节

更新:少了6个字节,这要归功于nutki!

再次更新128个字节。代码的可读性大大降低。现在,它也尝试剥离URL ftp://

更新第三个字节,为139个字节。代码更具可读性,并且摆脱了一些令人讨厌的不确定行为。现在,如果站点名称以开头www.,则将其删除。我的收入不到7k,但我想我必须和Pyth一起让Maltysen承认。做得好。

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

解开一点:

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

这个代码采取URL在命令行,并将其转换成BF仅使用.-,和+。该代码使得试图剥离的串ftp://http://https://,和www.转换为BF之前。以下是输出的输出列表:

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

如何使用一个内循环:for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)应该起作用。
nutki

@nutki令人印象深刻!谢谢!
BrainSteel

“请注意,如果我们假设没有URL以http://,https://或ftp://以外的其他开头,则可以从该解决方案中删除10个字节。” 您的解决方案仅适用于上述数据集,因此您可以假设自己想要什么,只要仍然可以正确处理该数据集/
orlp

@orlp哇!听起来像12个字节!感谢您的挑战,这非常有趣!
BrainSteel

4

Brainfuck,77个字节,得分= 31647

分数是codepoint+4每个字符的总和。

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

(使用BF实现,EOF =0。)

例:

input:
!bar

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

0

JavaScript(ES6)-137字节,得分-7413

这仅使用.+-。您可以在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('.')+'.'

这是我的分数计数器:

[
    '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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.