Tentukan Jika Tantangan Layak Menjawab

21

Saya pegolf kode yang sangat kasual, dan tidak sering melihat posting sampai mereka muncul di sidebar "Pertanyaan Jaringan Panas" di StackOverflow. Biasanya, saya terlambat ke permainan, dan karena satu-satunya bahasa yang saya tahu adalah Python, ada sedikit gunanya saya menjawab karena sudah ada beberapa jawaban Python. Tantangan Anda adalah mencari tahu apakah sebuah pertanyaan pantas saya jawab.

Memasukkan:

  • Kode Anda (fungsi atau program) akan mengambil satu parameter input i

Keluaran:

  • Nilai Truthy atau Falsey untuk id pertanyaan i. Keluaran Kebenaran jika pertanyaan memiliki lebih dari 5 jawaban, lebih dari 3 skor pertanyaan, dan satu atau kurang jawaban dalam Python (tidak ada perbedaan antara versi).

Aturan / Klarifikasi:

  • Format input bisa masuk akal (stdin, file, command line), tetapi harus ditentukan dalam jawaban Anda. Tipe data dan spasi putih terkemuka / tertinggal tidak masalah.
  • Asumsikan id pertanyaan valid untuk codegolf.stackexchange.com.
  • Abaikan persyaratan pertanyaan khusus bahasa. (yaitu jika sebuah pertanyaan memenuhi suara dan jawaban, dan tidak memiliki jawaban Python karena hanya Java, itu masih menghasilkan Kebenaran).
  • Sebuah jawaban memenuhi syarat sebagai jawaban Python jika "python" (case insenstive) muncul di mana saja sebelum baris baru pertama dari posting.
  • Ini adalah kode golf, jadi kode terpendek dalam byte menang.

Contoh Kasus *

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)

* Diverifikasi pada saat posting, mungkin telah berubah

wnnmaw
sumber
Saya juga hanya tahu Python ...
R. Kap
Saya juga tahu Python, terutama.
user48538
Saya harus mulai belajar beberapa bahasa lain.
R. Kap
5
@ R.Kap, tantangan ini akan menjadi saat yang tepat untuk memulai!
wnnmaw
2
Tantangan ini layak untuk dijawab.
Rɪᴋᴇʀ

Jawaban:

8

05AB1E , 167 160 159 158 156 154 143 byte

Sial, hampir selama bahasa normal ...

Sial ... lebih lama mengalahkan jawaban Ruby dengan 1 byte.

Sekarang lebih lama dari jawaban Ruby, argh! .

Saya mungkin harus pergi tidur sekarang.

Terima kasih kepada @wnnmaw untuk menghemat 1 byte dan terima kasih kepada @R. Kap untuk menyimpan 2 byte lagi!

Kode:

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

Atau dengan lebih mudah dibaca:

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

Penjelasan:

Pertama-tama, banyak teks sedang dikompresi di sini, yang diterjemahkan menjadi Python tua yang bagus. Versi tidak terkompresi adalah:

"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

Bagian ini:

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

sebenarnya muncul nilai stack, menyalinnya ke url dan mengambil semua data HTML. Data HTML didorong di atas tumpukan menggunakan #.append(f.read()).

Kami menghitung jumlah jawaban , dengan menghitung jumlah kemunculan class="answer".

Untuk menghitung jumlah suara, kami hanya membagi data pada "berguna dan jelas" dan hanya menyimpan nilai digit [0:99]menggunakan ®"useful and clear"¡`99£þ. Ini adalah jumlah upvotes.

Akhirnya, kita perlu memeriksa setiap jawaban jika teks "Python"ada sebelum teks header penutup. Untuk mendapatkan semua jawaban, kami hanya membagi data class="post-text"dan membagi masing-masing lagi <. Kami menghapus dua elemen pertama untuk mendapatkan bagian di mana bahasa ditampilkan dan memeriksa apakah versi huruf kecil ada di string ini.

Jadi, sekarang tumpukan kita terlihat seperti ini untuk id = 79273:

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

Ini juga bisa dilihat dengan -dbendera ebug menyala di interpreter.

Jadi, itu hanya masalah pemrosesan data:

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).

Menggunakan pengodean CP-1252 . Anda dapat mengunduh juru bahasa di sini .

Adnan
sumber
12
Saya suka versi "lebih mudah dibaca"; jeda baris tambahan itu benar-benar membuat perbedaan! ;)
Wildcard
@Wildcard Mereka memang membuat perbedaan;)
Erik the Outgolfer
Bisakah Anda menyimpan byte dengan menggunakan ppcg.lol/q/idkompresi?
wnnmaw
@wnnmaw Terima kasih, sekarang saya hanya 1 byte jauhnya dari jawaban Ruby: p.
Adnan
1
Oh tidak! Saya tidak berpikir saya dapat memotong sudut yang cukup untuk menyelamatkan 7 byte yang saya butuhkan untuk maju lagi ... Saya rasa saya hanya harus puas dengan tempat kedua
Value Ink
5

Python 3.5, 280 272 260 242 240 byte:

( Terima kasih Adnan untuk trik menggunakan *operator dalam perbandingan yang menghasilkan 2 byte yang disimpan! )

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)

Cukup sederhana. Menggunakan urllibpustaka bawaan Python untuk pergi ke situs pertanyaan, dan kemudian menggunakan ekspresi reguler untuk menemukan jumlah suara, jumlah jawaban, dan jumlah jawaban khusus Python dalam teks yang diterjemahkan yang dikembalikan dari situs web. Akhirnya, nilai-nilai ini dibandingkan dengan kondisi yang diperlukan untuk mengembalikan truthynilai, dan jika mereka memenuhi semua kondisi, maka Truedikembalikan. Kalau Falsetidak demikian.

Satu-satunya hal yang saya khawatirkan di sini adalah bahwa ekspresi reguler memberikan banyak cara dalam hal jumlah jawaban spesifik python untuk menyimpan byte, sehingga mungkin sedikit tidak akurat pada waktu-waktu tertentu, meskipun mungkin cukup baik untuk tujuan dari tantangan ini. Namun, jika Anda ingin yang lebih akurat, saya telah menambahkan satu di bawah ini, meskipun lebih lama dari yang di atas. Yang ditunjukkan di bawah saat ini adalah 298 byte karena menggunakan ekspresi reguler yang jauh lebih lama - yang Anda tidak tahu berapa lama waktu yang saya butuhkan - untuk menghitung jawaban Python daripada fungsi asli saya demi akurasi. Yang ini harus bekerja untuk setidaknya 80% hingga 90% dari semua kasus uji yang dilemparkan padanya.

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)

Tetapi, bagaimana dengan pertanyaan-pertanyaan itu dengan beberapa halaman jawaban? Tak satu pun dari yang di atas akan berfungsi dengan baik dalam situasi itu, jika, katakanlah, 1 jawaban python ada di halaman pertama dan yang lain ada di yang kedua. Yah, saya mengambil kebebasan untuk memperbaiki masalah ini dengan membuat versi lain dari fungsi saya (diperlihatkan di bawah) yang memeriksa setiap halaman jawaban, jika ada banyak jawaban, untuk jawaban Python, dan itu telah dilakukan dengan cukup baik pada banyak kasus uji saya. telah melemparkannya. Nah, tanpa basa-basi lagi, inilah fungsi baru dan yang diperbarui:

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))

Cukup lama, bukan? Saya tidak terlalu suka golf code dengan ini, meskipun, jika Anda mau, saya bisa sedikit menurunkan golf. Kalau tidak, saya menyukainya, dan tidak bisa lebih bahagia. Oh, saya hampir lupa, sebagai bonus tambahan, ini juga menampilkan jumlah total jawaban Python pada pertanyaan, total suara pada pertanyaan, dan total jumlah jawaban pada pertanyaan jika pertanyaanid terkait dengan pertanyaan dengan lebih dari 1 halaman jawaban. Kalau tidak, jika pertanyaan hanya terdiri dari satu halaman jawaban, itu hanya menghasilkan truthy/falsynilai. Saya benar-benar agak terbawa dengan tantangan ini.

Masing-masing mengambil pertanyaan iddalam bentuk a string .

Saya akan meletakkan Try It Online!tautan di sini untuk setiap fungsi, tetapi sayangnya, tidak ada repl.itatau tidak Ideonemengizinkan pengambilan sumber daya melalui urllibperpustakaan Python .

R. Kap
sumber
Anda dapat menggunakan http://codegolf.stackexchange.com/q/untuk mengambil pertanyaan. Juga, apakah http://wajib?
Marv
Ideone dan repl.it tidak memungkinkan mengambil sumber daya eksternal ala urllib.
Mego
@Mego Dang ... kalau begitu, saya kira orang harus mengonfirmasi itu bekerja menggunakan interpreter Python mereka sendiri.
R. Kap
@ Marv Ya, rupanya begitu. Kalau tidak, saya mendapatkan unknown url typekesalahan.
R. Kap
6
ppcg.lol/q/idjuga berfungsi
dihapus
4

Julia, 275 byte

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

Ini adalah fungsi yang menerima integer dan mengembalikan boolean. Itu terhubung ke Stack Exchange API dan setiap kali menjalankan fungsi membuat 2 permintaan API, jadi jangan jalankan berkali-kali atau Anda akan menghabiskan kuota 300 permintaan / hari Anda.

Tidak Disatukan:

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
Alex A.
sumber
Saya tidak mengetahui filter API "withbody"! +1. Jika menghemat byte pada jawaban Ruby saya, dapatkah saya menggunakan trik itu juga?
Value Ink
1
@ KevinLau-notKenny Tentu saja! Lakukan apa yang harus Anda lakukan atas nama golf. : P
Alex A.
Saya tidak ingin menjiplak = 3 tetapi sayangnya, setelah belajar ppcg.lolsebagai tautan singkat ke semua hal codegolf, versi API tidak cukup
Value Ink
4

Racket, 339 Bytes

(λ(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))

Masih banyak golf.

Winny
sumber
1
Kalahkan aku! : P
cat
TODO: buat seperti raket yang bisa bermain golf. :)
Winny
1
339 byte yang 68 adalah parens ... jadi LISP untuk golf akan membutuhkan pengidentifikasi pendek dan tidak ada parens. Tidak terlalu LISPy :(
cat
4

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

Saya tidak berpikir ada kasus tepi yang akan menyebabkan pola regex saya rusak, saya harap ...

Diperbarui ke shortlink disediakan oleh @WashingtonGuedes dan menemukan bahwa HTTParty tidak mengeluh jika saya mulai dengan //bukan http://.

Diperbarui untuk regex yang sedikit lebih aman. Saya menyimpan byte dengan cara menemukan bahwa objek respons HTTParty mewarisi dari String, yang berarti saya bahkan tidak perlu menggunakan .bodyketika mencocokkan regex!

@manatwork menunjukkan penambahan karakter yang tidak disengaja yang telah saya tinggalkan, dan demi golf, i harus diterima sebagai String sekarang.

Regex yang diperbarui. Sama panjang. -1 byte dengan memotong paren.

->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}

Catatan tambahan:

  • Baris pertama dari sebuah jawaban (yang harus mengandung bahasa sesuai dengan spesifikasi) adalah dua baris setelah tag HTML dengan kelas "post-text", yang kami cocokkan dengan st.*xt". Versi yang lebih aman akan menambah ruang setelahnya, tapi kami mengorbankan itu demi golf.
  • HTTParty digunakan di atas net/httpmodul asli karena penanganan pengalihan yang tepat untuk URL yang diberikan.
  • "up*?\dadalah urutan terpendek yang saya temukan yang sesuai dengan jumlah suara. Kami hanya membutuhkan yang pertama, jadi untungnya jawaban tidak memengaruhi ini.
Nilai Tinta
sumber
3
ppcg.lol/q/#{i}juga berfungsi
dihapus
@WashingtonGuedes ppcg.ga/q#{i}mungkin? (Saya tidak tahu Ruby)
Erik the Outgolfer
@ ΈρικΚωνσταντόπουλος ppcg.ga bukan pengalihan wildcard, coba sendiri - ppcg.ga/q/79273
Timtech
@Timtech Jadi, ppcg.lol/q#{i}apakah menurut saya berlaku? ( a/#bSama seperti a#b)
Erik the Outgolfer
1
Ini "merusak /"e-c.*?(\d+)/ekspresi reguler. By the way, kebutuhan katakanlah tentang input bahwa “jenis data (...) tidak masalah.” Jadi lebih baik lulus parameter i sebagai string, sehingga Anda dapat mengganti substitusi dengan Rangkaian: "//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}

Terima kasih kepada Timtech 17 karakter yang disimpan.

Def kata kunci juga tidak perlu.

Krzysztof Atłasik
sumber
Anda dapat mengganti codegolf.stackexchange.com dengan ppcg.lol
Timtech