Xác định xem một thử thách có đáng để trả lời không


21

Tôi là một người chơi mã rất bình thường và không thường thấy các bài đăng cho đến khi chúng xuất hiện trong thanh bên "Câu hỏi về mạng nóng" trên StackOverflow. Thông thường, tôi đến trễ trò chơi và vì ngôn ngữ duy nhất tôi biết là Python, nên có rất ít điểm trong tôi trả lời vì đã có một số câu trả lời Python. Thử thách của bạn là tìm hiểu xem một câu hỏi có đáng để tôi trả lời không.

Đầu vào:

  • Mã của bạn (chức năng hoặc chương trình) sẽ lấy một tham số đầu vào i

Đầu ra:

  • Giá trị thật hoặc Falsey cho id câu hỏi i. Đầu ra Sự thật nếu câu hỏi có nhiều hơn 5 câu trả lời, lớn hơn 3 điểm câu hỏi và một hoặc ít hơn câu trả lời trong Python (không phân biệt giữa các phiên bản).

Quy tắc / Làm rõ:

  • Định dạng đầu vào có thể là bất cứ điều gì hợp lý (stdin, tệp, dòng lệnh), nhưng nên được chỉ định trong câu trả lời của bạn. Các kiểu dữ liệu và khoảng trắng hàng đầu / dấu không quan trọng.
  • Giả sử id câu hỏi là hợp lệ cho codegolf.stackexchange.com.
  • Bỏ qua các yêu cầu câu hỏi cụ thể về ngôn ngữ. (tức là nếu một câu hỏi đáp ứng phiếu bầu và câu trả lời và không có câu trả lời Python vì đó chỉ là Java, thì nó vẫn dẫn đến Sự thật).
  • Một câu trả lời đủ điều kiện là một câu trả lời Python nếu "python" (trường hợp không xác định) xảy ra ở bất cứ đâu trước dòng mới đầu tiên của bài viết.
  • Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng.

Các trường hợp mẫu *

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)

* Xác minh tại thời điểm đăng, có thể đã thay đổi


Tôi cũng chỉ biết Python ...
R. Kap

Tôi cũng biết Python, chủ yếu.
dùng48538

Tôi đã bắt đầu học một số ngôn ngữ khác.
R. Kap

5
@ R.Kap, thử thách này sẽ là thời điểm tuyệt vời để bắt đầu!
wnnmaw

2
Thách thức này là giá trị trả lời rõ ràng.
Rɪᴋᴇʀ

Câu trả lời:


8

05AB1E , 167 160 159 158 156 154 143 byte

Chết tiệt, gần như là một ngôn ngữ bình thường ...

Tào lao ... còn hiện đánh bại các câu trả lời của Ruby bởi 1 byte.

Bây giờ dài hơn câu trả lời của Ruby, argh! .

Tôi có lẽ nên đi ngủ ngay bây giờ.

Cảm ơn @wnnmaw vì đã tiết kiệm 1 byte và cảm ơn @R. Kap để lưu thêm 2 byte!

Mã số:

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

Hoặc với khả năng dễ đọc hơn:

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

Giải trình:

Trước hết, rất nhiều văn bản đang được nén ở đây, nó chuyển thành Python cũ tốt. Phiên bản không nén là:

"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

Phần này:

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

thực sự bật một giá trị ngăn xếp, sao chép nó vào url và tìm nạp tất cả dữ liệu HTML. Dữ liệu HTML được đẩy lên trên cùng của ngăn xếp bằng cách sử dụng #.append(f.read()).

Chúng tôi đếm số lượng câu trả lời , bằng cách đếm số lần xuất hiện của class="answer".

Để đếm số phiếu bầu, chúng tôi chỉ cần chia dữ liệu ở mức "hữu ích và rõ ràng" và chỉ giữ lại các giá trị chữ số [0:99]sử dụng ®"useful and clear"¡`99£þ. Đây là số lượng upvote.

Cuối cùng, chúng ta cần kiểm tra mọi câu trả lời nếu văn bản "Python"tồn tại trước văn bản tiêu đề đóng. Để có được tất cả các câu trả lời, chúng tôi chỉ cần phân tách dữ liệu trên class="post-text"và phân tách từng dữ liệu một lần nữa <. Chúng tôi xóa hai phần tử đầu tiên để lấy phần ngôn ngữ được hiển thị và kiểm tra xem phiên bản chữ thường có trong chuỗi này không.

Vì vậy, bây giờ ngăn xếp của chúng tôi trông như thế này cho id = 79273:

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

Điều này cũng có thể được nhìn thấy với -dcờ ebug trên trong trình thông dịch.

Vì vậy, đó chỉ là vấn đề xử lý dữ liệu:

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

Sử dụng mã hóa CP-1252 . Bạn có thể tải về thông dịch viên ở đây .


12
Tôi thích phiên bản "dễ đọc hơn"; những ngắt dòng thêm thực sự làm cho một sự khác biệt! ;)
tự đại diện

@Wildcard Họ thực sự tạo ra sự khác biệt;)
Erik the Outgolfer

Bạn có thể lưu byte bằng cách sử dụng ppcg.lol/q/idnén?
wnnmaw

@wnnmaw Cảm ơn, bây giờ tôi chỉ còn 1 byte nữa từ câu trả lời của Ruby: p.
Ad Nam

1
Ồ không! Tôi không nghĩ rằng tôi có thể cắt đủ các góc để tiết kiệm 7 byte mà tôi cần để tiếp tục trở lại ... Tôi đoán tôi chỉ phải giải quyết cho vị trí thứ hai
Value Ink

5

Python 3.5, 280 272 260 242 240 byte:

( Cảm ơn Adnan về thủ thuật sử dụng *toán tử so sánh dẫn đến 2 byte được lưu! )

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)

Đủ đơn giản. Sử dụng urllibthư viện tích hợp của Python để đi đến trang web của câu hỏi và sau đó sử dụng các biểu thức thông thường để tìm số phiếu, số câu trả lời và số câu trả lời cụ thể của Python trong văn bản được giải mã được trả về từ trang web. Cuối cùng, các giá trị này được so sánh với các điều kiện cần thiết để trả về một truthygiá trị và nếu chúng thỏa mãn tất cả các điều kiện, thì Trueđược trả về. Nếu không thì Falselà.

Điều duy nhất tôi có thể lo lắng ở đây là các biểu thức chính quy đưa ra rất nhiều cách về số lượng câu trả lời cụ thể của python để lưu byte, vì vậy đôi khi nó có thể không chính xác, mặc dù nó có thể đủ tốt cho mục đích của thử thách này. Tuy nhiên, nếu bạn muốn một cái chính xác hơn nhiều, tôi đã thêm một cái bên dưới, mặc dù nó dài hơn cái bên trên. Cái được hiển thị dưới đây hiện là 298 byte vì nó sử dụng một biểu thức chính quy dài hơn nhiều mà bạn không thể biết tôi đã mất bao lâu để khám phá ra câu trả lời của Python so với chức năng ban đầu của tôi vì tính chính xác. Cái này sẽ hoạt động trong khoảng ít nhất 80% đến 90% của tất cả các trường hợp thử nghiệm được ném vào nó.

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)

Nhưng, những câu hỏi với nhiều trang câu trả lời thì sao? Cả hai điều trên sẽ không hoạt động tốt trong tình huống đó, nếu, giả sử, 1 câu trả lời trăn nằm ở trang đầu tiên và một câu trả lời khác ở trang thứ hai. Chà, tôi đã tự do khắc phục vấn đề này bằng cách tạo một phiên bản khác của hàm (hiển thị bên dưới) để kiểm tra mọi trang câu trả lời, nếu có nhiều câu trả lời, cho câu trả lời của Python và nó đã thực hiện khá tốt trên nhiều trường hợp kiểm tra tôi đã ném vào nó. Vâng, không có gì khó chịu, đây là chức năng mới và được cập nhật:

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

Khá lâu phải không? Tôi thực sự không thích chơi golf với điều này, mặc dù, nếu bạn muốn, tôi có thể chơi golf thêm một chút nữa. Mặt khác, tôi yêu nó, và không thể hạnh phúc hơn. Ồ, tôi gần như quên mất, như một phần thưởng bổ sung, điều này cũng cho ra tổng số câu trả lời của Python cho câu hỏi, tổng số phiếu cho câu hỏi và tổng số câu trả lời cho câu hỏi nếu câu hỏi idtương ứng với một câu hỏi có nhiều hơn 1 trang câu trả lời. Mặt khác, nếu câu hỏi chỉ bao gồm một trang câu trả lời, nó chỉ xuất ra truthy/falsygiá trị. Tôi thực sự đã có một chút mang đi với thách thức này.

Những câu hỏi này lấy câu hỏi iddưới dạng một chuỗi .

Tôi sẽ đặt Try It Online!các liên kết ở đây cho mỗi chức năng, nhưng thật không may, repl.itcũng không Ideonecho phép tìm nạp tài nguyên qua urllibthư viện của Python .


Bạn có thể sử dụng http://codegolf.stackexchange.com/q/để lấy câu hỏi. Ngoài ra, là http://bắt buộc?
Marv

Ideone và repl.it không cho phép tìm nạp tài nguyên bên ngoài một la urllib.
Mego

@Mego Dang ... vậy thì, tôi đoán mọi người sẽ phải xác nhận nó hoạt động bằng trình thông dịch Python của riêng họ.
R. Kap

@Marv Vâng, rõ ràng là như vậy. Nếu không, tôi nhận được một unknown url typelỗi.
R. Kap

6
ppcg.lol/q/idcũng hoạt động
đã xóa

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

Đây là một hàm chấp nhận một số nguyên và trả về một boolean. Nó kết nối với API trao đổi ngăn xếp và mỗi lần chạy chức năng tạo ra 2 yêu cầu API, vì vậy đừng chạy nó quá nhiều lần hoặc bạn sẽ sử dụng hết hạn ngạch 300 yêu cầu / ngày của bạn.

Ung dung:

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

Tôi không biết về bộ lọc API "withbody"! +1. Nếu nó lưu byte trên câu trả lời Ruby của tôi, tôi có thể sử dụng thủ thuật đó không?
Mực giá trị

1
@ KevinLau-notKenny Tất nhiên rồi! Làm những gì bạn phải làm trong tên của golf. : P
Alex A.

Tôi không muốn đạo văn = 3 nhưng than ôi, sau khi biết được ppcg.lolmột liên kết ngắn với tất cả mọi thứ về codegolf, phiên bản API chỉ là không đủ
Value Ink

4

Vợt, 339 byte

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

Có nhiều thứ để chơi golf, vẫn còn.


1
Đánh tôi đi! : P
con mèo

TODO: làm cho một cây vợt giống như có thể chơi gôn. :)
Winny

1
339 byte trong đó 68 là parens ... vì vậy một LISP cho golf sẽ cần số nhận dạng ngắn và không có parens. Không phải LISPy :(
con mèo

4

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

Tôi không nghĩ rằng có bất kỳ trường hợp cạnh nào sẽ khiến các mẫu regex của tôi bị phá vỡ, tôi hy vọng ...

Đã cập nhật vào liên kết ngắn được cung cấp bởi @WashingtonGuedes và phát hiện ra rằng HTTParty không phàn nàn nếu tôi bắt đầu bằng //thay vì http://.

Cập nhật cho regexes an toàn hơn một chút. Tôi đã lưu byte bằng cách phát hiện ra rằng các đối tượng phản hồi HTTParty kế thừa từ String, điều đó có nghĩa là tôi thậm chí không cần sử dụng .bodykhi khớp với biểu thức chính quy!

@manatwork đã chỉ ra một bổ sung nhân vật tình cờ mà tôi đã để lại, và vì lợi ích của golf, ibây giờ phải được chấp nhận là một Chuỗi.

Regexes cập nhật. Cùng chiều dài. -1 byte bằng cách cắt ra một 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}

Ghi chú thêm:

  • Dòng đầu tiên của câu trả lời (cần chứa ngôn ngữ theo thông số kỹ thuật) là hai dòng sau Thẻ HTML với lớp "post-text"mà chúng tôi khớp với st.*xt". Một phiên bản an toàn hơn sẽ có thêm một không gian sau nó, nhưng chúng tôi hy sinh điều đó vì lợi ích của golf.
  • HTTParty được sử dụng trên các net/httpmô-đun gốc do xử lý chuyển hướng phù hợp cho URL đã cho.
  • "up*?\dlà chuỗi ngắn nhất tôi thấy tương ứng với số phiếu bầu. Chúng tôi chỉ cần câu đầu tiên, vì vậy rất may câu trả lời không ảnh hưởng đến điều này.

3
ppcg.lol/q/#{i}cũng hoạt động
đã xóa

@WashingtonGuedes ppcg.ga/q#{i}có lẽ? (Tôi không biết Ruby)
Erik the Outgolfer 04/05/2016

@ ΈρκΚωστpc ppcg.ga không phải là một chuyển hướng ký tự đại diện, hãy tự mình thử - ppcg.ga/q/79273
Timtech

@Timtech Vậy ppcg.lol/q#{i}tôi có áp dụng được không? ( a/#bgiống như a#b)
Erik the Outgolfer 04/05/2016

1
Việc "làm hỏng /"e-c.*?(\d+)/biểu thức chính quy. Nhân tiện, yêu cầu nói về đầu vào mà các kiểu dữ liệu (không phải là vấn đề) của NNH. Vì vậy, tốt hơn nên chuyển tham số i dưới dạng chuỗi, do đó bạn có thể thay thế thay thế bằng ghép nối : "//ppcg.lol/q/"+i.
thao tác

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}

Nhờ TimTech 17 ký tự được lưu.

Từ khóa def cũng không cần thiết.


Bạn có thể thay thế codegolf.stackexchange.com bằng ppcg.lol
Timtech

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.