Python 3.5, 280 272 260 242 240 байт:
( Дякую Аднану за хитрість щодо використання *
оператора у порівняннях, що призводить до 2 збережених байтів! )
def g(o):import urllib.request as u,re;R=re.findall;w=bytes.decode(u.urlopen('http://ppcg.lol/q/'+o).read());print((len(R('(?:<h[0-9]>|<p>).*python',w.lower()))<2)*(int(R('(?<="vote-count-post ">)[0-9]+',w)[0])>3)*w.count('answercell">')>5)
Досить просто. Використовує вбудовану urllib
бібліотеку Python для переходу на сайт питання, а потім використовує регулярні вирази для пошуку підрахунку голосів, підрахунку відповідей та підрахунку конкретних відповідей Python у декодованому тексті, поверненому з веб-сайту. Нарешті, ці значення порівнюються з умовами, необхідними для повернення truthy
значення, а якщо вони задовольняють усім умовам, то True
повертаються. Інакше False
є.
Єдине, що мене тут може турбувати, - це те, що регулярні вирази дають багато уваги з точки зору кількості відповідей конкретного пітона для збереження байтів, тому це може бути дещо неточним часом, хоча це, мабуть, досить добре для цілі цього виклику. Однак, якщо ви хочете набагато точніше, я додав його нижче, хоча його довше, ніж вище. Один, показаний нижче, наразі складає 298 байт, оскільки він використовує набагато довший регулярний вираз - той, який ви не могли знати, скільки часу знадобилося мені для виявлення - для підрахунку відповідей Python, ніж мої вихідні функції заради точності. Цей повинен працювати приблизно як мінімум від 80% до 90% усіх тестових випадків.
def g(o):import urllib.request as u,re;R=re.findall;w=bytes.decode(u.urlopen('http://ppcg.lol/q/'+o).read());print(len(R('(?<=answercell">).*?(?:<h[0-9]>|<strong>)[^\n]*python[^\n]*(?=</h[0-9]>|</strong>)',w.lower()))<2and int(R('(?<="vote-count-post ">)[0-9]+',w)[0])>3and w.count('answercell">')>5)
Але що з тими питаннями з кількома сторінками відповідей? Жодне з перерахованих вище не спрацює дуже добре в цій ситуації, якщо, скажімо, 1 відповідь пітона є на першій сторінці, а інша - на другій. Що ж, я вирішив вирішити цю проблему, створивши іншу версію моєї функції (показану нижче), яка перевіряє кожну сторінку відповідей, якщо існує декілька, на відповіді Python, і це зробило досить добре у багатьох тестових випадках I кинули на це. Ну, без зайвих прихильностей, ось нова і оновлена функція:
def g(o):
import urllib.request as u,re;R=re.findall;w=bytes.decode(u.urlopen('http://ppcg.lol/q/'+o).read());t=0if len(re.findall('="go to page ([0-9]+)">',w))<1else max([int(i)for i in re.findall('="go to page ([0-9]+)">',w)])
if t<1:print(len(R('(?<=answercell">).*?(?:<h[0-9]>|<strong>)[^\n]*python[^\n]*(?=</h[0-9]>|</strong>)',w.lower(),re.DOTALL))<2and int(R('(?<="vote-count-post ">)[0-9]+',w)[0])>3and w.count('answercell">')>5)
else:
P=[];U=[];K=[]
for i in range(2,t+2):P.append(len(R('(?<=answercell">).*?(?:<h[0-9]>|<strong>)[^\n]*python[^\n]*(?=</h[0-9]>|</strong>)',w.lower(),re.DOTALL)));U.append(int(R('(?<="vote-count-post ">)[0-9]+',w)[0]));K.append(w.count('answercell">'));w=bytes.decode(u.urlopen('http://ppcg.lol/questions/'+o+'/?page='+str(i)).read())
print(sum(P)<2and U[0]>3and sum(K)>5);print('# Python answers: ',sum(P));print('# Votes: ',U[0]);print('# Answers: ',sum(K))
Досить довго, чи не так? Я насправді не дуже збирався з цим кодом для гольфу, хоча, якщо ви хочете, я можу трохи більше пограти в гольф. Інакше я люблю це, і не могла бути щасливішою. О, я майже забув, як додатковий бонус, це також виводить загальну кількість відповідей Python на питання, загальну кількість голосів на питання, і загальну кількість відповідей на питання, якщо питання id
відповідає на запитання з більш ніж 1 сторінкою відповідей. В іншому випадку, якщо питання складається лише з однієї сторінки відповідей, воно просто виводить truthy/falsy
значення. Я дійсно трохи захопився цим викликом.
Кожен з них бере питання id
у вигляді рядка .
Я би розміщував Try It Online!
тут посилання для кожної функції, але, на жаль, ні, repl.it
ні Ideone
допускати отримання ресурсів через urllib
бібліотеку Python .