¿Estoy superado por Dennis?

15

Según la leyenda , casi todos son superados por Dennis . Si no, lo serán.

Ahora tengo curiosidad si soy uno de esos 'casi todos'.

Se le dará un enlace a una respuesta en el formato de /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Encuentre la longitud del código, que asumiremos como el último número en la primera línea (en sentido de reducción) de la respuesta en el enlace.

Luego, busque las respuestas de Dennis y haga lo mismo.

Ahora compare la longitud del código de respuestas de entrada y Dennis, y si está fuera de juego (lo que significa que una o más respuestas de Dennis son más cortas que las de la respuesta de entrada), arroje un valor verdadero y, si no, un valor falso.

Si no hay una respuesta que pertenezca a Dennis en la misma pregunta que la respuesta, arroje un valor falso.

Ejemplos

  • Enlace :true
  • Enlace : false(Al menos por ahora, dime cuándo cambia)

Reglas

  • Puede usar cualquier forma de valor verdadero / falso.
  • La pregunta de la respuesta que se le dará siempre será .
  • La pregunta puede no tener una respuesta de Dennis, pero la respuesta ingresada nunca pertenecerá a Dennis.

  • Puede suponer que siempre hay un número en la primera línea de la respuesta.

Matthew Roh
fuente
3
¿Podemos suponer que siempre habrá una respuesta de Dennis para la pregunta dada, y que la respuesta dada no será la respuesta de Dennis?
Skidsdev
@Mayube No, y sí.
Matthew Roh
¿Necesitamos manejar la paginación o podemos suponer que ambas respuestas estarán en la misma página si hay varias páginas de respuestas?
Shaggy
@Shaggy ex.
Matthew Roh
@SIGSEGV Si no hay respuesta de Dennis, ¿generamos resultados falsos porque Dennis no ha superado la respuesta?
Skidsdev

Respuestas:

1

Python 3.6 + solicitudes + bs4 - 363 358 bytes

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)

Impresiones Trueo False.

Nota: actualmente no funciona en el segundo enlace debido a HTML no válido producido por esta respuesta (las etiquetas emy strongse terminan en el orden incorrecto al final de la segunda línea, y hace que el analizador pierda el bloque de nombre de usuario). Pruébelo en este enlace en su lugar.

Uso de la 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)

Tenga en cuenta que esto también falla en el segundo enlace, pero debido a que una respuesta comenzó en This may be foul play.lugar del encabezado ...

matsjoyce
fuente
Considere usar la API de Stack Exchange para obtener datos de respuesta en su lugar a través del analizador JSON , solo asegúrese de que filter=withbodyesté en su solicitud GET para obtener el cuerpo de respuesta para obtener el recuento de bytes
Value Ink
Con la versión de API, usó ados veces (una para configurar el ID de respuesta y otra al iterar r["items"], lo que conduciría a un comportamiento incorrecto. Además, no necesita configurar el pagesize(por defecto será 30). c=int(re.search(r'(\d+) bytes').group(1))Debería darle un recuperación más precisa de bytecount y es más corta, y si aún falla, (\d+)\s*byteshace el truco pero es un poco más larga. Finalmente, i=r["has_more"]and i+1es más corta que su condicional ternario.
Value Ink
En realidad, olvídate de la coincidencia de expresiones regulares. Olvidé dar cuenta de agregar el cuerpo de respuesta en la llamada de función para que esa parte sea más larga. Sin embargo, las otras sugerencias siguen siendo válidas.
Value Ink
@ValueInk Gracias, un poco más corto ahora. Parece que necesitamos un lenguaje de golf solo para la API, sus llamadas son muuuy largas ...
matsjoyce
Quizás. Pero, sinceramente, también existe el hecho de que tiene un buen analizador de HTML, además del hecho de que le dan la URL de la pregunta de forma predeterminada. Si la entrada fuera dos números, habría un poco de sobrecarga para obtener la página para la pregunta de codegolf también.
Value Ink
1

Rubí, 314 315 308 + 20 = 334 335 328 bytes

Utiliza las banderas -n -rjson -ropen-uri. +1 byte al arreglar un error menor.

-7 bytes descubriendo la open-uribiblioteca predeterminada 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
Tinta de valor
fuente