Python 3.5, 280 272 260 242 240 bayt:
( İşleçleri 2 tasarruflu bayt ile sonuçlanan karşılaştırmalarda kullanma hilesi için Adnan'a teşekkürler *
! )
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)
Yeterince basit. urllib
Sorunun sitesine gitmek için Python'un yerleşik kütüphanesini kullanır ve ardından web sitesinden döndürülen kodu çözülmüş metindeki oylama sayısını, yanıt sayısını ve Python'a özgü yanıtların sayısını bulmak için düzenli ifadeler kullanır. Son olarak, bu değerler, bir truthy
değer döndürmek için gerekli koşullarla karşılaştırılır ve tüm koşulları sağlamaları durumunda, o True
zaman geri döndürülür. Aksi False
olduğunu.
Burada endişelendirebileceğim tek şey, normal ifadelerin baytları kurtarmak için pitona özel cevapların sayısı açısından çok fazla lee yolu vermesidir, bu nedenle zaman zaman biraz yanlış olabilir. bu zorluğun amaçları. Ancak, daha doğru bir tane istiyorsanız, aşağıdakinden daha uzun olmasına rağmen aşağıya bir tane ekledim. Aşağıda gösterilen, şu anda 298 byte'tır çünkü Python cevaplarını doğruluk uğruna benim orijinal işlevimden daha fazla saymak için ne kadar zaman keşfettiğimi bilemediğiniz daha uzun bir düzenli ifade kullanır. Bu, atılan tüm test vakalarının en az% 80 ila% 90'ı için çalışmalıdır.
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)
Ancak, birden fazla cevap sayfalı sorulara ne dersiniz? Yukarıdakilerden hiçbiri bu durumda çok iyi sonuç vermeyecektir, örneğin, 1 python cevabı ilk sayfada ve bir diğeri ise. Python cevapları için birden fazla cevap varsa, her cevap sayfasını kontrol eden fonksiyonumun (aşağıda gösterilen) başka bir versiyonunu oluşturarak bu sorunu çözme özgürlüğüne kavuştum. atmış. Daha fazla uzatmadan, işte yeni ve güncellenmiş işlev:
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))
Oldukça uzun değil mi? Bu konuda kod golf için pek bir şey yapmadım, ancak istersen biraz daha aşağıya golf oynayabilirim. Aksi takdirde, onu seviyorum ve daha mutlu olamazdı. Oh, ek bir bonus olarak neredeyse unutmuşum, bu ayrıca sorudaki Python cevaplarının toplam sayısını, soruya verilen toplam oy sayısını ve eğer soru id
1 sayfadan daha fazla olan bir soruya karşılık geliyorsa, sorudaki toplam cevap sayısını da verir. Cevapların Aksi halde, soru sadece tek bir cevap sayfasından ibaretse, sadece truthy/falsy
değeri verir. Gerçekten bu zorlukla başa çıkmaya başladım.
Bunların her biri, soruyu id
bir dize şeklinde alır .
Ben koyardı Try It Online!
her bir işlev için buraya bağlantıları, ama ne yazık ki, ne repl.it
de Ideone
Python'un yoluyla kaynakların getirilirken izin urllib
kütüphaneye.