Invia la risposta sopra la tua


15

Scrivi un programma che genera il contenuto del primo <code>...</code>blocco HTML della risposta a questa domanda che è appena sopra la tua quando le risposte sono ordinate per voto. Emetti Top!se sei la risposta migliore.

Ignora le risposte che hanno voti negativi o nessun <code>...</code>tag. La fonte del tuo programma deve apparire nel primo <code>...</code>blocco del tuo post. Questi blocchi vengono creati automaticamente quando tu use backtickso

indent things with 4 spaces.

Questo è code-golf, vince la risposta con il minor numero di caratteri.

Regole aggiuntive (aggiornate)

  • Rispondi in qualsiasi linguaggio di programmazione che desideri, ma se rispondi più volte usa linguaggi diversi.
  • È possibile che non sia possibile codificare l'output. La capacità del tuo programma di funzionare correttamente non dovrebbe dipendere dal conteggio dei voti o da quale sia la risposta sopra. Se la distribuzione dei voti è cambiata drasticamente, il programma dovrebbe comunque generare correttamente il codice della risposta sopra di esso.
  • È possibile codificare il vostro programma per la ricerca di sé in questa pagina (in modo da trovare il prossimo più alto) attraverso alcune proprietà unica di vostra risposta, come il tuo nome utente (se si dispone di una sola risposta) o collegamento diretto del risposta.
  • Se due risposte hanno uguali voti, dovresti comunque usare quella appena sopra la tua (che credo sia la più recente).
  • Potresti avere più <code>...</code>blocchi nella tua risposta ma il primo deve contenere l'origine del tuo programma.

1
Devo tenere conto di più pagine?
Οuroso

1
Sì, dovresti tenere conto di più pagine
Calvin's Hobbies,

4
Nota che inline code spanssono giusti <code></code>, ma sono i blocchi di codice corretti <pre><code>stuff</code></pre>.
Maniglia della porta

3
@ Calvin'sHobbies Penso che l'ordine delle risposte legate (per numero di voti) sia casuale. Almeno su SO, non lo so qui.
Martin Ender,

4
Direi che non è necessario preoccuparsi di più pagine - se non sei nella prima pagina, non
vincerai

Risposte:


5

Javascript + jQuery (92 86 64 caratteri)

Per provare, apri Dev Tools su questa pagina (di solito F12) ed esegui il mio codice!

Questo Javscript deve essere eseguito utilizzando la console da questa pagina (e solo questa pagina).

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

Così breve, non ha nemmeno bisogno di una barra di scorrimento!

Fondamentalmente, trova la mia risposta per ID, quindi ottiene due nodi avanti (saltando il collegamento di ancoraggio). Se ciò non esiste, devo essere in cima. Quindi scava fino al primo codeelemento e lo ottiene .innerHTML.

La cosa bella è che SE usa jQuery per impostazione predefinita, quindi ottengo quel vantaggio senza nemmeno provarci.


2
Personalmente non mi piace la tua risposta dato che è un po 'come imbrogliare ... Comunque, potrebbe essere breve alert($("code",$("#answer-34767").prev().prev()).html()||"Top!").
core1024

@ core1024: Grazie per l'improvvisazione! Non avevo pensato di farlo con una sola affermazione. Sono d'accordo che ho un enorme vantaggio. Forse devo contare il codice di Firefox per> 78 MB? Le regole dicono "Rispondi in qualsiasi linguaggio di programmazione che desideri".
Robbie Wxyz,

Non è necessario contare il codice di Firefox :) Il vantaggio è nell'ambiente attuale e non nell'interprete. È come se tutti avessero già caricato l'origine della pagina in un "oggetto" / "variabile". +1 per l'exploit;)
core1024

4
Avviserà "in alto" se è in cima alla seconda pagina, è questo il comportamento corretto?
William Barbosa,

@WilliamBarbosa: sto con "lrn" su quello. (vedi il suo commento sulla domanda di OP).
Robbie Wxyz,

6

PHP 666 611 593 588 580 caratteri

Modifica: ha usato un URL ancora più piccolo di prima di tinyurl.

Modifica: dopo il commento su un'altra risposta ho usato int piuttosto che booleano. Inoltre, è necessario correggere un errore che è diventato evidente ma risolto ora.

Ecco il mio codice

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

Sono sicuro che questo può essere migliorato usando DOMXPath e nodi. Comunque sono abbastanza soddisfatto. Non potevo decidere cosa fare nel mio caso è l'unica risposta ma con -ve punti così ignorati. Tuttavia è stata pubblicata un'altra risposta, quindi non è più un problema.

Ho anche usato tinyurl per accorciare l'url, salvando molti personaggi.

Spero vi piaccia,

Paolo.

PS Questo non funzionerà nel codepad quindi non può mostrare un violino.

Modifica: altri 5 salvati con i tag php modificati

Puoi vederlo funzionare qui su un dominio che non uso attualmente (quindi non sto solo provando un link subdolo). Questo non è un collegamento permanente, ma è attualmente disponibile.


Potresti accorciarlo ancora di più usando un urlshortener =) ancora più breve, ad esempio ➡.ws / .v
flawr

L'ho provato con il link tinyarrows.com ma il ritardo nella connessione scade dal server. Sono comunque degli URL davvero minuscoli.
Paul Drewett,

1
Su questo sito, è accettabile utilizzare un tag di apertura abbreviato (credo che sia <?invece di <?php) e lasciare il tag di chiusura. Questo dovrebbe lasciarti qualche altro personaggio.
Giustino, il

1
turl.no crea collegamenti piuttosto brevi e, poiché è un accorciatore di collegamenti norvegese, poche persone lo hanno notato a livello internazionale. Ecco un link per te: turl.no/t2u punta alla stessa pagina del link tinyurl.com e salva 8 caratteri.
bilde2910,

@ bilde2910 Grazie, ha funzionato ed è davvero un altro URL molto piccolo. Molto apprezzato e Turl.ca è interessante. Adora i suoi domini .ca, no :-)
Paul Drewett,

4

Dardo 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 (beh, con newline e spazi bianchi principali)

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

Delfi (688 873 859 848 840)

Cercherò ancora di radere alcuni personaggi ma farà il lavoro :)

Modifica: invece di accorciarlo, l'ho allungato: P
Ho dimenticato di aggiungere l'ignoranza delle risposte quando ha un voto negativo o nessun blocco di codice.

Sto solo aggiornando la versione non giocata durante la modifica.
Grazie a @manatwork per le modifiche suggerite che hanno tolto 8 caratteri.

Versione golfizzata:

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.

Versione non golfata:

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#34718può essere cambiato in http://codegolf.stackexchange.com/q/34718, il che risparmierebbe un bel po 'di personaggi.
Maniglia della porta

Grazie, purtroppo ho anche dovuto aggiungere alcuni poiché ho dimenticato la parte in cui devi ignorare le risposte con un voto negativo o nessun blocco di codice: / .. non funziona :( Mi sposto in modo permanente un 301
Teun Pronk,

Come suggerito prima , puoi dichiarare l come TStringsinvece. (Ma mantieni l'istanza con TStringList.)
arte

Proverei a fare c byteinvece di boolean.
arte

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]

Questo è il mio primo codegolf, quindi spero che sia abbastanza golf!

Modifica: grazie per i suggerimenti! Ora sembra un po 'più golfista.


Non sembra male per un primo tentativo! Anche se si potrebbe utilizzare un URL shortener per il collegamento e sbarazzarsi di alcuni spazi in là ( for i,m, m==open, ecc).
Christoph Böhmwalder,

@HackerCow Penso che gli accorciatori di URL siano generalmente disapprovati, ma http://codegolf.stackexchange.com/q/34705/14509sicuramente funzionerebbero.
undergroundmonorail,

@KidElephant Ho rimosso un sacco di spazi bianchi dal tuo codice. Non l'ho provato o altro, ma a meno che non abbia sbagliato, dovrebbe essere (logicamente) lo stesso programma. Nota che ho rimosso lo shebang, quelli non sono richiesti qui. ix.io/dsz La rimozione di spazi bianchi può far risparmiare parecchi byte :)
undergroundmonorail

Inoltre, per le sfide del code golf dovresti includere un conteggio di byte. Ne modificherei uno qui per te, ma la tua risposta probabilmente cambierà se usi qualche suggerimento, quindi non mi preoccuperò. È possibile trovare il conteggio dei byte eseguendo wc -c $filename. Se il tuo editor aggiunge una nuova riga finale ai file (probabilmente lo fa) puoi sottrarne una per ottenere il tuo punteggio finale.
undergroundmonorail,

2

Mathematica - 159

La prima volta che fa l'analisi in Mathematica

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

2

Rubino 283 + 17 = 300

Ciò ha successo indipendentemente dal numero di voti ottenuti da questa risposta e indipendentemente dal fatto che ci sia una seconda (o quindicesima) pagina di risposte o meno. Utilizza l'API dei dati.

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 essere eseguito con ruby -rnet/http -rjson(quindi il +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 parentesi rimosse nel simbolo regex

302 commit iniziale


È possibile salvare alcuni byte rendendo il filtro non sicuro
pppery

@ppperry, per favore, spiegalo?
Non che Charles il

L'uso di filtri non sicuri significa che è necessario annullare manualmente lo scappamento HTML. Vedi i documenti di 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!';

Modifica: l'accorciatore di URL di lrn produce l'URL più breve :)

RegEx corrisponde all'ancoraggio prima di ogni risposta (insieme all'ID risposta) e al contenuto all'interno del primo <code>tag. La Ubandiera attiva la Umodalità ngreedy e la sbandiera fa .corrispondere a nuove linee (molto manciata). Non sono preoccupato se questo corrisponde a qualcos'altro poiché le risposte sono sfuggite, quindi nessuno può inserire il valore <letterale nella fonte della pagina.

Dopo aver ricevuto tutte le risposte $m[2]e i loro ID $m[1], uso solo echoper stampare la risposta sopra la mia, così come è $m[2][array_search(34786,$m[1])-1], o "Top!", Se la mia risposta alla fine arriva prima :)

Mi piace il fatto che in PHP l'operatore ternario possa essere utilizzato come operatore di corto circuito ?:


È fantastico. L'ho appena provato ma mostra il codice da quello qui sotto. Sono sicuro che sarà una soluzione rapida ma ho pensato di menzionarlo. Ottimo lavoro, 135 in PHP, non riesco ancora a crederci ...
Paul Drewett,

1
@PaulDrewett Si prega di guardare l'ordine quando si apre questa pagina nella navigazione privata. È diverso dall'ordine quando hai effettuato l'accesso.
core1024

Oh, è sorprendente. Mi chiedo perché? Siamo spiacenti di segnalare un errore per errore. Colpa mia. Ti ho votato come una risposta utile. Penso ancora che sia fantastico ...
Paul Drewett,

1

Delfi, 461 byte , 553 byte

Ora gestisce anche più pagine!

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.

(leggermente) 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.

Come eseguire:

app.exe > output.txt

bello, avrei potuto farlo anche io invece di usare le unità html .. peccato che non ci pensassi: P
Teun Pronk

Grazie. Inoltre, uno dei codici (se non solo) che gestisce anche più pagine.
Marko Paunovic,

1

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

Sono ancora in corso lavori, non ho fatto nulla per quanto riguarda più pagine (e nessuno ha fatto altro?)

Ho ottenuto il calo di 200 caratteri tagliando un sacco di dom extra, perché cercare oggetti quando riesco a trovare la loro posizione?

Questo è anche il mio primo codice golf! Sono felice di averlo fatto nel 200 e usando i metodi dom. Grazie ai commenti, ho appena rasato altri 4 personaggi.

Volevo fare qualcosa come jquery / jscript per quanto riguarda l'attraversamento del dom, e sto ancora lavorando per ridurlo. Forse potrei cavarmela cercando "asi" come nome utente?

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;

formattato:

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

Saluti


Tra parentesi new DOMDocument(), e la chiusura ?>può essere omessa in PHP.
jimmy23013,

Grazie, ho perso altri 4 personaggi. Al momento, non riesco a immaginare come renderlo più breve se non uso classi diverse, gli accessori DOM sono costosi.
Asitaka,

Salva i personaggi cambiando il tuo nome utente!
DavidG,

Penso che sia bello. Sto solo cercando di imparare la parte della query su DOMXPath, ma devo ammettere che la trovo difficile. L'ho provato per questo, ma non ci sono riuscito. Ho testato il tuo ma sembra che stia segnalando quelli due sopra di esso, non quello direttamente sopra. Sono sicuro che è una soluzione rapida ma ho pensato di menzionarlo.
Paul Drewett,

Seguendo queste informazioni "Si prega di guardare l'ordine quando si apre questa pagina nella navigazione privata. È diverso dall'ordine quando si è effettuato l'accesso - core1024" da un commento di risposta diverso Devo presumere che lo stesso stia accadendo anche qui. Scusa per quello.
Paul Drewett,

1

Python 3, 197 191 byte

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

Le regole non dicono che non posso usare l'API e che non posso usare un accorciatore di URL.

https://tinyurl.com/hdemk76si espande in https://api.stackexchange.com/2.2/questions/34705/answers?order=desc&sort=votes&site=codegolf&filter=withbody&pagesize=100 Funziona solo se si trova tra le prime 100 risposte ordinate per voti.


-6 se lo sostituisci https://tinyurl.com/hdemk76conhttp://bit.ly/2hN8TKV
Taylor Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.