在您的答案上方输出答案


15

编写一个程序,<code>...</code>当按投票对答案进行排序时,该程序输出该问题的答案的第一个HTML 块的内容,该内容就在您的问题上方。Top!如果您是最佳答案,请输出。

忽略投票否定或没有<code>...</code>标签的答案。程序的源代码必须出现在<code>...</code>帖子的第一块中。当您use backticks

indent things with 4 spaces.

这是代码高尔夫球,用最少的字符赢得的答案。

附加规则(已更新)

  • 以您想要的任何编程语言进行回答,但是如果您多次回​​答,则使用不同的语言。
  • 您可能没有对输出进行硬编码。您的程序正常运行的能力不应取决于它的投票数或上面的答案是什么。如果投票分配发生了巨大变化,您的程序仍应正确输出其上方答案的代码。
  • 可能通过答案的某些独特属性(例如用户名(如果只有一个答案)或答案的直接链接)对程序进行硬编码,以便在该页面上自行搜索(以便查找下一个最高的名称)。
  • 如果两个答案的票数相等,您仍应使用高于您的答案(我相信它将是最新的)。
  • <code>...</code>的答案中可能有多个块,但第一个必须包含程序的源代码。

1
我是否需要考虑多个页面?
2014年

1
是的,您应该考虑多个页面
卡尔文的爱好2014年

4
请注意,inline code spans这只是<code></code>,但是适当的代码块是<pre><code>stuff</code></pre>
门把手

3
@ Calvin'sHobbies我认为并列答案的顺序是随机的。至少在SO方面,我对此一无所知。
马丁·恩德

4
我认为不必关心多页内容-如果您不在首页上,则无论如何
都不会赢

Answers:


5

Javascript + jQuery(92 86 64个字符)

要进行测试,请在页面上打开Dev Tools (通常为F12),然后运行我的代码!

该Javscript需要使用该页面(仅此页面)上的控制台运行。

alert($("code",$("#answer-34767").prev().prev()).html()||"Top!")

如此简短,它甚至不需要滚动条!

基本上,它通过ID查找我的答案,然后在前面获得两个节点(跳过定位链接)。如果不存在,那么我必须排在最前面。然后,它向下挖掘到第一个code元素并得到它.innerHTML

令人高兴的是SE默认情况下使用jQuery,因此即使没有尝试我也能获得该优势。


2
我个人不喜欢您的答案,因为它有点像作弊...无论如何,它可能短至alert($("code",$("#answer-34767").prev().prev()).html()||"Top!")
core1024

@ core1024:感谢您的即兴!我没想到过要单陈述。我同意我确实具有巨大的优势。也许我必须计算> 78MB的Firefox代码?规则说“用您想要的任何编程语言回答”。
罗比·韦克斯

您不需要计算Firefox的代码:)您的优势是在当前环境中,而不是在解释器中。好像每个人的页面源文件都已加载到“对象” /“变量”中。为漏洞利用+1;)
core1024 2014年

4
如果它是第二页的顶部,这将警告“顶部”,这是正确的行为吗?
威廉·巴博萨

@WilliamBarbosa:我对那个有“ lrn”。(请参阅他对OP问题的评论)。
罗比·维克斯

6

PHP 666 611 593 588 580字符

编辑:使用了比以前的tinyurl更小的url。

编辑:在对其他答案的评论之后,我使用了int而不是boolean。还需要纠正一个明显但现在已解决的错误。

这是我的代码

<?
$a=34727;$b=new DOMDocument();$b->loadHTMLFile("http://turl.no/t2u");$c=$b->saveHTML();$d=$e=1;$f='data-answerid="';$g=strpos($c,$f);$h=substr($c,0,$g);$c=substr($c,($g+15));while($d==1){$g=strpos($c,'"');$i=substr($c,0,$g);if($i==$a){$j=$h;$k=$e;}$g=strpos($c,'vote-count-post ">');$c=substr($c,($g+18));$g=strpos($c,'<');$l=substr($c,0,$g);$g=strpos($c,'data-answerid="');if($g){++$e;++$e;$h=substr($c,0,$g);$c=substr($c,($g+15));}else{$d=2;}}if($k==1){echo 'Top!';}else{$g=strpos($j,'><code>');$m=strpos($j,'</code></pre>');$n=$m-$g-7;$o=substr($j,($g+7),$n);echo nl2br($o);}

我相信可以使用DOMXPath和节点来改善这一点。但是我对此很满意。我无法决定在我的情况下该怎么做是唯一的答案,但是-ve点被忽略了。但是发布了另一个答案,因此不再是问题。

我还使用tinyurl缩短了url,节省了大量字符。

我希望你喜欢它,

保罗

PS这将无法在键盘中运行,因此无法显示小提琴。

编辑:php标记被更改后,又保存了5个

您可以看到它我当前未使用的域上正常工作(因此,不仅仅是尝试偷偷摸摸的链接)。尽管这不是永久链接,但当前可用。


您可以使用更短的urlshortener =)来进一步缩短它的长度,例如➡.ws/ .v
瑕疵的

我使用tinyarrows.com链接尝试了此操作,但是连接超时导致服务器超时。它们实际上是很小的网址。
Paul Drewett 2014年

1
在此站点上,可以使用缩短的开始标签(我相信可以<?代替<?php),而不必使用结束标签。那应该剩下一些字符。
贾斯汀

1
turl.no制作了一些非常短的链接,并且由于它是挪威语的链接缩短器,因此在国际上很少有人注意到它。这是您的链接:turl.no/t2u指向与tinyurl.com链接相同的页面,并保存8个字符。
bilde2910 2014年

@ bilde2910谢谢,它起作用了,它的确是另一个很小的URL。非常感谢,Turl.ca很有趣。他爱自己的.ca域名,不是吗:-)
Paul Drewett 2014年

4

飞镖412 403

import"dart:io";import"dart:convert";main(){new HttpClient().get("pi.vu",0,"BYga").then((v)=>v.close()).then((r)=>r.transform(UTF8.decoder).join()).then((s,[i,c="Top!"])=>new RegExp(r'<div id="answer-(\d+)[^]*?vote-count-post ">(\d+)[^]*?<table class="fw"').allMatches(s).forEach((m)=>m[1]=="34735"?print(c):m[2][0]!='-'&&(i=(s=m[0]).indexOf("<code>"))>0?c=s.substring(i+6,s.indexOf("</code>",i)):0));}

脱节(很好,有换行符和领先的空格)

import"dart:io";
import"dart:convert";
main(){
  new HttpClient().get("pi.vu",0,"BYga")
  .then((v)=>v.close())
  .then((r)=>r.transform(UTF8.decoder).join())
  .then((s,[i,c="Top!"])=>
      new RegExp(r'<div id="answer-(\d+)[^]*?vote-count-post ">(\d+)[^]*?<table class="fw"')
      .allMatches(s)
      .forEach((m)=>
          m[1]=="34735"?print(c)
                       :m[2][0]!='-'&&(i=(s=m[0]).indexOf("<code>"))>0
                           ?c=s.substring(i+6,s.indexOf("</code>",i)):0
  ));
}

4

德尔福(688873859848 840)

我仍然会尝试刮掉一些字符,但这会完成工作的:)

编辑:不是让它变短,而是让它变长了:P
当投票数为负或没有代码块时,我忘记添加对答案的忽略。

我只是在编辑时更新非高尔夫版本。
感谢@manatwork提供建议的编辑,该编辑占用了8个字符。

高尔夫球版:

uses IdHTTP,Classes,MSHTML;const u='http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718#34718';var g:TIdHTTP;m:TMemoryStream;l:TStringList;p,t,r,o:OleVariant;s,i,j:int32;c:boolean;begin L:=TStringList.Create;g:=TIdHTTP.Create(nil);m:=TMemoryStream.Create;g.Get(u,m);m.Position:=0;L.LoadFromStream(m);p:=coHTMLDocument.Create as IHTMLDocument2;p.write(l.Text);for I:=0to p.body.all.length-1do begin c:=0>1;t:=p.body.all.item(i);if(t.classname='answer')and(t.id='answer-34718')then if s=0 then writeln('Top!') else for j:=0to o.all.length-1do begin t:=o.all.item(j);if t.tagname='CODE'then writeln(t.innertext);end else if t.classname='answer'then begin for j:=0to t.all.length-1do begin r:=t.all.item(j);if r.tagname='CODE'then c:=1>0 else if c and(r.class='vote-count-post')and(r.innertext[1]<>'-')then begin o:=t;s:=1;end;end;end;end;end.

非高尔夫版本:

uses
  IdHTTP,Classes,MSHTML;
const
  u='http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718';
  a='answer';b='CODE';
var
  g:TIdHTTP;
  m:TMemoryStream;
  l:TStrings;
  p,t,r,o,z:OleVariant;
  s,i,j:int32;
  c:byte;
begin
  L:=TStringList.Create;
  g:=TIdHTTP.Create(nil);
  m:=TMemoryStream.Create;
  g.Get(u,m);
  m.Position:=0;
  L.LoadFromStream(m);
  p:=coHTMLDocument.Create as IHTMLDocument2;
  p.write(l.Text);
  z:=p.body.all;
  for I:=0to z.length-1do
  begin
    c:=0;
    t:=z.item(i);
    if(t.classname=a)and(t.id='answer-34718')then
      if s=0 then
        write('Top!')
      else
        for j:=0to o.all.length-1do
        begin
          t:=o.all.item(j);
          if t.tagname=b then
            write(t.innertext)
        end
    else if t.classname=a then
      for j:=0to t.all.length-1do
      begin
        r:=t.all.item(j);
        if r.tagname=b then
          c:=1
        else if(c=1)and(r.class='vote-count-post')and(r.innertext[1]<>'-')then
        begin
          o:=t;
          s:=1;
        end;
      end;
  end;
end.

http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718#34718可以更改为http://codegolf.stackexchange.com/q/34718,这样可以节省很多字符。
门把手

谢谢,可悲的是,我也不得不添加一些内容,因为我忘记了您必须忽略投票数为负数或没有代码块的答案的部分:/ ..不起作用:(我得到了301永久移动
Teun Pronk,2014年

正如之前提示,你可以声明l由于TStrings代替。(但请保留实例化TStringList。)
manatwork 2014年

我会尝试用c byte代替boolean
manatwork 2014年

3

Python-280

import os, sys, cgi
os.system('wget http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours.html -q -O a')
b=[ x[:-2] for x in open('a').read().split('code>') if x[-1]=='/']
for i, m in enumerate(b):
    if m == cgi.escape(open(sys.argv[0]).read()):
        print b[i-1]

这是我的第一个代码高尔夫球,所以我希望这足够高尔夫!

编辑:感谢您的提示!现在看起来有点高尔夫球手。


第一次尝试看起来不错!虽然你可以使用一个短网址的链接,并在那里得到的(去掉一些空间for i,mm==open等)。
ChristophBöhmwalder2014年

@HackerCow我认为URL缩短器通常不受欢迎,但是http://codegolf.stackexchange.com/q/34705/14509肯定可以。
地下

@KidElephant我从代码中删除了一堆空格。我没有进行任何测试,但是除非我搞砸了,否则它应该(在逻辑上)是同一程序。请注意,我删除了shebang,这里不需要这些。ix.io/dsz取出空白可以节省相当多的字节:)
undergroundmonorail

同样,对于代码高尔夫挑战,您应该包括一个字节数。我会在这里为您编辑一个,但是如果您使用任何建议,您的答案可能会改变,因此我不会打扰。您可以通过运行来找到字节数wc -c $filename。如果您的编辑者在文件后添加尾随换行符(可能确实如此),则可以从中减去一个换行符以获得最终分数。
地下

2

Mathematica-159

第一次在Mathematica中进行解析

FirstCase[
 Cases[Import["http://bit.do/JGta1","XMLObject"],
 {__,a_,_,_,_,XMLElement[_, {_, "id""answer-34780",__},_],__}a,∞], 
 XMLElement["code",_,{c_}]c,"Top!",∞]

2

红宝石283 + 17 = 300

无论该答案获得多少票,无论是否有第二(或第十五)页答案,此方法都将成功。它使用数据API。

d=34849
JSON.parse(Net::HTTP.get(URI("http://api.stackexchange.com/2.2/questions/34705/answers?site=codegolf&filter=8G3Ng9T*")))['items'].map{|a|abort$1.gsub(/&.+?;/){|g|g[?a]??&:g[?g]??>:?<}if !d&&a['score']>=0&&/<code>(.*?)<\/code>/m=~a['body']
d=p if a['answer_id']==d}
$><<'Top!'

必须与ruby -rnet/http -rjson(因此+17)一起运行

松开

d = 34849 # this answer id
i = JSON.parse(Net::HTTP.get(URI("http://api.stackexchange.com/2.2/questions/34705/answers?site=codegolf&filter=8G3Ng9T*")))['items'] # stackexchange api answers for this question
i.map{ |a|
  # if we've already hit this answer, the score's above 0 and there's code...
  if !d && a['score']>=0 && /<code>(.*?)<\/code>/m=~a['body'] then
    # abort with html-unescaped code
    abort $1.gsub(/&.+?;/){ |g|
      # this turns &amp;, &gt; and &lt; into &, > and <, respectively
      g[?a] ? ?& : g[?g] ? ?> : ?<       
    }
  end
  # if we are at our answer, set d = nil
  if a['answer_id']==d then 
    d = p 
  end
}
# no abort. puts 'Top!'
$><<'Top!'

变更日志

300个正则表达式中的删除括号

302初次提交


您可以通过使过滤器不安全来节省一些字节
pppery

@ppperry请解释吗?
并非查尔斯(Charles)

使用不安全的过滤器意味着您必须手动进行HTML unescape。请参阅筛选器文档
pppery

1

PHP 135

<?
preg_match_all('@(\d+?)"></a.*de>(.*)</c@Us',join('
',file('http://pi.vu/BYga')),$m);echo$m[2][array_search(34786,$m[1])-1]?:'Top!';

编辑: lrn的URL缩短器产生最短的URL :)

RegEx与每个答案之前的锚点(以及答案ID)和第一个<code>标签内的内容匹配。该U标志触发U贪婪模式,并且s标志进行.匹配新行(极少数)。我不担心这是否与其他内容匹配,因为逃脱了答案,因此没有人可以<在页面源中插入文字。

当我得到所有答案$m[2]并将其ID 作为以后,如果我的答案最终排在第一位$m[1],我就用它在我echo的上方打印答案,因为它位于$m[2][array_search(34786,$m[1])-1]或“ Top!”中。

我喜欢这样的事实:在PHP中,三元运算符可以用作短路运算符 ?:


这是惊人的。我刚刚测试了它,但是它显示了下面的代码。我相信这将是一个快速解决方案,但我想我会提一下。很棒的工作,但是PHP 135,我还是不太相信...
Paul Drewett 2014年

1
@PaulDrewett在私人浏览中打开此页面时,请查看顺序。当你已经登录这是从顺序不同。
core1024

哦,太令人惊讶了。我想知道为什么?抱歉指出一个错误。我的错。我确实赞成您,但它是一个有用的答案。我仍然认为这太神奇了……
Paul Drewett 2014年

1

Delphi,461字节,553字节

现在也可以处理多个页面!

打高尔夫球:

uses IdHTTP,RegularExpressions;var T,S,O:String;K,V,C:Int32;begin repeat Inc(C);Str(C,S);S:=TIdHTTP.Create.Get('http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours?page='+S);T:=T+S;until Pos('<span class="page-numbers next',S)=0;O:='Top!';for T in TRegEx.Split(T,'<a name="') do begin S:=T;Val(Copy(S,1,Pos('"',S)-1),K,C);if C=1then Continue;Delete(S,1,Pos('post ">',S)+6);Val(Copy(S,1,Pos('<',S)-1),V,C);C:=Pos('<code>',S);if(C=0)or(V<0)then Continue;if K=34844then Break;O:=Copy(S,C+6,Pos('</code>',S)-C-6);end;Write(O)end.

(略)未打高尔夫球:

uses
  IdHTTP,RegularExpressions;
var
  T,S,O:String;
  K,V,C:Int32;
begin
  // download all pages in thread and concat them
  repeat
    Inc(C);
    Str(C,S);
    S:=TIdHTTP.Create.Get('http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours?page='+S);
    T:=T+S;
  until Pos('<span class="page-numbers next',S)=0;
  O:='Top!'; // initialize code string to 'Top!'
  for T in TRegEx.Split(T,'<a name="') do begin
    S:=T;
    Val(Copy(S,1,Pos('"',S)-1),K,C); // try to extract user id
    if C=1then Continue; // if failed, continue loop
    Delete(S,1,Pos('post ">',S)+6); // prepare S for next parse
    Val(Copy(S,1,Pos('<',S)-1),V,C); // try to extract vote count
    C:=Pos('<code>',S); // check if <code> tag exists
    if(C=0)or(V<0)then Continue; // make sure vote count is positive and <code> tag exists
    if K=34844then Break; // if its our answer, break the loop
    O:=Copy(S,C+6,Pos('</code>',S)-C-6); // get string in <code> tag
  end;
  Write(O); // write <code> string
end.

如何运行:

app.exe > output.txt

不错,可能已经做了太多,而不是使用HTML单位..耻辱,我没想到的是:P
师德普

谢谢。另外,(即使不是唯一的)一种代码也可以处理多个页面。
Marko Paunovic

1

PHP - 412 - 422 - 416 - 252 - 248:

仍在进行中,关于多页,我没有做任何事情(也没有其他人吗?)

我裁掉了很多多余的字符后,得到200个字符的字符,为什么当我只能找到它们的位置时搜索对象?

这也是我第一次打高尔夫!我很高兴在200年代使用dom方法做到了这一点。多亏了评论,我才剃了另外4个字符。

我想在遍历dom方面做类似jquery / jscript的事情,并且仍在努力做到这一点。也许我可以搜索“ asi”作为我的用户名呢?

高尔夫球:

<? $d=new DOMDocument;$d->loadHTMLFile("http://bit.do/JGta");$x=new DOMXPath($d);$r=$x->query("//*[@class='answer']");$a=-1;while($f=$r->item(++$a))if(strpos($f->nodeValue,"Asitaka"))echo$x->query(".//pre//code",$r->item($a-1))->item(0)->nodeValue;

格式:

    <?php
$d = new DOMDocument();
$d->loadHTMLFile("http://bit.do/JGta");
$x = new DOMXPath($d);
$r = $x->query("//*[@class='answer']");
$a = -1;
while($f = $r->item(++$a))
        if ( stripos($f->nodeValue, "Asitaka")!= 0)
            echo $x->query(".//pre//code",$r->item($a-1))->item(0)->nodeValue;
?>

干杯


中的括号new DOMDocument()?>在PHP中可以省略结尾。
jimmy23013

谢谢,又失去了4个字符。目前,除非使用不同的类,否则我无法想象如何缩短它,DOM访问器非常昂贵。
Asitaka 2014年

通过更改用户名来保存字符!
DavidG

我认为这很酷。我只是想学习DOMXPath的查询部分,但我必须承认我发现这很困难。我确实为此尝试过,但还不太明白。我测试了您的设备,但似乎报告的是上面的两个,而不是上面的一个。我确信这是一个快速解决方案,但我想我会提一下。
Paul Drewett 2014年

根据不同的答案注释中的信息“在私人浏览中打开此页面时,请查看顺序。它与您登录时的顺序-core1024不同”,我必须假设相同的情况也在这里发生。抱歉
Paul Drewett 2014年

1

Python 3中,197个 191字节

import urllib.request as u,gzip,json;p='Top!'
for r in json.loads(gzip.decompress(u.urlopen("http://bit.ly/2hN8TKV").read()).decode())["items"]:
 if r['answer_id']==82837:exit(p)
 p=r['body']

规则没有说我不能使用API​​,也不能使用URL缩短器。

https://tinyurl.com/hdemk76扩展为https://api.stackexchange.com/2.2/questions/34705/answers?order=desc&sort=votes&site=codegolf&filter=withbody&pagesize=100 仅在按投票排序的前100个答案中有效。


-6,如果您替换https://tinyurl.com/hdemk76http://bit.ly/2hN8TKV
Taylor Scott
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.