确定挑战是否值得回答


21

我是一个非常随意的代码高尔夫球手,并且直到他们出现在StackOverflow上的“热网络问题”侧栏中之后,才经常看到他们。通常,我迟到了游戏,并且由于我所知道的唯一语言是Python,所以我的回答毫无意义,因为已经有多个Python答案。您的挑战是弄清楚一个问题是否值得我回答。

输入:

  • 您的代码(函数或程序)将带有一个输入参数 i

输出:

  • 问题ID的真值或假值i。如果问题的答案超过5个,问题分数大于3,并且在Python中回答一个或更少,则输出Truthy(版本之间没有区别)。

规则/说明:

  • 输入格式可以是任何合理的格式(stdin,文件,命令行),但应在答案中指定。数据类型和前导/尾随空格无关紧要。
  • 假设问题ID对有效codegolf.stackexchange.com
  • 忽略特定于语言的问题要求。(即,如果一个问题满足投票要求和答案,并且没有Python答案,因为它仅是Java,则仍然会产生Truthy)。
  • 如果在帖子的第一条换行符之前的任何位置出现“ python”(区分大小写),则该回答为Python回答。
  • 这是代码高尔夫,因此以字节为单位的最短代码获胜。

样品盒*

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'5

我必须开始学习其他一些语言。
R. Kap

5
@ R.Kap,这个挑战是开始的好时机!
wnnmaw '16

2
显然,这一挑战值得回答。
Rɪᴋᴇʀ

Answers:


8

05AB1E167个 160 159 158 156 154 143字节

该死,几乎和普通语言一样长...

废话... 较长 当前击败了红宝石答案1个字节。

现在比Ruby答案更长,啊!

我可能现在应该睡觉。

感谢@wnnmaw保存1个字节,并感谢@R。节省另外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]using 的数字值®"useful and clear"¡`99£þ。这是投票数。

最终,我们需要检查每个答案,如果文本"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他们确实的确发挥了作用;)
Outgolfer选手Erik

您可以使用ppcg.lol/q/id压缩来保存字节吗?
wnnmaw '16

@wnnmaw谢谢,现在我距离Ruby答案:p 仅1个字节。
阿德南

1
不好了!我认为我没有足够的捷径来保存需要再次获得成功的7个字节...我想我只需要排在第二位
Value Ink

5

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

很简单。使用Python的内置urllib库转到问题的站点,然后使用正则表达式在网站返回的解码文本中查找投票计数,答案计数以及Python特定答案的计数。最后,将这些值与返回truthy值所需的条件进行比较,如果它们满足所有条件,则将True其返回。否则False是。

我在这里唯一担心的是,正则表达式在保存字节的特定于python的答案方面给了很多麻烦,所以有时可能有点不准确,尽管它可能已经足够了挑战的目的。但是,如果您想要更准确的一种,我在下面添加了一个,尽管它比上面的更长。下面显示的一个当前为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)

但是,那些多页答案的问题呢?如果在第一个页面上有一个python答案,而在第二个页面上有另一个python答案,则上述两种方法在这种情况下都无法很好地工作。好吧,我通过创建函数的另一个版本(如下所示)来自由地解决此问题,该版本检查答案的每一页(如果存在多个答案)是否存在Python答案,并且在许多测试用例中都做得很好扔了它。好吧,事不宜迟,这里是新的和更新的功能:

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

相当长,不是吗?我并没有为此投入太多精力,尽管,如果您愿意,我可以再打一点。否则,我会喜欢它,并且不会更快乐。哦,我差点忘了,作为一项额外的奖励,如果该问题id对应于一页以上的问题,它还会输出该问题的Python答案总数,该问题的总票数以及该问题的答案总数。的答案。否则,如果问题仅由单页答案组成,则仅输出truthy/falsy值。我确实确实对这项挑战感到有些困惑。

这些都采用字符串id形式的问题。

我会Try It Online!在此处为每个函数放置链接,但不幸的是,既不允许repl.itIdeone不允许通过Python的urllib库获取资源。


您可以http://codegolf.stackexchange.com/q/用来提取问题。另外,是http://强制性的吗?
Marv

Ideone和repl.it不允许通过urllib获取外部资源。
Mego,2016年

@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个请求/天的配额。

取消高尔夫:

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过滤器!+1。如果它在我的Ruby答案中节省了字节,我也可以使用该技巧吗?
价值墨水

1
@ KevinLau-notKenny当然!以高尔夫的名义做自己想做的事情。:P
Alex A.

我不想ppcg.lol窃= 3,但是可惜,在学习了与所有代码高尔夫球的简短链接之后,API版本还不够
价值油墨

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

TODO:制作像高尔夫球一样的球拍。:)
Winny

1
339个字节,其中68个是parens ...,因此用于高尔夫的LISP将需要短标识符且没有parens。不是很好LISPy :(

4

红宝石+ HTTParty170 146 145 142 139 138 + 11(-rhttparty标志)= 181个 157 156 153 150 149字节

我认为没有任何极端情况会导致我的正则表达式模式崩溃,我希望...

已更新为@WashingtonGuedes提供的短链接,并发现如果我以//代替,HTTParty不会抱怨http://

已更新,用于更安全的正则表达式。无论如何,我发现HTTParty响应对象是从String继承的,从而节省了字节,这意味着.body在匹配正则表达式时甚至不需要使用它!

@manatwork指出了我遗留下来的一个偶然的字符,为了高尔夫,i现在必须将其作为String接受。

更新了正则表达式。长度相同。通过切出-1字节来保留括号

->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标记为class的两行"post-text",我们将其与匹配st.*xt"。一个更安全的版本会在其后添加一个空间,但是为了高尔夫,我们为此牺牲了空间。
  • net/http由于对给定URL进行了正确的重定向处理,因此在本机模块上使用HTTParty 。
  • "up*?\d是我发现与投票数相对应的最短序列。我们只需要第一个,因此谢天谢地的答案不会影响到此。

3
ppcg.lol/q/#{i}也有效
删除

@WashingtonGuedes ppcg.ga/q#{i}也许?(我不知道Ruby)
暴民埃里克

@ pcb.ga不是通配符重定向,请自己尝试-ppcg.ga/q/79273
Timtech '16

@Timtech ppcg.lol/q#{i}我认为适用吗?(a/#b与相同a#b
暴民埃里克(Erik the Outgolfer

1
"被破坏的/"e-c.*?(\d+)/正则表达式。顺便说一句,关于输入的要求说“数据类型(...)无关紧要。”因此最好将i参数作为字符串传递,这样就可以用串联替换替换:"//ppcg.lol/q/"+i
manatwork's

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个字符。

关键字def也不是必需的。


您可以用ppcg.lol代替codegolf.stackexchange.com
Timtech '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.