X



プログラミングのお題スレ Part9 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2016/12/01(木) 16:58:30.97ID:gTkHDluD
プログラミングのお題スレです。

前スレ
プログラミングのお題スレ Part8©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1444216746/

【出題と回答例】
1 名前:デフォルトの名無しさん
  お題:お題本文

2 名前:デフォルトの名無しさん
  >>1 使用言語
  回答本文

【ソースコードが長くなったら】 (オンラインでコードを実行できる)
http://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
http://runnable.com/
http://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/

宿題は宿題スレがあるのでそちらへ。
0433デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:00:36.94ID:EQKnHSgY
っていうか、この関数インデックスに0与えたら何が出力されるんだろう・・・。
早速バグってる気がする。
0441デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:47:30.85ID:B3p9Yl5S
じゃあ、任意の二個の数からはじまるフィボナッチ数列で、はじめから連続する素数の数が多い物を探す
って課題で
0443デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:49:05.29ID:EQKnHSgY
あれ?俺とんちんかんなこと言ってるか?
>>422が数列としてあってるのかよくわからない。Orz
どう考えればいいんだろう。
0448デフォルトの名無しさん
垢版 |
2017/07/30(日) 19:16:10.29ID:LizATlBz
>>431 Ruby

def farey(n, k)
return [0r, 1r][k] if n == 1
farey(n - 1, 0..-1).each_cons(2).inject([0r]){|s, (a, b)|
x = a.denominator + b.denominator
s << 1r*(a.numerator + b.numerator)/x if x == n
s << b
}[k]
end
0449デフォルトの名無しさん
垢版 |
2017/08/03(木) 07:36:01.80ID:cLWzUq7C
お題:ミンコフスキーの疑問符関数の実装
ttps://en.wikipedia.org/wiki/Minkowski%27s_question_mark_function
ttp://reference.wolfram.com/language/ref/MinkowskiQuestionMark.html
0451デフォルトの名無しさん
垢版 |
2017/08/03(木) 10:48:34.50ID:ONmyLPuf
>>449のWIKIより。
/* Minkowski's question mark function */
double minkowski(double x) {
long p=x; if ((double)p>x) --p; /* p=floor(x) */
long q=1, r=p+1, s=1, m, n;
double d=1, y=p;
if (x<(double)p||(p<0)^(r<=0)) return x; /* out of range ?(x) =~ x */
for (;;) /* invariants: q*r-p*s==1 && (double)p/q <= x && x < (double)r/s */
{
d/=2; if (y+d==y) break; /* reached max possible precision */
m=p+r; if ((m<0)^(p<0)) break; /* sum overflowed */
n=q+s; if (n<0) break; /* sum overflowed */

if (x<(double)m/n) r=m, s=n;
else y+=d, p=m, q=n;
}
return y+d; /* final round-off */
}
0453デフォルトの名無しさん
垢版 |
2017/08/12(土) 18:46:00.57ID:953va2dM
寿司のオーダーNのやつを理解しようとしたけどまだやってない。
その仕組みと、ほんとに正解してるのかとか。いたら誰が解説して。
0455デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:07:04.34ID:4r/z/Qd5
会社に帰ってこない巡回セールスマンだよね
寿司の乗った皿がノード、計算量はO(n!)
0456デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:10:18.10ID:Bi4KH0eW
それぞれの寿司を食べている期間をレーン上の線分で表します

この線の重なり具合をpileで表しました

効率良く食べられた場合はレーンがpile_max周するまでの間に食べきることが出来ます

170行目の判定がそれで、trueの場合は効率良く食べられない場合です
0458デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:17:11.73ID:6XNTCj+p
巡回セールスマン問題とけたら色々応用範囲アルヨ。
マジでどっかに売り込んでもいいくらい。
天才か。
0459デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:18:34.85ID:6XNTCj+p
社会的に言うと交通統制とかもそれじゃないかな?
信号の待ち時間問題。よくしらんけど。
0460デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:19:17.76ID:Bi4KH0eW
効率良く食べられない方が簡単なのでその場合から

お寿司を以下のグループに分けます
----
各グループのお寿司は、レーンの特定の位置から食べ始めた場合、pile[グループ]周以内で食べ終わることが出来る
このとき、pile_max = Σ pile[グループ]
となる
---
このようなグループの分け方の最小の物が存在します
0461デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:22:56.16ID:Bi4KH0eW
同じグループのお寿司は連続して食べます
開始時と、各グループのお寿司を食べ終わった後、最初に来るお寿司から食べはじめ、pile[グループ]以内で食べられる食べ方でそのグループを食べ終える
ということを繰り返せば最小の時間で食べ終えることが出来ます
0462デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:26:29.79ID:Bi4KH0eW
グループ分けした時に1個のグループになった場合は、
効率良く食べられることになります
つまり、pile_max周以下で食べ終えることが出来ます

この時は、コード上にあるダミーのお寿司を追加してから最小時間を求め、ダミーのお寿司を食べてる時間を引けば求められます
0463デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:28:18.79ID:4r/z/Qd5
うーん、よくわからん
セールスマンの巡回先を一次元にマッピングできれば同じことできそうな
無理か
0464デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:30:27.01ID:Bi4KH0eW
グループの分け方は少し難しいです

レーンの各整数位置に対して、
お寿司の線の両端にあたる点同士
線の重なりがpile_max未満である区間の点(両端を含む)
を同じグループの点とし、
これらを続けることで最小のグループ分けが出来ます
線の両端の点のグループが、そのお寿司のグループになります
0468デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:39:44.61ID:2Yw2XYfL
372仕様書無しさん2017/08/11(金) 10:31:43.41
フリーランスで検索すると引っかかる零細ITがやっているフリーランスのサイトはだめだ。
高額に見せているけど実際は50万前後
JIET加入した方がいいよ。案件は毎日千件以上末端価格は60万円 平凡な稼働時間の80万円の案件もある。
ユー子も求人をだしてる。名刺も渡せる。ユー子に名刺が渡せるんだぞ。夢のようだ

それらの案件まさぐってHPで転売していたのが零細ITがやるフリーランスサイト

473非決定性名無しさん2017/08/03(木) 15:21:30.71

JIETに加入すれば誰でも3次60万からスタートだ。フリーランスのサイトをやってる
自称エージェントもそこから案件情報を取得しきてる。サイトで60万で釣って40万から55万の
間でやらしている。

446非決定性名無しさん2017/08/02(水) 22:12:48.95

JIETに毎月5千円払えば3次から入場できるだろ?
高額をうたうフリーランスのサイトはだいたい5次から45万円
JIETで閲覧応募できる末端価格からさらに搾取するのが高額をみせつけるフリーランスサイトでした
高額案件をみせつけるフリーランスサイトも案件の取得はJIETでした

自称エージェントはJIETから流れてくる案件を転売してるだけだった。
JIETに加入すれば誰でも案件に応募することができた。収入が40万50万台にならなくて済む
0469デフォルトの名無しさん
垢版 |
2017/08/12(土) 19:40:20.63ID:Bi4KH0eW
pile_maxとその位置から下限が得られますが、
>>296 の例では98秒の物以外はすべてその下限になっています
一個その下限になるような例を見つければ答えがわかるのですが、
自力で検索してみればわかると思いますがそのような例はあっさり見つかります

98秒の例は効率良く食べられない場合になります

効率良く食べられる側のなかでも、pileから得られる下限値より大きくなる場合もあります
0471デフォルトの名無しさん
垢版 |
2017/09/15(金) 10:14:33.05ID:lRMsxOf0
お題:
N次元で1辺のマス目がM個の魔法陣を作る
N>3(任意)、M>=3(任意)の超立方体
0473デフォルトの名無しさん
垢版 |
2017/09/17(日) 16:38:38.03ID:DSKC3zx4
魔方陣は1個作ればいいの?

Mが奇数か4の倍数は簡単
4で割って2余るのは検索するしかないのかな?
0474デフォルトの名無しさん
垢版 |
2017/09/17(日) 16:55:04.37ID:fthJj6jv
バックトラックで組もうかと思ったけど、重そうだったからやめた。
数独より重そう。
それに一列合計をどの数字にするのかちょっとわからなかった。
0477デフォルトの名無しさん
垢版 |
2017/09/18(月) 23:06:01.10ID:FC5+Wne9
お題
0以上90未満の整数nを入力として
タンジェントn°の値が有理数ならば真
そうでなければ偽を返す
0483デフォルトの名無しさん
垢版 |
2017/09/19(火) 03:58:59.82ID:KVkpgN/c
tan1°が無理数であることの証明すら面倒くせえのに一体どんな回答を求めているんだ
0486デフォルトの名無しさん
垢版 |
2017/09/19(火) 08:13:59.26ID:Ten4kOds
いや、おれは出来るよ

>>483の実力で出来るのか?と疑問に思っただけ
実力じゃなくてカンニングね
0488デフォルトの名無しさん
垢版 |
2017/09/19(火) 08:49:35.38ID:q1kL6yRz
問題が悪いな

与えられた有理数rに対し、
tan(πr)が有理数かどうか判別するプログラムを書け

ならテーブルは使えない
0492デフォルトの名無しさん
垢版 |
2017/09/19(火) 12:53:02.28ID:RSOddfRB
そもそも出題者はどういう回答を期待してるんだ?
数学の知識無しでは作れないし、数学の知識を使えば>>478になる
0493デフォルトの名無しさん
垢版 |
2017/09/19(火) 14:38:36.12ID:LvSRuVZD
tan()の加法定理
 tan(α+β)=(tanα+tanβ)/(1-tanαtanβ)
により

もしtan(α)が有理数なら
tan(nα) (n = 1,2,3,4・・・)
も全て有理数

このため
整数nにより
tan(n)が無理数なら
nの約数全てによるtan()が無理数

ここで
tan(60)=√3
が無理数なのは簡単に証明されるため、
tan(1)
も無理数

証明終わり
0499デフォルトの名無しさん
垢版 |
2017/09/19(火) 22:25:08.25ID:FbLYus+p
>>492
WolframAlphaが
is tan(pi * 1 / 180) a rational number?
→ not a rational number
と返す仕組みを知りたかった
0501デフォルトの名無しさん
垢版 |
2017/09/20(水) 14:48:00.57ID:jgmli1ek
>>493
は加法定理で(1-tanαtanβ)が0になってはまずいので
0度以上90未満の範囲内に限定しないといけないな。


tan()の加法定理
 tan(α+β)=(tanα+tanβ)/(1-tanαtanβ)
により

もしtan(α)が有理数で、かつ 0 <= nα < 90なら
tan(nα) (n = 1,2,3,4・・・)
も全て有理数

このため
整数 n ( 0 <= n < 90 ) により
tan(n)が無理数なら
nの約数全てによるtan()が無理数

ここで
tan(60)=√3
が無理数なのは簡単に証明されるため、
tan(1)
も無理数
0502デフォルトの名無しさん
垢版 |
2017/09/20(水) 14:51:06.46ID:jgmli1ek
tan(1)だけじゃなくて
>>477 >>478 も証明できるかな???

つまり整数 n ( 0 <= n < 90 ) において
tan(n)が有理数になるのはn=0,45に限ることの証明

tan(90-n) = 1/tan(n) なので
n ( 0 <= n < 45 ) の範囲で証明されればOK

またtan(45)が有理数で加法定理で減算し
 tan(45-n):有理数 ⇔ tan(n):有理数 ( 0 <= n < 45 )
も成立
0503デフォルトの名無しさん
垢版 |
2017/09/20(水) 14:51:42.84ID:jgmli1ek
60の約数 はtan(n)無理数
1,2,3,4,5,6,10,12,15,20,30

これの45-n もtan(n)無理数
44,43,42,41,40,39,35,33,25,15

この約数で、まだ含まれていないもの
11,22,21,8,13,7

45-nにより
34,23,24,37,32,38

この約数で、まだ含まれていないもの
17,16,19

45-nにより
28,29,26

この約数で、まだ含まれていないもの
14

45-nにより
31

ここまでの数を並べると
01,02,03,04,05,06,07,08,**,10,
11,12,13,14,15,16,17,**,19,20,
21,22,23,24,25,26,**,28,29,30,
31,32,33,34,35,**,37,38,39,40,
41,42,43,44

9度の倍数の証明のみが残された
0509デフォルトの名無しさん
垢版 |
2017/09/21(木) 16:21:06.33ID:na02B6ss
[1] 授業単元名:FizzBuzzクイズ
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)特に問わない
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)特に問わない
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)特に問わない

http://kohada.2ch.net/test/read.cgi/prog/1209467166/401
FizzBuzzクイズ

1.fizz.buzz #=> 1
3.fizz.buzz #=> "Fizz"
5.fizz.buzz #=> "Buzz"
15.fizz.buzz #=> "FizzBuzz"
999.fizz.buzz #=> 999

となるようなメソッドfizz、buzzは定義可能か?
可能である場合、同様にgizzを追加定義し、
7.fizz.buzz.gizz #=> "Gizz"
21.fizz.buzz.gizz #=> "FizzGizz"
35.fizz.buzz.gizz #=> "BuzzGizz"
105.fizz.buzz.gizz #=> "FizzBuzzGizz"
105.fizz.gizz.buzz #=> "FizzGizzBuzz" と拡張・応用ができるか?

メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。
オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。
0516デフォルトの名無しさん
垢版 |
2017/09/22(金) 09:43:07.90ID:eeRMTLx0
外部出力を伴う関数(あるいはメソッド)なら簡単
たぶん関数(あるいはメソッド)の返値がそうなるようにって意味かと
(じゃないと普通に書けてクイズにならない)
たしか数理学的にはこういう関数は書けないことになっていたはず
0519デフォルトの名無しさん
垢版 |
2017/09/22(金) 12:51:02.25ID:qmG6L9xB
C言語だとトリッキーな技を使わないと出来ない
同じ関数名で複数関数を作れないから
2段や3段重ねて、intを受けて文字列を返すのは普通には無理

C++だと簡単
大きく分けて2つの方法がある

C++でも数値によって戻り値の型を変えるのは無理
数値がconstexprで良いなら出来るだろうけど
0521デフォルトの名無しさん
垢版 |
2017/09/22(金) 16:30:21.56ID:W1Y66+yK
>>520
関数インターフェース的にはその値を与えることが出来ない

別の関数か何かで変えるかインターフェースを変えるしか
0522デフォルトの名無しさん
垢版 |
2017/09/22(金) 16:41:43.04ID:W1Y66+yK
>>516
戻り値を文字列にする方法

方法1
段階によって引数と戻り値の型を変える
S1 fizz(int n);
S2 fizz(S1 s);
std::string fizz(S2 s);
※テンプレートを使うと楽

方法2
戻り値をstd::string固定にしてなんとかする

方法2-1
戻り値は常に結果の文字列にし、パラメーター以外で情報を渡す
方法2-2
文字列に情報をエンコードして入れる
最終型段だけ結果を返すようにする

方法3
戻り値を結果文字列そのままではなく、文字列情報を含む情報とする
(これは反則かな?)
0523デフォルトの名無しさん
垢版 |
2017/09/22(金) 16:44:03.80ID:W1Y66+yK
方法2-1であれば >>520の問題は解決する
ただし、そのままだとスレッドセーフじゃなくて気持ち悪い
0525デフォルトの名無しさん
垢版 |
2017/09/22(金) 18:17:47.82ID:eeRMTLx0
例えばRubyだと文字列を含め組み込み型にインスタンス変数を仕込めるので
たぶんそれで次のメソッドに情報を渡せる
0526デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:04:29.86ID:FtjqsiSd
>>522 の方法2-1
C++版
https://ideone.com/ZavKGg

外部情報は「n」のみ
複数スレッドや割り込みハンドラからコールする時はこのnが問題になるんで
なんとかしてstd::stringに埋め込めれば良いんだけど

>>525
問題を変えちゃダメだよね
> [3.3] 言語: (C/C++/どちらでも可 のいずれか)特に問わない
0527デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:08:43.22ID:FtjqsiSd
8行目、なんとなく文字列から判別してみたけど、
素直にnと同じように外部にフラグを持てば条件が減る
(文字列の最後が数字にならないとか文字コードが連続してるとか)
0528デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:09:11.03ID:pX6TouLp
「(C/C++/どちらでも可 のいずれか)特に問わない」って日本語がまず謎
有限個の具体例しか与えられていないので仕様も謎
0529デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:26:24.34ID:FtjqsiSd
出題者の選択枝が [C/C++/どちらでも可] の3個あって、出題者がその「いずれか」を選ぶ
というフォーマットを使った出題
出題者は回答者に対し『その3個のどれでも良いよ』という意味で「特に問わない」と

と私は解釈した
つまり、回答者の選択枝はCかC++のどちらかだと

出力する文字列のルールはリンク先を見れば大体わかる
gizzが7の倍数かどうかは実際には不明で、実は14で割ると7余る数かもしれないが...

リンク先に「プリントする」とあるので
printfなどで標準出力に出せば良いのかと思ったが、
>>516の解釈は違うらしい

数値の場合だけ""でくくってないので、
文字列の場合は""をくっつける必要があるのか、
型を変えろと言っているのかはよくわからん
いずれにしろ、CやC++では値によって戻り値の型を変えるのは不可能
0531デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:33:47.07ID:eEMHecr4
>>529
>回答者の選択枝はCかC++のどちらかだと
いや、そうじゃなくて、本当に「特に問わない」、どういったらいいかな、このテンプレはC宿題スレのものを、そのまま頂戴しただけじゃない?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況