编写一个自行下载的程序


66

编写一个连接到该站点的程序,下载其发布的答案,提取其自己的源代码并打印出来。输出必须与源代码相同。最短的代码(以字节为单位)获胜。

规则:

  • 不允许使用URL缩短器。
  • 答案必须具有常规格式-带有语言名称和大小,可选描述,代码块,可选描述和解释的标题。不允许使用非自然的分隔符。
  • 输出必须源自站点上发布的实际代码块。
  • 功能必须不取决于答案列表中的位置。即使有多个页面,它也应该起作用,而答案不在第一页上。
  • 新增内容:有关应在浏览器中运行的答案的特殊说明:可以要求在codegolf域上运行它们(遵守同源策略)是可以的,但是该域和路径应包含在解决方案中,以便公平一点。

39
Catch-22:我应该如何测试提交的内容?
马丁·恩德

9
我希望人们发布答案并将其删除,以便他们可以测试其代码。
贾斯汀

4
@ m.buettner的答案可以首先用于其他答案(针对其他问题),然后发布,然后进行编辑以更改URL :)
aditsu 2014年

8
@hexafraction如果评论能够干扰答案,则答案不是很好...
aiditsu 2014年

17
我脑海中浮现出一个问题:如何编写一条链接到自身的推文,而无需使用任何URL缩短器,而是通过估算您的推文ID来推文?
Ming-Tang

Answers:


34

Bash + coreutils + Lynx浏览器,61字节

感谢@FDinoff的提示:

lynx -dump codegolf.stackexchange.com/posts/28164/body|grep 2

4
如果我输入grep寻找的魔术字,会发生什么?
Shade 2014年

3
lynx lynx lynx。此评论将被删除(标题也是如此)
–ζ-2014年

1
@hexafraction Awww。你必须去破坏它!
Shade 2014年

8
该网址应该有效。codegolf.stackexchange.com/posts/28164/body并且它忽略评论。我也认为它,你可以用它在规则之内...
FDinoff

3
@DigitalTrauma awww ...该死的。
haneefmubarak

22

红宝石,155 186 195 148 138 110 97字符

require'open-uri';puts open('http://codegolf.stackexchange.com/posts/28159/body').read[/req.+;/];

我必须使其成为一行,因为否则它将输出换行符\n而不是实际的换行符。

  • +31个字符,因为我没有注意到某些字符已被转义。
  • +9个字符可消除烦人的反斜杠。
  • 感谢Nathan Osman节省了2个字符,而Ventero通过消除了上面列出的大多数修复程序而节省了55(!!!)。

说明

让我们先美化一下。但是,我将不得不在此代码中使用某种有趣的符号。出于稍后解释的原因,我在本文中根本无法使用分号,因此将{SEMI}代替分号。

require 'open-uri'
resp = open('http://codegolf.stackexchange.com/posts/28159/body').read
puts resp.match(/req.+{SEMI}/){SEMI}

好了,现在让我们来看看。前两行很不言自明,它们获取了此答案的HTML文本。

现在,最后一行是这里有趣的一行。您在代码结尾看到了看似没用的分号吗?这是绝对必需的,这就是原因。

首先,resp.match提取要打印的代码。为此使用的正则表达式是窍门:/req.+{SEMI}/。它REQuire'net/http'通过搜索reqre将抓取my REputation)来抓取代码的开头。然后,它通过搜索分号来找到代码的结尾!由于+默认情况下是贪婪的,因此它将一直进行下去,直到找到表示代码结尾的分号为止。明白为什么我不能再使用分号了吗?

在那之后,由于Ventero不再使用的修复程序,我无需取消\任何操作。我要做的就是将更{AMPERSAND}改为{AMPERSAND}amp{SEMI},只需删除该amp{SEMI}部分即可实现。由于有了新的URL,因此不再需要此功能。之后,原始代码已被检索!(注意:我也不能使用&字符,因为它使用HTML编码,这会导致创建分号。)


一些角色正在逃脱..
aiditsu

1
@aditsu Gah; 没注意到。固定。
门把手

您会讨厌这个..反斜杠正在重复。也有换行符的区别,但这是次要的事情。
aiditsu 2014年

@aditsu Argh!:P也固定。换行的原因是puts; 它可以解决,print但嗯。只是假装代码中有尾随换行符,即使SE无法显示它也是如此。
门把手

1
对于链接, http://codegolf.stackexchange.com/a/28159将获得与您相同的结果,并节省一些字符。
Mhmd 2014年

20

PowerShell- 69 62

(irm codegolf.stackexchange.com/posts/28236/body).div.pre.code

外壳中的DOM。真好!
弗雷坎特

irm是否不需要Azure权限管理?没有该模块,我想您可以使用Invoke-WebRequest来实现。
Scott Leadley

@ScottLeadley irmInvoke-RestMethodPowerShell v3核心的别名,并在PowerShell v3核心中引入。computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant 2014年

10
哇靠。一个PowerShell代码高尔夫球答案,其长度与主要答案的数量级相同。+1
亚当·玛拉斯

@AdamMaras Ha,我知道你的意思!确实偶尔会发生。codegolf.stackexchange.com/a/26811/4565codegolf.stackexchange.com/a/21982/4565相距遥远。
雷纳特

15

的JavaScript - 123 122 101 95 92 91 87 86 114

with(new XMLHttpRequest)send(open(0,/\codegolf.stackexchange.com\posts\28175\body/,0)),alert(/w.*/.exec(response))

在此页面上的Web浏览器的控制台中运行。在最新的Chrome 和Firefox上进行了测试。

编辑:+28个字节以添加完整域。

Firefox在此更新中不再喜欢我的Regex URL技巧:(

这是打破常规的86字节解决方案:

with(new XMLHttpRequest)send(open(0,/posts\28175\body/,0)),alert(/w.*/.exec(response))

那令我敬畏。多次。
fregante

1
@ bfred.it我只是使用了一个有趣的正则表达式削减了一个字节。希望它使您再敬畏一次。
nderscore 2014年

如果打印到控制台是可接受的输出方法,则可以通过删除警报将其缩短7个字符。
Tejas Kale 2014年

另外,根据新规则,您必须添加codegolf.stackexchange.com/到url。
2014年

1
@TejasKale从我已经看到的人们开始,他们皱眉并不真正警告/document.write/console.log答案的解决方案。
nderscore 2014年

10

Ruby + wget + gunzip159 86 82 71

使用@FDinoff的技巧来使用http://codegolf.stackexchange.com/posts/28173/body

puts `wget -qO- codegolf.stackexchange.com/posts/28173/body`[/pu.*\]/]

经过测试。感谢@ace和@Bob进行命令行优化。


2
您可以wget像中的那样组合中的标志wget -qO- url。另外,在bash中,您不需要在URL两端加上双引号,因此这也可能对您有用。
ace_HongKong独立

您可以省去http://
鲍勃

6

果酱-53

"codegolf.stackexchange.com/posts/28184/body"g54/1=);

我正在回答这个问题,所以我正在制作这个社区Wiki,并且我真的不想竞争:p
感谢FDinoff提供的URL选择。


糟糕,代码中的笑脸+1
Cruncher 2014年

1
@Cruncher );对我来说似乎不太笑...
MD XF

5

Rebmu,91个字符

由于Catch-22,我必须发布以获取此答案的URL。:-/ 好,知道了。

paTSrd http://codegolf.stackexchange.com/a/28154[th<a name="28154">th<code>cpCto</code>]prC

Rebmu是Rebol的方言,您可以阅读所有有关它的内容。此处等效的Rebol为:

parse to-string read http://codegolf.stackexchange.com/a/28154 [
    thru <a name="28154">
    thru <code>
    copy c to </code>
]
print c

Rebol的PARSE是对RegEx的高度素养解答。它开始输入的解析器位置(可以是任何序列,包括结构块...二进制数据...或字符串类型)。规则是解析位置如何移动的语言。

标签和URL实际上只是语言中的底层字符串。但是它们是“风味的”,随着Rebol被动态键入,您可以检查该类型。例如READ知道,如果您给它提供URL风格的字符串,则应将其分派给方案处理程序以进行读取。(在这种情况下,该注册为HTTP)。默认情况下,您会获取UTF-8字节,因此我们使用to-string对其进行解码,并在普通Unicode字符串中获得一系列代码点。

在解析方言的情况下,遇到标记类型只是像看起来像标记的字符串一样被匹配。THRU是一条指令,意思是“跳过直到随后的规则匹配,然后将匹配位置放在刚匹配的内容的末尾”。(TO是匹配的类似物,但将解析位置保留在元素之前)。

因此,我们沿zip前进<a name="28154">。然后我们跳过下一次出现的<code>,解析位置现在位于的后面>。然后,PARSE的COPY命令使我们可以将数据复制到另一个规则,在这种情况下,该规则是[TO </code>]...,因此我们将所有内容都放入变量C中,直到此之前<

吧?:-)

从技术上讲,我可以将其剃光更多,例如通过查找TO "</",这样可以节省三个字符-只需匹配就不必匹配整个</code>end标签</。我可以为开始标签设置类似的参数。但是Rebmu是关于打高尔夫球的知识 ……即使您可能一开始觉得它看起来很奇怪!

更新/body诀窍不言而喻,但我类似地将其保留不变...因为我认为这种方式更具教育意义。


5

Java现在为634、852、1004

代码已更新;感谢您的建议。高尔夫:现在用>替换&gt

//bacchus
package golf;
import java.net.*;
import java.util.*;
public class G{
public static void main(String[] a) throws Exception {
Scanner z;
URL u;
int x=0;
String s;
u=new URL("http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself");
z=new Scanner(u.openConnection().getInputStream());
z.useDelimiter("\\s*//bacchus\\s*");
while(z.hasNext())
{
s=z.next();
s=s.replace("&gt;", ">");
if(x>0)System.out.println("//bacchus\n"+s);
x++;
if(x>2)break;
}
System.out.println("//bacchus\n");
}
}
//bacchus

提交测试后,我将进行编辑并尝试打高尔夫球。需要将x> 1更改为x> 2,因为测试字符串也在我的代码中。注意:代码高尔夫球将>符号替换为&gt。

//bacchus
package golf;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Golf {

    public static void main(String[] args) throws IOException {
        URL u;
        URLConnection c;
        InputStream i;
        InputStreamReader r;
        BufferedReader b;
        String s;
        int x=0;
        try {
            u=new URL("http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself");
            c=u.openConnection();
            i=c.getInputStream();
            r=new InputStreamReader(i);
            b=new BufferedReader(r);
            while((s=b.readLine())!=null)
            {
                if(s.contains("//bacchus")) x++;
                if(x>0)System.out.println(s);
                if(x>2) break;
            }
            i.close();
            b.close();
        } catch (MalformedURLException ex) {

        }
    }

}
//bacchus

7
您如何处理包含的评论//bacchus
–ζ

3
您可以内联很多东西,尝试资源,并使用*导入来节省很多代码。
西蒙·匡

@SimonKuang-我也只是将流保持打开状态,而不是关闭内容。而且,throws Exception而不是试图处理任何事情。另外,我认为使用Scanner而不是BufferedReader会更简单,尤其是您可以将定界符设置为//bacchus,这会使事情变得更容易...
Jules,2014年

5

Python中,175个 167字节

这使用了两个外部库。我没有读到它是未经授权的。

import bs4,requests
print(bs4.BeautifulSoup(requests.get('http://codegolf.stackexchange.com/q/28154').text).select('#answer-28171')[0].select('pre > code')[0].string)

更长,但看起来更好的代码:

import bs4, requests
request = requests.get('http://codegolf.stackexchange.com/q/28154')
soup = bs4.BeautifulSoup(request.text)
answer = soup.select('#answer-28171')[0]
code = answer.select('pre > code')[1].string
print(code)

1
questionsurl中可以替换为qhttp://codegolf.stackexchange.com/q/28154
贾斯汀

1
bs4, requests(第1行)中的空格可以删除以减少1个字节。
ace_HongKong独立

5

JavaScript 228

r=new XMLHttpRequest()
c='code'
r.open('GET','//'+c+'golf.stackexchange.com/posts/28157/body')
r.onreadystatechange=function(){this.readyState==4&&alert((a=r.responseText).substr(i=a.indexOf(c)+5,a.indexOf('/'+c)-i-1))}
r.send()

在此页面上运行。


您如何运行它?
aditsu

@aditsu应该在浏览器的JavaScript控制台上运行。但我仍在测试(和修复)它,请稍候
ace_HongKongIndependence

@aditsu现在应该可以工作了。打开浏览器控制台(按F12键)并将此代码粘贴到此处。
ace_HongKong独立

先生,您需要一个if(this.readyState == this.DONE)内部功能。
Fabricio 2014年

1
@ace我明白了:)直到现在我还没有看到其他js答案。然后借此给予好评的我
C5H8NNaO4

4

Haskell,563613字节

import Control.Monad
import Data.List
import Network.HTTP
m%f=join(fmap f m)
q s=(simpleHTTP(getRequest"http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself?answertab=oldest#tab-top"))%getResponseBody%(putStrLn.head.filter((==)(s++show s)).map(take 613).tails)
main=q"import Control.Monad\nimport Data.List\nimport Network.HTTP\nm%f=join(fmap f m)\nq s=(simpleHTTP(getRequest\"http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself?answertab=oldest#tab-top\"))%getResponseBody%(putStrLn.head.filter((==)(s++show s)).map(take 613).tails)\nmain=q"

经过测试。通过“最旧的帖子”功能具有页面支持。使用喹线结构查找要打印的内容。这import Control.Monad仅是因为在HTML中>>=生成&gt;


4

JavaScript和jQuery的,87,67

我不确定是否可以使用jQuery,但是:

$('body').load('//codegolf.stackexchange.com/posts/28268/body pre')

JavaScript和jQuery的,如果excecuted在此页:27,25

为了好玩,如果可以在这里执行:

$('[id$=268] pre').html()

$('[id$=28268] pre').html()


1
这比源代码输出更多。
nderscore 2014年

1
67:$('body').load('//codegolf.stackexchange.com/posts/28268/body pre')
nderscore

您是正确的,我错误地假设了整个答复而不是代码
Martijn


3

飞镖,164

我以为我会在Dart中尝试一下,使用imo很有趣。

这可以在DartEditor的控制台中运行,但是需要在pubspec.yaml中添加http包。

import"package:http/http.dart"as h;h.read("http://codegolf.stackexchange.com/posts/28215/body").then((s){print(new RegExp(r"im.+(?:})").firstMatch(s).group(0));});}

非高尔夫版本:

import "package:http/http.dart" as h;

void main()
{
  h.read("http://codegolf.stackexchange.com/posts/28215/body").then((s)
  {
    print(new RegExp(r"im.+(?:})").firstMatch(s).group(0));
  });
}

2

R 114个字符

library(XML);cat(xpathSApply(xmlParse("http://codegolf.stackexchange.com/posts/28216/body"),'//code',xmlValue)[1])

这里没有真正的魔术:它采用html标签之间的字段值<code></code>。使用库XML(很明显,在代码中可以看到)。将结果输出为标准输出。


1

Java中,300 294

import java.net.*;import java.util.*;public class G{public static void main (String [] a) throws Exception{Scanner s=new Scanner(new URL("http://codegolf.stackexchange.com/posts/28189/body").openConnection().getInputStream()).useDelimiter("./?[c]ode\\W");s.next();System.out.print(s.next());}}

bacchusbeale答案的改进版本:

  • 不会不必要地关闭资源
  • 没有声明不必要的变量
  • 使用A Scanner来避免必须遍历输入
  • 使用与自身不匹配的正则表达式,以避免不得不跳过中间出现的开始/结束标记。

更新:

  • 使用帖子的直接URL,因此我们不需要唯一的注释来标识代码的开头/结尾;现在<code>[...]</code>用作搜索的分隔符(实际上使用正则表达式“ ./?[c]ode\W”,以避免必须进行解码,&lt;并且&gt;-“ \ W”是必需的,而不是较短的“。”。为避免它与帖子的URL部分匹配,不幸的是,该部分花费2个字符,并且c周围的方括号阻止了正则表达式自身的匹配)。

1
您有一堆不必要的空间。另外,您的课程不需要公开。
aditsu

1
openConnection()。getInputStream()也可以缩短为openStream()
2014年

1

w3m 55字节

w3m codegolf.stackexchange.com/posts/28242/body|grep x

基于@DigitalTrauma


1

红宝石,237 215 146 132

require'mechanize'
a=Mechanize.new
puts a.get('http://codegolf.stackexchange.com/a/28159').search('.lang-rb code:nth-child(1)').text

可以肯定的是,您可以在此处和此处删除一些空格以节省一些字节。
MisterBla

@理查德谁在乎我无论如何都不会赢。
Mhmd 2014年

1
这样做只是为了获得胜利,而不是为了获胜。
MisterBla

@RichardA完成了,我还从正则表达式中删除了几个字符。
Mhmd 2014年

1

处理中,90

print(loadStrings("http://codegolf.stackexchange.com/posts/28657/body")[2].substring(11));

编辑:终于知道了!



0

Javascript,138

a=window.open("http://codegolf.stackexchange.com/posts/28160/body");setTimeout('alert(a.document.body.innerHTML.match(/a=.*9\\)/)[0])',99)

假设页面加载时间少于99毫秒,则此方法有效。由于相同的原始策略,还必须通过在codegolf.SE页面上打开的控制台来运行它。


请注意:URL中不需要任何提示,问题可以用q代替。
分裂

1
请注意,您可以http://codegolf.stackexchange.com/a/28160代替http://codegolf.stackexchange.com/a/28160/12551
Justin

Chrome浏览器不喜欢这样:“未捕获的TypeError:无法读取未定义的属性'document'”
Spedwards 2014年

@Spedwards,您应该禁用弹出窗口阻止程序。
nderscore 2014年

0

Perl 5.10的,155个 127 122 117字节

use XML::LibXML;say XML::LibXML->new->parse_file('http://codegolf.stackexchange.com/posts/28330/body')->find('//pre')

使用XML::LibXML


0

Shell和xmllint,82个字节

xmllint --xpath 'string(//pre)' http://codegolf.stackexchange.com/posts/28333/body

0

Python,164

通过提取代码标签之间的文本来工作。它很长,但是除非直接编辑html页面或在下面的页面之前添加一个新的代码块,否则它将始终能够正常工作(在此之后有一个代码块对程序的输出没有影响)。

import urllib2
print urllib2.urlopen("http://codegolf.stackexchange.com/posts/28617/body").read().split(chr(60)+"code"+chr(62))[1].split(chr(60)+"/code"+chr(62))[0]
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.