Apakah saya dikalahkan oleh Dennis?

15

Menurut legenda , hampir semua orang dikalahkan oleh Dennis . Jika tidak, mereka akan melakukannya.

Sekarang saya ingin tahu apakah saya salah satu dari 'hampir semua orang' itu.

Anda akan diberikan tautan ke jawaban dalam format /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID] .

Temukan panjang kode, yang akan kita anggap sebagai terakhir pada baris pertama (bijaksana penurunan harga) dari jawaban di tautan.

Kemudian, cari jawaban Dennis, dan lakukan hal yang sama.

Sekarang, bandingkan panjang kode jawaban input dan Dennis, dan jika tidak di-golf (artinya satu atau lebih jawaban Dennis 'lebih pendek dari pada jawaban input), keluarkan nilai yang benar, dan jika tidak, nilai yang salah.

Jika tidak ada jawaban yang dimiliki oleh Dennis pada pertanyaan yang sama dengan jawabannya, berikan nilai yang salah.

Contohnya

  • Tautan :true
  • Tautan : false(Setidaknya untuk sekarang, beri tahu saya ketika itu berubah)

Aturan

  • Anda dapat menggunakan segala bentuk nilai kebenaran / kepalsuan.
  • Pertanyaan tentang jawaban yang Anda berikan akan selalu berupa .
  • Pertanyaannya mungkin tidak memiliki jawaban Dennis, tetapi jawaban yang dimasukkan tidak akan pernah menjadi milik Dennis.

  • Anda mungkin menganggap selalu ada nomor di baris pertama jawabannya.

Matthew Roh
sumber
3
Bisakah kita berasumsi akan selalu ada jawaban oleh Dennis pada pertanyaan yang diberikan, dan bahwa jawaban yang diberikan tidak akan menjadi jawaban Dennis?
Skidsdev
@Mayube Tidak, dan ya.
Matius Roh
Apakah kita perlu menangani paging atau dapatkah kita berasumsi kedua jawaban akan berada di halaman yang sama jika ada beberapa halaman jawaban?
Shaggy
@Shaggy mantan.
Matthew Roh
@SIGSEGV Jika tidak ada jawaban oleh Dennis apakah kami menampilkan salah karena Dennis belum mengungguli jawabannya?
Skidsdev

Jawaban:

1

Python 3.6 + permintaan + bs4 - 363 358 byte

import bs4,re,requests
u,n=input().split("/#");i=1;d=y=float("inf")
while i:
 A=bs4.BeautifulSoup(requests.get(u+f"?page={i}").text,"html.parser")(class_="answer")
 for a in A:
  c=int(re.findall("\d+",(a("h1")+a("h2")+a("p"))[0].text)[-1])
  if "Dennis"in a(class_="user-details")[-1].text:d=min(c,d)
  if a["data-answerid"]==n:y=c
 i=A and i+1;
print(d<y)

Cetakan Trueatau False.

Catatan: saat ini tidak berfungsi pada tautan kedua karena HTML tidak valid yang dihasilkan oleh jawaban ini ( tag emdan strongdiakhiri dengan urutan yang salah di akhir baris kedua, dan menyebabkan pengurai melewatkan blok nama pengguna). Cobalah tautan ini sebagai gantinya.

Menggunakan API - 401 380 byte

import requests,re
q,A=re.findall("\d+",input());i=1;d=y=float("inf")
while i:
 r=requests.get(f"https://api.stackexchange.com/2.2/questions/{q}/answers?site=codegolf&filter=withbody&page={i}").json();i=r["has_more"]and i+1
 for a in r["items"]:
  c=int(re.search("(\d+)\D+$",a["body"]).group(1))
  if a["owner"]["user_id"]==12012:d=min(d,c)
  if a["answer_id"]==A:y=c
print(d<y)

Perhatikan bahwa ini juga gagal pada tautan kedua, tetapi karena satu jawaban dimulai dengan This may be foul play. alih alih tajuk ...

matsjoyce
sumber
Pertimbangkan untuk menggunakan Stack Exchange API untuk mendapatkan data jawaban sebagai gantinya melalui JSON parser , pastikan saja filter=withbodyada dalam permintaan GET Anda untuk mendapatkan badan jawaban untuk mengambil hitungan byte
Value Ink
Dengan versi API, Anda menggunakan adua kali (sekali untuk mengatur ID jawaban, dan lain ketika iterasi r["items"], yang akan menyebabkan perilaku yang tidak benar. Juga, Anda tidak perlu mengatur pagesize(akan default untuk 30). c=int(re.search(r'(\d+) bytes').group(1))Harus memberikan pengambilan bytecount yang lebih akurat dan lebih pendek, dan jika masih gagal, (\d+)\s*byteslakukan trik tetapi sedikit lebih lama. Akhirnya, i=r["has_more"]and i+1lebih pendek daripada persyaratan ternary Anda.
Value Ink
Sebenarnya, lupakan pertandingan regex. Saya lupa akun karena menambahkan badan jawaban dalam panggilan fungsi sehingga bagian itu lebih panjang. Namun, saran lain masih valid.
Value Ink
@ ValueInk Terima kasih, sedikit lebih pendek sekarang. Terlihat seperti kita membutuhkan bahasa golf hanya untuk API, panggilan nya adalah sooo panjang ...
matsjoyce
Mungkin. Tapi jujur ​​ada juga fakta bahwa Anda memiliki parser HTML yang bagus, ditambah fakta bahwa Anda diberi URL pertanyaan secara default. Jika inputnya adalah dua angka saja, akan ada sedikit overhead untuk mendapatkan halaman untuk pertanyaan codegolf juga.
Value Ink
1

Ruby, 314 315 308 + 20 = 334 335 328 byte

Menggunakan bendera -n -rjson -ropen-uri. +1 byte dari memperbaiki bug minor.

-7 byte dengan menemukan open-uripustaka default Ruby.

~/(\d+)\D+(\d+)/
u="http://api.stackexchange.com/2.2/questions/#$1/answers?site=codegolf&filter=withbody&page=%s"
n=eval$2
a="answer_id"
j=1
o=[]
(o+=r=JSON.parse(open(u%j).read)["items"]
j=r!=[]&&j+1)while j
p o.select{|e|e["owner"]["user_id"]==12012||e[a]==n}.min_by{|e|e["body"][/\d+\s*bytes/].to_i}[a]!=n
Nilai Tinta
sumber