Чи я перевершив Денніса?


15

За легендою , Деніс майже всіх перевершив . Якщо ні, вони будуть.

Зараз мені цікаво, чи я одна з тих, «майже всіх».

Вам буде надано посилання на відповідь у форматі /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Знайдіть довжину коду, яку ми будемо вважати останнім числом у першому рядку (розмітка з позначкою) відповіді за посиланням.

Потім знайдіть відповіді Денніса і зробіть те саме.

Тепер порівняйте довжину коду введення та відповіді Денніса, і якщо він перебуває поза полем (означає, що одна чи більше відповідей Денніса коротше, ніж відповідь на вхід), виведіть значення "truthy", а якщо ні, то помилкове значення.

Якщо відповіді на Денніса немає відповіді на те саме питання, що і відповідь, виведіть помилкове значення.

Приклади

Правила

  • Ви можете використовувати будь-яку форму правдивої / хибної цінності.
  • Питання відповіді, яку вам дають, завжди буде .
  • На запитання може не відповісти Деніс, але введена відповідь ніколи не буде належати Деннісу.

  • Ви можете припустити, що в першому рядку відповіді завжди є число.


3
Чи можемо ми припустити, що на це питання завжди знайдеться відповідь Денніса, і що дана відповідь не буде відповіддю Денніса?
Скидсдев

@Mayube Ні, і так.
Matthew Roh

Чи потрібно обробляти підкачки або чи можна припустити, що обидва відповіді будуть на одній сторінці, якщо є кілька сторінок відповідей?
Кудлатий

@Shaggy колишній.
Matthew Roh

@SIGSEGV Якщо відповіді Денніса немає, ми виводимо помилкові, оскільки Денніс не перевершив відповідь?
Скидсдев

Відповіді:


1

Python 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, що створюється цією відповіддю ( emі strongтеги завершуються в неправильному порядку в кінці другого рядка, і змушує аналізатор пропустити блок імені користувача). Спробуйте замість цього посилання .

За допомогою 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.замість заголовка ...


Розгляньте можливість використання API Exchange Stack для отримання даних відповідей замість синтаксичного аналізатора JSON , просто переконайтеся, що filter=withbodyце у вашому запиті GET, щоб отримати тіло відповідей, щоб отримати кількість байтів
Value Ink

З версією API ви використовували aдвічі (один раз , щоб встановити ідентифікатор відповіді, а інші при переборі r["items"], що призведе до некоректного поведінки. Крім того , вам не потрібно , щоб встановити pagesize( по замовчуванням буде 30). c=int(re.search(r'(\d+) bytes').group(1))Повинен дати вам точніше пошук байт-рахунку і коротший, і якщо він все-таки не вдається, (\d+)\s*bytesце робить трюк, але трохи довше. Нарешті, i=r["has_more"]and i+1коротший, ніж ваш термінальний умовний.
Value Ink

Власне, забудьте про матч з регулярними виразками. Я забув записати те, що додав тіло відповідей у ​​виклик функції, щоб ця частина була довшою. Інші пропозиції все ще дійсні.
Значення чорнила

@ValueInk Дякую, зараз трохи коротше. Схоже, нам потрібна мова для гольфу лише для API, її дзвінки є sooo довго ...
matsjoyce

Можливо, Але, якщо чесно, є й той факт, що у вас є гарний HTML-аналізатор, плюс той факт, що вам задано URL-адресу питання за замовчуванням. Якщо натомість було два числа, то було б досить багато накладних витрат для отримання сторінки також для питання про кодегольф.
Значення чорнила

1

Рубі, 314 315 308 + 20 = 334 335 328 байт

Використовує прапори -n -rjson -ropen-uri. +1 байт від виправлення неповнолітніх помилок.

-7 байт, відкривши open-uriбібліотеку за замовчуванням 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.