課題が回答に値するかどうかを判断する


21

私は非常にカジュアルなコードゴルファーであり、StackOverflowの「Hot Network Questions」サイドバーに投稿が表示されるまで、投稿を見ることはあまりありません。通常、私はゲームに遅れており、私が知っている唯一の言語はPythonであるため、すでにいくつかのPythonの答えがあるので、答える意味はほとんどありません。あなたの課題は、質問に答える価値があるかどうかを判断することです。

入力:

  • コード(関数またはプログラム)は1つの入力パラメーターを取ります i

出力:

  • 質問idのTruthyまたはFalsey値i。質問に5つ以上の回答、3つ以上の質問スコア、およびPythonで1つ以下の回答がある場合、Truthyを出力します(バージョンの区別はありません)。

規則/説明:

  • 入力形式は合理的なものであれば何でもかまいません(stdin、file、command line)が、回答で指定する必要があります。データ型と先頭/末尾の空白は関係ありません。
  • に対して質問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.ガプス

主にPythonも知っています。
user48538

他のいくつかの言語を学び始めなければなりません。
R. Kap

5
@ R.Kap、このチャレンジは開始する絶好の機会です!
wnnmaw

2
この課題は明らかに答える価値があります。
Rɪᴋᴇʀ

回答:


8

05AB1E167の 160 159 158 156 154 143バイト

くそー、ほぼ普通の言語と同じくらい...

Crap ... 現在、Rubyの回答よりも1バイト長くなっ ています。

Rubyの答えよりも長くなりました。

おそらく今すぐ寝るべきです。

1バイトを保存してくれた@wnnmawと@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"を分割し、それぞれを再度分割し<ます。最初の2つの要素を削除して、言語が表示される部分を取得し、小文字バージョンがこの文字列に含まれているかどうかを確認します。

したがって、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彼らは確かに違いを;)
生む

ppcg.lol/q/id圧縮を使用してバイトを節約できますか?
wnnmaw

@wnnmawありがとう、今はRubyの回答からわずか1バイト離れています:p。
アドナン

1
あらいやだ!私はちょうど二位で我慢しなければならないと思います...私は、私が先に再び取得する必要が7つのバイトを保存するのに十分なコーナーを切ることができるとは思わない
バリューインク

5

Pythonの3.5、280 272 260 242 240バイト:

比較で演算子を使用して2バイトの保存バイトを作成するトリックについてAdnan感謝します!*

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ライブラリを使用して質問のサイトにアクセスし、正規表現を使用して、投票数、回答数、およびWebサイトから返されたデコードテキストのPython固有の回答数を検索します。最後に、これらの値は値を返すために必要な条件と比較されtruthy、すべての条件を満たす場合Trueは返されます。そうでない場合False

私がここで心配している唯一のことは、正規表現がバイトを節約するためのPython固有の回答の数の面で多くの風通しの悪い方法を与えるということですので、それはおそらく十分ではありますが、この課題の目的。ただし、より正確なものが必要な場合は、上記のものよりも長いものの、以下のものを追加しました。以下に示すものは、正確さのために元の関数よりもPythonの回答をカウントするために、はるかに長い正規表現(発見するのに時間がかからないもの)を使用しているため、現在298バイトです。これは、スローされたすべてのテストケースの少なくとも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の回答が最初のページにあり、別のページが2番目のページにある場合、上記のどちらも非常にうまく機能しません。まあ、私がチェックしていること(下図)私の機能の別のバージョンを作成することによってこの問題を解決するために自由を取ったすべてのページの回答の、複数のものは、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))

かなり長いですね。私はこれでコードゴルフにあまり行きませんでしたが、もし望むなら、もう少しゴルフをすることができます。そうでなければ、私はそれを愛し、幸せになることができませんでした。ああ、追加のボーナスとして、これはまた、質問に対するPythonの回答の総数、質問に対する投票の総数、およびid質問が1ページ以上の質問に対応する場合の質問の回答の総数を出力します。答えの。それ以外の場合、質問が1ページの回答のみで構成されている場合、truthy/falsy値を出力するだけです。私はこの挑戦に本当に夢中になりました。

これらはそれぞれ、質問を文字列のid形式で受け取ります

Try It Online!ここに関数ごとにリンクを配置しますが、残念ながら、Pythonのライブラリを介したリソースのフェッチrepl.itIdeone許可しませんurllib


を使用http://codegolf.stackexchange.com/q/して質問を取得できます。また、http://必須ですか?
マーヴ

Ideoneおよびrepl.itは、urllibのような外部リソースのフェッチを許可しません。
メゴ

@Mego Dang ...それでは、人々は独自のPythonインタープリターを使用して、それが機能することを確認する必要があると思います。
R.ガプス

@Marvはい、明らかにそうです。そうしないと、unknown url typeエラーが発生します。
R.ガプス

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リクエストが作成されるため、何度も実行しないでください。1日あたり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
アレックスA.

私はの学習の後、= 3を盗用したいが、残念ながらありませんでしたppcg.lolすべてのものへの短いリンクはcodegolfとして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個は括弧です。したがって、ゴルフのLISPには短い識別子が必要であり、括弧は必要ありません。あまりLISPyではない:(
cat

4

ルビー+ HTTParty170 146 145 142 139 138 + 11(-rhttpartyフラグ)= 181の 157 156 153 150 149バイト

私の正規表現パターンが壊れるようなエッジケースはないと思います...

@WashingtonGuedesが提供するショートリンクに更新し、HTTPartyがの//代わりに開始しても文句を言わないことを発見しましたhttp://

わずかに安全な正規表現用に更新されました。HTTParty応答オブジェクトがStringを継承していることを発見して、バイトを節約しました。つまり.body、正規表現に一致するときに使用する必要さえありません。

@manatworkは、私が残した偶発的なキャラクターの追加を指摘し、ゴルフのために、i現在ストリングとして受け入れられなければなりません。

更新された正規表現。同じ長さ。括弧を切り取って-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タグの後に2行である"post-text"我々がマッチし、st.*xt"。より安全なバージョンでは、その後にスペースが追加されますが、ゴルフのためにそれを犠牲にしています。
  • HTTPartyはnet/http、指定されたURLの適切なリダイレクト処理のために、ネイティブモジュールよりも使用されます。
  • "up*?\d投票数に対応する最短のシーケンスでした。最初のものだけが必要なので、ありがたいことに答えがこれに影響することはありません。

3
ppcg.lol/q/#{i}動作
削除

@WashingtonGuedes ppcg.ga/q#{i}?(私はRubyを知らない)
エリックアウトゴルファー

@ΈρικΚωνσταντόπουλοςppcg.gaはワイルドカードリダイレクトではない、それを自分で試してください- ppcg.ga/q/79273
Timtech

@Timtechだからppcg.lol/q#{i}適用可能だと思う?(a/#bと同じですa#b
エリックアウトゴルファー

1
"台無しにされた/"e-c.*?(\d+)/正規表現を。ところで、この要件では、入力について「データ型(…)は問題ではない」と言われています。したがって、iパラメーターを文字列として渡すと、置換を連結に置き換えることができます"//ppcg.lol/q/"+i
マナトワーク

3

グルービー、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も必要ありません。


codegolf.stackexchange.comをppcg.lolに置き換えることができます
Timtech

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.