あなたの答えを上に出力する


15

<code>...</code>この質問に対する回答の最初のHTML ブロックの内容を出力するプログラムを作成します。これは、回答が投票によってソートされたときに、あなたのすぐ上にあります。Top!あなたが一番の答えである場合に出力します。

反対票または<code>...</code>タグがない回答を無視します。プログラムのソースは<code>...</code>、投稿の最初のブロックに表示される必要があります。これらのブロックは、次のuse backticks場合に自動的に作成されます

indent things with 4 spaces.

これはコードゴルフです。文字数が最も少ない答えが勝ちです。

追加ルール(更新)

  • 必要なプログラミング言語で回答しますが、複数回回答する場合は異なる言語を使用します。
  • 出力をハードコーディングすることはできません。プログラムが正しく実行されるかどうかは、投票数や上記の答えに依存するべきではありません。投票分布が大幅に変更された場合でも、プログラムは上記の回答のコードを正しく出力するはずです。
  • ユーザー名(回答が1つしかない場合)や回答の直接リンクなど、回答の固有のプロパティを使用して、このページでプログラムをハードコーディングして(次に高いものを見つけるように)ハードコーディングすることできます。
  • 2つの回答が同じ票を持っている場合でも、あなたの回答の1つ上にあるものを使用する必要があります(最新のものになると思います)。
  • <code>...</code>回答に複数のブロックがある場合がありますが、最初のブロックにはプログラムのソースが含まれている必要があります。

1
複数のページを考慮する必要がありますか?
Οurous

1
はい、複数のページを考慮する必要があります
カルビンの趣味14

4
ただし、適切なコードブロックはであることに注意しinline code spansてください。<code></code><pre><code>stuff</code></pre>
ドアノブ

3
@ Calvin'sHobbiesタイの回答(投票による)の順序はランダムだと思います。少なくともSOでは、ここについては知りません。
マーティンエンダー14

4
私は、複数のページを気にする必要はないと主張します-あなたが最初のページにいなければ、あなたはとにかく
勝ち

回答:


5

Javascript + jQuery(92 86 64文字)

テストするには、この上で開発ツールを開きますページ(通常はF12)で、コードを実行します!

このJavscriptは、このページ(およびこのページのみ)からコンソールを使用して実行する必要があります。

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

要するに、スクロールバーさえ必要ありません!

基本的には、IDで回答を見つけ、2つのノードを先に取得します(アンカーリンクをスキップします)。それが存在しない場合、私は一番上になければなりません。次に、最初のcode要素まで掘り下げて取得します.innerHTMLます。

嬉しいことに、SEはデフォルトでjQueryを使用しているので、試してみなくてもその利点が得られます。


2
個人的には、ごまかしに少し似ているのであなたの答えは好きではありませんalert($("code",$("#answer-34767").prev().prev()).html()||"Top!")
core1024 14

@ core1024:改善をありがとう!私はそれを一言でやろうとは考えていませんでした。私には大きな利点があることに同意します。たぶん、78MBを超えるFirefoxのコードをカウントする必要がありますか?ルールには、「必要なプログラミング言語で回答する」と書かれています。
ロビーWxyz 14

Firefoxのコードを数える必要はありません:)あなたの利点は、インタープリターではなく現在の環境にあります。まるで誰もがページのソースを「オブジェクト」/「変数」にロードしているかのようです。エクスプロイトのために+1;)
core1024 14

4
これは、2ページ目の上部にある場合に「上部」にアラートを出します。これは正しい動作ですか
ウィリアムバルボサ14

@WilliamBarbosa:その上で「lrn」と一緒にいます。(OPの質問に関する彼のコメントを参照)。
ロビーWxyz

6

PHP 666 611 593 588 580文字

編集:tinyurlから以前よりもさらに小さなURLを使用しました。

編集:私はブール値ではなくintを使用した他の答えのコメントに従ってください。明らかになったが現在修正されているエラーを修正する必要もありました。

ここに私のコードがあります

<?
$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
flawr 14

tinyarrows.comリンクで試しましたが、接続の遅延によりサーバーがタイムアウトしました。しかし、それらは本当に小さなURLです。
ポールドリューエット14

1
このサイトでは、短縮された開始タグ(の<?代わりに使用されると思います<?php)を使用し、終了タグを省略してもかまいません。これにより、さらにいくつかの文字が残ります。
ジャスティン14

1
turl.noはかなり短いリンクを作成します。ノルウェーのリンク短縮サービスであるため、国際的に気づいている人はほとんどいません。リンクは次のとおりです。turl.no / t2uは、tinyurl.comリンクと同じページを指し、8文字を保存します。
bilde2910 14

@ bilde2910ありがとう、それはうまくいきました。それは確かに非常に小さなURLです。Turl.caは非常に高く評価されており、興味深いものです。彼は.caドメインが好きではありません:-)
ポールドリューエット14

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

Ungolfed(まあ、改行と先頭の空白を含む)

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

デルファイ(688 873 859 848 840)

私はまだいくつかのキャラクターを剃ろうとしますが、それは仕事をします:)

編集:短くする代わりに、長くしました:P
投票数が負であるかコードブロックがない場合、回答を無視することを忘れました。

編集中にゴルフをしていないバージョンを更新しています。
提案された編集で8文字を削除してくれた@manatworkに感謝します。

ゴルフバージョン:

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恒久的に移動し得る/ .. doesntの仕事:(:おかげで、悲しいことに私はまた、私はあなたが負のvotecountまたは全くコードブロックとの答えを無視する必要が一部忘れてしまったので、いくつかを追加する必要がありました
Teunプロンク

前に提案され、あなたはとしてリットルを宣言することができますTStrings代わりに。(ただし、インスタンス化はTStringList。で続けてください)
マナトワーク14

byte代わりにcを作成しようとしbooleanます。
マナトワーク14

3

パイソン-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]

これは私の最初のcodegolfであるので、これが十分なゴルフであることを願っています!

編集:ヒントをありがとう!少しゴルファーになりました。


最初の試行では見た目は悪くありません!ただしfor i,m、リンクにURL短縮サービスを使用して、そこにあるいくつかのスペースを削除することもできます(m==open、など)。
クリストフベームヴァルダー14

@HackerCow URL短縮サービスは一般的に嫌われていると思いますが、http://codegolf.stackexchange.com/q/34705/14509間違いなく機能します。
地下

@KidElephantコードから空白を削除しました。私はそれも何もテストしませんでしたが、めちゃくちゃにしない限り(論理的に)同じプログラムでなければなりません。シバンを削除したことに注意してください。これらはここでは必要ありません。ix.io/dsz空白を削除すると、かなりのバイトを節約できます:)
地下

また、コードゴルフチャレンジでは、バイトカウントを含める必要があります。私はここであなたのために編集しますが、あなたが何か提案をするならばあなたの答えはおそらく変わるでしょうので、私は気にしません。を実行すると、バイトカウントを見つけることができますwc -c $filename。エディターがファイルに末尾の改行を追加する場合(おそらく追加します)、それから1つを減算して最終スコアを取得できます。
地下

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

これは、このアンサーが何票獲得するかに関係なく、アンサーの2ページ目(または15ページ目)に関係なく成功します。データ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説明してください?
はないチャールズ

安全でないフィルターを使用すると、手動でHTMLエスケープを解除する必要があります。参照フィルタドキュメント
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フラグは、トリガーUngreedyモードとsフラグメイクは.新しい行(非常に少数の)と一致します。答えがエスケープされているため、これが他の何かと一致するかどうかは心配しないので<、ページのソースにリテラルを挿入することはできません。

すべての回答$m[2]とのID を取得した後、のように、上の回答を印刷する$m[1]ために使用echoします$m[2][array_search(34786,$m[1])-1]

PHPでは、三項演算子を短絡演算子として使用できるという事実が好きです ?:


すごい。私はそれをテストしましたが、以下のコードを示しています。私はこれが簡単な修正になると確信していますが、私はそれに言及すると思いました。けれども、PHPで135、私はまだかなり...それを信じることができない素晴らしい仕事
ポールDrewett

1
@PaulDrewettこのページをプライベートブラウジングで開くときは、注文をご覧ください。それはあなたがログインしている順序とは異なるのです。
core1024

ああ、それは驚くべきことです。なぜだろうか?エラーのエラーを指摘して申し訳ありません。私の悪い。役に立つ答えとしてあなたに賛成しました。私はまだ...それは驚くべきだと思う
ポールDrewett

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
Teunプロンク

ありがとう。また、複数のページを処理するコードの1つ(だけではないにしても)。
マルコパウノビッチ

1

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

まだ進行中の作業ですが、複数のページに関しては何もしていません(他にも誰もいませんか?)

たくさんの余分なdomを切り取って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 14

おかげで、さらに4つのキャラクターを失いました。現時点では、異なるクラスを使用しない限り、どのように短くするか想像できません。DOMアクセサーは高価です。
Asitaka 14

ユーザー名を変更してキャラクターを保存してください!
DavidG 14

これはクールだと思います。私はDOMXPathのクエリ部分を学習しようとしていますが、それが難しいことを認めなければなりません。私はこれのためにそれを試みましたが、それを全く得ることができませんでした。私はあなたのものをテストしましたが、真上のものではなく、上の2つを報告しているようです。私はそれが簡単な修正であると確信していますが、私はそれを言及すると思いました。
ポールドリューエット14

この情報に従って、「プライベートブラウジングでこのページを開くときの順序を確認してください。ログインしているときの順序とは異なります-core1024」異なる回答のコメントからここでも同じことが起こっていると思います。そのために残念。
ポールドリューエット14

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
テイラースコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.