1 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 18:28:20.99 ID:cuIcFT6k.net] 公式 https://www.rust-lang.org/ https://blog.rust-lang.org/ https://github.com/rust-lang/rust Web上の実行環境 https://play.rust-lang.org 日本語の情報 https://rust-jp.rs/ ※Rustを学びたい人はまず最初に公式のThe Bookを読むこと https://doc.rust-lang.org/book/ ※Rustを学ぶ際に犯しがちな12の過ち https://dystroy.org/blog/how-not-to-learn-rust ※Rustのasyncについて知りたければ「async-book」は必読 https://rust-lang.github.io/async-book/ ※C++との比較は専用スレへ C++ vs Rust https://mevius.5ch.net/test/read.cgi/tech/1619219089/ ※次スレは原則>>980 が立てること 前スレ Rust part14 https://mevius.5ch.net/test/read.cgi/tech/1644596656/
101 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:08:20 ID:bcZKOTNR.net] 大きいフィールドを持つ型には、Copyは実装しないだろうし普通はCopy/Moveのコスト差を気にすることなくない? どちらにすべきかボーダーが難しいことはありそうだけど
102 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:14:11 ID:P5Km+xQv.net] >>94 データフローを見直して単純に消せるclone/copyは消せってことか? それこそ今更すぎるわ 単純に消せないところまで消した後、さらにパフォーマンス改善するにはどうするかってことで、参照の話か?って聞いたんだけど どこの誰とも知れないやつのフィボナッチのコードに対する指摘をされても知らねーよ 問題があって対策が分かってるなら自分で直すがいい
103 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:41:25.51 ID:4GWzufxp.net] >>97 実行回数の話だったのかよww まさかねw
104 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:56:39.00 ID:HgdHe2aE.net] >>101 フィボナッチの件はBigIntなど非Copyも対象で今回の話は全く無関係だろ そこを区別できていないのは相当ヤバいぞ
105 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:12:27.72 ID:BE/QrV8J.net] 流れからすると本当はジェネリックのフィボナッチにCopyを付けないほうが有利と主張したかったんじゃね? でも後から回避できないことに気づいて苦しい言い訳を重ねてるだけと見た
106 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:21:27.45 ID:6swlbHlO.net] >>85 根拠も示さず批判だけする一番アカン人間やな
107 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:33:04.08 ID:6hDwlDoy.net] >>104 フィボナッチはCopyを回避できないものなの?
108 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:45:43.18 ID:2HNq06l+.net] 分からないなら分からないから教えてって言えばいいのに意地を張るからこうなる 構えば構うほど意味不明な発言が出てくる 真面目に議論したいならせめてIDコロコロ変えるのやめな
109 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 09:10:15.39 ID:Gy2qdhBc.net] フィボナッチってこれだろ f(0) = 0 f(1) = 1 f(n) = f(n - 1) + f(n - 2) 関数呼び出しに足し算に大量のコピーは避けられない
110 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 09:28:25.87 ID:3vPi03ro.net] >>87 async関数やasyncブロックで生成されるFutureは結構大きくなることがあって、boxingした方が性能出るケースもある
111 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:05:07.09 ID:jV65BxdQ.net] >>106 型制約からCopyを外すこことcopyを回避することは全く意味が違う >>83 の質問は明らかに後者 プリミティブも対象になるフィボナッチでcopyを回避するのは無理
112 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:20:40.09 ID:AWXqkW+Q.net] >>110 型制約からCopyを外せばプリミティブと言えどもcopyされなくなる 具体的には個々のプリミティブ型へモノモーフィゼーゼーションされる前の段階でCopy実装していない型に対してのcopy発生エラーが生じる フィボナッチでcopyを回避するのは可能
113 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:38:43.35 ID:2JRtSvHV.net] 複オジの主張まとめ(1) 37, 39, 44 ===== CopyやCloneを使っているから別問題だろう。 一般的にRustのプログラミングでは、 Copy(暗黙的な自動コピー)やClone(clone()による明示的な手動コピー)を使うと楽になるが、コストは高くなる。 そのため不要なclone()を見極めてそれを回避するプログラミングが出来るかどうか、というRustにおける根源的な話だろう。 もちろんCopyは最もコストが高い。 個々のコスト自体は通常clone()と同じだが、常に自動的にclone()が起きるため最もコストが高くなる。 Copyはコストが一番高いから出来る限り避けるべきだな 特にヒープを使うならCloneまでにしておくべき 可能ならばCloneも避けるべきだが
114 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:39:05.95 ID:2JRtSvHV.net] 複オジの主張まとめ(2) 50, 52, 57 ===== それは理解不足すぎるぜ 大文字のCopyはCopyトレイトを意味しCopyトレイトを実装するか否かの話だろ moveは別方向の話であり比較対象にすらならない 比較するならば「Copy実装(必然的にClone)も実装」「Cloneのみ実装」「どちらも実装なし」の3つだな デタラメすぎ ムーブでビットパターンのコピーは発生しない ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる Copyのコピーはディープであって高コスト これだけCopyやCloneを理解していない連中が多い状況だと >>30 の質問に答えられるかどうかは最低限クリアすべきテストとして有用ではないか? フィボナッチ自体はもちろんどうでもよい話だがCopyやCloneを避けるRustの基本ができるかどうかわかる点で
115 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:41:41.09 ID:2JRtSvHV.net] 複オジの一連の主張を読んでから>>83 の複オジ質問を読むべし
116 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:44:21.46 ID:Jso4/z1R.net] 複おじに反応するやつも複おじ
117 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:52:26.71 ID:j9G6SOiS.net] 主張が毎回変わる 口調も毎回変わる 表記も毎回変わる 間違いなく多重人格者
118 名前:デフォルトの名無しさん [2022/05/18(水) 10:55:48.57 ID:TXrPyH7a.net] >>98 この文脈では○○にはなんでも当てはまるから意味がないよね 以下なら議論になる? A「copy/cloneはmoveよりコストが生じるので、copyが必要な部分とそうでない部分で構造体を分離してでも出来るだけmoveを使用する」 B「copy/cloneのコストはmoveよりコストが生じるとは限らないので、一部でもcopyが必要な部分がある構造体は丸ごとcopyして構わない」
119 名前:デフォルトの名無しさん [2022/05/18(水) 11:00:11.80 ID:TXrPyH7a.net] >>116 そこまでいったらネット上では別人で良いだろ
120 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:05:55.27 ID:f/6XNiB/.net] >>108 やってみた fn main() { for n in 0..100 { let f = f(n); println!("f({n}) = {f}"); } } fn f(n: i32) -> i32 { match n { 0 => 0, 1 => 1, n => f(n - 1) + f(n - 2), } } このあたりから非常に重くなった f(43) = 433494437 f(44) = 701408733 f(45) = 1134903170 f(46) = 1836311903 f(47) = -1323752223 f(48) = 512559680
121 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:24:29.81 ID:Rx65yaNy.net] メモ化されてないんやから遅くなるのは当然 >>108 は定義を示しただけちゃう?
122 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:25:30.07 ID:Rx65yaNy.net] つかオーバーフローしとるな
123 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:29:30.10 ID:e0i+LLok.net] >>119 そのコードだとcopyは何回くらい発生してるのだろう 0回?1回?2回?3回?たくさん?
124 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 12:13:31 ID:QV9C5cPM.net] ぼくのかんがえたさいきょうのcountup<T>()をみんなバカにしたので ぼくのかんがえたさいきょうのfibonacchi<T>()でやっつけようとしたら わざをだすまえにボコボコにやられてしまいました く、くやしいです!
125 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 13:41:52 ID:mX15beFi.net] clone()が一個でコンパイル通ったからそのコードでのコピーは一回ではないか use std::ops::{Add, Sub}; fn f<T>(n: T) -> T where T: Clone + PartialEq + TryFrom<usize> + Add<Output=T> + Sub<Output=T> { let [zero, one, two] = [0, 1, 2].map(|n| T::try_from(n).ok().unwrap()); match n { n if n == zero => zero, n if n == one => one, n => f(n.clone() - one) + f(n - two), } }
126 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 13:50:00 ID:FQ8O/3lA.net] >>119 計算量はO(n), メモリ使用量は定数オーダーにできるのになんで定義どおり実装したの?
127 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 14:41:04.77 ID:xTux5YG/.net] >>123 ぼくのかんがえたさいきょうのfizzbuzz<T>()もわすれないで
128 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 15:04:45.49 ID:dI/aN4vs.net] >>125 そんな魔法はありません
129 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 16:48:40.40 ID:pQAvghMm.net] >>127 え?
130 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 17:53:48.13 ID:jsK0MVuh.net] Rust以前の問題じゃん スレ違い
131 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 23:22:25.69 ID:z2ufbs5N.net] >>124 そのclone()は子のf(n-1)とf(n-2)やそれらの子孫でも呼ばれるので1回ではなくO(n)より大きい それをO(n)すなわちn回+定数回以下に抑えられるのかどうか あるいはO(0)回すなわち定数回以下に抑えられるのかどうか
132 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 23:41:48.24 ID:RLh6XGtQ.net] フィボナッチはu128を使ってもf(187)でオーバフローするからBigInt必須 clone()はできる限り少なくしないと厳しい
133 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:10:47.96 ID:SnnzWk5R.net] どうでもいいから複おじはTRPL読み直してきてね
134 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:16:28.52 ID:IEr5OW/T.net] >>120 メモ化したら速くなったけど memoをこちらで用意して毎回渡していくのを避けられないのかな? fn main() { let mut memo: Vec<usize> = Vec::new(); for n in 0..100 { let f = f(n, &mut memo); println!("f({n}) = {f}"); } } fn f(n: usize, memo: &mut Vec<usize>) -> usize { if let Some(result) = memo.get(n) { *result } else { let result = match n { 0 => 0, 1 => 1, n => f(n - 1, memo) + f(n - 2, memo), }; memo.push(result); result } }
135 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:24:17.53 ID:d4KplWCH.net] メモ化する必要ある? 直前の2つだけ記録しておけば次の一項が計算できるんだから再帰にする必要ないよね
136 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:33:12.40 ID:IEr5OW/T.net] >>134 具体的にどうすればよいてすか?
137 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:46:08.98 ID:HY3grr6d.net] >>135 "rust fibonacci"でググるとよいです
138 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 01:21:23 ID:f3pwm4rC.net] >>134 直前の2つだけ記録して再帰にしない方法ならば おそらくこうする案だと思うが >>133 がO(n)で済んでいるのに
139 名前:対して これは二重のforによりO(n^2)になっていてこれは悪手 fn main() { for n in 0..100 { let f = f(n); println!("f({n}) = {f}"); } } fn f(n: usize) -> usize { match n { 0 => 0, 1 => 1, n => { let mut prepre = 0; let mut pre = 1; for i in 2..n { let tmp = pre; pre += prepre; prepre = tmp; } pre + prepre }, } } [] [ここ壊れてます]
140 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 01:31:14.77 ID:d4KplWCH.net] >>135 fn main(){ for n in 0..10{ println!("f({}) = {}", n, f(n)); } } fn f(n:usize) -> usize{ let mut a = 0; let mut b = 1; for i in 0..n{ let tmp = b; b = a + b; a = tmp; } return a; } わざわざRustっぽい書き方をする必要はない
141 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 01:39:04.90 ID:f3pwm4rC.net] >>138 それもforが二重となっていて全体でO(n^2)だから同じく悪手
142 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 02:09:27.74 ID:XQuKTBpO.net] >>131 なら尚のことジェネリックにする意味ないよね?
143 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 03:45:23.95 ID:jyObMdH0.net] >>137 ,139 悪手ってなにをもって悪手だよ 一般項の導出は高校生でもできるレベルで、そうすればO(log(n))で求められるし、つまらん計算量改善のためだけのアルゴリズム議論はもうやめろ これ以上計算量の話をするなら別のスレでやってくれ
144 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 04:01:44.79 ID:f3pwm4rC.net] >>141 mainに既にforループがある だから個々をO(n)で求めると全体でO(n^2)となる もし個々をO(log(n))で求めたとしても全体でO(n✕log(n))となる 一方で>>133 は優れていて全体でO(n)だから圧倒的に良手
145 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 08:08:36.85 ID:SnnzWk5R.net] まあ(usize) -> usizeのインターフェースを持たせつつ逐次処理したければメモ化が楽だわな Rustとは特に関係の無いアルゴリズム一般論の話だけど
146 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:20:27.39 ID:TVQgVkXp.net] なんでmainのループまで計算量に入れてるの? 今やってるのはフィボナッチ数列の計算量の話でしょ 余計なところまで話し広げてどうするの?
147 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:42:29.01 ID:Y0RaHe9J.net] いい加減こんな語り尽くされた話終わってろ 何スレだよここ
148 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:44:11.02 ID:2eGzkY/T.net] >>143 メモ化は良いが>>133 のコードはインターフェースがあまりよくない 逆に>>138 のコードはn個の列挙にO(n^2)も費やしている 以下のように書けばn個の列挙がO(n)に収まり、個別f(n)もO(n)で両立できる fn main() { println!("f(77) = {}", f(77)); for (n, f) in fibonacci_iter().enumerate() { println!("f({n}) = {f}"); } } fn f(n: usize) -> usize { fibonacci_iter().nth(n).unwrap() } fn fibonacci_iter() -> impl Iterator<Item=usize> { let mut p = 0; let mut q = 1; std::iter::from_fn(move || { let r = p; p = q; q += r; Some(r) }) }
149 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:47:27.97 ID:wYj4kQtM.net] 僕チンすごい!ってホルホルしたいんだろうけど 脳のワーキングメモリーが減ってこの程度の内容でしかコードが書けないんだろうな
150 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 13:06:09.75 ID:TVQgVkXp.net] まず計算量にmainのループを勘定してる時点で…
151 名前:デフォルトの名無しさん [2022/05/19(木) 13:18:54.57 ID:u56F2Ocx.net] >>144 > 今やってるのはフィボナッチ数列の計算量の話でしょ その通りでアンタが正しい >>148 フィボナッチ『数列』の計算量だから mainのループを勘定するのは当然 f(0)、f(1)、f(2)、…、f(n)がフィボナッチ『数列』
152 名前:デフォルトの名無しさん [2022/05/19(木) 18:50:45.11 ID:j8hvvms1.net] イテレーターにするとメリット多いんだな Rustと相性いい
153 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 19:01:17.07 ID:SnnzWk5R.net] >>146 はメモ捨ててるから計算済みのf(n)引っ張ってくるのに毎回O(n)かかる
154 名前:けどね イテレータと相性良いように見えるとしたら0..nループと組み合わせることしかしてこなかったmainが見せる幻想 そろそろRustの話に戻ってもらっていいですか? [] [ここ壊れてます]
155 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 19:56:30.02 ID:X9gr9ket.net] >>151 マジで>>133 のメモ化が好ましいと思っているのか? イテレータはメモ化とも相性が良い 例えば>>146 のfibonacci_iter()を含むイテレータ汎用メモ化は即席でこんな感じ fn main() { let mut memo = IterMemo::new(fibonacci_iter()); assert_eq!(memo.nth(10), Some(55)); assert_eq!(memo.nth(0), Some(0)); assert_eq!(memo.nth(30), Some(832040)); assert_eq!(memo.nth(5), Some(5)); assert_eq!(memo.nth(50), Some(12586269025)); } struct IterMemo<I> { iter: I, memo: Vec<usize>, } impl<I: Iterator<Item=usize>> IterMemo<I> { fn new(iter: I) -> Self { IterMemo { iter, memo: Vec::new() } } fn nth(&mut self, n: usize) -> Option<usize> { for _i in self.memo.len()..=n { if let Some(x) = self.iter.next() { self.memo.push(x); } } self.memo.get(n).cloned() } }
156 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:07:44.82 ID:wYj4kQtM.net] 汚いな
157 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:11:33.57 ID:+7PnyNeM.net] 複オジは何が問題だと指摘されてるのか理解しないんだよなぁ 頭悪いのにとにかくマウントだけ取りたがって恥の上塗り上塗り上塗り 何回塗るねんっw
158 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:20:54.65 ID:5LQoe3Bs.net] ほらなw ぼくのかんがえたさいきょうのひぼなっちいてれーた! どや!? どやどやどや!!? これで1000まで行くよw
159 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:27:22.70 ID:SnnzWk5R.net] どうしてもイテレータが欲しいなら>>133 に建て増ししたほうがよっぽど整理されていいよ https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=86c556a9709d959e8b9ecff08223b099
160 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:29:51.14 ID:u7/IlrFk.net] >>152 イテレータの規約に反したオレオレnth()はやめてくれ IterMemoなんて名前の構造体にnth()が実装されてればイテレータのnth()と勘違いしてしまう
161 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:34:02.60 ID:wYj4kQtM.net] その前に単純にバグ入りだけど
162 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:51:56.08 ID:MGh63lg3.net] メモ化と個別機能が完全に分離できている>>152 の方が良さげ
163 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:55:11.08 ID:wYj4kQtM.net] このスレだけでなくRust書く人間はコケ前提なのが馬鹿らしい 未知の計算するのに対策してない馬鹿野郎ども
164 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:56:15.85 ID:wYj4kQtM.net] 目が覚めろ 目が覚めろ コケ前提は恥ずかしい
165 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:56:34.11 ID:iLpWQ9zs.net] >>159 分離できてねーよw アホだろ イテレータ使ったことないのか?
166 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:58:30.11 ID:wYj4kQtM.net] Rust書く人間はレベルが低いと思われても平気なのか?
167 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:05:28.50 ID:+v1Fmw4c.net] >>156 は普通にフィボナッチ数列を順に表示するだけでも常にVecを使ったメモ化を伴うので筋がよくない >>152 はメモ化を付け外し可能で問題点も特に無いようだが
168 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:13:58.00 ID:G2OEvBhv.net] 「Rustでドヤりたい素人が犯しがちな12の過ち」 みたいな記事が捗りそう
169 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:18:44.85 ID:iQApRYmM.net] >>164 関数の設計ができない人の発想
170 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:22:18.18 ID:z7fdj+fO.net] >>164 なんでIDコロコロ変えてるの?
171 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:27:10.61 ID:2ZXoSlQ2.net] >>165 複オジ特有の妄想を一般化するなよ 「複オジがドヤ顔で晒した恥ずかしい勘違い12選」にしとけ 需要ないけどな
172 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:29:47.42 ID:EaXeIbDt.net] こんな数列ごときでヒープ必須の>>156 はプログラミングが下手
173 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:47:12.76 ID:AQMm07Qd.net] 数列ごときのプログラムしか書けない複製おじさん……
174 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 23:33:01.93 ID:wYj4kQtM.net] cargo run --releaseで予測した動きをしないコードを書くなよ 速やかにバグを取れ
175 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 23:33:20.92 ID:vqaI/jC6.net] Rust 1.61.0
176 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 23:35:03.68 ID:wYj4kQtM.net] このスレの底辺のコーダーもどき全員ゴミ まともなコードすらかけないでiterが~とか言ってんじゃねえよ バカども
177 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:27:37 ID:xM0P3yOr.net] 拗らせくんもいるのか
178 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:53:44 ID:syYn06qN.net] このスレを見る限りRustプログラマは低レベルの人間ばかり まともに動きもしないものでああだこうだ言いあってるだけだ
179 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:53:59 ID:obugnqXb.net] フィボナッチ数列議論スレでやれ
180 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:54:42 ID:syYn06qN.net] オーバーフローのまともな対処すら知らない馬鹿ばかり
181 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 01:04:06 ID:syYn06qN.net] 俺が小学生の頃はBASICで整数オーバーフロー考慮したプログラムは書いていた 多倍長整数演算も自分で考案して天文計算もやっていた このスレの連中は小学生の頃の俺に負けるレベルの奴しかいない Rustを書く人間はその程度のレベルばかり
182 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 01:16:05.19 ID:P7xg55cn.net] エイリアン vs アバター
183 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 02:33:24.77 ID:g6eOZZWy.net] 天文計算なら多倍長じゃなくて浮動小数みたいに指数部と仮数部だけ保持しておくほうがいいだろう
184 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 07:35:06.49 ID:SXN+DpBP.net] >>177 >>146 のオーバーフロー対策をしてみた これでいい? fn fibonacci_iter() -> impl Iterator<Item=usize> { let mut op: Option<usize> = Some(0); let mut oq: Option<usize> = Some(1); std::iter::from_fn(move || { op.take().map(|p| { op = oq.take().map(|q| { oq = q.checked_add(p); q }); p }) }) } fn main() { for (n, f) in fibonacci_iter().enumerate() { println!("f({n}) = {f}"); } }
185 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:11:12.19 ID:YZ72zuyX.net] 必要ないOptionまで追加してtake.mapのネストは汚すぎる 事前に設計せずコンパイラ駆動だけで書くと汚いコードになりがち
186 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:24:34.35 ID:5N9lui0T.net] >>179 勝手に戦えww 複製おじさん vs 100点おじさん
187 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:33:57.56 ID:7pe7/3hl.net] >>168 1レスで晒したこの4つの無知は外せないww (1) ムーブでビットパターンのコピーは発生しない -> ムーブ無知 (2) ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない -> 値渡し無知 (3)さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる -> Copy無知 (4)Copyのコピーはディープであって高コスト -> ディープコピー無知
188 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:44:11.52 ID:SXN+DpBP.net] >>182 フラグは必要 それをOptionで簡潔に表現した 批判したいならば代替コードを出すべき
189 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:52:03.20 ID:Te9amNUZ.net] フィボナッチ数列を他の計算の入力として使わないのなら何番目まで必要なのかをusizeとかで受け取ってBigUintのイテレータ返すので十分かな
190 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:54:16.47 ID:Te9amNUZ.net] うげ 俺が出したのは>>185 の言う代替案じゃないから 勘違いしそうだから念のため
191 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 09:01:03.34 ID:SXN+DpBP.net] >>186 うん 今回はオーバーフローの対処をしろと言う>>177 のリクエストに応じたのみ
192 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 09:03:09.77 ID:SXN+DpBP.net] >>182 mapのネストが苦手と言うならば mapを使わないバージョンも用意したのでどうぞ fn fibonacci_iter() -> impl Iterator<Item=usize> { let mut op: Option<usize> = Some(0); let mut oq: Option<usize> = Some(1); std::iter::from_fn(move || { let p = op.take()?; op = (|| { let q = oq.take()?; oq = q.checked_add(p); Some(q) })(); Some(p) }) }
193 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 09:18:53.35 ID:qCLhnuk6.net] firefoxってどのへんにrust使ってるんだっけ
194 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:35:37.22 ID:t0eTe6yv.net] >>189 さらに汚くしてどうすんのw
195 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:55:09.60 ID:SXN+DpBP.net] >>191 汚いと言うならば同じ動作をするもっと美しいコードを出そう 「汚い」と言う人はいつもコードを出せない人だから負け惜しみで言っているのかと
196 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:59:18.09 ID:6DrTvbrK.net] >>185 unfold使ってた時と同じでフラグという捉え方がコードが汚くなる原因 命名を疎かにせず変数や関数の型を考えよう そうすればOptionが必要なものと不要なものくらいは区別できるはず ヒント終わり コンパイルができた動けばいいだけのコードからは早めに卒業しようね
197 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:03:32.49 ID:WF81UNfB.net] >>192 君のコードを汚いという人間は一人や二人ではないだろう? それがなぜなのか? なぜ汚いと言われるのか? 自分で考えて足掻いてこそ成長するんだよ
198 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:08:36.62 ID:5NF4cE9g.net] >>192 ちなみに汚いコードの反対は汚くないコード 美しいコードである必要はない 実践で重要なのは美しいコードよりも汚くないコードを書くこと
199 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:16:04.61 ID:SXN+DpBP.net] >>193 有無を表現することが必要だからOptionを使うのが最適 Optionを使わずに書けるのならばコードを出そう >>194 今まで言われたことない 今回言われたから、いつも汚いを連呼しているがコードを出せないダメな人かなと 反論があるならばコードで示そう
200 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:26:17.74 ID:SXN+DpBP.net] >>195 その通りだよ だから汚くなく、簡素でわかりやすく、無駄をせずに効率も良いコードを>>189 に出した 同じ動作と同じ効率でもっと簡素に書けるのならばコードを出してごらん