Sou derrotado por Dennis?

15

Segundo a lenda , quase todo mundo é derrotado por Dennis . Se não, eles serão.

Agora estou curioso para saber se sou um desses 'quase todo mundo'.

Você receberá um link para uma resposta no formato de /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Encontre o comprimento do código, que assumiremos como o último número na primeira linha (remarcação) da resposta no link.

Em seguida, procure as respostas de Dennis e faça o mesmo.

Agora compare o comprimento do código de entrada e de resposta de Dennis e, se estiver fora do campo de golfe (o que significa que uma ou mais respostas de Dennis é menor que a resposta de entrada), produza um valor verdadeiro e, se não, um valor falso.

Se não houver resposta pertencente a Dennis na mesma pergunta que a resposta, produza um valor falso.

Exemplos

  • Link :true
  • Link : false(pelo menos por enquanto, me diga quando isso muda)

Regras

  • Você pode usar qualquer forma de valor de verdade / falsidade.
  • A pergunta da resposta que você recebe será sempre .
  • A pergunta pode não ter uma resposta de Dennis ', mas a resposta inserida nunca pertencerá a Dennis.

  • Você pode assumir que sempre existe um número na primeira linha da resposta.

Matthew Roh
fonte
3
Podemos assumir que sempre haverá uma resposta de Dennis para a pergunta dada e que a resposta dada não será a resposta de Dennis?
Skidsdev 10/05
@ Mayube Não, e sim.
Matthew Roh
Precisamos lidar com paginação ou podemos assumir que ambas as respostas estarão na mesma página se houver várias páginas de respostas?
Shaggy
@Shaggy ex.
Matthew Roh
@SIGSEGV Se Dennis não responder, obtemos um resultado falso porque Dennis não superou a resposta?
Skidsdev 10/05

Respostas:

1

Python 3.6 + solicitações + 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)

Imprime Trueou False.

Nota: no momento, não funciona no segundo link devido ao HTML inválido produzido por esta resposta (as tags eme strongsão finalizadas na ordem errada no final da segunda linha e faz com que o analisador perca o bloco de nome de usuário). Experimente neste link .

Usando a 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)

Observe que isso também falha no segundo link, mas porque uma resposta começou com em This may be foul play.vez do cabeçalho ...

matsjoyce
fonte
Considere usar a API do Stack Exchange para obter dados de resposta em vez do analisador JSON , mas verifique se filter=withbodyestá em sua solicitação GET para obter o corpo da resposta para obter a contagem de bytes
Value Ink
Com a versão da API, você usou aduas vezes (uma vez para definir o ID resposta, e outra quando a iteração r["items"], o que levaria a um comportamento incorreto. Além disso, você não precisa definir a pagesize(o padrão será 30). c=int(re.search(r'(\d+) bytes').group(1))Deve dar-lhe uma recuperação mais precisa de bytecount e é mais curto, e se ele ainda falhar, (\d+)\s*bytesfaz o truque, mas é um pouco mais Finalmente,. i=r["has_more"]and i+1é mais curto do que o seu ternário condicional.
Valor Ink
Na verdade, esqueça a correspondência regex. Esqueci de incluir o corpo da resposta na chamada de função, para que essa parte seja mais longa. As outras sugestões ainda são válidas.
Value Ink
@ ValueInk Obrigado, um pouco mais curto agora. Parece que nós precisamos de uma linguagem de golfe apenas para o API, suas chamadas são muuuito tempo ...
matsjoyce
Possivelmente. Mas, honestamente, também existe o fato de você ter um bom analisador de HTML, além do fato de receber o URL da pergunta por padrão. Se a entrada fosse dois números, haveria um pouco de sobrecarga para obter a página para a questão do codegolf também.
Value Ink
1

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

Usa as bandeiras -n -rjson -ropen-uri. +1 byte da correção de um bug menor.

-7 bytes, descobrindo a open-uribiblioteca padrão do 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
Value Ink
fonte