Suis-je dépassé par Dennis?

15

Selon la légende , presque tout le monde est devancé par Dennis . Sinon, ils le seront.

Maintenant, je suis curieux de savoir si je fais partie de «presque tout le monde».

Vous recevrez un lien vers une réponse au format /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Trouvez la longueur du code, que nous supposerons comme le dernier nombre sur la première ligne (en termes de démarque) de la réponse dans le lien.

Ensuite, recherchez les réponses de Dennis et faites de même.

Maintenant, comparez la longueur du code des réponses de Dennis et de l'entrée, et si elle est hors golf (ce qui signifie qu'une ou plusieurs réponses de Dennis sont plus courtes que celle de la réponse d'entrée), sortez une valeur véridique, et sinon, une valeur fausse.

S'il n'y a pas de réponse appartenant à Dennis sur la même question que la réponse, émettez une valeur fausse.

Exemples

  • Lien :true
  • Lien : false(au moins pour l'instant, dites-moi quand cela changera)

Règles

  • Vous pouvez utiliser n'importe quelle forme de valeur véridique / fausse.
  • La question de la réponse qui vous sera donnée sera toujours le .
  • La question peut ne pas avoir de réponse de Dennis, mais la réponse entrée n'appartiendra jamais à Dennis.

  • Vous pouvez supposer qu'il y a toujours un nombre sur la première ligne de la réponse.

Matthew Roh
la source
3
Pouvons-nous supposer qu'il y aura toujours une réponse de Dennis sur la question donnée, et que la réponse donnée ne sera pas la réponse de Dennis?
Skidsdev
@Mayube Non, et oui.
Matthew Roh
Avons-nous besoin de gérer la pagination ou pouvons-nous supposer que les deux réponses seront sur la même page s'il y a plusieurs pages de réponses?
Shaggy
@Shaggy former.
Matthew Roh
@SIGSEGV S'il n'y a pas de réponse de Dennis, affichons-nous faux parce que Dennis n'a pas surpassé la réponse?
Skidsdev

Réponses:

1

Python 3.6 + requêtes + bs4 - 363 358 octets

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)

Imprime TrueouFalse .

Remarque: ne fonctionne pas actuellement sur le deuxième lien en raison du code HTML non valide produit par cette réponse (les balises emet strongsont terminées dans le mauvais ordre à la fin de la deuxième ligne, et l'analyseur manque le bloc de nom d'utilisateur). Essayez-le sur ce lien .

Utilisation de l'API - 401 380 octets

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)

Notez que cela échoue également sur le deuxième lien, mais parce qu'une réponse a commencé par This may be foul play.au lieu de l'en-tête ...

matsjoyce
la source
Pensez à utiliser l' API Stack Exchange pour obtenir des données de réponse à la place via l'analyseur JSON , assurez-vous simplement qu'il se filter=withbodytrouve dans votre demande GET afin d'obtenir le corps de la réponse pour récupérer le nombre d'octets
Value Ink
Avec la version de l'API, vous l'avez utilisé adeux fois (une fois pour définir l'ID de réponse et une autre lors de l'itération r["items"], ce qui conduirait à un comportement incorrect. De plus, vous n'avez pas besoin de définir la pagesize(elle sera par défaut de 30). c=int(re.search(r'(\d+) bytes').group(1))Devrait vous donner un une récupération plus précise des bytecount et est plus courte, et si elle échoue toujours, (\d+)\s*bytesfait l'affaire mais est un peu plus longue. Enfin, i=r["has_more"]and i+1est plus courte que votre conditionnel ternaire.
Value Ink
En fait, oubliez le match regex. J'ai oublié de tenir compte de l'ajout du corps de réponse dans l'appel de fonction afin que cette partie soit plus longue. Les autres suggestions restent cependant valables.
Value Ink
@ValueInk Merci, un peu plus court maintenant. On dirait que nous avons besoin d'un langage de golf juste pour l'API, ses appels sont tellement longs ...
matsjoyce
Peut-être. Mais honnêtement, il y a aussi le fait que vous avez un bon analyseur HTML, plus le fait que l'URL de la question vous est donnée par défaut. Si l'entrée était composée de deux nombres à la place, il y aurait un peu de surcharge pour obtenir également la page pour la question de codegolf.
Value Ink
1

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

Utilise les drapeaux -n -rjson -ropen-uri. +1 octet de correction d'un bug mineur.

-7 octets en découvrant la open-uribibliothèque par défaut de 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
Encre de valeur
la source