Деннис меня превзошел?

15

Согласно легенде , почти каждый outgolfed от Дениса . Если нет, они будут.

Теперь мне любопытно, являюсь ли я одним из тех «почти всех».

Вам будет предоставлена ​​ссылка на ответ в формате /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Найдите длину кода, которую мы будем считать последней цифрой в первой строке (по уценке) ответа в ссылке.

Затем найдите ответы Денниса и сделайте то же самое.

Теперь сравните длину кода входных данных и ответов Денниса, и, если он вне поля зрения (имеется в виду, что один или несколько ответов Денниса короче, чем ответ входного ответа), выведите истинное значение, а если нет, ложное значение.

Если нет ответа от Денниса на тот же вопрос, что и ответ, выведите ложное значение.

Примеры

  • Ссылка :true
  • Ссылка : false(по крайней мере, пока, скажите мне, когда это изменится)

правила

  • Вы можете использовать любую форму истинного / ложного значения.
  • Вопрос ответа, который вы получите, всегда будет .
  • На этот вопрос может не быть ответа Денниса, но введенный ответ никогда не будет принадлежать Денису.

  • Вы можете предположить, что в первой строке ответа всегда есть число.

Мэтью Ро
источник
3
Можем ли мы предположить, что Деннис всегда будет отвечать на данный вопрос, и что данный ответ не будет ответом Дениса?
Скидсдев
@ Mayube Нет, и да.
Мэтью Ро
Нужно ли обрабатывать пейджинг или мы можем предположить, что оба ответа будут на одной странице, если есть несколько страниц ответов?
Лохматый
@ Шэгги бывший.
Мэтью Ро,
@SIGSEGV Если Деннис не отвечает, мы выводим false, потому что Деннис не переиграл ответ?
Скидсдев

Ответы:

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.заголовка ...

matsjoyce
источник
Попробуйте использовать API Stack Exchange для получения данных ответов вместо парсера JSON , просто убедитесь, что filter=withbodyв вашем запросе GET есть тело ответа, чтобы получить счетчик байтов
Value Ink
В версии API вы использовали aдважды (один раз для установки идентификатора ответа, а другой - для итерации r["items"], что привело бы к некорректному поведению. Кроме того, вам не нужно устанавливать pagesize(по умолчанию это 30). c=int(re.search(r'(\d+) bytes').group(1))Должно дать вам Более точный поиск bytecount и короче, и если он все еще не работает, (\d+)\s*bytesделает свое дело, но немного дольше. Наконец, i=r["has_more"]and i+1короче, чем ваша троичная условно.
Value Ink
На самом деле, забудьте о регулярных выражениях. Я забыл учесть добавление тела ответа в вызов функции, чтобы эта часть была длиннее. Другие предложения остаются в силе, хотя.
Value Ink
@ValueInk Спасибо, теперь немного короче. Похоже, нам нужен язык игры в гольф только для API, его звонки ооочень длинные ...
matsjoyce
Может быть. Но, честно говоря, есть и тот факт, что у вас есть хороший HTML-парсер, плюс тот факт, что вы задали URL-адрес вопроса по умолчанию. Если бы вместо ввода были два числа, было бы немало лишних затрат на получение страницы для вопроса о Codegolf.
Value Ink
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
Значение чернил
источник