Sortez la réponse au-dessus de la vôtre

15

Écrivez un programme qui génère le contenu du premier <code>...</code>bloc HTML de la réponse à cette question qui est juste au-dessus de la vôtre lorsque les réponses sont triées par votes. Sortie Top!si vous êtes la meilleure réponse.

Ignorez les réponses qui ont des votes négatifs ou sans <code>...</code>balises. La source de votre programme doit apparaître dans le premier <code>...</code>bloc de votre message. Ces blocs sont créés automatiquement lorsque vous use backticksou

indent things with 4 spaces.

C'est le code-golf, la réponse avec le moins de personnages l'emporte.

Règles supplémentaires (mises à jour)

  • Répondez dans n'importe quel langage de programmation que vous souhaitez, mais si vous répondez plusieurs fois, utilisez des langages différents.
  • Vous ne pouvez pas coder en dur votre sortie. La capacité de votre programme à fonctionner correctement ne devrait pas dépendre du nombre de votes ni de la réponse ci-dessus. Si la distribution des votes a radicalement changé, votre programme devrait toujours afficher correctement le code de la réponse au-dessus.
  • Vous pouvez coder en dur votre programme pour qu'il se recherche lui-même sur cette page (afin de trouver le suivant le plus élevé) via une propriété unique de votre réponse, comme votre nom d'utilisateur (si vous n'avez qu'une seule réponse) ou le lien direct de la réponse.
  • Si deux réponses ont des voix égales, vous devez toujours utiliser celle juste au-dessus de la vôtre (qui, je crois, sera la plus récente).
  • Vous pouvez avoir plusieurs <code>...</code>blocs dans votre réponse, mais le premier doit contenir la source de votre programme.
Loisirs de Calvin
la source
1
Dois-je rendre compte de plusieurs pages?
Julurous
1
Oui, vous devez tenir compte de plusieurs pages
Calvin's Hobbies
4
Notez que ce inline code spanssont juste <code></code>, mais les blocs de code appropriés le sont <pre><code>stuff</code></pre>.
Poignée de porte
3
@ Calvin'sHobbies Je pense que l'ordre des réponses liées (par votes) est aléatoire. Au moins sur SO, je ne sais pas ici.
Martin Ender
4
Je dirais que se soucier de plusieurs pages n'est pas nécessaire - si vous n'êtes pas sur la première page, vous ne
GAGNEZ PAS de

Réponses:

5

Javascript + jQuery (92 86 64 car.)

Pour tester, ouvrez Dev Tools sur cette page (généralement F12) et exécutez mon code!

Ce Javscript doit être exécuté à l'aide de la console à partir de cette page (et uniquement de cette page).

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

Si court, il n'a même pas besoin d'une barre de défilement!

Fondamentalement, il trouve ma réponse par ID, puis obtient deux nœuds à l'avance (en sautant le lien d'ancrage). Si cela n'existe pas, je dois être au top. Ensuite, il creuse jusqu'au premier codeélément et l'obtient .innerHTML.

La bonne chose est que SE utilise jQuery par défaut, donc j'obtiens cet avantage sans même essayer.

Robbie Wxyz
la source
2
Personnellement, je n'aime pas votre réponse car c'est un peu comme tricher ... Quoi qu'il en soit, cela pourrait être aussi court que alert($("code",$("#answer-34767").prev().prev()).html()||"Top!").
core1024
@ core1024: Merci pour l'amélioration! Je n'avais pas pensé à faire une seule déclaration. Je suis d'accord que j'ai un énorme avantage. Peut-être que je dois compter le code de Firefox pour> 78 Mo? Les règles indiquent "Répondre dans n'importe quel langage de programmation que vous souhaitez".
Robbie Wxyz
Vous n'avez pas besoin de compter le code de Firefox :) Votre avantage est dans l'environnement actuel et non dans l'interpréteur. C'est comme si tout le monde avait la source de la page déjà chargée dans un "objet" / "variable". +1 pour l'exploit;)
core1024
4
Cela va alerter "top" si c'est en haut de la deuxième page, est-ce le bon comportement?
William Barbosa
@WilliamBarbosa: Je suis avec "lrn" sur celui-là. (voir son commentaire sur la question d'OP).
Robbie Wxyz
6

PHP 666 611 593 588 580 caractères

Edit: utilisé une URL encore plus petite que précédemment de tinyurl.

Edit: Suite au commentaire sur une autre réponse, j'ai utilisé int plutôt que booléen. Également nécessaire pour corriger une erreur qui est devenue apparente mais qui est maintenant corrigée.

Voici mon code

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

Je suis sûr que cela peut être amélioré en utilisant DOMXPath et les nœuds. Cependant, j'en suis très satisfait. Je ne pouvais pas décider quoi faire dans le cas du mien est la seule réponse mais avec -ve points si ignoré. Cependant une autre réponse a été postée donc ce n'est plus un problème.

J'ai également utilisé tinyurl pour raccourcir l'url, économisant beaucoup de caractères.

J'espère que tu aimes,

Paul.

PS Cela ne fonctionnera pas dans le codepad donc ne peut pas montrer un violon.

Edit: enregistré 5 de plus avec les balises php en cours de modification

Vous pouvez le voir fonctionner ici sur un domaine que je n'utilise pas actuellement (donc je n'essaie pas seulement un lien sournois). Ce n'est pas un lien permanent mais il est actuellement disponible.

Paul Drewett
la source
Vous pouvez le raccourcir encore plus en utilisant un raccourcisseur d'url encore plus court =) par exemple ➡.ws /
.v
Je l'ai essayé avec le lien tinyarrows.com mais le délai de connexion expire le serveur. Ce sont des URL vraiment minuscules.
Paul Drewett
1
Sur ce site, il est acceptable d'utiliser une balise d'ouverture raccourcie (je pense que c'est au <?lieu de <?php) et de laisser la balise de fermeture. Cela devrait vous laisser quelques caractères supplémentaires.
Justin
1
turl.no fait des liens assez courts, et parce que c'est un raccourcisseur de liens norvégien, peu de gens l'ont remarqué à l'international. Voici un lien pour vous: turl.no/t2u pointe vers la même page que votre lien tinyurl.com et enregistre 8 caractères.
bilde2910
@ bilde2910 Merci, cela a fonctionné et c'est en effet une autre très petite URL. Très apprécié et Turl.ca est intéressant. Il aime ses domaines .ca, n'est-ce pas :-)
Paul Drewett
4

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

Non golfé (enfin, avec des nouvelles lignes et des espaces blancs de premier plan)

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
  ));
}
lrn
la source
4

Delphi (688 873 859 848 840)

Je vais quand même essayer de raser certains personnages mais ça fera l'affaire :)

Edit: au lieu de le raccourcir, je l'ai allongé: P
J'ai oublié d'ajouter l'ignorance des réponses quand il y a un vote négatif ou pas de blocs de code.

Je mets juste à jour la version non-golfée lors de l'édition.
Merci à @manatwork pour les modifications suggérées qui ont enlevé 8 caractères.

Version golfée:

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.

Version non golfée:

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.
Teun Pronk
la source
http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718#34718peut être changé en http://codegolf.stackexchange.com/q/34718, ce qui économiserait pas mal de caractères.
Poignée de porte
Merci, malheureusement, j'ai également dû en ajouter car j'ai oublié la partie où vous devez ignorer les réponses avec un nombre de votes négatif ou aucun bloc de code: / .. ne fonctionne pas :( Je reçois un 301 déplacé en permanence
Teun Pronk
Comme suggéré précédemment , vous pouvez déclarer l as à la TStringsplace. (Mais gardez l'instanciation avec TStringList.)
Manatwork
J'essaierais de faire c byteau lieu de boolean.
manatwork
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]

Ceci est mon premier codegolf, donc j'espère que c'est assez pour le golf!

Edit: Merci pour les conseils! Ça a l'air un peu plus golfeur maintenant.

KidElephant
la source
Ne semble pas mauvais pour un premier essai! Bien que vous pouvez utiliser un raccourcisseur d'URL pour le lien et de se débarrasser de quelques places là - dedans ( for i,m, m==open, etc.).
Christoph Böhmwalder
@HackerCow Je pense que les raccourcisseurs d'URL sont généralement désapprouvés, mais http://codegolf.stackexchange.com/q/34705/14509fonctionneraient certainement.
undergroundmonorail
@KidElephant J'ai supprimé un tas d'espaces de votre code. Je ne l'ai pas testé ou quoi que ce soit, mais à moins que j'aie merdé, il devrait être (logiquement) le même programme. Notez que j'ai retiré le shebang, ceux-ci ne sont pas requis ici. ix.io/dsz Supprimer les espaces blancs peut économiser pas mal d'octets :)
undergroundmonorail
En outre, pour les défis de golf de code, vous êtes censé inclure un nombre d'octets. Je voudrais en éditer un pour vous ici, mais votre réponse va probablement changer si vous utilisez des suggestions, donc je ne vais pas déranger. Vous pouvez trouver le nombre d'octets en exécutant wc -c $filename. Si votre éditeur ajoute un retour à la ligne aux fichiers (il le fait probablement), vous pouvez en soustraire un pour obtenir votre score final.
undergroundmonorail
2

Mathematica - 159

Première analyse syntaxique dans Mathematica

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

Rubis 283 + 17 = 300

Cela réussit quel que soit le nombre de votes obtenus par cette réponse et qu'il y ait ou non une deuxième (ou quinzième) page de réponses. Il utilise l'API de données.

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

doit être exécuté avec ruby -rnet/http -rjson(d'où le +17)

non golfé:

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

Changelog

300 parens supprimés dans le symbole regex

302 commit initial

Pas que Charles
la source
Vous pouvez économiser quelques octets en rendant votre filtre dangereux
pppery
@ppperry veuillez expliquer?
Pas que Charles
L'utilisation de filtres non sécurisés signifie que vous devez avoir manuellement une décompression HTML. Voir les documents de filtrage
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!';

Edit: le raccourcisseur d'URL de lrn produit l'URL la plus courte :)

Le RegEx fait correspondre l'ancre avant chaque réponse (avec l'ID de réponse) et le contenu à l'intérieur de la première <code>balise. Le Udrapeau déclenche le Umode ngreedy et le sdrapeau fait .correspondre de nouvelles lignes (très poignée). Je ne suis pas inquiet si cela correspond à autre chose car les réponses sont échappées, donc personne ne peut insérer le <littéral dans la source de la page.

Après avoir reçu toutes les réponses $m[2]et leurs identifiants $m[1], j'utilise simplement echopour imprimer la réponse au-dessus de la mienne, telle qu'elle est $m[2][array_search(34786,$m[1])-1], ou "Top!", Si ma réponse finit par arriver en premier :)

J'aime le fait qu'en PHP l'opérateur ternaire puisse être utilisé comme opérateur de court-circuit ?:

core1024
la source
C'est étonnant. Je viens de le tester mais il montre le code de celui ci-dessous. Je suis sûr que ce sera une solution rapide, mais j'ai pensé le mentionner. Un travail incroyable cependant, 135 en PHP, je n'arrive toujours pas à y croire ...
Paul Drewett
1
@PaulDrewett Veuillez regarder la commande lorsque vous ouvrez cette page en navigation privée. C'est différent de la commande lorsque vous êtes connecté.
core1024
Oh, c'est surprenant. Je me demande pourquoi? Désolé de signaler une erreur par erreur. Ma faute. Je vous ai cependant voté comme une réponse utile. Je pense toujours que c'est incroyable ...
Paul Drewett
1

Delphi, 461 octets , 553 octets

Gère désormais également plusieurs pages!

Golfé:

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.

(légèrement) Non golfé:

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.

Comment exécuter:

app.exe > output.txt
Marko Paunovic
la source
sympa, j'aurais pu faire ça aussi au lieu d'utiliser les unités html .. dommage que je n'y ai pas pensé: P
Teun Pronk
Merci. En outre, l'un des codes (sinon seulement) qui gère également plusieurs pages.
Marko Paunovic
1

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

Encore un travail en cours, je n'ai rien fait concernant plusieurs pages (ni personne d'autre?)

J'ai obtenu la baisse de 200 caractères en supprimant beaucoup de dom supplémentaires, pourquoi rechercher des objets quand je peux juste trouver leur position?

C'est aussi mon premier golf à code! Je suis heureux de l'avoir fait dans les années 200 et d'utiliser des méthodes dom. Grâce aux commentaires, je viens de raser 4 autres personnages.

Je voulais faire quelque chose comme jquery / jscript en ce qui concerne la traversée du dom, et je travaille toujours à l'amincir. Peut-être pourrais-je m'en tirer en cherchant "asi" comme nom d'utilisateur?

Le golf:

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

Formaté:

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

À votre santé

Asitaka
la source
Les parenthèses new DOMDocument()et la fermeture ?>peuvent être omises en PHP.
jimmy23013
Merci, perdu 4 autres personnages. Pour le moment, je ne peux pas imaginer comment le raccourcir à moins d'utiliser des classes différentes, les accesseurs DOM sont chers.
Asitaka
Enregistrez des personnages en changeant votre nom d'utilisateur!
DavidG
Je pense que c'est cool. J'essaie simplement d'apprendre la partie requête à DOMXPath mais je dois admettre que je trouve cela difficile. Je l'ai essayé pour cela mais je n'ai pas pu l'obtenir. J'ai testé le vôtre, mais il semble signaler celui au-dessus, pas celui directement au-dessus. Je suis sûr que c'est une solution rapide, mais j'ai juste pensé à le mentionner.
Paul Drewett
Suite à cette info "Veuillez regarder la commande lorsque vous ouvrez cette page en navigation privée. C'est différent de la commande lorsque vous êtes connecté - core1024" de réponse différente Je dois supposer que la même chose se produit ici aussi. Désolé.
Paul Drewett
1

Python 3, 197 191 octets

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']

Les règles ne disent pas que je ne peux pas utiliser l'API et que je ne peux pas utiliser de raccourcisseur d'URL.

https://tinyurl.com/hdemk76se développe en https://api.stackexchange.com/2.2/questions/34705/answers?order=desc&sort=votes&site=codegolf&filter=withbody&pagesize=100 Cela ne fonctionne que si elle est dans le top 100 des réponses triées par votes.

pppery
la source
-6 si vous remplacez https://tinyurl.com/hdemk76parhttp://bit.ly/2hN8TKV
Taylor Scott