ตรวจสอบว่าการท้าทายนั้นมีค่าตอบรับ


21

ฉันเป็นมากนักกอล์ฟรหัสสบาย ๆ และมักจะไม่เห็นโพสต์จนกว่าพวกเขาจะแสดงใน "คำถามเครือข่ายร้อน" sidebar มากกว่าใน StackOverflow โดยปกติฉันมาช้าไปกับเกมและเนื่องจากภาษาเดียวที่ฉันรู้คือ Python มีจุดเล็กน้อยที่ฉันตอบเพราะมีคำตอบของ Python อยู่แล้ว ความท้าทายของคุณคือการคิดออกว่าคำถามนั้นคุ้มค่ากับฉันหรือไม่

การป้อนข้อมูล:

  • รหัสของคุณ (ฟังก์ชั่นหรือโปรแกรม) จะใช้พารามิเตอร์อินพุตหนึ่งรายการ i

เอาท์พุท:

  • Truthy หรือ Falsey ค่าสำหรับ iID เอาท์พุทจริงถ้าคำถามมีมากกว่า 5 คำตอบมากกว่า 3 คะแนนคำถามและหนึ่งหรือน้อยกว่าคำตอบในงูหลาม (ไม่มีความแตกต่างระหว่างรุ่น)

กฎ / ชี้แจง:

  • รูปแบบการป้อนข้อมูลอาจเป็นสิ่งที่สมเหตุสมผล (stdin, file, command line) แต่ควรระบุไว้ในคำตอบของคุณ ชนิดข้อมูลและช่องว่างนำหน้า / ต่อท้ายนั้นไม่สำคัญ
  • codegolf.stackexchange.comสมมติรหัสคำถามที่ถูกต้องสำหรับ
  • ไม่สนใจข้อกำหนดคำถามเฉพาะภาษา (เช่นถ้าคำถามตรงกับคะแนนโหวตและคำตอบและไม่มีคำตอบ Python เพราะเป็น Java เท่านั้นมันยังคงส่งผลให้เกิดความจริง)
  • คำตอบนั้นถือว่าเป็นคำตอบของ Python หาก "python" (case insenstive) เกิดขึ้นที่ใดก็ได้ก่อนที่จะขึ้นบรรทัดใหม่ครั้งแรกของการโพสต์
  • นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีตัวอย่าง *

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)

* ตรวจสอบแล้ว ณ เวลาที่ทำการโพสต์อาจมีการเปลี่ยนแปลง


ฉันรู้เพียง Python เท่านั้น ...
R. Kap

ฉันก็รู้จัก Python เป็นส่วนใหญ่
user48538

ฉันต้องเริ่มเรียนรู้ภาษาอื่นบ้าง
R. Kap

5
@ R.Kap ความท้าทายนี้จะเป็นช่วงเวลาที่ดีในการเริ่มต้น!
wnnmaw

2
ความท้าทายนี้มีค่าตอบรับที่เห็นได้ชัด
Rɪᴋᴇʀ

คำตอบ:


8

05AB1E , 167 160 159 158 156 154 143 ไบต์

ประณามเกือบตราบเท่าที่ภาษาปกติ ...

อึ ... อีกต่อไป ขณะเต้นที่คำตอบทับทิมโดย1ไบต์

ตอนนี้นานกว่าคำตอบทับทิมใช่มั้ย! .

ตอนนี้ฉันน่าจะเข้านอน

ขอบคุณ @wnnmaw สำหรับการบันทึก 1 ไบต์และต้องขอบคุณ @R Kap สำหรับบันทึกอีก 2 ไบต์!

รหัส:

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

หรือด้วยการอ่านเพิ่มเติมได้:

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

คำอธิบาย:

ก่อนอื่นเลยมีการบีบอัดข้อความจำนวนมากที่นี่ซึ่งแปลว่า Python แบบเก่าที่ดี เวอร์ชันที่ไม่บีบอัดคือ:

"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

ส่วนนี้:

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

จริงจะปรากฏค่าสแต็กคัดลอกลงใน url และดึงข้อมูล HTML ทั้งหมด ข้อมูล HTML #.append(f.read())จะผลักดันให้อยู่ด้านบนของสแต็คโดยใช้

เรานับจำนวนคำตอบclass="answer"โดยการนับจำนวนของการปรากฏของ

ในการนับจำนวนคะแนนเราเพิ่งแยกข้อมูลที่ "มีประโยชน์และชัดเจน" และเก็บค่าหลักของการ[0:99]ใช้®"useful and clear"¡`99£þเท่านั้น นี่คือจำนวน upvotes

ในที่สุดเราจำเป็นต้องตรวจสอบทุกคำตอบหากมีข้อความ"Python"อยู่ก่อนข้อความส่วนหัวปิด เพื่อให้ได้คำตอบทั้งหมดเราก็แยกข้อมูลบนและแยกแต่ละของพวกเขาอีกครั้งในclass="post-text" <เราลบสององค์ประกอบแรกเพื่อรับส่วนที่แสดงภาษาและตรวจสอบว่ารุ่นตัวพิมพ์เล็กอยู่ในสตริงนี้หรือไม่

ดังนั้นตอนนี้สแต็กของเราจะเป็นแบบนี้สำหรับ id = 79273:

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

สิ่งนี้สามารถเห็นได้ด้วยการ-dตั้งค่าสถานะ ebug ในล่าม

ดังนั้นมันเป็นเพียงเรื่องของการประมวลผลข้อมูล:

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 คุณสามารถดาวน์โหลดล่ามที่นี่


12
ฉันชอบเวอร์ชั่น "อ่านง่ายกว่า"; การแบ่งบรรทัดพิเศษเหล่านั้นสร้างความแตกต่างอย่างแท้จริง! ;)
ไวด์การ์ด

@ Wildcard พวกเขาสร้างความแตกต่างได้แน่นอน;)
Erik the Outgolfer

คุณสามารถบันทึกไบต์โดยใช้การppcg.lol/q/idบีบอัดได้หรือไม่
wnnmaw

@wnnmaw ขอบคุณตอนนี้ฉันแค่1ไบต์จากคำตอบ Ruby: p
Adnan

1
ไม่นะ! ฉันไม่คิดว่าฉันสามารถตัดมุมได้มากพอที่จะช่วยรักษา 7 ไบต์ฉันต้องเดินหน้าอีกครั้ง ... ฉันเดาว่าฉันต้องตั้งที่สองแล้ว
Value Ink

5

Python 3.5, 280 272 260 242 240 ไบต์:

( ขอบคุณAdnanสำหรับเคล็ดลับเกี่ยวกับการใช้ตัว*ดำเนินการในการเปรียบเทียบทำให้มีการบันทึก 2 ไบต์! )

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)

เรียบง่ายพอสมควร ใช้urllibห้องสมุดPython ในตัวเพื่อไปที่ไซต์ของคำถามจากนั้นใช้นิพจน์ทั่วไปเพื่อค้นหาการนับคะแนนการนับคำตอบและการนับคำตอบเฉพาะของ Python ในข้อความถอดรหัสที่ส่งคืนจากเว็บไซต์ ในที่สุดค่าเหล่านี้จะถูกเปรียบเทียบกับเงื่อนไขที่จำเป็นในการส่งคืนtruthyค่าและหากตรงตามเงื่อนไขทั้งหมดก็Trueจะถูกส่งกลับ มิฉะนั้นFalseจะเป็น

สิ่งเดียวที่ฉันอาจเป็นห่วงเกี่ยวกับที่นี่คือการแสดงออกปกติให้จำนวนมากทางในแง่ของจำนวนคำตอบเฉพาะงูหลามเพื่อบันทึกไบต์ดังนั้นมันอาจจะไม่ถูกต้องเล็กน้อยในบางครั้งแม้ว่ามันอาจจะดีพอสำหรับ วัตถุประสงค์ของการท้าทายนี้ อย่างไรก็ตามหากคุณต้องการรูปแบบที่แม่นยำยิ่งขึ้นฉันได้เพิ่มรูปด้านล่างแม้ว่าจะยาวกว่ารูปด้านบน อันที่แสดงด้านล่างปัจจุบันมี 298 ไบต์เนื่องจากมันใช้นิพจน์ปกติที่ยาวกว่ามากซึ่งคุณไม่รู้ว่าใช้เวลานานแค่ไหนในการค้นหา - สำหรับการนับคำตอบของ Python มากกว่าฟังก์ชั่นดั้งเดิมของฉันเพื่อความถูกต้อง สิ่งนี้ควรใช้งานได้อย่างน้อย 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 และทำได้ดีมากในกรณีทดสอบหลายข้อที่ฉัน โยนมันทิ้งไป ฟังก์ชั่นใหม่และปรับปรุงแล้ว: ไม่มี ado

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 หน้า ของคำตอบ มิฉะนั้นหากคำถามประกอบด้วยเพียงหน้าเดียวของคำตอบก็จะส่งออกtruthy/falsyค่า ฉันทำไปกับความท้าทายนี้เล็กน้อย

เหล่านี้ในแต่ละใช้คำถามของidในรูปแบบของสตริง

ผมจะวางTry It Online!การเชื่อมโยงที่นี่สำหรับแต่ละฟังก์ชั่น แต่น่าเสียดายค่าrepl.itมิได้Ideoneอนุญาตให้มีการดึงข้อมูลของทรัพยากรทาง ธurllibห้องสมุด


คุณสามารถใช้http://codegolf.stackexchange.com/q/เพื่อดึงคำถาม นอกจากนี้ยังมีhttp://ผลบังคับใช้?
Marv

Ideone และ repl.it ไม่อนุญาตให้ดึงข้อมูลจากแหล่งภายนอก
Mego

@Mego Dang ... ถ้าอย่างนั้นฉันคิดว่าผู้คนจะต้องยืนยันว่ามันใช้งานได้กับล่าม Python ของพวกเขาเอง
R. Kap

@ Marv ใช่เห็นได้ชัดว่ามันเป็น มิฉะนั้นฉันได้รับunknown url typeข้อผิดพลาด
R. Kap

6
ppcg.lol/q/idใช้งานได้
นำออก

4

จูเลีย, 275 ไบต์

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

นี่คือฟังก์ชั่นที่รับจำนวนเต็มและส่งคืนบูลีน มันเชื่อมต่อกับ Stack Exchange API และการทำงานแต่ละครั้งทำให้คำขอ 2 API ดังนั้นอย่ารันหลายครั้งเกินไปหรือคุณจะหมดโควต้า 300 คำขอ / วัน

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

ฉันไม่รู้ตัวกรอง API "withbody"! +1 หากบันทึกจำนวนไบต์บนคำตอบ Ruby ของฉันฉันสามารถใช้เคล็ดลับนั้นได้หรือไม่
มูลค่าหมึก

1
@ KevinLau-notKenny แน่นอน! ทำในสิ่งที่คุณต้องทำในชื่อของกอล์ฟ : P
Alex A.

ฉันไม่ต้องการที่จะขโมยความคิด = 3 แต่อนิจจาหลังจากเรียนรู้ppcg.lolว่าเป็นการเชื่อมโยงสั้น ๆ กับทุกสิ่ง codegolf รุ่น API ก็ไม่เพียงพอ
Value Ink

4

แร็กเก็ต, 339 ไบต์

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

ยังมีสนามกอล์ฟอีกมาก


1
เอาชนะฉันไป! : P
cat

สิ่งที่ต้องทำ: สร้างแร็กเก็ตเหมือนกอล์ฟที่สามารถ :)
Winny

1
339 bytes ซึ่ง 68 เป็น parens ... ดังนั้น LISP สำหรับการเล่นกอล์ฟจะต้องใช้ตัวระบุแบบสั้นและไม่มี parens LISPy ไม่มาก :(
cat

4

Ruby + HTTParty , 170 146 145 142 139 138 + 11 ( -rhttpartyแฟล็ก) = 181 157 156 153 150 149 ไบต์

ฉันไม่คิดว่ามีกรณีขอบใด ๆ ที่จะทำให้รูปแบบ regex ของฉันแตกฉันหวังว่า ...

การปรับปรุงเพื่อ shortlink ที่มีให้โดย @WashingtonGuedes และการค้นพบว่า HTTParty ไม่บ่นถ้าฉันเริ่มต้นด้วยแทน//http://

อัปเดตสำหรับ regexes ที่ปลอดภัยกว่าเล็กน้อย ฉันบันทึกไบต์แล้วโดยค้นพบว่าวัตถุตอบสนอง HTTParty สืบทอดมาจาก String ซึ่งหมายความว่าฉันไม่จำเป็นต้องใช้.bodyเมื่อจับคู่ regex!

@ manatwork ชี้ให้เห็นถึงการเพิ่มตัวละครโดยไม่ได้ตั้งใจซึ่งฉันได้ทิ้งไว้และเพื่อประโยชน์ของกอล์ฟฉันiต้องยอมรับในฐานะ String ในตอนนี้

อัปเดต regexes ความยาวเท่ากัน -1 ไบต์โดยตัด 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}

หมายเหตุเพิ่มเติม:

  • บรรทัดแรกของคำตอบ (ซึ่งควรมีภาษาให้เป็นไปตามสเปค) เป็นสองเส้นหลังแท็ก HTML ที่มีระดับซึ่งเราจับคู่กับ"post-text" st.*xt"รุ่นที่ปลอดภัยกว่านั้นจะเพิ่มช่องว่างหลังจากนั้น แต่เรากำลังเสียสละเพื่อการตีกอล์ฟ
  • HTTParty ถูกใช้ผ่านnet/httpโมดูลเนทิฟเนื่องจากการจัดการการเปลี่ยนเส้นทางที่เหมาะสมสำหรับ URL ที่กำหนด
  • "up*?\dเป็นลำดับที่สั้นที่สุดที่ฉันพบว่าสอดคล้องกับจำนวนคะแนน เราต้องการเพียงคนแรกเท่านั้นดังนั้นคำตอบที่ดีนั้นจะไม่ส่งผลกระทบต่อเรื่องนี้

3
ppcg.lol/q/#{i}ใช้งานได้
นำออก

@WashingtonGuedes ppcg.ga/q#{i}อาจจะ? (ฉันไม่รู้ทับทิม)
Erik the Outgolfer

@ ΈρικΚωνσταντόπουλος ppcg.ga ไม่ใช่การเปลี่ยนเส้นทางลองใช้ด้วยตัวคุณเอง - ppcg.ga/q/79273
Timtech

@Timtech ดังนั้นppcg.lol/q#{i}ฉันคิดว่าเป็นประโยชน์? ( a/#bเหมือนกับa#b)
Erik the Outgolfer

1
"ถูกทำลาย/"e-c.*?(\d+)/แสดงออกปกติ โดยวิธีการที่ต้องการพูดเกี่ยวกับการป้อนข้อมูลที่ว่า“ชนิดข้อมูล ( ... ) ไม่ได้เรื่อง.” "//ppcg.lol/q/"+iเพื่อให้ดีขึ้นผ่านพารามิเตอร์ฉันเป็นสตริงเพื่อให้คุณสามารถเปลี่ยนทดแทนด้วยการเรียงต่อกัน:
จัดการ

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 17 chars ที่บันทึกไว้

การกำหนดคำหลักนั้นไม่จำเป็นเช่นกัน


คุณสามารถแทนที่ codegolf.stackexchange.com ด้วย ppcg.lol
Timtech

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.