Выведите ответ выше вашего


15

Напишите программу, которая выводит содержимое первого HTML- <code>...</code>блока ответа на этот вопрос, который находится чуть выше вашего, когда ответы сортируются по голосам. Выведите, Top!если вы лучший ответ.

Игнорировать ответы с отрицательным голосом или без <code>...</code>тегов. Источник вашей программы должен появиться в первом <code>...</code>блоке вашего поста. Эти блоки создаются автоматически, когда вы use backticksили

indent things with 4 spaces.

Это код-гольф, ответ с наименьшим количеством символов выигрывает.

Дополнительные правила (обновлено)

  • Отвечайте на любом языке программирования, который вы хотите, но если вы отвечаете несколько раз, используйте разные языки.
  • Вы не можете жестко закодировать свой вывод. Способность вашей программы работать правильно не должна зависеть от подсчета голосов или от того, какой ответ выше. Если распределение голосов кардинально изменилось, ваша программа все равно должна правильно вывести код ответа над ним.
  • Вы можете жестко запрограммировать свою программу для поиска себя на этой странице (чтобы найти следующую наивысшую оценку) с помощью некоторого уникального свойства вашего ответа, такого как имя пользователя (если у вас есть только один ответ) или прямая ссылка ответа.
  • Если два ответа имеют равные голоса, вы все равно должны использовать тот, который находится чуть выше вашего (который, я считаю, будет самым новым).
  • В <code>...</code>вашем ответе может быть несколько блоков, но первый должен содержать источник вашей программы.

1
Нужно ли учитывать несколько страниц?
Οurous

1
Да, вы должны учитывать несколько страниц
Увлечения Кэлвина

4
Обратите внимание, что inline code spansэто просто <code></code>, но правильные блоки кода есть <pre><code>stuff</code></pre>.
Дверная ручка

3
@ Calvin'sHobbies Я думаю, что порядок ответов (по голосам) является случайным. По крайней мере, на ТАК, я не знаю здесь.
Мартин Эндер

4
Я бы сказал, что забота о нескольких страницах не нужна - если вы не на первой странице, вы все равно не ВЫИГРЫВАЕТЕ :)
lrn

Ответы:


5

Javascript + JQuery (92 86 64 символа)

Чтобы проверить, откройте Dev Tools на этой странице (обычно F12) и запустите мой код!

Этот Javscript должен быть запущен с помощью консоли с этой страницы (и только с этой страницы).

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

Короче говоря, ей даже не нужна полоса прокрутки!

По сути, он находит мой ответ по идентификатору, а затем получает два узла вперед (пропуская ссылку привязки). Если этого не существует, я должен быть на вершине. Затем он копает до первого codeэлемента и получает его .innerHTML.

Приятно то, что SE по умолчанию использует jQuery, поэтому я получаю это преимущество, даже не пытаясь.


2
Мне лично не нравится твой ответ, так как это немного похоже на мошенничество ... В любом случае, оно может быть таким же коротким, как и alert($("code",$("#answer-34767").prev().prev()).html()||"Top!").
core1024

@ core1024: Спасибо за улучшение! Я не думал делать это одним утверждением. Я согласен, что у меня есть огромное преимущество. Может быть, я должен посчитать код Firefox для> 78 МБ? Правила гласят: «Ответь на любом языке программирования».
Робби Wxyz

Вам не нужно считать код Firefox :) Ваше преимущество в текущей среде, а не в интерпретаторе. Это как если бы у всех был источник страницы, уже загруженный в «объект» / «переменная». +1 за эксплойт;)
core1024

4
Это предупредит "top", если это верх второй страницы, это правильное поведение?
Уильям Барбоза

@WilliamBarbosa: я с "lrn" на этом. (см. его комментарий к вопросу ОП).
Робби Wxyz

6

PHP 666 611 593 588 580 символов

Изменить: Используется даже меньший URL, чем ранее из tinyurl.

Изменить: После комментария на другой ответ я использовал 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 Это не будет работать в кодовой панели, поэтому не может показать скрипку.

Изменить: еще 5 сохранено с изменением тегов php

Вы можете видеть, что это работает здесь на домене, которым я в настоящее время не пользуюсь (поэтому я не просто пытаюсь скрытую ссылку). Это не постоянная ссылка, но в настоящее время доступна.


Вы можете сократить его еще больше, используя еще более короткий urlshortener =), например, ➡.ws / .v
flawr

Я попробовал это с ссылкой tinyarrows.com, но задержка в соединении истекает из-за сервера. Они действительно крошечные URL, хотя.
Пол Дрюетт

1
На этом сайте допустимо использовать укороченный открывающий тег (я полагаю, что это <?не так <?php) и не включать закрывающий тег. Это должно оставить вас еще несколько символов.
Джастин

1
turl.no делает несколько довольно коротких ссылок, и поскольку это норвежский сокращатель ссылок, мало кто заметил это на международном уровне. Вот ссылка для вас: turl.no/t2u указывает на ту же страницу, что и ваша ссылка tinyurl.com, и сохраняет 8 символов.
bilde2910

@ 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

Delphi (688 873 859 848 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

Как предлагалось ранее , вы можете объявить l как TStringsвзамен. (Но сохраняйте экземпляр с TStringList.)
manatwork

Я бы попробовал сделать c byteвместо boolean.
Манатворк

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, так что я надеюсь, что этого достаточно!

Изменить: Спасибо за советы! Сейчас это выглядит немного лучше.


Не выглядит плохо с первой попытки! Хотя вы можете использовать URL Shortener для ссылки и избавиться от нескольких пространств там ( for i,m, m==openи т.д.).
Кристоф Бемвальдер

@HackerCow Я думаю, что сокращение URL-адресов, как правило, не одобряется, но http://codegolf.stackexchange.com/q/34705/14509определенно будет работать.
подземный

@KidElephant Я удалил кучу пробелов из вашего кода. Я не проверял это или что-то еще, но если я не облажался, это должно быть (логически) одна и та же программа. Обратите внимание, что я удалил Шебанг, они здесь не нужны. ix.io/dsz Удаление пустого пространства может сэкономить немало байтов :)
подземный

Кроме того, для кодовых задач в гольф вы должны включать количество байтов. Я бы отредактировал один для вас здесь, но ваш ответ, вероятно, изменится, если вы используете какие-либо предложения, поэтому я не буду беспокоиться. Вы можете найти количество байтов, запустив 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)

ungolfed:

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 удаленных паренов в символе regex

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!';

Редактировать: сокращение URL-адрес lrn производит самый короткий URL :)

RegEx сопоставляет привязку перед каждым ответом (вместе с идентификатором ответа) и содержимое внутри первого <code>тега. UФлаг вызывает Ungreedy режима и sфлаг делает .спички новых линий (очень горсть). Я не волнуюсь, если это совпадает с чем-то другим, поскольку ответы не отображаются, поэтому никто не может вставить <литерал в исходный код страницы.

После того, как я получу все ответы $m[2]и их идентификаторы $m[1], я просто использую, echoчтобы напечатать ответ выше моего, так как он находится в$m[2][array_search(34786,$m[1])-1] , или «Top!», Если мой ответ в конце концов окажется первым :)

Мне нравится тот факт, что в PHP троичный оператор может использоваться как оператор короткого замыкания ?:


Это удивительно. Я только что проверил это, но он показывает код из приведенного ниже. Я уверен, что это будет быстрое решение, но подумал, что упомяну об этом. Потрясающая работа, 135 в PHP, я до сих пор не могу в это поверить ...
Paul Drewett

1
@PaulDrewett Пожалуйста, посмотрите на порядок, когда вы открываете эту страницу в приватном просмотре. Это отличается от порядка, когда вы вошли в систему.
core1024

О, это удивительно. Интересно, почему? Извините, что указал на ошибку в ошибке. Виноват. Я сказал тебе, хотя бы как полезный ответ. Я все еще думаю, что это удивительно ...
Пол Дрюетт

1

Delphi, 461 байт , 553 байт

Теперь обрабатывает несколько страниц тоже!

Golfed:

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
Теун Пронк

Благодарю. Кроме того, один из (если не только) кодов, который также обрабатывает несколько страниц.
Марко Паунович

1

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

Все еще в стадии разработки, я ничего не сделал в отношении нескольких страниц (и никто другой?)

Я получил падение в 200 символов, вырезав много лишних очков, зачем искать объекты, когда я могу просто найти их положение?

Это тоже мой первый кодовый гольф! Я счастлив, что сделал это в 200-х и используя методы DOM. Благодаря комментариям я просто сбрил еще 4 персонажа.

Я хотел сделать что-то вроде jquery / jscript в отношении обхода dom, и все еще работаю над уменьшением этого. Может быть, я мог бы уйти с поиска «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 стоят дорого.
Аситака

Сохраняйте персонажей, меняя имя пользователя!
DavidG

Я думаю, что это круто. Я просто пытаюсь узнать часть запроса к DOMXPath, но должен признать, что мне это сложно. Я попробовал это для этого, но не мог получить это. Я проверил ваш, но, кажется, он сообщает о двух выше, а не о том, что выше. Я уверен, что это быстрое решение, но я подумал, что упомяну об этом.
Пол Дрюетт

После этой информации "Пожалуйста, посмотрите на порядок, когда вы открываете эту страницу в приватном просмотре. Он отличается от порядка, когда вы вошли в систему - core1024" из другого комментария к ответу. Я должен предположить, что то же самое происходит и здесь. Простите за это.
Пол Дрюетт

1

Питон 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/hdemk76наhttp://bit.ly/2hN8TKV
Тейлор Скотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.