答える質問をいくつかください!


15

前書き

時々私は退屈し、PPCGに新しい質問がないので、PPCGの過去からランダムな質問を掘ってほしいです。

チャレンジ

入力としてユーザーのPPCG IDを指定します(たとえば、私のIDは30525です)。ランダムに選択されたPPCG質問のURLを出力します。質問が次の基準を満たさない場合、基準を満たすまで別の質問を選択する必要があります。

  • 質問者は、質問にIDが入力されたユーザーであってはなりません
  • 質問にIDが入力されたユーザーが質問に回答していないこと
  • 質問は未回答であってはなりません。それはおそらく難しすぎるでしょう
  • 質問には10個以上の回答を含めることはできません。おそらく簡単すぎるでしょう
  • 質問にはタグを付ける必要があります

ルール

URL短縮サービスは許可されていません。

Stack Exchange APIとStack Exchange Data Explorerを使用できます。

実際のPPCGユーザーのIDのみが与えられます。

万一、適切な質問がない場合は、何も出力する必要はありません(未定義の動作は問題ありません)。

サイドチャレンジ

余分なポイントは授与されませんが、実行時にブラウザーウィンドウを開いて上記の基準に従うランダムなPPCG質問を作成する使用可能なブックマークレットを誰かが設計していただければ幸いです。ユーザーIDはプログラムにハードコーディングする必要があります(ブックマークレットの場合のみ)。

チャレンジ

バイト単位の最短コードが優先されます。

回答:


4

PowerShell、261バイト

param($i)$q=irm (($u="api.stackexchange.com/questions/")+($s="?tagged=code-golf&site=codegolf"))
do{$t=$q.items|?{$c=$_|% an*;$_.owner.user_id-ne$i-and$c-gt0-and$c-lt10}|random}while((irm($u+$t.question_id+'/answers'+$s)).items.owner.user_id-contains$i)
$t.link

説明:

param($i)
$q=irm (($u="api.stackexchange.com/questions/")+($s="?tagged=code-golf&site=codegolf")) #run this query
do{ #until we find a valid question, get a random one that fits the basic specs
    $t=$q.items|?{$c=$_|% an*;$_.owner.user_id-ne$i-and$c-gt0-and$c-lt10}|random
}while( #Get all of the answers, and their owners into an array, check it doens't contain the provided id
(irm($u+$t.question_id+'/answers'+$s)).items.owner.user_id-contains$i
)
$t.link #output the question link

webbrowserで開くバージョンに4バイトを追加します

param($i)$q=irm (($u="api.stackexchange.com/questions/")+($s="?tagged=code-golf&site=codegolf"))
do{$t=$q.items|?{$c=$_|% an*;$_.owner.user_id-ne$i-and$c-gt0-and$c-lt10}|random}while((irm($u+$t.question_id+'/answers'+$s)).items.owner.user_id-contains$i)
saps $t.link

5

JavaScriptの(ES6)、333の 329 327 323 283バイト

api.stackexchange.comドメイン内から実行する必要があります(関連するメタ)。PromiseURL(関連するメタ)を含むを返します。

f=async i=>await(u="/questions/",s="?tagged=code-golf&site=codegolf",q=await(await(await fetch(u+s)).json()).items.filter(x=>x.owner.user_id!=i&x.answer_count<11).sort(_=>.5-Math.random())[0],await(await fetch(u+q.question_id+s)).json()).items.some(x=>x.owner.user_id==i)?f(i):q.link

それを試してみてください

f=async i=>await(u="//api.stackexchange.com/questions/",s="?tagged=code-golf&site=codegolf",q=await(await(await fetch(u+s)).json()).items.filter(x=>x.owner.user_id!=i&x.answer_count<11).sort(_=>.5-Math.random())[0],await(await fetch(u+q.question_id+s)).json()).items.some(x=>x.owner.user_id==i)?f(i):q.link
k.previousSibling.value=58974 // me
k.onclick=_=>f(+k.previousSibling.value).then(p=>k.nextSibling.innerText=p)
<input type=number><button id=k>Fetch</button><pre>


しおり

そして、これはカスタマイズ可能なブックマークレットとして、まだ答えていないランダムな質問をロードします。使用するには、ブラウザのツールバーに新しいブックマークを追加し、完全なコードをURLフィールドにドロップします。

上記のソリューションとは異なり、これはサイト上のすべての質問で機能するため、実行に時間がかかる場合があります(サイトおよびタグによって異なります)。また、APIができるため、一度に100の質問のみを返します。

カスタマイズするには、次の変数を変更します

  • k:APIキー- ここで登録できます
  • s:質問を取得するStack Exchangeサイト。
  • i:そのサイトのユーザーID。
  • t:フィルタリングするタグ。このオプションには4つのオプションがあります。
    1. "":空の文字列。タグでフィルタリングしたくない場合は、
    2. "code-golf;string":セミコロンで区切られた、フィルタリングするタグのリスト、
    3. prompt("Tags:"):フィルタリングするタグの入力を求められます。または、
    4. prompt("Tags:","code-golf;string"):デフォルトのリストが提供された状態で、フィルタリングするタグの入力を求められます。
javascript:(f=(

/* See /codegolf//a/122400/58974 for documenation */
k="",
s="codegolf",
i=58974,
t="code-golf",

p=1,q=[],r=1)=>fetch((u="//api.stackexchange.com/questions/")+(d=`?key=${k}&tagged=${t}&site=`+s)+`&page=${p}&pagesize=100`).then(r=>r.json()).then(j=>r&&(q=[...q,...j.items.filter(x=>x.owner.user_id!=i&(a=x.answer_count)&a<11)])^j.has_more?f(i,k,s,t,p+1,q,1):q.sort(_=>.5-Math.random())[0]).then(y=>fetch(u+y.question_id+"/answers"+d).then(r=>r.json()).then(j=>j.items.some(x=>x.owner.user_id==i)?f(i,k,s,t,q,0):window.location=y.link)))()

1
これに関する私のPowershellの回答に基づいて、APIの文字列をうまく再利用します。
colsw

どの時点で永久に禁止されますか?;)
ベータ崩壊

@ BetaDecay、APIチャレンジが再びペースを上げたら、すぐにわかるかもしれません!:D
シャギー

ここからAPIトークンを使用できます:stackapps.com/q/7384/45852でレート制限を引き上げます。
Programmer5000

1
@BetaDecay、使用可能なスクリプトに拡張するつもりでしたが、時間が足りませんでした。明日また戻ってくるようにします。
シャギー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.