Bir Mücadelenin Cevap Vermeye Değer Olduğunu Belirleme


21

Ben çok sıradan bir kod golfçüsüyüm ve StackOverflow üzerindeki "Sıcak Ağ Soruları" kenar çubuğunda görünene kadar yayınları göremiyorum. Genellikle oyuna geç kaldım ve bildiğim tek dil Python olduğu için, cevap verdiğim çok az nokta var çünkü zaten birçok Python cevabı var. Buradaki zorluk, bir sorunun cevap vermeye değip değmeyeceğini bulmak.

Giriş:

  • Kodunuz (fonksiyon veya program) bir giriş parametresi alacaktır i

Çıktı:

  • Soru kimliği için Truthy veya Falsey değeri i. Sorunun 5 cevabı, 3'ten fazla soru puanı ve Python'da bir veya daha az cevabı varsa, Truthy çıktı (sürüm arasında bir ayrım yoktur).

Kurallar / Açıklamalar:

  • Giriş formatı makul herhangi bir şey olabilir (stdin, dosya, komut satırı), ancak cevabınızda belirtilmelidir. Veri türleri ve ana / sondaki boşluk hiç önemli değil.
  • Soru kimliğinin geçerli olduğunu varsayalım codegolf.stackexchange.com.
  • Dile özgü soru gereksinimlerini yoksay. (örneğin, bir soru oyları ve cevapları karşılıyorsa ve yalnızca Java olduğundan Python yanıtı yoksa, yine de Truthy'de sonuçlanır).
  • "Python" (büyük / küçük harf kullanımı), gönderinin ilk satırından önce herhangi bir yerde gerçekleşirse, yanıt Python yanıtı olarak nitelendirilir.
  • Bu kod golf, bayt cinsinden en kısa kod kazanır.

Örnek Olaylar *

id = 79082 => True
id = 78591 => False (less than 5 answers, also hella hard)
id = 78410 => True
id = 76428 => False (greater than 1 Python answer)
id = 78298 => False (not high enough question score)

* Gönderim sırasında onaylandı, değişmiş olabilir


Ayrıca sadece Python'u tanıyorum ...
R. Kap

Ayrıca Python'u da tanıyorum.
user48538

Başka diller öğrenmeye başlamalıyım.
R. Kap,

5
@ R.Kap, bu meydan okuma başlamak için harika bir zaman olurdu!
wnnmaw

2
Bu zorluk görünüşte cevap vermeye değer.
Rɪᴋᴇʀ

Yanıtlar:


8

05AB1E , 167 160 159 158 156 154 143 bayt

Kahretsin, neredeyse normal bir dil olduğu sürece ...

Bok ... artık şu anda yenerek Yakut cevabını tarafından 1 byte.

Şimdi Ruby cevabından daha uzun, argh! .

Muhtemelen şu an yatmalıyım.

1 byte tasarruf için @ wnnmaw ve @R sayesinde teşekkürler. 2 bayt daha kaydettiğiniz için Kap!

Kod:

’£Ø ˆå§¾.‡¢ as g;#.¾¿„–(g.ˆåƒÛ('·Ç://ÐÏg.´¢/q/'+•œ_#()).‚Ø())’.e©’„à="Ž»"’DU¢®…ƒŠ‡¡`99£þs\®X¡¦vy’„à="‚¬-„¹"’¡¦'>¡¦¦¬l’±¸’¢s\}rUV)O2‹X5›Y3›)P

Veya daha fazla okunabilirlikle:

’£Ø ˆå§¾.‡¢ as g;#.¾¿„–(g.ˆåƒÛ('·Ç://ÐÏg.´¢/q/'+•œ_#()).‚Ø())’
 .e©
’„à="Ž»"’
 DU¢®
“ƒŠ‡“
 ¡`99£þs\®X¡¦
v
 y’„à="‚¬-„¹"’¡¦'>¡¦¦¬l’±¸’¢s\}rUV)O2‹X5›Y3›)P

Açıklama:

Her şeyden önce, iyi eski Python anlamına gelen çok sayıda metin sıkıştırılıyor. Sıkıştırılmamış versiyonu:

"import urllib.request as g
 f=g.urlopen('http://ppcg.lol/q/'+pop_#())
 #.append(f.read())"
.e©“class="answer"“¢®"useful and clear"¡`99£þs\®“class="answer"“¡¦vy“class="post-text"“¡¦'>¡¦¦¬l"python"¢s\}rUV)O2‹X5›Y3›)P

Bu kısım:

import urllib.request as g
stack.append(g.urlopen('http://ppcg.lol/q/'+pop_stack()).read())`

aslında bir yığın değeri çıkarır, url'ye kopyalar ve tüm HTML verilerini alır. HTML verisi kullanılarak yığının üstüne itilir #.append(f.read()).

Biz saymak cevapların sayısını tekrarlarını sayısı saymak suretiyle class="answer".

Oy sayısını saymak için, verileri yalnızca "kullanışlı ve temiz" olarak ayırdık ve [0:99]kullanmanın yalnızca rakamlarını koruyoruz ®"useful and clear"¡`99£þ. Bu, oyların sayısıdır.

Sonunda, metnin "Python"kapanış başlık metninden önce mevcut olup olmadığını her cevabı kontrol etmemiz gerekir . Tüm cevapları almak için, sadece verileri böldük class="post-text"ve her birini yeniden böldük <. Dilin görüntülendiği kısmı almak için ilk iki öğeyi kaldırdık ve küçük harf sürümünün bu dizgede olup olmadığını kontrol ettik.

Yani, şimdi kümemiz id = için şöyle gözüküyor 79273:

`[6, '14', 0, 0, 0, 1, 0, 0]`
  │    │   └───────┬──────┘
  │    │           │
  │    │   is python answer?
  │    │
  │    └── number of upvotes
  │
  └─── number of answers

Bu ayrıca -dtercümandaki ebug bayrağıyla da görülebilir .

Yani, sadece veri işleme meselesi:

rUV)O2‹X5›Y3›)P

r                # Reverse the stack
 U               # Pop the number of answers value and store into X
  V              # Pop the number of upvotes value and store into Y
   )O            # Wrap everything together and sum it all up
     2‹          # Check if smaller than 2
       X5›       # Push X and check if greater than 5
          Y3›    # Push Y and check if greater than 3
             )P  # Wrap everything into an array and take the product.
                   This results into 1 if and only if all values are 1 (and not 0).

CP-1252 kodlamasını kullanır . Tercümanı buradan indirebilirsiniz .


12
"Daha okunaklı" versiyonunu seviyorum; Bu ekstra satır sonları gerçekten bir fark yaratıyor! ;)
Wildcard

@Wildcard Gerçekten bir fark yaratıyorlar;)
Outgolfer Erik

ppcg.lol/q/idSıkıştırma kullanarak bayt kaydedebilir misiniz ?
wnnmaw

@wnnmaw Teşekkürler, şimdi Ruby cevabından sadece 1 bayt uzağım : p.
Adnan

1
Oh hayır! Tekrar ilerlemem gereken 7 byte'ı kurtarmak için yeterince köşeyi kesebileceğimi sanmıyorum ... Sanırım sadece ikinci sıraya yerleşmek zorundayım
Value Ink

5

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. urllibSorunun 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 truthydeğer döndürmek için gerekli koşullarla karşılaştırılır ve tüm koşulları sağlamaları durumunda, o Truezaman geri döndürülür. Aksi Falseolduğ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 id1 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/falsydeğeri verir. Gerçekten bu zorlukla başa çıkmaya başladım.

Bunların her biri, soruyu idbir 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.itde IdeonePython'un yoluyla kaynakların getirilirken izin urllibkütüphaneye.


http://codegolf.stackexchange.com/q/Soruyu almak için kullanabilirsiniz . Ayrıca, http://zorunlu mu?
Marv

İdeone ve repl.it, dış kaynakları bir URL alıp almaya izin vermez.
Mego,

@Mego Dang ... öyleyse, insanların kendi Python tercümanlarını kullanarak çalıştığını onaylamaları gerekecek.
R. Kap,

@Marv Evet, görünüşe göre öyle. Aksi takdirde unknown url typehata alıyorum.
R. Kap,

6
ppcg.lol/q/idayrıca çalışır
kaldırıldı

4

Julia, 275 bayt

using Requests
f(q,p=(s,t)->JSON.parse(readall(get("https://api.stackexchange.com/2.2/questions/$q$s",query=Dict(:site=>"codegolf",:filter=>"$t"))))["items"],x=p("","")[1])=x["answer_count"]>5&&x["score"]>3&&count(i->ismatch(r"python",i["body"]),p("/answers","!9YdnSMKKT"))<2

Bu bir tamsayıyı kabul eden ve bir boole döndüren bir işlevdir. Stack Exchange API'sine bağlanır ve fonksiyonun her çalışması 2 API isteği yapar, bu yüzden çok fazla çalıştırmayın, 300 istek / gün kotanızı tüketeceksiniz.

Ungolfed:

using Requests

function f(q)
    # Define a function that takes two strings and returns a Dict
    # that connects to the SE API
    p = (s,t) -> JSON.parse(readall(get("https://api.stackexchange.com/2.2/questions/$q$s",
        query = Dict(:site => "codegolf", :filter=> "$t"))))["items"]

    # Get the question object
    x = p("", "")[1]

    # Get all answers using the `withbody` API filter
    y = p("/answers", "!9YdnSMKKT")

    x["answer_count"] > 3 && x["score"] > 5 &&
        count(i -> ismatch(r"python", i["body"], y) < 2
end

"Withbody" API filtresinin farkında değildim! +1. Ruby cevabımda bayt kaydederse, bu numarayı da kullanabilir miyim?
Değerli Mürekkep

1
@ KevinLau-notKenny Elbette! Ne yapman gerekiyorsa golf adına yap. : P
Alex A.

= 3 intihal etmek istemedim ama ne yazık ki, ppcg.lolher şeyi kodlayıcıya kısa bir bağlantı olarak öğrendikten sonra , API sürümü yeterli değildi
Value Ink

4

Raket, 339 Bayt

(λ(q)((λ(h)((λ(g)((λ(j)(and(>(h j'score)3)(>(h j'answer_count)5)(<(for/sum([a(g"~a/answers"q)]#:when(regexp-match #rx"(?i:python)"(h a'body)))1)2)))(car(g"~a"q))))(λ(s d)(define-values(x y b)(http-sendrecv"api.stackexchange.com"(format"/2.2/questions/~a?site=codegolf&filter=withbody"(format s d))))(h(read-json b)'items))))hash-ref))

Hala golf için çok şey var.


1
Beni yen! : P
kedi

TODO: Raket benzeri bir golf oynamak mümkün kılar. :)
Winny

1
68'i parens olan 339 bayt ... yani golf için bir LISP'nin kısa tanımlayıcılara ihtiyacı var ve parensi olmaz. Çok LISPy :(
kedi

4

Ruby + HTTParty , 170 146 145 142 139 138 + 11 ( -rhttpartybayrak) = 181 157 156 153 150 149 bayt

Regex kalıplarımın kırılmasına neden olacak herhangi bir son durum olduğunu sanmıyorum, umarım ...

@WashingtonGuedes tarafından sağlanan kısa bağlantıya güncellendi ve //bunun yerine başlasam, HTTParty'nin şikayet etmediğini keşfetti http://.

Biraz daha güvenli regex'ler için güncellendi. Yine de baytları kurtardım, bu HTTParty yanıt nesnelerinin String'den miras aldığını keşfettim, yani regex'i .bodyeşleştirirken bile kullanmama gerek kalmadı !

@manatwork, bıraktığım kazara bir karakter eklemesi olduğuna dikkat çekti ve golf uğruna, işimdi bir Dize olarak kabul edilmesi gerektiğine dikkat çekti .

Güncelleme regexes. Aynı uzunluk. Bir pareni keserek -1 bayt.

->i{/"up.*?(\d+)/=~s=HTTParty.get("//ppcg.lol/q/"+i)
$1.to_i>3&&(a=s.scan /st.*xt".*\n(.*)/).size>5&&a[1..-1].count{|e|e[0]=~/python/i}<2}

Ekstra notlar:

  • Bir cevabın ilk satırı (belirtime göre dili içermesi gerekir) "post-text"eşleştiğimiz sınıflı HTML Etiketinden sonra iki satırdır st.*xt". Daha güvenli bir sürüm ondan sonra bir boşluk eklerdi, ancak bunu golf uğruna feda ediyoruz.
  • HTTParty, net/httpverilen URL için doğru yönlendirme işleminden dolayı yerel modüller üzerinde kullanılır .
  • "up*?\dOy sayısına karşılık gelen en kısa dizi oldu. Sadece birincisine ihtiyacımız var, bu yüzden neyse ki cevaplar bunu etkilemiyor.

3
ppcg.lol/q/#{i}ayrıca çalışır
kaldırıldı

@WashingtonGuedes ppcg.ga/q#{i}belki? (Ruby'yi tanımıyorum)
Outgolfer Erik'i

@ ΈρικΚωνσταντόπουλος ppcg.ga bir joker yönlendirici değildir, kendiniz deneyin - ppcg.ga/q/79273
Timtech

@Timtech Yani ppcg.lol/q#{i}uygulanabilir mi? ( a/#bile aynı a#b)
Outgolfer Erik

1
"Mahvediyor /"e-c.*?(\d+)/düzenli ifade. Bu arada, giriş hakkında gereklilik demek olduğunu “Veri türleri (...) önemli değildir.” Eğer birleştirme aracılığı ile ikame yerini böylece Böylece daha, dize olarak i parametresini geçmektedir: "//ppcg.lol/q/"+i.
Manatwork

3

Groovy, 179 161 157

{i->t=new URL("http://ppcg.lol/q/$i").text;a=0;p=0;(t=~/"(?i)p.{25}>\n.*python/).each{p++};(t=~/(?m)v.{13}t ">(\d+)/).each{if(it[1].toLong()>3)a++};a>5&&p<2}

Timtech sayesinde 17 karakter kaydedildi.

Anahtar sözcük def de gerekli değildir.


Codegolf.stackexchange.com adresini ppcg.lol ile değiştirebilirsiniz
Timtech

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.