데니스가 아웃 고프를 했습니까?


15

전설에 따르면 , 거의 모든 사람들이 데니스에 의해 아웃 고프된다 . 그렇지 않으면, 그들은 될 것입니다.

이제 나는 '거의 모든 사람'중 하나인지 궁금합니다.

형식으로 답변에 대한 링크가 제공됩니다 /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

코드 길이를 찾으십시오 . 링크에서 답변의 첫 번째 줄 (마침표 아래)의 마지막 숫자 로 가정 합니다.

그런 다음 Dennis의 답변을 검색하고 동일한 작업을 수행하십시오.

이제 입력과 Dennis의 응답 코드 길이를 비교하고 그것이 골프를 벗어난 경우 (Dennis의 하나 이상의 응답이 입력 응답의 응답보다 짧음을 의미) 진실 값을 출력하고 그렇지 않으면 거짓 값을 출력합니다.

답변과 동일한 질문에 Dennis에 속하는 답변이 없으면 잘못된 값을 출력하십시오.

  • 링크 :true
  • 링크 : false(적어도 지금은 언제 바뀌는 지 알려주세요)

규칙

  • 당신은 어떤 형태의 진실 / 거짓 가치를 사용할 수 있습니다.
  • 당신에게 주어진 대답의 질문은 항상 입니다.
  • 질문에 Dennis에 대한 답변이 없을 수도 있지만 입력 된 답변은 Dennis에 속하지 않습니다.

  • 답의 첫 줄에는 항상 숫자가 있다고 가정 할 수 있습니다.


3
주어진 질문에 대해 Dennis의 답변이 항상 있고 해당 답변이 Dennis의 답변이 아니라고 가정 할 수 있습니까?
Skidsdev

@Mayube 아니요, 그렇습니다.
Matthew Roh

페이징을 처리해야합니까, 아니면 여러 페이지의 답변이있는 경우 두 답변이 같은 페이지에 있다고 가정 할 수 있습니까?
Shaggy

@Shaggy 전.
Matthew Roh

@SIGSEGV Dennis가 답을 찾지 못하면 Dennis가 답을 능가하지 않기 때문에 거짓을 출력합니까?
Skidsdev

답변:


1

파이썬 3.6 + 요청 + BS4 - 363 358 바이트

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)

인쇄물 True 또는 False.

참고 : 이 답변으로 생성 된 잘못된 HTML로 인해 현재 두 번째 링크에서 작동하지 않습니다 ( emstrong태그는 두 번째 줄 끝에서 잘못된 순서로 종료되어 파서가 사용자 이름 블록을 놓치게합니다). 그것을 시도대신 이 링크 .

API를 사용하여 - (401) 380 바이트

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)

이것은 두 번째 링크에서도 실패하지만 This may be foul play.헤더 대신 하나의 답변으로 시작했기 때문에 ...


JSON 교환기를 통해 대신 응답 데이터를 가져 오기 위해 Stack Exchange API를 사용하는 것을 고려 하십시오 filter=withbody. 바이트 수를 얻기 위해 응답 본문을 얻으려면 GET 요청에 있는지 확인하십시오.
Value Ink

이 API 버전으로, 당신은 사용 a응답 ID를 설정하고, 또 다른 반복 할 때를 한 번 두 번 ( r["items"]잘못된 동작이 발생할 것이다. 또한, 당신은 설정할 필요가 없습니다 pagesize(이) (30)로 기본 설정됩니다. c=int(re.search(r'(\d+) bytes').group(1))당신에게 제공한다 보다 정확한 바이트 수의 검색 및 더 짧고 여전히 실패 (\d+)\s*bytes하면 트릭을 수행하지만 조금 더 길다 마지막으로 i=r["has_more"]and i+13 진 조건보다 짧습니다
Value Ink

실제로 정규식 일치는 잊어 버리십시오. 함수 호출에 응답 본문을 추가하여 부분이 길어 지도록 계정을 잊어 버렸습니다. 그러나 다른 제안은 여전히 ​​유효합니다.
가치 잉크

@ValueInk 감사합니다. 조금 짧아졌습니다. 우리처럼 보인다는 전화가 그냥 API에 대한 골프 언어를 필요 sooo를 ... 긴
matsjoyce

혹시. 그러나 솔직히 HTML 파서가 있다는 사실과 기본적으로 질문 URL이 제공된다는 사실도 있습니다. 입력이 대신 두 개의 숫자라면 codegolf 질문에 대한 페이지를 얻는 데 약간의 오버 헤드가 있습니다.
가치 잉크

1

루비 314 315 308 + 20 = 334 (335) 328 바이트

플래그를 사용합니다 -n -rjson -ropen-uri. 사소한 버그 수정에서 +1 바이트

open-uriRuby 기본 라이브러리 를 발견하여 -7 바이트

~/(\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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.