Envie a resposta acima da sua


15

Escreva um programa que produza o conteúdo do primeiro <code>...</code>bloco HTML da resposta a esta pergunta que fica logo acima do seu quando as respostas são classificadas por votos. Saída, Top!se você é a melhor resposta.

Ignore respostas com votos negativos ou sem <code>...</code>tags. A fonte do seu programa deve aparecer no primeiro <code>...</code>bloco da sua postagem. Esses blocos são criados automaticamente quando você use backticksou

indent things with 4 spaces.

Isso é código-golfe, a resposta com o menor número de caracteres ganha.

Regras adicionais (atualizadas)

  • Responda em qualquer linguagem de programação desejada, mas se você responder várias vezes, use idiomas diferentes.
  • Você pode não codificar sua saída. A capacidade do seu programa para funcionar corretamente não deve depender da contagem de votos ou da resposta acima. Se a distribuição de votos mudou drasticamente, seu programa ainda deve exibir corretamente o código da resposta acima.
  • Você pode codificar seu programa para procurar por si mesmo nesta página (para encontrar a próxima mais alta) por meio de alguma propriedade exclusiva de sua resposta, como seu nome de usuário (se você tiver apenas uma resposta) ou o link direto da resposta.
  • Se duas respostas tiverem votos iguais, você ainda deve usar a logo acima da sua (que acredito ser a mais recente).
  • Você pode ter vários <code>...</code>blocos em sua resposta, mas o primeiro deve conter a fonte do seu programa.

1
Preciso contabilizar várias páginas?
Οurous

1
Sim, você deve contabilizar várias páginas.
Calvin's Hobbies

4
Observe que inline code spanssão justos <code></code>, mas os blocos de código adequados são <pre><code>stuff</code></pre>.
Maçaneta

3
@ Calvin'sHobbies Acho que a ordem das respostas empatadas (por votos) é aleatória. Pelo menos no SO, eu não sei sobre aqui.
Martin Ender

4
Eu diria que se preocupar com várias páginas é desnecessário - se você não está na primeira página, você não está GANHANDO, de qualquer maneira :) :) #
446

Respostas:


5

Javascript + jQuery (92 86 64 caracteres)

Para testar, abra as Ferramentas de Desenvolvimento nesta página (geralmente F12) e execute meu código!

Esse Javscript precisa ser executado usando o console nesta página (e somente nesta página).

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

Tão curto que nem sequer precisa de uma barra de rolagem!

Basicamente, ele encontra minha resposta por ID e, em seguida, coloca dois nós à frente (pulando o link da âncora). Se isso não existir, devo estar no topo. Então ele desce para o primeiro codeelemento e obtém.innerHTML .

O bom é que o SE usa o jQuery por padrão, então eu ganho essa vantagem sem nem tentar.


2
Pessoalmente, não gosto da sua resposta, pois é um pouco como trapaça ... De qualquer forma, pode ser tão curta quanto alert($("code",$("#answer-34767").prev().prev()).html()||"Top!").
precisa

@ core1024: Obrigado pela melhoria! Eu não tinha pensado em fazer uma afirmação. Concordo que tenho uma enorme vantagem. Talvez eu tenha que contar o código do Firefox para> 78MB? As regras dizem "Responda em qualquer linguagem de programação que você desejar".
22614 Robbie Wxyz #:

Você não precisa contar o código do Firefox :) Sua vantagem está no ambiente atual e não no intérprete. É como se todos já tivessem a fonte da página carregada em um "objeto" / "variável". +1 para a exploração;)
core1024

4
Isso alertará "top" se for o topo da segunda página, esse é o comportamento correto?
William Barbosa

@WilliamBarbosa: Estou com "lrn" nessa. (veja seu comentário sobre a pergunta do OP).
Robbie Wxyz

6

PHP 666 611 593 588 580 caracteres

Edit: Usado url ainda menor do que anteriormente de tinyurl.

Edit: Após o comentário em outra resposta, usei int em vez de booleano. Também necessário para corrigir um erro que se tornou aparente, mas corrigido agora.

Aqui está o meu código

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

Estou certo de que isso pode ser melhorado usando DOMXPath e nós. No entanto, estou bastante satisfeito com isso. Eu não conseguia decidir o que fazer no caso da minha é a única resposta, mas com muitos pontos ignorados. No entanto, outra resposta foi postada, portanto não há mais problema.

Também usei tinyurl para encurtar o URL, economizando muitos caracteres.

Espero que você goste,

Paulo.

PS: Isso não será executado no teclado de código, portanto não será possível mostrar um violino.

Editar: economizou mais 5 com as tags php sendo alteradas

Você pode vê-lo trabalhando aqui em um domínio que atualmente não uso (por isso não estou apenas tentando um link sorrateiro). Este não é um link permanente, mas está disponível no momento.


Você poderia reduzi-lo ainda mais, usando um urlshortener ainda mais curto =) por exemplo ➡.ws / .v
flawr

Eu tentei com o link tinyarrows.com, mas o atraso na conexão expira o tempo limite do servidor. Eles são realmente urls minúsculos.
Paul Drewett

1
Neste site, é aceitável usar uma tag de abertura reduzida (acredito que seja em <?vez de <?php) e deixar de lado a tag de fechamento. Isso deve deixar mais alguns caracteres.
Justin

1
O turl.no faz alguns links bastante curtos e, por ser um encurtador de link norueguês, poucas pessoas o notaram internacionalmente. Aqui está um link para você: turl.no/t2u aponta para a mesma página que o link tinyurl.com e salva 8 caracteres.
bilde2910

@ bilde2910 Obrigado, isso funcionou e é de fato outro URL muito pequeno. Muito apreciado e Turl.ca é interessante. Ele ama seus domínios .pt não ele :-)
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));}

Ungolfed (bem, com novas linhas e espaços em branco à esquerda)

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)

Ainda vou tentar raspar alguns personagens, mas ele fará o trabalho :)

Edit: em vez de diminuí-lo, eu o tornei mais longo: P
Esqueci-me de adicionar o ignorar das respostas quando ele tem uma contagem de votos negativa ou nenhum bloco de código.

Estou apenas atualizando a versão un-golfed durante a edição.
Agradecemos a @manatwork pelas edições sugeridas que exibiram 8 caracteres.

Versão Golfed:

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.

Versão não destruída:

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#34718pode ser alterado para http://codegolf.stackexchange.com/q/34718, o que economizaria bastante caracteres.
Maçaneta

Obrigado, infelizmente, eu também tive que adicionar um pouco desde que eu esqueci a parte onde você tem que ignorar respostas com um votecount negativo ou há blocos de código: / .. doesnt trabalho :( Eu recebo um 301 movido permanentemente
Teun Pronk

Como sugerido anteriormente , você pode declarar l como TStringsalternativa. (Mas tenha a instanciação com TStringList.)
manatwork

Eu tentaria fazer c em bytevez 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 é o meu primeiro codegolf, então espero que isso seja suficiente!

Edit: Obrigado pelas dicas! Agora está um pouco mais golfista.


Não parece ruim para uma primeira tentativa! Embora você poderia usar um encurtador de URL para o link e se livrar de alguns espaços lá ( for i,m, m==open, etc).
Christoph Böhmwalder

@HackerCow Acho que os encurtadores de URL geralmente são desaprovados, mas http://codegolf.stackexchange.com/q/34705/14509definitivamente funcionariam.
Undergroundmonorail

@KidElephant Eu removi um monte de espaços em branco do seu código. Eu não testei nada, mas a menos que eu estraguei tudo deveria ser (logicamente) o mesmo programa. Observe que eu removi o shebang, esses não são necessários aqui. ix.io/dsz Tirando espaço em branco pode economizar muito poucos bytes :)
undergroundmonorail

Além disso, para desafios de código de golfe, você deve incluir uma contagem de bytes. Gostaria de editar um aqui para você, mas sua resposta provavelmente mudará se você usar alguma sugestão, para que eu não me incomode. Você pode encontrar a contagem de bytes executando wc -c $filename. Se o seu editor anexar uma nova linha final aos arquivos (provavelmente o faz), você poderá subtraí-la para obter sua pontuação final.
Undergroundmonorail

2

Mathematica - 159

Primeira análise ao Mathematica

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

2

Rubi 283 + 17 = 300

Isso é bem-sucedido, independentemente do número de votos que essa resposta recebe e não importa se há uma segunda (ou décima quinta) página de respostas ou não. Ele usa a API de dados.

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

deve ser executado com ruby -rnet/http -rjson (daí o +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!'

Changelog

300 parênteses removidos no símbolo regex

302 confirmação inicial


Você pode salvar alguns bytes, fazendo seu filtro inseguro
pppery

@ppperry por favor explique?
Não que Charles

O uso de filtros não seguros significa que você precisa desmarcar manualmente o HTML. Veja os documentos do 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: o encurtador de URL do lrn produz o URL mais curto :)

O RegEx corresponde à âncora antes de cada resposta (junto com o ID da resposta) e o conteúdo dentro da primeira <code>tag. A Ubandeira aciona o Umodo ngreedy e a sbandeira faz .combinações com novas linhas (muito poucas). Não estou preocupado se isso corresponder a outra coisa, pois as respostas são escapadas, para que ninguém possa inserir o< literal na fonte da página.

Depois de obter todas as respostas $m[2]e seus IDs $m[1], apenas uso echopara imprimir a resposta acima da minha, pois está$m[2][array_search(34786,$m[1])-1] , ou "Top!", Se minha resposta for a primeira :)

Eu gosto do fato de que no PHP o operador ternário pode ser usado como um operador de curto-circuito ?:


Isso é incrível. Acabei de testar, mas ele está mostrando o código do código abaixo. Estou certo de que será uma solução rápida, mas pensei em mencioná-lo. Trabalho incrível, porém, 135 em PHP, eu ainda não consigo acreditar nisso ...
Paul Drewett

1
@PaulDrewett Veja o pedido quando você abrir esta página na navegação privada. É diferente da ordem em que você está logado.
core1024

Oh, isso é surpreendente. Eu quero saber porque? Desculpe apontar um erro por engano. Foi mal. Eu o votei como uma resposta útil. Eu ainda acho que é incrível ...
Paul Drewett

1

Delphi, 461 bytes , 553 bytes

Agora lida com várias páginas também!

Golfe:

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.

(ligeiramente) Ungolfed:

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 executar:

app.exe > output.txt

bom, poderia ter feito isso também em vez de usar as unidades html .. pena que eu não pensei nisso: P
Teun Pronk

Obrigado. Além disso, um dos códigos (se não apenas) que também lida com várias páginas.
Marko Paunovic

1

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

Ainda em andamento, não fiz nada em relação a várias páginas (nem mais ninguém?)

Consegui a queda de 200 caracteres cortando um monte de dom extra. Por que procurar objetos quando consigo encontrar a posição deles?

Este também é o meu primeiro código de golfe! Estou feliz por ter feito isso nos anos 200 e usando métodos dom. Graças aos comentários, acabei de cortar mais 4 caracteres.

Eu queria fazer algo como jquery / jscript em relação a atravessar o domínio, e ainda estou trabalhando para diminuir isso. Talvez eu consiga pesquisar "asi" como meu nome de usuário?

Golfe:

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

Formatado:

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

Felicidades


Parênteses new DOMDocument()e o fechamento ?>podem ser omitidos no PHP.
jimmy23013

Obrigado, perdeu mais 4 personagens. No momento, não consigo imaginar como reduzi-lo, a menos que eu use classes diferentes, os acessadores do DOM sejam caros.
Asitaka 19/07/2014

Salve os personagens alterando seu nome de usuário!
DavidG

Eu acho que isso é legal. Estou apenas tentando aprender a parte da consulta para o DOMXPath, mas devo admitir que estou achando difícil. Eu tentei isso, mas não consegui. Eu testei o seu, mas parece estar relatando os dois acima, não o diretamente acima. Tenho certeza de que é uma solução rápida, mas pensei em mencionar.
Paul Drewett

Após esta informação "Observe a ordem quando você abre esta página na navegação privada. É diferente da ordem quando você está logado - core1024" de comentários de respostas diferentes. Devo assumir que o mesmo está acontecendo aqui também. Desculpe por isso.
Paul Drewett

1

Python 3, 197 191 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']

As regras não dizem que não posso usar a API e que não posso usar um encurtador de URL.

https://tinyurl.com/hdemk76expande para https://api.stackexchange.com/2.2/questions/34705/answers?order=desc&sort=votes&site=codegolf&filter=withbody&pagesize=100 Isso só funciona se estiver entre as 100 principais respostas classificadas por votos.


-6 se você substituir https://tinyurl.com/hdemk76porhttp://bit.ly/2hN8TKV
Taylor Scott
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.