Pythonの3.5、280 272 260 242 240バイト:
(比較で演算子を使用して2バイトの保存バイトを作成するトリックについてAdnanに感謝します!*
)
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)
簡単です。Pythonの組み込みurllib
ライブラリを使用して質問のサイトにアクセスし、正規表現を使用して、投票数、回答数、およびWebサイトから返されたデコードテキストのPython固有の回答数を検索します。最後に、これらの値は値を返すために必要な条件と比較されtruthy
、すべての条件を満たす場合True
は返されます。そうでない場合False
。
私がここで心配している唯一のことは、正規表現がバイトを節約するためのPython固有の回答の数の面で多くの風通しの悪い方法を与えるということですので、それはおそらく十分ではありますが、この課題の目的。ただし、より正確なものが必要な場合は、上記のものよりも長いものの、以下のものを追加しました。以下に示すものは、正確さのために元の関数よりもPythonの回答をカウントするために、はるかに長い正規表現(発見するのに時間がかからないもの)を使用しているため、現在298バイトです。これは、スローされたすべてのテストケースの少なくとも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の回答が最初のページにあり、別のページが2番目のページにある場合、上記のどちらも非常にうまく機能しません。まあ、私がチェックしていること(下図)私の機能の別のバージョンを作成することによってこの問題を解決するために自由を取ったすべてのページの回答の、複数のものは、Pythonの答えを、存在し、それは私がテストケースの多くに非常によく行っている場合それを投げました。さて、これ以上苦労することなく、ここに新しい更新された関数があります:
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ページ以上の質問に対応する場合の質問の回答の総数を出力します。答えの。それ以外の場合、質問が1ページの回答のみで構成されている場合、truthy/falsy
値を出力するだけです。私はこの挑戦に本当に夢中になりました。
これらはそれぞれ、質問を文字列のid
形式で受け取ります。
Try It Online!
ここに関数ごとにリンクを配置しますが、残念ながら、Pythonのライブラリを介したリソースのフェッチrepl.it
もIdeone
許可しませんurllib
。