Виведіть відповідь вище своєї


15

Напишіть програму, яка виводить вміст першого <code>...</code>блоку HTML відповіді на це питання, який знаходиться вище вашого, коли відповіді сортуються за голосами. Виведіть, Top!якщо ви найкраща відповідь.

Ігноруйте відповіді, які мають негативні голоси або відсутні <code>...</code>теги. Джерело вашої програми має з’явитися в першому <code>...</code>блоці у вашій публікації. Ці блоки створюються автоматично, коли ви use backticksабо

indent things with 4 spaces.

Це кодовий гольф, виграє відповідь з найменшими символами.

Додаткові правила (оновлено)

  • Відповідайте будь-якою мовою програмування, але якщо ви відповіли кілька разів, використовуйте різні мови
  • Ви не можете жорстко кодувати свій вихід. Здатність вашої програми до правильного запуску не повинна залежати від її підрахунку голосів чи від відповіді, яка вище Якщо розподіл голосів різко змінився, ваша програма все одно правильно виводить код відповіді над нею.
  • Ви можете жорстко кодувати програму, щоб шукати себе на цій сторінці (щоб знайти наступну найвищу) через якесь унікальне властивість вашої відповіді, наприклад, ваше ім’я користувача (якщо у вас є лише одна відповідь) або пряме посилання відповіді.
  • Якщо два відповіді мають рівні голоси, ви все одно повинні використовувати той, який знаходиться вище вашого (який, я вважаю, буде найновішим).
  • У <code>...</code>вашій відповіді може бути кілька блоків, але перший повинен містити джерело програми.

1
Чи потрібно обліковувати кілька сторінок?
Οurous

1
Так, ви повинні мати кілька сторінок
Calvin's Hobbies

4
Зауважте, що inline code spansце справедливі <code></code>, але правильні блоки коду є <pre><code>stuff</code></pre>.
Дверна ручка

3
@ Calvin'sHobbies Я думаю, що порядок зв'язаних відповідей (голосами) випадковий. Принаймні, про SO, я не знаю про це тут.
Мартін Ендер

4
Я б заперечував, що турбота про декілька сторінок зайва - якщо ти не на першій сторінці, то все одно не
перемагаєш

Відповіді:


5

Javascript + jQuery (92 86 64 char)

Для тестування відкрийте 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 за> 78MB? У правилах написано "Відповісти будь-якою мовою програмування, яку ви хочете".
Robbie Wxyz

Вам не потрібно рахувати код Firefox :) Ваша перевага в поточному середовищі, а не в перекладачі. Це так, як якщо б у всіх було джерело сторінки, вже завантажене у змінну "об'єкт" / ". +1 за подвиг;)
core1024

4
Це буде попереджати "вгорі", якщо це верх другої сторінки, це правильна поведінка?
Вільям Барбоса

@WilliamBarbosa: Я з цим "lrn". (див. його коментар до питання ОП).
Роббі Віксиз

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

Я спробував це за посиланням tinyarrows.com, але затримка підключення часу на сервер. Вони справді крихітні URL-адреси, хоча.
Пол Дрюетт

1
На цьому веб-сайті прийнятно використовувати скорочений тег відкриття (я вважаю, що це <?замість <?php) та залишити тег із закриттям. Це повинно залишити вам ще кілька символів.
Джастін

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

@ bilde2910 Дякую, що працювало, і це справді ще одна дуже крихітна URL-адреса. Дуже цінується, і Turl.ca цікавий. Він любить свої домени .ca, чи не так :-)
Пол Дрюетт

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.)
манатура

Я б спробував зробити 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]

Це мій перший кодогольф, тому я сподіваюся, що цього достатньо для гольфу!

Редагувати: Дякую за поради! Зараз це виглядає трохи гольфіст.


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

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

@KidElephant Я видалив з вашого коду купу пробілів. Я не перевіряв цього чи нічого, але якщо я не накрутив, це повинна бути (логічно) та сама програма. Зауважте, що я зняв шебанг, вони тут не потрібні. ix.io/dsz Виділення простору може зберегти небагато байтів :)
undergroundmonorail

Крім того, для кодових проблем із гольфом ви повинні включати кількість байтів. Я відредагував би вас тут, але ваша відповідь, ймовірно, зміниться, якщо ви скористаєтесь якимись пропозиціями, тому я не буду турбувати. Ви можете знайти кількість байтів, запустивши wc -c $filename. Якщо ваш редактор додає до файлів кінцевий новий рядок (це, мабуть, так і є), ви можете відняти один з них, щоб отримати остаточну оцінку.
підземниймонорельс

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

Редагувати: укорочувач URL-адреси lrn створює найкоротшу URL-адресу :)

RegEx відповідає узв'язку перед кожною відповіддю (разом з ідентифікатором відповіді) та вмістом всередині першого <code>тегу. UПрапор викликає Ungreedy режиму і sпрапор робить .сірники нових ліній (дуже жменю). Я не переживаю, якщо це відповідає чомусь іншому, оскільки відповіді уникнуть, тому ніхто не може вставити< буквальне у джерело сторінки.

Після того, як я отримаю всі відповіді $m[2]та їх посвідчення особи $m[1], я просто використовую echoдля друку відповіді над моєю, як це є $m[2][array_search(34786,$m[1])-1], або "Вгору!", Якщо моя відповідь зрештою стає першою :)

Мені подобається те, що в PHP термінальний оператор може використовуватися як оператор короткого замикання ?:


Це чудово. Я тільки тестував його, але він показує код із наведеного нижче. Я впевнений, що це буде швидким виправленням, але думав, що я це згадаю. Дивовижна робота, проте, 135 в PHP, я все ще не можу повністю повірити ...
Пол Дрюетт

1
@PaulDrewett Будь ласка, подивіться на порядок, коли ви відкриєте цю сторінку в приватному веб-перегляді. Це відрізняється від порядку, коли ви ввійшли в систему.
core1024

О, це дивує. Цікаво, чому? Вибачте, що вказали на помилку помилки. Моє ліжко. Я вас схвалив, хоча як корисну відповідь. Я все ще думаю, що це дивовижно ...
Пол Дрюетт

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 Pronk

Спасибі. Також один з (якщо не тільки) кодів, який також обробляє кілька сторінок.
Марко Паунович

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;
?>

Ура


Вхідні параметри 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.