Sono superato da Dennis?


15

Secondo la leggenda , quasi tutti sono superati da Dennis . In caso contrario, lo saranno.

Ora sono curioso di sapere se sono uno di quei "quasi tutti".

Ti verrà dato un link a una risposta nel formato di /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Trova la lunghezza del codice, che assumeremo come ultimo numero sulla prima riga (punto di riferimento) della risposta nel link.

Quindi, cerca le risposte di Dennis e fai lo stesso.

Ora confronta la lunghezza del codice di risposta dell'input e di Dennis, e se è superata (nel senso che una o più risposte di Dennis è più breve di quella della risposta di input), genera un valore veritiero e, in caso contrario, un valore falso.

Se non esiste una risposta appartenente a Dennis sulla stessa domanda della risposta, genera un valore errato.

Esempi

  • Link :true
  • Link : false(almeno per ora, dimmi quando cambia)

Regole

  • È possibile utilizzare qualsiasi forma di valore di verità / falsità.
  • La domanda della risposta che ti verrà data sarà sempre .
  • La domanda potrebbe non avere una risposta di Dennis ', ma la risposta immessa non apparterrà mai a Dennis.

  • Puoi presumere che ci sia sempre un numero sulla prima riga della risposta.


3
Possiamo presumere che ci sarà sempre una risposta di Dennis sulla domanda data e che la risposta data non sarà la risposta di Dennis?
Skidsdev,

@Mayube No, e sì.
Matthew Roh,

Dobbiamo gestire il paging o possiamo supporre che entrambe le risposte saranno sulla stessa pagina se ci sono più pagine di risposte?
Shaggy,

@Shaggy ex.
Matthew Roh,

@SIGSEGV Se non ci sono risposte da parte di Dennis, viene emesso falso perché Dennis non ha superato la risposta?
Skidsdev,

Risposte:


1

Python 3.6 + richieste + bs4 - 363 358 byte

import bs4,re,requests
u,n=input().split("/#");i=1;d=y=float("inf")
while i:
 A=bs4.BeautifulSoup(requests.get(u+f"?page={i}").text,"html.parser")(class_="answer")
 for a in A:
  c=int(re.findall("\d+",(a("h1")+a("h2")+a("p"))[0].text)[-1])
  if "Dennis"in a(class_="user-details")[-1].text:d=min(c,d)
  if a["data-answerid"]==n:y=c
 i=A and i+1;
print(d<y)

Stampe Trueo False.

Nota: al momento non funziona sul secondo collegamento a causa dell'HTML non valido prodotto da questa risposta (i tag eme strongsono terminati nell'ordine sbagliato alla fine della seconda riga e fanno sì che il parser non salti il ​​blocco del nome utente). Provalo invece su questo link .

Utilizzo dell'API - 401 380 byte

import requests,re
q,A=re.findall("\d+",input());i=1;d=y=float("inf")
while i:
 r=requests.get(f"https://api.stackexchange.com/2.2/questions/{q}/answers?site=codegolf&filter=withbody&page={i}").json();i=r["has_more"]and i+1
 for a in r["items"]:
  c=int(re.search("(\d+)\D+$",a["body"]).group(1))
  if a["owner"]["user_id"]==12012:d=min(d,c)
  if a["answer_id"]==A:y=c
print(d<y)

Si noti che anche questo non riesce sul secondo collegamento, ma poiché una risposta è iniziata con This may be foul play.anziché l'intestazione ...


Prendi in considerazione l'utilizzo dell'API Stack Exchange per ottenere i dati di risposta invece tramite il parser JSON , assicurati solo che filter=withbodysia nella tua richiesta GET al fine di ottenere il corpo della risposta per ottenere il conteggio dei byte
Valore Ink

Con la versione dell'API, hai usato adue volte (una volta per impostare l'ID di risposta e un'altra durante l'iterazione r["items"], il che porterebbe a un comportamento errato. Inoltre, non è necessario impostare il pagesize(per impostazione predefinita su 30). c=int(re.search(r'(\d+) bytes').group(1))Dovresti darti un recupero più accurato di bytecount ed è più breve, e se fallisce ancora, (\d+)\s*bytesfa il trucco ma è un po 'più lungo. Infine, i=r["has_more"]and i+1è più corto del tuo condizionale ternario.
Value Ink,

In realtà, dimentica la partita regex. Ho dimenticato di rendere conto dell'aggiunta del corpo della risposta nella chiamata di funzione in modo che la parte sia più lunga. Gli altri suggerimenti sono comunque validi.
Value Ink,

@ValueInk Grazie, ora un po 'più corto. Sembra che abbiamo bisogno di un linguaggio da golf solo per l'API, le sue chiamate sono così lunghe ...
matsjoyce,

Forse. Ma onestamente c'è anche il fatto che hai un buon parser HTML, oltre al fatto che ti viene assegnato l'URL della domanda per impostazione predefinita. Se invece l'input fosse di due numeri, ci sarebbe un bel po 'di overhead per ottenere anche la pagina per la domanda di codegolf.
Value Ink,

1

Rubino, 314 315 308 + 20 = 334 335 328 byte

Usa le bandiere -n -rjson -ropen-uri. +1 byte dalla correzione di un bug minore.

-7 byte scoprendo la open-urilibreria predefinita di Ruby.

~/(\d+)\D+(\d+)/
u="http://api.stackexchange.com/2.2/questions/#$1/answers?site=codegolf&filter=withbody&page=%s"
n=eval$2
a="answer_id"
j=1
o=[]
(o+=r=JSON.parse(open(u%j).read)["items"]
j=r!=[]&&j+1)while j
p o.select{|e|e["owner"]["user_id"]==12012||e[a]==n}.min_by{|e|e["body"][/\d+\s*bytes/].to_i}[a]!=n
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.