プログラミングのお題スレ Part16

■ このスレッドは過去ログ倉庫に格納されています
2019/11/17(日) 09:00:22.10ID:xqEdXdr6
プログラミングのお題スレです。

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

2 名前:デフォルトの名無しさん
  >>1 使用言語
  回答本文
  結果がある場合はそれも

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

宿題は宿題スレがあるのでそちらへ。

※前スレ
プログラミングのお題スレ Part15
http://mevius.5ch.net/test/read.cgi/tech/1564310397/
2019/12/07(土) 05:38:25.75ID:GrS1V5od
もう少し例を載せるべきでした。
すいません。

例えば
>>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)
2019/12/07(土) 06:50:35.03ID:HQTo5ewj
>>155
なるほど、概ね理解した
157デフォルトの名無しさん
垢版 |
2019/12/07(土) 09:57:16.56ID:WrheNqRo
>>150
取り敢えずRで力任せ。これでも瞬時に終わるので工夫の必要なし。
https://ideone.com/pCp36v
158デフォルトの名無しさん
垢版 |
2019/12/07(土) 15:33:28.08ID:WrheNqRo
実は>>157は「残った整数の集合から」の条件を忘れていて、元の集合から抜き出すと
勘違いして書いてしまったプログラム。

が、改めて条件を考えてみると、既に抜き出された数と同じものを選んでしまうのは、
「片方の部分集合の要素が2個以上で、もう片方の部分集合の要素が3個以上の場合」(A)
に限られる。例えば、2+9=11と2+3+6=11。この場合、2回選んでしまった2を取り除いた
部分集合は、和9=9と3+6=9が11より小さく、かつ(A)の場合に該当しないので2回選んで
しまった数は存在しない。

だから結局、>>157のプログラムのままで正解が得られることになる。
159デフォルトの名無しさん
垢版 |
2019/12/07(土) 16:28:15.65ID:tj55yZgB
へなへななお題へなへなな回答
2019/12/07(土) 20:45:08.83ID:HU7sPj+p
>>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通りあった
数が与えられたとき何通りの分け方があるかどうやって計算するのか考えてたけど
そんな簡単な問題ではないようだった

とりあえず数が与えられたら上の例のように全ての分け方を列挙する
というのを問題としてみる
161デフォルトの名無しさん
垢版 |
2019/12/07(土) 22:36:30.68ID:WrheNqRo
>>160
Rでお決まりの再帰呼び出し。
https://ideone.com/LkPChG
2019/12/07(土) 23:22:48.98ID:eT8T+vHJ
分割数でググれば考え方いっぱい出てくるよ
2019/12/08(日) 13:36:47.70ID:jvur7pXC
>>160
C++
https://ideone.com/QVywdv
2019/12/08(日) 13:57:09.43ID:FOSx0Jk/
>>154
最後の文はどこから出てきたの?
2019/12/08(日) 13:58:38.12ID:xElyalHo
>>164
元のスレ
2019/12/08(日) 14:21:04.90ID:FOSx0Jk/
しらんがな
2019/12/08(日) 14:22:15.55ID:FOSx0Jk/
その制限が無い方がアルゴリズムとしておもしろい
制限があるとつまらなすぎる
2019/12/08(日) 17:19:46.37ID:xElyalHo
知らんがなって
なら聞くなアホ
2019/12/08(日) 17:53:26.22ID:FOSx0Jk/
すまん

不満は>>150に言ったつもり
そんな重要な事を省略すんなって
2019/12/08(日) 19:17:22.87ID:DgjgjjxW
別に項数の制限はつけていませんよ
「項数の制限が無い」という事を省略したのに怒っているのならすいません。
ですが制限があるのなら普通に問題文に加えますし、別に書くほどの事では無いかな〜と
2019/12/08(日) 19:37:55.14ID:KCeBLlvA
>>150
https://ideone.com/OJyvxF
C++。総当たりです。スカイレークのi7で12秒くらいかかります。
久しぶりにまじめに総当たりを書いた気がしました。
2019/12/08(日) 19:44:34.35ID:KCeBLlvA
>>150
https://ideone.com/p6FUh4

オマケで、答えが見える版を置いておきます。C++。
2019/12/08(日) 20:22:49.16ID:KCeBLlvA
ちなみにオーダーは大体O(N!)位です。(笑
2019/12/08(日) 20:35:11.71ID:KCeBLlvA
ギャグですけど、並列化は比較的簡単なのでそれで時間短縮はできます。
底の値をシェアードにすると早く終わります。Nになってると思うんだけど。
2019/12/08(日) 20:48:51.01ID:KCeBLlvA
一回を関数に切り出して実行した場合、
一回のイテレーションが大体100回のループに収まるはずなのでザクザクおわります。
多分。
2019/12/08(日) 20:49:16.37ID:KCeBLlvA
一回を関数に切り出して実行した場合、
一回のイテレーションが大体100回のループに収まるはずなのでザクザクおわります。
多分。
2019/12/08(日) 20:59:32.19ID:KCeBLlvA
ぐあ、重複した・・・。
178デフォルトの名無しさん
垢版 |
2019/12/08(日) 21:17:04.79ID:FKbRmDMb
>>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

なんてパッと見では思いつかないから、コンピュータに探させる意義がある。
2019/12/08(日) 21:27:36.39ID:KCeBLlvA
>>178
異様に早いなーと思ったら、言語にコンビネーションあるんかいな。
裏山シー。
2019/12/08(日) 22:01:27.05ID:h14g0YSH
サンプルだから人間が簡単に検証できるようにしてるんでしょ
普通それぐらいはわかりそうなもんだけど、>>165みたいに項数だと思う奴とか>>178みたいにイチャモンつける奴とか世の中広いわw
181デフォルトの名無しさん
垢版 |
2019/12/08(日) 22:35:33.47ID:FKbRmDMb
>>180
そんなことは分かっているよ。だから、お題通りの1〜20の場合も>>157でちゃんと回答した。
その上で、もっと面白い場合の追加を提案してみただけ。
2019/12/09(月) 00:06:03.91ID:QbXWD96q
>>150
N!より速い方法ある?
2019/12/09(月) 00:53:44.24ID:rq2SBWAq
>>182
動的計画法?
2019/12/09(月) 01:15:42.30ID:2eMu76Ef
https://ideone.com/52jcdq
全ての和を計算して並べ替えるだけ
多分最も愚直な方法
2019/12/09(月) 01:57:50.57ID:2eMu76Ef
bit演算で面倒なことやってたけどpairっての使えば良かったのか
2019/12/09(月) 02:04:04.39ID:vzskLW//
>>150 https://ideone.com/tKvgv3

By PyPy、 ノーマルpythonでは力業の(N=20)が8秒くらいかな、

力業が 2^N * N

最小値だけなら、N*数列の合計 = N^2 * 数の平均(/2) ででる(みたい?)
(自信ががないDP解)
2019/12/09(月) 02:51:44.21ID:ElWitvQQ
>>180
日本語が読め無い馬鹿発見
2019/12/09(月) 04:54:54.63ID:wE9bCkNR
>>181
わかってたら
> これは問題の設定がつまらないな。
なんていう物言いにはならんだろ

>>187
夜中まで必死だな…
何に必死なのかよくわからんけどw
2019/12/09(月) 05:00:22.33ID:ElWitvQQ
必死なのはお前だろ
お前一人だけ日本語すらまともに読めてない馬鹿だって気づけよ
2019/12/09(月) 06:12:33.29ID:wE9bCkNR
うわっ、アホが無駄に絡んできたよw
2019/12/09(月) 06:42:21.59ID:QCNDYaVq
明け方からどんだけ必死なんだよ
以降、劣等感の塊のID:wE9bCkNRくんが全レスしてくれるってよ!
2019/12/09(月) 06:46:34.43ID:PLlkWb6P
こいつ少し上の方でレスバしてたアホやろ?
さんざん馬鹿にされて悔しい思いしたから早朝にちょろっと顔出してるんやろ
2019/12/09(月) 07:23:51.05ID:RwnUxfkW
単芝ガイジ君、情けなさ過ぎて草
2019/12/09(月) 12:30:02.62ID:G+LM1RHL
>>192
自己紹介乙ww
2019/12/09(月) 15:19:21.58ID:gONUrOAf
https://ideone.com/aYEPpX
C++面白いな
2019/12/09(月) 15:48:30.74ID:gONUrOAf
(sum[i].second & sum[i + 1].second) == 0
この比較はいらないのかな
これが重なってるならより小さい重なってない組合せが必ず存在するか
197デフォルトの名無しさん
垢版 |
2019/12/09(月) 21:07:53.73ID:l5WymCFL
お題:2つの素数(2つは同じでもよい)の積で表される数は半素数と呼ばれる。
1万以下の半素数をすべて表示せよ。
2019/12/09(月) 21:20:18.06ID:QbXWD96q
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};
2019/12/09(月) 21:22:25.12ID:QbXWD96q
91じゃなかった
2019/12/09(月) 21:29:40.49ID:ZryjKmS+
>>197
https://mevius.5ch.net/test/read.cgi/tech/1434079972/
2625個、でしょうか?
2019/12/09(月) 21:35:00.48ID:ZryjKmS+
やりなおします
>>197
https://mevius.5ch.net/test/read.cgi/tech/1434079972/62
2625個
2019/12/09(月) 22:42:10.29ID:QbXWD96q
ふるいで5000以下の素数を求めて
2重ループで列挙

が速いかな
203デフォルトの名無しさん
垢版 |
2019/12/09(月) 22:48:18.91ID:l5WymCFL
>>201
正解。Rでエラトステネスの篩を使って求めるプログラムを一応貼っておく。
https://ideone.com/anqKGW
204デフォルトの名無しさん
垢版 |
2019/12/10(火) 06:55:28.37ID:cIwr+d9F
>>197 J

(smoutput~ 2=#@q:)@>>:i.10000

4
6
9
10
...
9991
9993
9995
9997
9998
2019/12/10(火) 07:06:32.14ID:qBy9puuu
問題の一区分である素数判定、並びに範囲内の素数列挙するコード
https://ideone.com/fGT115
~/bin/is_prime.exe 2 10000
とやれば1万までの素数が列挙され、
~/bin/is_prime.exe 2017
と1つ引数与えればそれだけ判定
引数無いとURLの用にOFする限界付近まで全部


1万までの素数出して、それパイプで処理したら楽かなと思った
2019/12/10(火) 08:49:47.69ID:92MPgAr5
5000までの素数で十分だって言ってるのに
207デフォルトの名無しさん
垢版 |
2019/12/10(火) 09:32:39.88ID:WOcT9SPT
>>197
お題:このお題の回答を論理式で表すとどうなるでしょうか。
2019/12/10(火) 09:53:12.04ID:gKYhlG5V
>>207
それはプログラミングのお題なのか?
209デフォルトの名無しさん
垢版 |
2019/12/10(火) 13:07:12.61ID:bINIS1ks
また数(ry
2019/12/10(火) 13:10:37.69ID:FDwwVytW
出題者はいろんな言語の表記方法を知りたいだけか?
数学やアルゴリズム的には全然おもしろくないのばかり
2019/12/10(火) 15:09:39.15ID:zIz8I18p
>>197
https://ideone.com/wVVsOF
C++。>>205 の素数判定パクりました。楽すぎ。
と、思ったらこれ、俺の回答間違ってる。
2019/12/10(火) 15:15:40.70ID:zIz8I18p
>>197
https://ideone.com/1Vax7p

C++。こうかいな。
213デフォルトの名無しさん
垢版 |
2019/12/10(火) 16:37:43.07ID:hI+yeapE
>>210
お前が面白い問題出せばいいじゃん
たぶん誰も解かないだろうけどwww
2019/12/10(火) 17:22:00.22ID:Ajx0JUvY
過去スレからお題引っ張りたいんだけど、有料会員じゃないからむりぽ
2019/12/10(火) 17:45:48.68ID:qBy9puuu
2chscとかいうのが無料サルベージに向いていると聞いたことがある
216デフォルトの名無しさん
垢版 |
2019/12/10(火) 17:47:09.91ID:ClyY78bX
>>214
普通のブラウザで見ても出ないんだっけ?
2019/12/10(火) 18:57:11.15ID:W3sLZ8lM
>>213
問題を出して人に解かせるのはあまり好きじゃない
解く方が好き
2019/12/10(火) 19:01:43.67ID:W3sLZ8lM
過去の良問があればおしえろください
2019/12/10(火) 19:30:15.36ID:Ajx0JUvY
>>216
見れた( ゚Д゚)
220デフォルトの名無しさん
垢版 |
2019/12/10(火) 20:07:19.37ID:ClyY78bX
>>219
そうか。普通のブラウザだとエロ広告が激しく付くからそれで過去スレ見せる料金なんとかしてるのかもね。

>>217
そんなあなたにとっておきのお題をひとつ。

お題: 面白いお題を作れ。
2019/12/10(火) 20:25:27.92ID:6QYDHDQi
じゃあ四角形を全部違う大きさの円で埋める
2019/12/10(火) 21:05:07.05ID:0RQ6ozIG
>>207
答えは高々有限個の整数でしかないんだから論理式にはならない
223デフォルトの名無しさん
垢版 |
2019/12/10(火) 22:54:03.68ID:ZImsJVBi
>>210
まあ、そんな所だね。このスレは競技プログラミングじゃないから、アルゴリズムや
パフォーマンスの追求よりは、各自が使う言語で楽な書き方ができるのを披露する方が多い。
>>203も可変長ベクトルへの再代入の繰り返しという非効率なことをやっているが、
自前のforループ不要で簡潔に書けるし、篩い落とす操作を忠実に表してもいる。
昔と違ってこれでも実用な速度で動くので、色々な書き方ができるようになった。

C#, Julia, PowerShellでも類似の書き方ができる(>>206の通り素数は5000までにした)。
C# https://ideone.com/YWc3f8
Julia https://ideone.com/8NdOe3
PowerShell https://ideone.com/DRoOMU
R https://ideone.com/34lnNQ

C#のstatic void Main()の中だけを抜き出したC#スクリプトも作って、それぞれの実行時間を
PowerShellの

measure-command {semiprime.exe}
measure-command {csi semiprime.csx}
measure-command {julia semiprime.jl}
measure-command {semiprime.ps1}
measure-command {rscript semiprime.R}

で計測すると、C#を1倍として、R 3.40倍、C#スクリプト 10.1倍、Julia 16.6倍、
PowerShell 199倍となった。PowerShellだけは延々と待たされ実用的でない。
他の4つはすぐに終わるが、右へ行くほどややもたつく。Rは遅いと言われているが、
スクリプト言語の中ではかなり速い。
224デフォルトの名無しさん
垢版 |
2019/12/10(火) 22:54:55.70ID:ZImsJVBi
>>217
じゃあ、これ解いてみる?

整数x, y, z, kに関する方程式x^3 + y^3 + z^3 = kの解を、k = 1から100までの場合について求めよ。
https://engineer.fabcross.jp/archeive/190921_charity-engine.html
2019/12/10(火) 23:25:26.63ID:qBy9puuu
k = 64, z = 4の時
任意の整数 を+-反転した組が x,yの解であり、その個数は無限
2019/12/10(火) 23:27:52.24ID:W3sLZ8lM
なぜ
k=1, z=1
じゃない?
2019/12/10(火) 23:47:24.77ID:qBy9puuu
あとから追加されそうな条件の
仮に全部0以上の整数とした時に
5*5*5>125,100>4*4*4のメモ代り
2019/12/10(火) 23:59:19.26ID:RjwvfByt
k=1から100のどれかに対してじゃなくて、
k=1から100のそれぞれすべてに対して求めるんじゃろ…
2019/12/11(水) 00:11:02.49ID:10jfhd7e
https://ideone.com/WP5jkx

10000000以下で0.04秒
C++は速い!
2019/12/11(水) 00:13:04.91ID:10jfhd7e
C#の10000以下より速い!
2019/12/11(水) 00:30:48.20ID:10jfhd7e
>>224
k=1の時からいきなり難しいなあ
2019/12/11(水) 00:40:32.37ID:10jfhd7e
>>224
ん?
解を全て求めるのではなく
各kに対して1個解を求めればいいの?
233デフォルトの名無しさん
垢版 |
2019/12/11(水) 09:11:06.45ID:aadkbL3F
>>197 seq, factor, awk

seq 10000 | factor | awk 'NF == 3'
234デフォルトの名無しさん
垢版 |
2019/12/11(水) 09:24:12.51ID:ztpKOEip
>>233
awkのとここれどういう意味?わたし女騎士だけど教えて!
235デフォルトの名無しさん
垢版 |
2019/12/11(水) 10:31:05.38ID:dG8VWZ74
>>234
女騎士?

まあいいや。NFが3になる行だけ出力するんだよ。NFはフィールド数ね。
区切り文字がデフォルトのままだと空白文字で区切った時の個数。例えば行に a b c って入ってたら 3 になる。
236デフォルトの名無しさん
垢版 |
2019/12/11(水) 12:05:48.97ID:dG8VWZ74
>>197
Kotlin
https://paiza.io/projects/6zHoXJXw1KuNLWZViVDYug
2019/12/11(水) 13:38:08.03ID:ivhCTlPt
>>233
素因数分解しちゃえばいいのか
サイコー
238デフォルトの名無しさん
垢版 |
2019/12/11(水) 13:42:56.98ID:QbvBtpFM
>>233
やってみたら
--- Data stack:
って出力が10000行並ぶだけなんだけど…
なんかオプションいる?
2019/12/11(水) 14:03:27.78ID:jagg9gKF
普通にできたけど
何のシェル使ってるの?
240デフォルトの名無しさん
垢版 |
2019/12/11(水) 14:35:31.47ID:QbvBtpFM
bash。macで。
2019/12/11(水) 14:38:38.09ID:jagg9gKF
俺もbashもだけど
seq 100くらいなら動くの?
242デフォルトの名無しさん
垢版 |
2019/12/11(水) 15:36:13.32ID:QbvBtpFM
$ seq 3 | factor で止めてawk飛ばすと以下の出力です。
Factor 0.98 x86.64 (1886, heads/master-211d69561a, Jul 2 2018 17:46:19)
[Clang (GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29))] on macosx
IN: scratchpad
--- Data stack:
1
IN: scratchpad
--- Data stack:
1
2
IN: scratchpad
--- Data stack:
1
2
3
IN: scratchpad
2019/12/11(水) 16:49:11.52ID:1E1+DBtw
>>233
約数が3個な数を列挙ってこと?
4の約数は1,2,4の3個だけど
6の約数は1,2,3,6の4個だよ
2019/12/11(水) 17:02:16.44ID:hUZCfnLs
factorみりゃわかんだろ……
素因数の数だっつーの
2019/12/11(水) 18:01:04.84ID:10jfhd7e
素因数の数が3?
2019/12/11(水) 18:12:47.35ID:ivhCTlPt
こんな具合だろ
seq 100 | ~/bin/factorization.pl| awk -F, "NF==2" | ~/bin/align.pl "=" 4 2,2
6 2,3
9 3,3
10 2,5
14 2,7
......
9995 5,1999
9997 13,769
9998 2,4999
2019/12/11(水) 19:33:15.23ID:ReYSFEXH
>>224
とりあえず7個を除いて出来た
ここからが長いのかな?
2019/12/11(水) 19:46:53.70ID:6E3wj7zP
>>243
そうそう、それに
8 の約数は 1, 2, 4, 8 の 4 個だけれども、これは >>197 のいう半素数ではないんですよね

>>233 は間違っていますね
249デフォルトの名無しさん
垢版 |
2019/12/11(水) 20:44:53.42ID:WjX/lCwK
QZがそういうなら合ってるんじゃないの?
2019/12/11(水) 20:51:31.74ID:7CYZ1E2N
反面教師?
2019/12/11(水) 20:54:12.94ID:7CYZ1E2N
お題
1兆以下の半素数の個数を求めよ

これだとスクリプト系は無理かな?
2019/12/11(水) 21:07:14.36ID:ivhCTlPt
素数判定で書いた
long long int のC言語でも100億ぐらいを上限でサポートしてる
100億以上の判定は遅くてより優れた判定アルゴリズムが必要だからだ

推定:C系、優れた判定、現代スペックのPCが必要
2019/12/11(水) 21:11:52.35ID:7CYZ1E2N
素数判定する必要は無いよ
2019/12/11(水) 22:08:07.74ID:6E3wj7zP
>>252
>long long int のC言語でも100億ぐらいを上限でサポートしてる

極めて不正確ですよ
C99 後は uint64_t の最大値は 1844'6744'0737'0955'1615=約 1844 京ですね
それに実際に割ってみる方法以外には素数判定があるとでも?そんなものは存在しませんね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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