Envía la respuesta por encima de la tuya

15

Escriba un programa que muestre el contenido del primer <code>...</code>bloque HTML de la respuesta a esta pregunta que está justo arriba del suyo cuando las respuestas se ordenan por votos. Salida Top!si eres la respuesta principal.

Ignora las respuestas que tengan votos negativos o que no tengan <code>...</code>etiquetas. La fuente de su programa debe aparecer en el primer <code>...</code>bloque de su publicación. Estos bloques se crean automáticamente cuando usted use backtickso

indent things with 4 spaces.

Este es el código de golf, la respuesta con la menor cantidad de caracteres gana.

Reglas adicionales (actualizadas)

  • Responda en cualquier lenguaje de programación que desee, pero si responde varias veces, use diferentes idiomas.
  • Es posible que no codifique su salida. La capacidad de su programa para ejecutarse correctamente no debe depender de su conteo de votos o de cuál sea la respuesta anterior. Si la distribución de votos cambió drásticamente, su programa aún debería generar correctamente el código de la respuesta que se encuentra arriba.
  • Usted puede codificar su programa para buscar por sí mismo en esta página (con el fin de encontrar la siguiente más alta) a través de alguna propiedad única de su respuesta, tal como su nombre de usuario (si sólo tiene una respuesta) o un enlace directo de la respuesta.
  • Si dos respuestas tienen los mismos votos, aún debe usar la que está justo arriba de la suya (que creo que será la más nueva).
  • Puede tener varios <code>...</code>bloques en su respuesta, pero el primero debe contener la fuente de su programa.
Pasatiempos de Calvin
fuente
1
¿Tengo que dar cuenta de varias páginas?
Agradable
1
Sí, deberías tener en cuenta varias páginas
Calvin's Hobbies
44
Tenga en cuenta que inline code spansson justos <code></code>, pero los bloques de código adecuados son <pre><code>stuff</code></pre>.
Pomo de la puerta
3
@ Calvin'sHobbies Creo que el orden de las respuestas vinculadas (por votos) es aleatorio. Al menos en SO, no sé sobre aquí.
Martin Ender
44
Yo diría que no es necesario preocuparse por varias páginas: si no está en la primera página, no está
GANANDO de

Respuestas:

5

Javascript + jQuery (92 86 64 char)

Para probar, abra Dev Tools en esta página (generalmente F12) y ejecute mi código.

Este Javscript debe ejecutarse utilizando la consola desde esta página (y solo esta página).

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

¡Tan breve que ni siquiera necesita una barra de desplazamiento!

Básicamente, encuentra mi respuesta por ID y luego obtiene dos nodos por delante (omitiendo el enlace de anclaje). Si eso no existe, debo estar en la cima. Luego cava hasta el primer codeelemento y lo obtiene .innerHTML.

Lo bueno es que SE usa jQuery por defecto, así que obtengo esa ventaja sin siquiera intentarlo.

Robbie Wxyz
fuente
2
Personalmente no me gusta tu respuesta ya que es un poco como hacer trampa ... De todos modos, podría ser tan breve como alert($("code",$("#answer-34767").prev().prev()).html()||"Top!").
core1024
@ core1024: ¡Gracias por la mejora! No había pensado en hacerlo con una sola declaración. Estoy de acuerdo en que tengo una gran ventaja. ¿Quizás tenga que contar el código de Firefox para> 78MB? Las reglas dicen "Responda en cualquier lenguaje de programación que desee".
Robbie Wxyz
No necesita contar el código de Firefox :) Su ventaja está en el entorno actual y no en el intérprete. Es como si todos tuvieran la fuente de la página cargada en un "objeto" / "variable". +1 para el exploit;)
core1024
44
Esto alertará "arriba" si está en la parte superior de la segunda página, ¿es este el comportamiento correcto?
William Barbosa
@WilliamBarbosa: Estoy con "lrn" en eso. (Ver su comentario sobre la pregunta de OP).
Robbie Wxyz
6

PHP 666 611 593 588 580 Caracteres

Editar: se usó una URL aún más pequeña que anteriormente de tinyurl.

Editar: Después del comentario en otra respuesta, utilicé int en lugar de boolean. También necesitaba corregir un error que se hizo evidente pero solucionado ahora.

Aqui esta mi codigo

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

Estoy seguro de que esto se puede mejorar usando DOMXPath y nodos. Sin embargo, estoy bastante satisfecho con eso. No pude decidir qué hacer en el caso mío es la única respuesta, pero con -ve puntos tan ignorados. Sin embargo, se publicó otra respuesta, así que ya no es un problema.

También usé tinyurl para acortar la url, ahorrando muchos caracteres.

Espero que te guste,

Pablo.

PD: Esto no se ejecutará en el teclado, por lo que no puede mostrar un violín.

Editar: ahorró 5 más con las etiquetas php siendo alteradas

Puede verlo trabajando aquí en un dominio que no uso actualmente (por lo que no solo estoy probando un enlace furtivo). Sin embargo, este no es un enlace permanente, pero actualmente está disponible.

Paul Drewett
fuente
Podría acortarlo aún más utilizando un acortador de urls aún más corto =) por ejemplo ➡.ws / .v
flawr
Lo intenté con el enlace tinyarrows.com pero el retraso en la conexión agota el tiempo de espera del servidor. Sin embargo, son URL realmente pequeñas.
Paul Drewett
1
En este sitio, es aceptable usar una etiqueta de apertura acortada (creo que es en <?lugar de <?php) y dejar la etiqueta de cierre. Eso debería dejarte algunos caracteres más.
Justin
1
turl.no crea algunos enlaces bastante cortos, y debido a que es un acortador de enlaces noruego, pocas personas lo han notado internacionalmente. Aquí hay un enlace para ti: turl.no/t2u apunta a la misma página que su enlace tinyurl.com, y guarda 8 caracteres.
bilde2910
@ bilde2910 Gracias, eso funcionó y de hecho es otra url muy pequeña. Muy apreciado y Turl.ca es interesante. Le encantan sus dominios .ca, ¿no? :-)
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));}

Sin golf (bueno, con nuevas líneas y espacios en blanco)

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
fuente
4

Delphi688 873 859 848 840)

Todavía intentaré eliminar algunos caracteres pero hará el trabajo :)

Editar: en lugar de acortarlo, lo hice más largo: P
Olvidé agregar el ignorar las respuestas cuando tiene un conteo de votos negativo o no hay bloques de código.

Solo estoy actualizando la versión sin golf mientras edito.
Gracias a @manatwork por las ediciones sugeridas que eliminaron 8 caracteres.

Versión de golf:

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.

Versión sin golf:

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
fuente
http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718#34718se puede cambiar a http://codegolf.stackexchange.com/q/34718, lo que ahorraría bastantes caracteres.
Pomo de la puerta
Gracias, lamentablemente también tuve que agregar algunos, ya que olvidé la parte en la que tienes que ignorar las respuestas con un recuento de votos negativo o sin bloques de código: / ... no funciona :( Recibo un 301 movido permanentemente
Teun Pronk
Como se sugirió anteriormente , puede declarar l como en su TStringslugar. (Pero mantenga la instanciación con TStringList.)
manatwork
Intentaría hacer c en bytelugar 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]

Este es mi primer codegolf, ¡así que espero que sea suficiente para jugar al golf!

Editar: ¡Gracias por los consejos! Ahora se ve un poco más golfista.

KidElephant
fuente
¡No se ve mal para un primer intento! Aunque se puede usar un acortador de URL para el enlace y deshacerse de unos espacios en los que hay ( for i,m, m==open, etc.).
Christoph Böhmwalder
@HackerCow Creo que los acortadores de URL generalmente están mal vistos, pero http://codegolf.stackexchange.com/q/34705/14509definitivamente funcionarían.
undergroundmonorail
@KidElephant Eliminé un montón de espacios en blanco de su código. No lo probé ni nada, pero a menos que lo haya estropeado, debería ser (lógicamente) el mismo programa. Tenga en cuenta que eliminé el shebang, no se requieren aquí. ix.io/dsz Sacar espacios en blanco puede ahorrar bastantes bytes :)
undergroundmonorail
Además, para los desafíos de código de golf se supone que debe incluir un recuento de bytes. Editaría uno para usted aquí, pero su respuesta probablemente cambiará si usa alguna sugerencia para no molestarme. Puede encontrar el recuento de bytes ejecutando wc -c $filename. Si su editor agrega una nueva línea final a los archivos (probablemente lo haga), puede restar una de eso para obtener su puntaje final.
undergroundmonorail
2

Mathematica - 159

Primera vez haciendo análisis en Mathematica

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

Rubí 283 + 17 = 300

Esto tiene éxito independientemente de los pocos votos que obtenga esta respuesta y no importa si hay una segunda (o decimoquinta) página de respuestas o no. Utiliza la API de datos.

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

debe ejecutarse con ruby -rnet/http -rjson(de ahí el +17)

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

Registro de cambios

300 parens eliminados en regex de símbolo

302 confirmación inicial

No es que Charles
fuente
Puede guardar algunos bytes haciendo que su filtro no sea seguro
pppery
@ppperry por favor explique?
No es que Charles
El uso de filtros inseguros significa que quiere tener que eliminar manualmente el HTML. Ver los documentos del filtro
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!';

Editar: el acortador de URL de lrn produce la URL más corta :)

El RegEx coincide con el ancla antes de cada respuesta (junto con el ID de la respuesta) y el contenido dentro de la primera <code>etiqueta. La Ubandera activa el Umodo ngreedy y la sbandera hace .coincidir nuevas líneas (muy pocas). No me preocupa si esto coincide con otra cosa ya que las respuestas se escapan, por lo que nadie puede insertar el <literal en la fuente de la página.

Después de obtener todas las respuestas $m[2]y sus ID $m[1], solo uso echoimprimir la respuesta sobre la mía, como está $m[2][array_search(34786,$m[1])-1], o "¡Arriba!", Si mi respuesta finalmente es la primera :)

Me gusta el hecho de que en PHP el operador ternario puede usarse como operador de cortocircuito ?:

core1024
fuente
Esto es increíble. Acabo de probarlo pero muestra el código del siguiente. Estoy seguro de que será una solución rápida, pero pensé en mencionarlo. Sin embargo, trabajo increíble, 135 en PHP, todavía no puedo creerlo ...
Paul Drewett
1
@PaulDrewett Observe el pedido cuando abra esta página en la navegación privada. Es diferente del pedido cuando
inicias
Oh, eso es sorprendente. ¿Me pregunto porque? Lamento señalar un error por error. Culpa mía. Aunque te voté como una respuesta útil. Todavía creo que es increíble ...
Paul Drewett
1

Delphi 461 bytes , 553 bytes

¡Ahora también maneja varias páginas!

Golfizado:

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.

(ligeramente) Sin golfista:

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.

Como correr:

app.exe > output.txt
Marko Paunovic
fuente
bien, podría haber hecho eso también en lugar de usar las unidades html ... lástima que no haya pensado en eso: P
Teun Pronk
Gracias. Además, uno de los códigos (si no solo) que maneja varias páginas también.
Marko Paunovic
1

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

Todavía un trabajo en progreso, no he hecho nada con respecto a varias páginas (¿ni nadie más lo ha hecho?

Obtuve la caída de 200 caracteres cortando un montón de dom extra, ¿por qué buscar objetos cuando puedo encontrar su posición?

Este es también mi primer código de golf! Estoy feliz de haberlo hecho en los años 200 y usar métodos dom. Gracias a los comentarios, me limité a 4 personajes más.

Quería hacer algo como jquery / jscript con respecto a atravesar el dom, y todavía estoy trabajando para adelgazar. ¿Tal vez podría salirse con la búsqueda de "asi" como mi nombre de usuario?

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;

Formateado:

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

Salud

Asitaka
fuente
Entre paréntesis new DOMDocument(), y el cierre ?>se puede omitir en PHP.
jimmy23013
Gracias, perdí 4 personajes más. Por el momento, no puedo imaginar cómo hacerlo más corto a menos que use diferentes clases, los accesos DOM son caros.
Asitaka
¡Guarde caracteres cambiando su nombre de usuario!
DavidG
Creo que esto es genial. Solo estoy tratando de aprender la parte de consulta a DOMXPath, pero debo admitir que me resulta difícil. Lo intenté para esto pero no pude conseguirlo. Probé el tuyo pero parece estar informando el uno dos arriba, no el que está directamente arriba. Estoy seguro de que es una solución rápida, pero pensé en mencionarlo.
Paul Drewett
Siguiendo esta información "Mire el pedido cuando abra esta página en la navegación privada. Es diferente del pedido cuando está conectado - core1024" del comentario de respuesta diferente Tengo que asumir que lo mismo está sucediendo aquí también. Lo siento por eso.
Paul Drewett
1

Python 3, 197191 bytes

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

Las reglas no dicen que no puedo usar la API y que no puedo usar un acortador de URL.

https://tinyurl.com/hdemk76se expande a https://api.stackexchange.com/2.2/questions/34705/answers?order=desc&sort=votes&site=codegolf&filter=withbody&pagesize=100 Esto solo funciona si está entre las 100 mejores respuestas ordenadas por votos.

pppery
fuente
-6 si reemplazas https://tinyurl.com/hdemk76conhttp://bit.ly/2hN8TKV
Taylor Scott