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/

宿題は宿題スレがあるのでそちらへ。
0787785
垢版 |
2017/12/05(火) 02:32:35.27ID:LDxS5CId
>>786
問題勘違いしてました。素直にぐるぐる回すように修正しました。
https://paiza.io/projects/ncIY4LljeBahWZPJpd8ZPQ
下の「入力」タブの方にスペース区切りで b, c, d の値を1行づつ並べて入れてから実行させると「出力」に結果が出ます。
とりあえず >>768 に書いてある値を入力にセットしたところ出力は同じになりました。
0788デフォルトの名無しさん
垢版 |
2017/12/05(火) 20:55:13.95ID:vy+ohhoY
>>787
入出力の確認をしただけですが、今回は問題ないようです
paiza使うと簡単に確認できて便利ですね
0789デフォルトの名無しさん
垢版 |
2017/12/05(火) 21:48:50.31ID:32LsMTj+
>>768
僕の頭だとどうしても右端から左端に行くときの動きがイメージできないので、解答締め切ったあとでもいいのでちょろっと教えてもらえると嬉しいです
上3つまではわかるけどそこから先がそもそも答えにたどり着けない……
0791デフォルトの名無しさん
垢版 |
2017/12/06(水) 00:25:49.49ID:gvvJf1Ph
>>789
上の3つまでは分かるということなので、3つめのcの値を一つずつ増やしてみると、こんな感じになります
"7"、"78"、"789"、"7890"と並ぶ数値が増えていっているのが分かると思います
c+d の合計は9が最高なので、これ以上cを増やすにはdを減らさなくてはなりません
b = 7 c = 1 d = 5 a = 1273456890
b = 7 c = 2 d = 5 a = 2378456901
b = 7 c = 3 d = 5 a = 3478956012
b = 7 c = 4 d = 5 a = 4578906123

今度はcを2に固定して、dの値を一つずつ増やすと、こんな感じになります
"78"の並びが一つずつ右へずれていっているのが分かると思います
c+d の合計は9が最高なので、これ以上dを増やすにはcを減らさなくてはなりません
b = 7 c = 2 d = 1 a = 0123456978
b = 7 c = 2 d = 2 a = 8123456907
b = 7 c = 2 d = 3 a = 7823456901
b = 7 c = 2 d = 4 a = 2783456901
b = 7 c = 2 d = 5 a = 2378456901
b = 7 c = 2 d = 6 a = 2347856901
b = 7 c = 2 d = 7 a = 2345786901

こんな感じで分かるでしょうか?私も自分の頭で考えると混乱しますw
0792デフォルトの名無しさん
垢版 |
2017/12/06(水) 00:31:57.65ID:+0bHqE6f
自分の考え方は、配列の一部を切り取ってパッディングするんだけど、
まず配列を回転させて切り取る第0インデックスを配列の最初に持って来る。
すると、配列の後ろにはすでにパディングが終わった数列のができてる。
で切り取って削除して尻尾にくっつける。
で、さっき回した分を戻してやると完成。

という方法で、>>770を解いた。
0793デフォルトの名無しさん
垢版 |
2017/12/06(水) 00:32:05.18ID:+0bHqE6f
自分の考え方は、配列の一部を切り取ってパッディングするんだけど、
まず配列を回転させて切り取る第0インデックスを配列の最初に持って来る。
すると、配列の後ろにはすでにパディングが終わった数列のができてる。
で切り取って削除して尻尾にくっつける。
で、さっき回した分を戻してやると完成。

という方法で、>>770を解いた。
0795デフォルトの名無しさん
垢版 |
2017/12/06(水) 00:38:22.54ID:+0bHqE6f
C++は比較的不自由な言語なので頭使うのは鍛えられるよ。
パーツが少ないのでほとんど自作しないといけない。
0796デフォルトの名無しさん
垢版 |
2017/12/06(水) 00:46:18.89ID:DokUEpLm
コンパイルが必要とかでスクリプト系の言語より
使うことに不便があるかもしれないが、
できるアプリが自由で高速・軽量!

ライブラリもSTLやboost以外にも、探せば便利なのがいっぱい。
0797デフォルトの名無しさん
垢版 |
2017/12/06(水) 01:07:01.76ID:+0bHqE6f
よそのライブラリ使うとイデオンで動かないからなぁ。
まぁ、業務ではライセンスに合ったものを使えばいいよ。
0798デフォルトの名無しさん
垢版 |
2017/12/06(水) 02:01:03.49ID:QVT4XBLu
>>789
塊が移動すると考えれば良い。
例えば 7, 4, 2 だとすると、 789 と先頭の 0 が移動する塊だ。
で、ちょっと分かり易くするためにこの塊を伏せて * で書くとするとこうなる。

*123456***

それでこの塊を右に一つずらす。その時に1は食われて尻尾から吐き出される。

**234561**

移動量2なのでもう一回右にずらす。すると2が食われて尻尾から吐き出される。

***345612*

それでは * から 7890 に戻してみよう。

8903456127

できあがり。
0799デフォルトの名無しさん
垢版 |
2017/12/06(水) 02:58:25.26ID:+0bHqE6f
>>793
これ間違ってるな。
最後尻尾にくっつけるんじゃなくて、適所にインサートだった。
で戻す。
書いた日から時間たってるからすまん。
0801デフォルトの名無しさん
垢版 |
2017/12/06(水) 17:48:37.81ID:T95E7suL
log2だけど、これ使うといいらしいよ。分割統治法のBSA法というやつらしい。
2個ずつの積を繰り返すことで計算回数が減らせる。


{{1, a0}, {0, r}}*{{1, a1}, {0, r}}を[ [○,P], [○,Q] ]とおくと
r*P/Qはa0 + a1/rであり、

{{1, a0}, {0, r}}*{{1, a1}, {0, r}}*{{1, a2}, {0, r}}を[ [○,P], [○,Q] ]とおくと
r*P/Qはa0 + a1/r + a2/r^2。

上の式を実際に計算してみる。
http://www.wolframalpha.com/input/?i=%7B%7B1,+a0%7D,+%7B0,+r%7D%7D*%7B%7B1,+a1%7D,+%7B0,+r%7D%7D*%7B%7B1,+a2%7D,+%7B0,+r%7D%7D
0804デフォルトの名無しさん
垢版 |
2017/12/07(木) 09:24:10.80ID:XIHsqoOR
>>801でできるはずだ。やってみる
0806デフォルトの名無しさん
垢版 |
2017/12/07(木) 15:54:52.13ID:XIHsqoOR
804だけど考えてみたら面倒なんだな。
有理数(整数)で完全に求めてから割り算するのは時間かかりそうだから、
展開も、割り算も、有限で打ち切って求める精度がでるようにするのが普通?
0807デフォルトの名無しさん
垢版 |
2017/12/07(木) 18:15:20.36ID:wGY0QmnN
お題
辺の長さが10,000以下の整数である直方体について
すべての面の対角線も整数となるものを全て求める
0812デフォルトの名無しさん
垢版 |
2017/12/07(木) 21:26:37.34ID:5gbe7aWB
作ってみたけど、オッセ―。
なんか数学的にやらないとダメぽ。

>>810
検索したら出てきた。
ただのHYPODだった。
0820デフォルトの名無しさん
垢版 |
2017/12/07(木) 22:27:00.87ID:XIHsqoOR
>>801のように積へ変換した場合、どれ位の精度・桁数が必要なのか簡単にわからないな。
>>801でやると、誤差ありの巨大な数同士の掛け算になって、その結果誤差が拡大する。
和のままやると、適当に2ベキをかければ、各項の整数部分だけ計算すればよさそうだけど。
>>801は桁を十分にとったとしても、2進10桁以上の部分も計算途中で無視はできないか。
0821デフォルトの名無しさん
垢版 |
2017/12/07(木) 22:32:10.24ID:5gbe7aWB
グア。題意勘違いしてた。
直方体の対角線はいらんのか。うおー。
ばかばかー。
0823デフォルトの名無しさん
垢版 |
2017/12/07(木) 23:06:46.33ID:BdlZ1dXv
>>820
普通に、求めたい精度+α の精度を保てば十分かと
演算回数はlog(n)のオーダーなので
普通にlog(2)を求める時には使える手法
0825デフォルトの名無しさん
垢版 |
2017/12/07(木) 23:18:28.32ID:8ACt5G91
物体は表面だけでなく無数の内面を有するという考えは絶対に存在する
一方で全てを表面でしかとらえない人の存在も否定できない
0828デフォルトの名無しさん
垢版 |
2017/12/08(金) 12:45:22.72ID:lX5lg0SB
log2は>>801でもできそうだ。
積の先頭ほど精度が必要で、無視できる上限・下限を積の位置で可変にするか、
最初の積の計算で必要な精度をすべてに適用するかでいけそう。
0832デフォルトの名無しさん
垢版 |
2017/12/09(土) 02:59:25.21ID:C21Kkp0z
>>807
これでいいかな?
Kotlin で書いた。しかしpaiza.ioの制限なのか、何故か import kotlin.math.* がエラーだったので java.lang.Math の関数を使っている。
https://paiza.io/projects/ImbYdf3NSWgW-zj8Ke6cDw
0833デフォルトの名無しさん
垢版 |
2017/12/09(土) 09:05:25.04ID:WAlxvB4a
お題
10,000以下の三角形数をもとめる
0838デフォルトの名無しさん
垢版 |
2017/12/10(日) 00:50:34.10ID:J0bkBqjd
>>833
1+2+3+... だよね? じゃあこうだ。
perl -e '$i=0;$n=1;while(($i+=$n)<=10000){print"$i\n";++$n}'
0839デフォルトの名無しさん
垢版 |
2017/12/10(日) 00:52:24.37ID:J0bkBqjd
>>833
while じゃなくて for にするとこう。
perl -e 'for($i=0,$n=1;($i+=$n)<=10000;++$n){print"$i\n"}'
0840デフォルトの名無しさん
垢版 |
2017/12/10(日) 08:00:18.20ID:uc7Ht429
>833 R
cat(cumsum(0:140))
0841デフォルトの名無しさん
垢版 |
2017/12/10(日) 09:05:44.08ID:gZDGKqrG
>>801は精度管理の手間を考えたら、そのまま級数計算するのと大差ないと諦めたが。
こうすれば割り算の小数計算がほぼでないからいいのでは? 既に実装済?


an = 1/n、r = 2として、Σ an/r^n を定数C倍したやつの整数部分の取り出し。
C*anを再びanとおく。
Σ an/r^n
= a2/r^2 + a4/r^4 +・・・+ aN(2)/r^N(2) (添え字は2の倍数を動く)
+ a3/r^3 + a9/r^9 + a15/r^15 + ・・・+ aN(3)/r^N(3)
+ ap/r^p + ・・・+ aq/r^q + ・・・ (pは素数、qはp未満の数で割り切れないpの倍数)

= 1/N(2)r^N(2) * ( N(2)*a2*r^(N(2)-2) + ・・・ + N(2)*aN(2) ) + ・・

この分子部分は、各項、整数でそのまま計算しても>>801でも速くなるはず。
0842デフォルトの名無しさん
垢版 |
2017/12/10(日) 21:52:17.18ID:gZDGKqrG
>>841は添え字に被りが出ていて間違えてた。
0845デフォルトの名無しさん
垢版 |
2017/12/10(日) 22:22:45.57ID:gZDGKqrG
秒数ではCPU依存するから正確に比較できない。
掛ける2だけのループを10^10回するだけでも19秒では終わらない。
無料のideone codepadなどの実行可能時間以内にできる範囲とか、
ベースとなる簡単なコード、関数の何倍時間がかかるかなどだと比較できるけど。
084735歳
垢版 |
2017/12/11(月) 02:10:45.96ID:OsSLt9Cy
Bronze取りました
084835歳
垢版 |
2017/12/11(月) 02:11:34.08ID:OsSLt9Cy
Bronze取りました
0850デフォルトの名無しさん
垢版 |
2017/12/11(月) 05:19:34.19ID:zs4BBX0s
あ、ちなみにideoneの結果は間違っている
多分スタックオーバーフローしている
100, 50, 0の場合は答えは100
0852デフォルトの名無しさん
垢版 |
2017/12/11(月) 05:45:19.55ID:pBTqvDfH
ところで、いくらメモ化してても5回しか呼ばれないってことがあるのか?って気はする。
0854デフォルトの名無しさん
垢版 |
2017/12/11(月) 07:09:30.00ID:pBTqvDfH
あら、コンパイルエラーになっちゃった。
VCだと通ったんだけど。もちろんステップ数とか設定はいじってるが。
0856デフォルトの名無しさん
垢版 |
2017/12/11(月) 12:03:51.37ID:uZdMj4Ux
お題
6つの辺の長さが 与えられた4面体の体積を求める
0866デフォルトの名無しさん
垢版 |
2017/12/11(月) 22:30:10.81ID:pBTqvDfH
>>861
ウチはi6700メモリ8Gだな。20秒くらいボケーっとしてたらコンパイル完了する。
実実行より全然早い。
0868デフォルトの名無しさん
垢版 |
2017/12/12(火) 00:19:40.23ID:JpJzeAvs
>>866
悪い
VCで /constexpr:steps 1000000を付けてコンパイルしたら4秒ほどでコンパイルが終わった
多分/MPも付けてるからだと思う
実行結果は25になった

gcc 7.2.0 64bitだとどんどんメモリを食って行って最後にスラッシングが起きる
馬鹿正直な実装をしているからかも知れないね

VCの方がいろいろとメモリを食わないように工夫されてるのかも

Clangでも/constexpr:steps は -fconstexpr-steps という形でサポートされてるようだから
多分行けると思う
メモリ64G積んでるし
0869デフォルトの名無しさん
垢版 |
2017/12/12(火) 01:27:56.58ID:qpuoD4bc
>>868
いいマシーンだな。
まぁ、ウチはあれくらいで資源尽きちゃうけど、メモリ64Gもあったらもっと行けるな。
気が向いたらどうぞ。
0871デフォルトの名無しさん
垢版 |
2017/12/12(火) 22:52:21.86ID:38dJ/vud
以下のURLのように、同じ色の点同士をつなぐゲームがある。
https://play.google.com/store/apps/details?id=com.bigduckgames.flow

N×Mの2次元配列が与えられる。配列の各要素は半角英字('a'-'z')または'*'である。
半角英字は色付きの点を表し、'*'は空のマスを表す。
'*'以外の文字は、配列中に必ず2個ずつ存在する。

このパズルの解を一つ出力せよ。
・'-'は左右のマスをつなぐ
・'|'は上下のマスをつなぐ
・'.'はマスをつながない

解がない場合は"No solution"と出力せよ。

[input]
***rg
**bg*
r****
ob*yo
****y

[output]
*-*-*-r.g
|.......|
*.*-b.g-*
|.|......
r.*.*-*-*
..|.|...|
o.b.*.y.o
|...|.|..
*-*-*.*-y
0872デフォルトの名無しさん
垢版 |
2017/12/15(金) 09:30:54.91ID:gDuLBiTf
>>841
やってはないけど、そもそもこれ間違ってるのと、同じような発想でやるとしても
全ての素数での分類ではなく、3分割くらいのほうが効率がいいのと、
Σ (2の倍数) + Σ (3の倍数かつ2の倍数でない) + Σ (2と3で割り切れない) 
分割する事もなく、N項の和だとしたらNの階乗か分数をなくせる最小公倍数かけてもいい。それだと掛け算もしくは割り算がいくつも出てくるが。
0873デフォルトの名無しさん
垢版 |
2017/12/16(土) 14:04:43.43ID:+Cq6iaDY
>>871
等幅フォントで表示しているエディタにコピペしてようやっと何を言わんとしているか分かった。
それってマスとマスの間に - または | を入れて繋ぐってことでいいんだよね? で、つながない所がピリオドだと。
(まあ等幅フォントのASCIIでやるならそれしか方法ないとは思うけど)。
0874デフォルトの名無しさん
垢版 |
2017/12/16(土) 14:07:59.25ID:+Cq6iaDY
しかしピリオドは

**
**

の時に

*.*
...
*.*

のようになって中央のピリオドが本来なら不要なものになるわけだが、それはスペースでなくても良いのかな?
まあただの幅合わせだからどうでもいいものではあるが。
0875デフォルトの名無しさん
垢版 |
2017/12/17(日) 12:04:31.10ID:V69L7+t+
>>801 の方法で出来ると書いてるけど
結局誰もやってないのか

個人的には(高速には)出来ないと思っている
0877デフォルトの名無しさん
垢版 |
2017/12/17(日) 17:50:05.54ID:3PMrWzl3
無理に線引かないでrだのgだので埋めた方がわかりやすいと思うがな
すべてのマスを埋めなければならないルールが抜け落ちてるみたいだから
実は別物のゲームで交差があるとかなったらそうはいかないが
0878デフォルトの名無しさん
垢版 |
2017/12/17(日) 20:33:27.61ID:0HU8GFa9
ブレゼンハム的なやつって、始点と傾き(と区間や境界等で決まる明示されない終点)が
与えられた際に、終点座標を求めてから始点に向かうのってアリなんだろうか?
0879デフォルトの名無しさん
垢版 |
2017/12/18(月) 08:21:39.40ID:T+ClDj4W
ここでやるには問題がでかすぎ
100分割してほしい
0882デフォルトの名無しさん
垢版 |
2017/12/21(木) 15:58:54.33ID:jrnuCabF
訂正
ただし解は1つでありかつ線が通らないマスは無いことを前提とする
ではなく
解が存在すればすべての解は全てのマスを通ることを前提とする
0883デフォルトの名無しさん
垢版 |
2017/12/22(金) 19:30:58.88ID:PPoMR9m8
お題
22の分割(たとえば3+3+5+8)のうち
分割したそれぞれの数の逆数の和が1になるものを求める
0884デフォルトの名無しさん
垢版 |
2017/12/22(金) 19:39:05.90ID:PPoMR9m8
早速間違えましたすみません
3 +5 +6 +8
でした
0885デフォルトの名無しさん
垢版 |
2017/12/22(金) 20:06:25.02ID:FRcsVGN9
>>883 ruby
f=->n,k{n==1?[[k]]:(1..k/n).flat_map{|i|f[n-1,k-i].map{|j|[i,*j].sort}}.uniq}
(1..22).each{|i|f[i,22].each{|a|p a if a.map{|e|1r/e}.sum==1}}

#=>[2, 4, 8, 8]
[2, 5, 5, 10]
[3, 3, 4, 12]
■ このスレッドは過去ログ倉庫に格納されています

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