プログラミングのお題スレ Part16
■ このスレッドは過去ログ倉庫に格納されています
>>101 Kotlin script println((1..100).sum()) ま、しかし、昔々算数で四角を描いて 100 * (100 + 1) / 2 で出来ると習ったような気がするので馬鹿正直に1から100まで足す必要はないな。 工夫出来るところは工夫する >>105 は間違った工夫の例 >>105 が小一時間いったい何を問い詰めるつもりだったのか気になる おっすおら小一時間! これからの議論におらわくわくすっぞ! >>118 お前のアホさとか、多分一時間じゃ足りないw 小一時間とかサムいフレーズでウケると思ってるからウザがられんだよ 俺は別にうざがってないぞ なに全員がうざがってるみたいなまとめ方するんだよ 小一時間問い詰めるとか 具体的に想像すると陰湿極まりないパワハラが思い浮かぶ 初心者じゃない奴が全員プロだとでも思ってるのかなぁw まあとりあえずこれ読んどけ https://netyougo.com/2ch/2535.html ものすごい速度で羊を数えてください 1 sheep two sheep three sheep four sheep ........... >>137 とりあえずお題なの? 曖昧すぎてわからん >>101 julia f(a,b)=(a+b)*(b-a+1)÷2 f(1,100) #-> 5050 f(50,80) #-> 2015 >>101 Perl5 use feature current_sub; print sub {$_[0] and $_[0] + __SUB__->($_[0] - 1)}->(100); >>101 Perl5 sub Y_combinator { my $f = shift; sub { my $x = shift; $x->($x) }->( sub { my $y = shift; $f->(sub {$y->($y)(@_)}) } ) } my $series = sub {my $f = shift; sub { my $n = shift; $n and $n + $f->($n - 1) } }; print Y_combinator($series)->(100); お題: 丸カッコと空白の並びで構成される入力文字列がある。丸カッコは入れ子になっていてそれぞれペアになっている。入力文字列は奇数文字数である。 プレーヤー1は、最初に入力文字列の一番左端に居る。プレーヤー2は最初に入力文字列の一番右端に居る。各プレーヤーは一回のアクションで次のいずれかの動作が可能。 (あ) カッコを飛び越えずにひとつ左か右に移動する。ただし、入力文字列の外側には移動できない。 (い) プレーヤーXがカッコAの外側に居て、AとXが隣接しているとき、XがカッコAに対応する別のカッコBの外側の端に移動する。 (う) カッコをひとつまたいでひとつ左か右に移動する。 入力文字列に対してプレーヤー1と2を何度もターン制でアクションをさせてプレーヤーの位置が衝突するまで鬼ごっこをさせよ。 動かすのはランダムでも知能つきでも構わない。アクションごとに位置を表示せよ。 知能戦略の例) 鬼はなるべく近くなる方を選ぶ。 子どもは鬼からなるべく遠ざかるように動く。 動き方がわかりません 1文字右が ( の場合 (あ)1文字右に動く (い)右の ( に対応する ) の右の文字に動く (う)2文字右に動く のいずれかが出来る ただし、(い) (う) の移動先が文字列の外になる場合は移動出来ない でいい? >>101 Perl5 no warnings 'experimental::signatures'; use feature qw(say signatures); sub f($n) {$n and $n + f($n - 1)}; say f(100); sub Y($f) { sub {$f->(Y($f))->(@_)} } say Y(sub($f) { sub($n) { $n and $n + $f->($n - 1) } })->(100); >>101 Perl5 no warnings 'experimental::signatures'; use feature qw(say signatures); sub Y($f) { sub {$f->(Y($f))->(@_)} } # Y combinator w/ recursive $s = sub ($n) {$n and $n + $s->($n - 1)}; # calc series recursive say Y(sub ($f) { $s })->(100); >>101 Perl5 use List::Util 'sum'; print sum 1..100; お題 1以上、20以下の整数がランダムに10個与えられます。 与えられた整数の集合から1つ以上の整数を抜き出し、残った整数の集合からまた1つ以上の整数を抜き出します。 この時2つの抜き出した整数の集合のそれぞれの和が同値であり、かつ最小のものを出力して下さい。 例 与えられた整数の集合 : 2 3 4 5 6 7 8 9 10 11 期待される出力 : 5 この場合、与えられた整数の集合から 「2,3」「5」の整数を抜き出しています。 ・「同値」の意味が謎 ・解がない時の処理が謎(e.g. input: 9 10 11 12 13 14 15 16 17 18 ・同値の使い方が間違っているのでそもそも「集合」の元が重複しないものとしてよいものか悩ましい >>152 同値は単に同じ(等しい)値という意味で使っています。 解が存在しない場合は「ないよー」と出力して下さい。 与えられる整数は重複する可能性があります。 ならば結局こういうことでよいのかね. もとのスレを見ても出題者本人の主張が不明瞭なうえに二転三転していて気持ち悪いが. 与えられた数列を {a_n} に対して, {a_n} の異なる項からなる任意の部分列の内それぞれの和が等しくなるものを {b_n}, {c_n} として Σb_n (= Σc_n) が最小となる {b_n}, {c_n} を求めよ. そして今回は b, c の項数をそれぞれ 2, 1 に限るものとすると. もう少し例を載せるべきでした。 すいません。 例えば >>152 さんの解が存在しないとしているものですが、 9 10 11 12 13 14 15 16 17 18 を与えられた場合の出力は 21となります。(10,11と9,12) 入力が 1 1 1 1 1 1 1 1 1 1 の場合の出力は 1となります。(1と1) >>150 取り敢えずRで力任せ。これでも瞬時に終わるので工夫の必要なし。 https://ideone.com/pCp36v 実は>>157 は「残った整数の集合から」の条件を忘れていて、元の集合から抜き出すと 勘違いして書いてしまったプログラム。 が、改めて条件を考えてみると、既に抜き出された数と同じものを選んでしまうのは、 「片方の部分集合の要素が2個以上で、もう片方の部分集合の要素が3個以上の場合」(A) に限られる。例えば、2+9=11と2+3+6=11。この場合、2回選んでしまった2を取り除いた 部分集合は、和9=9と3+6=9が11より小さく、かつ(A)の場合に該当しないので2回選んで しまった数は存在しない。 だから結局、>>157 のプログラムのままで正解が得られることになる。 >>150 この問題から関連して考えてたんだけど 5を 1 1 1 1 1 1 1 1 2 1 1 3 1 2 2 1 4 2 3 5 このように分割する方法は7通り、10だと42通りあった 数が与えられたとき何通りの分け方があるかどうやって計算するのか考えてたけど そんな簡単な問題ではないようだった とりあえず数が与えられたら上の例のように全ての分け方を列挙する というのを問題としてみる その制限が無い方がアルゴリズムとしておもしろい 制限があるとつまらなすぎる すまん 不満は>>150 に言ったつもり そんな重要な事を省略すんなって 別に項数の制限はつけていませんよ 「項数の制限が無い」という事を省略したのに怒っているのならすいません。 ですが制限があるのなら普通に問題文に加えますし、別に書くほどの事では無いかな〜と >>150 https://ideone.com/OJyvxF C++。総当たりです。スカイレークのi7で12秒くらいかかります。 久しぶりにまじめに総当たりを書いた気がしました。 ギャグですけど、並列化は比較的簡単なのでそれで時間短縮はできます。 底の値をシェアードにすると早く終わります。Nになってると思うんだけど。 一回を関数に切り出して実行した場合、 一回のイテレーションが大体100回のループに収まるはずなのでザクザクおわります。 多分。 一回を関数に切り出して実行した場合、 一回のイテレーションが大体100回のループに収まるはずなのでザクザクおわります。 多分。 >>150 これは問題の設定がつまらないな。1〜20の中から10個を選んで元の集合を作るから、 結果に1個か2個の和しかほとんど現れず、集合の最初の方をパッと見ただけで 暗算でも分かってしまう。1〜5000の中から10個を選ぶ設定にすると、 結果がなしだったり、3個の和と4個の和だったり、2個の和と6個の和だったり、 変化に富んで面白くなる。https://ideone.com/kmihyT 例えば、リンク先にある 入力: [63, 70, 269, 949, 1337, 2670, 3538, 3764, 4183, 4320] 出力: Σ[3764, 4183] = Σ[63, 70, 269, 1337, 2670, 3538] = 7947 なんてパッと見では思いつかないから、コンピュータに探させる意義がある。 >>178 異様に早いなーと思ったら、言語にコンビネーションあるんかいな。 裏山シー。 サンプルだから人間が簡単に検証できるようにしてるんでしょ 普通それぐらいはわかりそうなもんだけど、>>165 みたいに項数だと思う奴とか>>178 みたいにイチャモンつける奴とか世の中広いわw >>180 そんなことは分かっているよ。だから、お題通りの1〜20の場合も>>157 でちゃんと回答した。 その上で、もっと面白い場合の追加を提案してみただけ。 https://ideone.com/52jcdq 全ての和を計算して並べ替えるだけ 多分最も愚直な方法 bit演算で面倒なことやってたけどpairっての使えば良かったのか >>150 https://ideone.com/tKvgv3 By PyPy、 ノーマルpythonでは力業の(N=20)が8秒くらいかな、 力業が 2^N * N 最小値だけなら、N*数列の合計 = N^2 * 数の平均(/2) ででる(みたい?) (自信ががないDP解) >>181 わかってたら > これは問題の設定がつまらないな。 なんていう物言いにはならんだろ >>187 夜中まで必死だな… 何に必死なのかよくわからんけどw 必死なのはお前だろ お前一人だけ日本語すらまともに読めてない馬鹿だって気づけよ 明け方からどんだけ必死なんだよ 以降、劣等感の塊のID:wE9bCkNRくんが全レスしてくれるってよ! こいつ少し上の方でレスバしてたアホやろ? さんざん馬鹿にされて悔しい思いしたから早朝にちょろっと顔出してるんやろ (sum[i].second & sum[i + 1].second) == 0 この比較はいらないのかな これが重なってるならより小さい重なってない組合せが必ず存在するか お題:2つの素数(2つは同じでもよい)の積で表される数は半素数と呼ばれる。 1万以下の半素数をすべて表示せよ。 int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,91}; ふるいで5000以下の素数を求めて 2重ループで列挙 が速いかな >>201 正解。Rでエラトステネスの篩を使って求めるプログラムを一応貼っておく。 https://ideone.com/anqKGW >>197 J (smoutput~ 2=#@q:)@>>:i.10000 4 6 9 10 ... 9991 9993 9995 9997 9998 問題の一区分である素数判定、並びに範囲内の素数列挙するコード https://ideone.com/fGT115 ~/bin/is_prime.exe 2 10000 とやれば1万までの素数が列挙され、 ~/bin/is_prime.exe 2017 と1つ引数与えればそれだけ判定 引数無いとURLの用にOFする限界付近まで全部 1万までの素数出して、それパイプで処理したら楽かなと思った >>197 お題:このお題の回答を論理式で表すとどうなるでしょうか。 出題者はいろんな言語の表記方法を知りたいだけか? 数学やアルゴリズム的には全然おもしろくないのばかり >>197 https://ideone.com/wVVsOF C++。>>205 の素数判定パクりました。楽すぎ。 と、思ったらこれ、俺の回答間違ってる。 >>210 お前が面白い問題出せばいいじゃん たぶん誰も解かないだろうけどwww ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる