당신의 대답을 출력하십시오


15

<code>...</code>답변이 투표로 정렬 될 때 귀하의 바로 위에있는이 질문에 대한 답변 의 첫 번째 HTML 블록의 내용을 출력하는 프로그램을 작성 하십시오. Top!당신이 최고 답변이라면 출력 .

투표가 부정적이거나 <code>...</code>태그가 없는 답변은 무시하십시오 . 프로그램의 출처는 <code>...</code>게시물 의 첫 번째 블록에 나타나야합니다 . 이 블록은 use backticks또는

indent things with 4 spaces.

이것은 코드 골프이며, 가장 적은 문자가있는 답이 이깁니다.

추가 규칙 (업데이트 됨)

  • 원하는 프로그래밍 언어로 대답하되 여러 번 대답하면 다른 언어를 사용하십시오.
  • 출력을 하드 코딩 할 수 없습니다. 프로그램의 올바른 실행 능력은 투표 수 또는 위의 답변에 따라 달라지지 않아야합니다. 투표 분포가 급격히 바뀌더라도 프로그램은 여전히 ​​위의 답변 코드를 올바르게 출력해야합니다.
  • 사용자 이름 (하나의 답변 만있는 경우) 또는 답변의 직접 링크와 같은 답변의 고유 한 속성을 통해이 페이지에서 자신을 검색하도록 프로그램을 하드 코딩 할 수 있습니다 .
  • 두 개의 답변이 동일한 투표권을 가지고 있다면 여전히 귀하의 바로 위에있는 답변을 사용해야합니다 (최신 답변이라고 생각합니다).
  • <code>...</code>답변에 여러 블록 이있을 수 있지만 첫 번째 블록에는 프로그램 소스가 포함되어 있어야합니다.

1
여러 페이지를 고려해야합니까?
OUurous

1
예, 여러 페이지를 고려해야합니다
Calvin 's Hobbies

4
그 주 inline code spans만입니다 <code></code>만, 적절한 코드 블록이다 <pre><code>stuff</code></pre>.
손잡이

3
@ Calvin'sHobbies (답으로) 묶인 답변의 순서는 무작위라고 생각합니다. 적어도 그래서, 나는 여기에 대해 모른다.
Martin Ender

4
여러 페이지를 돌보는 것이 불필요하다고 주장합니다. 첫 페이지에 있지 않다면 어쨌든 당첨되지 않습니다 :)
lrn

답변:


5

자바 스크립트 + jQuery (92 86 64 자)

테스트하려면 페이지 (일반적으로 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 코드를 계산해야합니까? 규칙에 "원하는 프로그래밍 언어로 대답"이 표시됩니다.
로비 Wxyz

Firefox 코드를 세지 않아도됩니다. :) 통역사가 아닌 현재 환경에서 이점이 있습니다. 마치 모든 사람이 페이지의 소스를 이미 "개체"/ "변수"에로드 한 것과 같습니다. 익스플로잇의 경우 +1;)
core1024

4
두 번째 페이지의 상단에있는 경우 "정상"이라고 경고합니다. 이것이 올바른 동작입니까?
윌리엄 바르보사

@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

tinyarrows.com 링크로 시도했지만 서버 연결 시간이 지연되었습니다. 그들은 정말로 작은 URL입니다.
Paul Drewett

1
이 사이트에서는 단축 시작 태그를 사용하고 ( <?대신 <?php) 닫는 태그를 사용하지 않는 것이 좋습니다. 그것은 당신에게 더 많은 문자를 남길 것입니다.
Justin

1
turl.no는 꽤 짧은 링크를 만들고 노르웨이 링크 단축기이기 때문에 국제적으로 그것을 알아 차린 사람은 거의 없습니다. 여기에 대한 링크입니다 : turl.no/t2u 점 같은 페이지로 tinyurl.com 링크로는 8 개 문자를 저장합니다.
bilde2910

고마워, 그것은 효과가 있었고 실제로 또 다른 아주 작은 URL입니다. 많은 감사와 Turl.ca는 흥미 롭습니다. 그는 자신의 .ca 도메인을 좋아하지 않습니다 :-)
Paul Drewett

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 859848 840)

나는 여전히 일부 캐릭터를 면도하려고하지만 작업을 수행합니다 :)

편집하다: 짧아지는 대신 길어졌습니다
.

편집하는 동안 골프 용 버전을 업데이트하고 있습니다.
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 영구적으로 이동 얻을 / .. 나던 작업 :( : 덕분에, 슬프게도 나는 또한 당신이 음의 votecount 또는 전혀 코드 블록과 대답을 무시해야하는 부분 잊었 때문에 몇 가지를 추가했다
Teun Pronk

이전에 제안한 대로 l을 TStrings대신 선언 할 수 있습니다 . (하지만 인스턴스화를 계속 유지하십시오 TStringList.)
manatwork

byte대신 c를 만들려고합니다 boolean.
manatwork

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]

이것이 나의 첫 번째 코드 골프이기 때문에 이것이 골프라고 생각합니다!

편집 : 팁 주셔서 감사합니다! 이제 조금 골퍼로 보입니다.


첫 시도에 나쁘지 않습니다! 해당 링크에 대한 URL 축약 서비스를 사용할 수 거기 (에 약간의 공간을 제거하지만 for i,m, m==open등).
Christoph Böhmwalder

@HackerCow URL 단축 문자는 일반적으로 눈살을 찌푸리게 생각하지만 http://codegolf.stackexchange.com/q/34705/14509확실히 작동합니다.
undergroundmonorail

@KidElephant 코드에서 공백을 제거했습니다. 나는 그것을 테스트하지 않았지만 망쳐 놓지 않으면 (논리적으로) 동일한 프로그램이어야합니다. Shebang을 제거 했으므로 여기서는 필요하지 않습니다. ix.io/dsz 공백을 제거하면 상당히 많은 바이트를 절약 할 수 있습니다. :)
undergroundmonorail

또한 코드 골프 문제의 경우 바이트 수를 포함해야합니다. 나는 당신을 위해 하나를 편집 할 것이지만, 당신이 어떤 제안을 사용하면 귀찮지 않게 당신의 대답은 아마 바뀔 것입니다. 를 실행하여 바이트 수를 찾을 수 있습니다 wc -c $filename. 편집자가 파일에 후행 줄 바꿈을 추가하는 경우 (아마도 가능) 최종 점수를 얻기 위해 해당 줄을 뺄 수 있습니다.
undergroundmonorail

2

매스 매 티카-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 설명 해주십시오?
찰스

안전하지 않은 필터를 사용한다는 것은 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인데도 여전히 믿을 수 없습니다 ...
Paul Drewett

1
@PaulDrewett이 페이지를 개인 브라우징으로 열 때 주문을보십시오. 로그인했을 때의 순서와 다릅니다.
core1024

아, 놀랍습니다. 왜 궁금해? 오류 오류를 지적하여 죄송합니다. 내 잘못이야. 유용한 답변으로 당신을 찬성했습니다. 나는 아직도 그것이 놀랍다 고 생각합니다 ...
Paul Drewett

1

델파이, 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 Pronk

감사. 또한 여러 페이지를 처리하는 코드 중 하나 일뿐입니다.
Marko Paunovic

1

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

여전히 진행중인 작업으로 여러 페이지에 대해 아무 것도하지 않았습니다 (다른 사람이 있습니까?)

여분의 돔을 많이 잘라서 200자를 떨어 뜨 렸습니다. 왜 위치를 찾을 수있을 때 물체를 검색합니까?

이것은 또한 나의 첫 번째 코드 골프입니다! 저는 200 년대에 dom 메소드를 사용하여 기뻤습니다. 의견 덕분에 방금 4 문자를 더 깎았습니다.

돔 통과와 관련하여 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;
?>

건배


의 괄호로 묶고 PHP에서 new DOMDocument()닫는 ?>것을 생략 할 수 있습니다.
jimmy23013

고마워, 4 자 더 잃었다. 현재 다른 클래스를 사용하지 않으면 DOM 액세서가 비싸지 않으면 더 짧아지는 방법을 상상할 수 없습니다.
Asitaka

사용자 이름을 변경하여 문자를 저장하십시오!
DavidG

나는 이것이 멋지다고 생각합니다. DOMXPath에 대한 쿼리 부분을 배우려고하지만 힘든 것을 인정해야합니다. 나는 이것을 시도했지만 그것을 얻지 못했습니다. 나는 당신을 테스트했지만 직접 위의 두 가지가 아니라 그 위의 두 가지를보고하는 것 같습니다. 나는 그것이 빠른 해결책이라고 확신하지만 그것을 언급 할 것이라고 생각했습니다.
Paul Drewett

이 정보에 따르면 "개인 검색에서이 페이지를 열 때 순서를 확인하십시오. 로그인 한 순서와 다릅니다-core1024"다른 답변 의견에서 나는 여기에서도 동일한 상황이 발생한다고 가정해야합니다. 그 죄송합니다.
Paul Drewett

1

Python 3, 197191 바이트

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.