Bin ich von Dennis überfordert?

15

Der Legende nach ist fast jeder von Dennis überfordert . Wenn nicht, werden sie es sein.

Jetzt bin ich neugierig, ob ich einer von diesen "fast allen" bin.

Sie erhalten einen Link zu einer Antwort im Format von /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Bestimmen Sie die Länge des Codes, den wir als letzte Zahl in der ersten Zeile (absteigend) der Antwort im Link annehmen .

Suchen Sie dann nach Dennis 'Antworten und tun Sie dasselbe.

Vergleichen Sie nun die Antwortcodelänge der Eingaben und Dennis 'und geben Sie einen Wahrheitswert aus, und, falls diese nicht richtig ist (was bedeutet, dass mindestens eine Antwort von Dennis' Antwort kürzer ist als die der Eingabeantwort), falls nicht, einen falschen Wert.

Wenn es zu derselben Frage wie die Antwort keine Antwort von Dennis gibt, geben Sie einen falschen Wert aus.

Beispiele

  • Link :true
  • Link : false(Zumindest jetzt, sag mir, wenn es sich ändert)

Regeln

  • Sie können jede Form von wahrem / falschem Wert verwenden.
  • Die Frage nach der Antwort lautet immer .
  • Die Frage hat möglicherweise keine Antwort von Dennis, aber die eingegebene Antwort wird niemals Dennis gehören.

  • Sie können davon ausgehen, dass in der ersten Zeile der Antwort immer eine Zahl steht.

Matthew Roh
quelle
3
Können wir davon ausgehen, dass Dennis auf die gegebene Frage immer eine Antwort geben wird und dass die gegebene Antwort nicht Dennis 'Antwort sein wird?
Skidsdev
@ Mayube Nein und ja.
Matthew Roh
Müssen wir uns um das Blättern kümmern, oder können wir davon ausgehen, dass sich beide Antworten auf derselben Seite befinden, wenn es mehrere Seiten mit Antworten gibt?
Shaggy
@ Shaggy früher.
Matthew Roh
@SIGSEGV Wenn es keine Antwort von Dennis gibt, geben wir false aus, weil Dennis die Antwort nicht überholt hat?
Skidsdev

Antworten:

1

Python 3.6 + fordert + bs4 - 363 358 Bytes an

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)

Druckt Trueoder False.

Hinweis: Funktioniert derzeit nicht mit dem zweiten Link, da durch diese Antwort ungültiger HTML-Code generiert wurde (die Tags emund strongwerden am Ende der zweiten Zeile in der falschen Reihenfolge beendet und der Parser übersieht den Benutzernamenblock). Versuchen Sie es stattdessen über diesen Link .

Verwendung der API - 401 380 Bytes

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)

Beachten Sie, dass dies auch beim zweiten Link fehlschlägt, da jedoch eine Antwort mit This may be foul play.anstelle des Headers begann ...

Matsjoyce
quelle
Erwägen Sie die Verwendung der Stack Exchange-API, um Antwortdaten stattdessen über den JSON-Parser abzurufen. Vergewissern Sie sich filter=withbodyjedoch , dass Ihre GET-Anforderung den Antworttext enthält, um die Byteanzahl zu ermitteln
Value Ink
Mit der API - Version, verwendet man azweimal (einmal die Antwort - ID einzustellen, und eine andere , wenn das Iterieren r["items"], was zu fehlerhaften Verhalten führen würde. Außerdem brauchen Sie nicht zu setzen die pagesize(auf 30 ausfällt.) c=int(re.search(r'(\d+) bytes').group(1))Sollten Sie geben ein Ein genauerer Abruf von bytecount ist kürzer, und wenn der Vorgang immer noch fehlschlägt, (\d+)\s*bytesreicht der Trick aus, ist jedoch etwas länger. Schließlich i=r["has_more"]and i+1ist er kürzer als Ihre ternäre Bedingung.
Value Ink
Vergessen Sie eigentlich das Regex-Match. Ich habe vergessen, den Antworttext im Funktionsaufruf zu berücksichtigen, damit dieser Teil länger ist. Die anderen Vorschläge sind jedoch weiterhin gültig.
Value Ink
@ValueInk Danke, jetzt etwas kürzer. Es sieht so aus, als ob wir nur für die API eine
Golfsprache
Vielleicht. Aber ehrlich gesagt gibt es auch die Tatsache, dass Sie einen netten HTML-Parser haben, sowie die Tatsache, dass Sie standardmäßig die URL der Frage erhalten. Wenn die Eingabe stattdessen zwei Zahlen wäre, wäre es ziemlich aufwändig, die Seite auch für die Codegolf-Frage zu erhalten.
Value Ink
1

Ruby, 314 315 308 + 20 = 334 335 328 Bytes

Verwendet die Fahnen -n -rjson -ropen-uri. +1 Byte von der Behebung eines kleinen Fehlers.

-7 Bytes durch Ermitteln der open-uriRuby-Standardbibliothek.

~/(\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
Wert Tinte
quelle