1 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 22:19:47.56 ID:avZQ9Wm7.net] 闘え ※前スレ C++ vs Rust https://mevius.5ch.net/test/read.cgi/tech/1619219089/ C vs C++ vs Rust Part.2 https://mevius.5ch.net/test/read.cgi/tech/1639539350/
610 名前:デフォルトの名無しさん [2022/03/19(土) 16:12:10.15 ID:m5PNQvz6.net] >>547 互換性が壁になるのは、長く広く使われてる言語ではどうしようも無いしなぁ。 だから言語も新しく作られるわけだけど、新しいものは認めません!という奴はいつだっている。
611 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 16:13:51.10 ID:M61n5/yF.net] もう少しわかりやすくして このsubsetsイテレータをC++で実装すればいいんだよね fn subsets<T>(input: &[T]) -> impl Iterator<Item=Vec<&T>> { let len = input.len(); (0..(1 << len)) .map(move |bits| (0..len) .filter(|index| bits & (1 << index) != 0) .map(|index| &input[index]) .collect()) } fn main() { let input = ["a", "b", "c"]; for s in subsets(&input) { println!("{s:?}"); } } 出力結果 [] ["a"] ["b"] ["a", "b"] ["c"] ["a", "c"] ["b", "c"] ["a", "b", "c"]
612 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 16:30:53.75 ID:kMuw3v3E.net] >>602 置き換えのためのテスト手順なんかも考えずに新しいものにすればいいって言い張る老害も たくさんいるんでその辺はどっちもどっちだがな。
613 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 16:40:18.91 ID:DslNhsx1.net] filter_mapがfilterとmapに分かれただけじゃんwwww マジでそんなのを何度もブラッシュアップするレベルでは俺には一生追いつけないぞw どうでもいいけどクロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪いのと結局collectしちゃうのはイマイチだねw あと生成コードの比較、もしくは時間測定は出来たのか?w 何度も言うが、誰でもどちらの言語でも同じように書けるぞw
614 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 17:31:22.77 ID:M61n5/yF.net] >>603 やってみたがC++の従来のイテレータ仕様が悪すぎることが敗因 なのでC++20からのstd::rangesでかなり改善できる ただしRust版ほどシンプルに仕上がらないな >>605 勘違いで詰まらない言いがかりを付けてくるな そこまで言うならばC++版のコードはおまえに任せる
615 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:10:48.21 ID:DslNhsx1.net] 単発IDがたまに連続させたって意味ないんだけどw その辺はとうに>>572 に書いたよね?w まだ出来ないの?wwwww
616 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:22:18.16 ID:u/mznaJY.net] >>605 > クロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪い 意味不明すぎ クロージャを理解できていない? > 結局collectしちゃうのはイマイチだね わかりやすくcollectしてるだけだろう collectを外せばイテレータを返すイテレータとなるのは自明
617 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:31:58.03 ID:DslNhsx1.net] またID変えて忙しいやつだなwww 1つ目の点は細かいが、クロージャを外に出したいと思ったときに不自由なんだよw 2つ目の点は遅延評価をわざわざ使うなら、collectしちゃうとロスが発生するのは分かるだろw 例えばコンソールに出力する場合、そのままiteratorをぶん回したらメモリ要らないのに、最初にcollect付けちゃってるから問題なんだよw 後から付ける事はできても、取り外すことは出来ないからw
618 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:34:23.73 ID:+R/acvy/.net] エアプC++erの言い訳無限に出てくるよw
619 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:37:48.37 ID:LL+Ti59i.net] もういいから正解書いてくれ。
620 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:38:41.55 ID:DslNhsx1.net] ありゃりゃココで複垢まで使っちゃうと他で使えなくなっちゃうよ?w いいの?w
621 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:39:15.88 ID:+R/acvy/.net] 書けないのに書けるフリして可哀想やわ
622 名前:デフォルトの名無しさん [2022/03/19(土) 18:41:43.33 ID:LL+Ti59i.net] 複垢とか何を言ってるのかよくわからんが、正解がどうなるのか気になるので正解かいてくれ。 おれはC++もRustもそんなに知らん。
623 名前:デフォルトの名無しさん [2022/03/19(土) 18:43:31.88 ID:6MHm2WKJ.net] >>545 手間を惜しまないならチュリ完ならなんでも出来るからなw
624 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:44:04.03 ID:DslNhsx1.net] そんなに知らないならココ見るなよwwww 答えクレクレ君が来る場所じゃないw
625 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:44:08.25 ID:jyTBsiM0.net] >>605 >どうでもいいけどクロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪い クロージャーは互いに独立しているので 引数を次のクロージャーで使うのは不可能です 根本的な理解が出来ていないのでは?
626 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:45:06.81 ID:DslNhsx1.net] チュリ完はプログラミング出来るというだけで、何でもは出来んよw 知ったかくんw
627 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:46:38.78 ID:DslNhsx1.net] 入れ子のクロージャでって意味の次のだよw ただの順番w
628 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:47:35.76 ID:+R/acvy/.net] だっさwwww 言い訳ばっかやんwww
629 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:49:45.68 ID:DslNhsx1.net] 分かる人は最初ので全部分かってるから、何もしないw バカが煽ったり質問したりするから永遠に反応してやってるだけw
630 名前:デフォルトの名無しさん [2022/03/19(土) 18:49:59.87 ID:LL+Ti59i.net] いやくるなと言われてもくるけどね。
631 名前:デフォルトの名無しさん [2022/03/19(土) 18:50:09.75 ID:m5PNQvz6.net] 相変わらすc++コードは全然でてこないな。
632 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:50:51.71 ID:+R/acvy/.net] C++書いたほうが早いのに言い訳しか出てこないの怖いわw
633 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:54:53.91 ID:DslNhsx1.net] Rust推しの駆け出し君がC++を語るとか片腹痛いw
634 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:02:54.69 ID:cmtG3lS6.net] >>619 何を言ってるのかわからん 皆にイチャモンつけまくっているだけにみえる 君のsubsetsイテレータ実装を出したまえ
635 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:04:05.03 ID:DslNhsx1.net] 君等のような駆け出し君がやれマウントだドヤ顔だ上から目線だのと言いつつ、自分の仕事に真摯に取り組まず、自身の評価ばかり気にして待遇がどうの周りがどうのと言い始めて辞めた挙げ句、技術も経験もないままニートになってるから社会問題になってるんだよw まずは足元を固めてじっくり1つのことをやった方がいいと思うぞおっさん的にはw
636 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:06:49.48 ID:+R/acvy/.net] お前がなw
637 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:09:27.82 ID:DslNhsx1.net] あれれ?当たっちゃった?w 頑張れよw
638 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:10:49.95 ID:GZmTU31E.net] >>625 痛いのは左の腹ですか?それとも右脇腹ですか?
639 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:14:41.36 ID:DslNhsx1.net] あえて訂正してこないところが出来るね君w 背中側の腹だよw
640 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:33:55.07 ID:YQxYhoLA.net] >>605 もちろんcollect()を外せばそのままイテレータを返すイテレータを返す関数になる fn subsets<T>(input: &[T]) -> impl Iterator<Item=impl Iterator<Item=&T>> { let len = input.len(); (0..(1 << len)) .map(move |bits| (0..len) .filter(move |index| bits & (1 << index) != 0) .map(|index| &input[index])) }
641 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:50:41.66 ID:YQxYhoLA.net] あとはID:DslNhsx1氏がC++バージョンを書けるかどうか
642 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:52:06.07 ID:+R/acvy/.net] やめたれw
643 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:57:39.82 ID:DslNhsx1.net] あれあれ?全文がなくなって動かなくなってるねwwww 変更はそこだけでいいのかな?w C++はお前が書けないのがおかしいんだよw
644 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 20:09:59.31 ID:YQxYhoLA.net] >>635 言いがかりをつけることしか出来ないダメなやつだな 自分でコードを書けないってことなんだろ どうぞ >>632 用の簡易動作確認コード let input = ["a", "b", "c"]; for mut iter in subsets(&input) { println!("({})", iter.join(",")); }
645 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 20:41:03.66 ID:DslNhsx1.net] # こんな感じねw cargo install cargo-edit cargo-geiger cargo new subsets cd subsets cargo add itertools cat >src/main.rs <<EOF #![forbid(unsafe_code)] use itertools::Itertools; fn subsets<T>(input: &[T]) -> impl Iterator<Item = impl Iterator<Item = &T>> { let len = input.len(); (0..(1 << len)).map(move |bits| { (0..len) .filter(move |index| bits & (1 << index) != 0) .map(|index| &input[index]) }) } fn main() { let input = ["a", "b", "c"]; for s in subsets(&input) { println!("[{}]", s.format(",")); } } EOF cargo run cargo geiger # Run cargo-geiger!
646 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 20:42:40.39 ID:DslNhsx1.net] まあ外部に括りにくいのが気になるのは趣味だから修正はやめといたw joinはformatに変えただけw そのまま動くというのはこういうコードw
647 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 21:18:01.62 ID:OlJIHMMJ.net] 相変わらずコピペ&改変だけしかできないガイガー君だ ゼロからコードを書くのは苦手だからC++版の方は手付かずのままなわけだ
648 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 21:27:48.52 ID:jYZm0dN8.net] 金もらわないとコード書かないんじゃなかったのか 機嫌が良かったのかな?
649 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 21:39:07.36 ID:DslNhsx1.net] 俺は書けるけど、お前らが書けないのに俺が書いたら書かされた感があって嫌なだけw
650 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 21:44:20.43 ID:LL+Ti59i.net] 残念だな。エレガントなC++のコードみたかったわ。
651 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 21:47:05.64 ID:DslNhsx1.net] じゃあエレガントでないC++のコードを見せろよw
652 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 21:50:10.65 ID:LL+Ti59i.net] いやおれは書かないけどね。なにをいうてんの。
653 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 21:57:27.50 ID:OlJIHMMJ.net] ガイガー君はコピペ改変なら辛うじてできるからC++派の誰かがコードを書くまで無理だろう
654 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 22:02:11.32 ID:DslNhsx1.net] なんでC++派とかRust派とかいるんだよwwww 両方書けないのになんでこのスレにいるんだよゴミクズどもwwww
655 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 22:18:51.04 ID:pGbdb8un.net] >>646 スレタイと >>1 を見なさいよ ここは各派閥が争うスレ
656 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 22:19:15.66 ID:/tgdZc/e.net] 正確には Rustだと色々シンプルに書けるためRust派 と C++でも書ける派 ただし後者はコードが出てこないので実証されていない
657 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 22:25:23.19 ID:DslNhsx1.net] いやいや RustだとC++より色々シンプルに書ける派と RustもC++も同じ派がいるだけだろw C++だとこんなになっちゃいますってコードが前者から出てないんだがw C++書けないのにRustだけシンプルに書けると思い込んでるバカはお引取り願おうかねwwwww
658 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 22:32:19.39 ID:DslNhsx1.net] あと個人的に無駄が結構気になるので、さっきのコードRust部分だけ以下に置き換えてくれ #![forbid(unsafe_code)] use itertools::Itertools; fn subsets(len: usize) -> impl Iterator<Item=impl Iterator<Item=usize>> { (0..(1 << len)).map(move |bits| { (0..len).filter(move |index| bits & (1 << index) != 0) }) } fn main() { let input = ["a", "b", "c"]; for s in subsets(input.len()) { println!("[{}]", s.map(|index|&input[index]).format(",")); } }
659 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 22:36:43.09 ID:unVMuDSw.net] 絶対コード書けないだろ 面白すぎw
660 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 22:42:30.15 ID:miakijMp.net] >>650 ポインタとusizeは同じ大きさだから そのコードでは何か無駄を削除できているわけではない むしろ使う側で毎回mapしなければならず使い勝手が悪くなっている さらに大元の話は>>460 から始まっているのだから大きく仕様を変えるべきではない 以上3点により却下だ
661 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 23:04:04.71 ID:DslNhsx1.net] 別にu32やu16でもいいよw むしろセットである必要がないのが素晴らしく合理的だし元とかiteratorにした時点で細かく言えば変わっているw ただ最適化時に範囲チェックがどこまで見てくれるのかが気になるかな… ノーチェックでいいと判断してくれたら御の字w
662 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 23:27:21.61 ID:YSd+hKe3.net] >>653 添え字を返すならusize必須 あと使う側で変換すればいいと言う主張ならば最初の>>522 『0..(1 << len)』でも良いことになる そのままの方がビット演算処理もできてより利便性が高い
663 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 23:49:24.15 ID:DslNhsx1.net] お前は何を言ってるんだw inputのサイズで、この方式だと30個が上限w usizeはオーバースペックなのw
664 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 23:58:01.67 ID:Xi4ntxoy.net] >>653 Iteratorではなく他の言語のようにコストを払ってVec(のVec)で返したいならば 以下のように2段階そ
665 名前:れぞれcollect()するだけなのでコードが本質的に変わるわけではない fn subsets<T>(input: &[T]) -> Vec<Vec<&T>> { let len = input.len(); (0..(1 << len)) .map(move |bits| (0..len) .filter(|index| bits & (1 << index) != 0) .map(|index| &input[index]) .collect()) .collect() } そしてあなたもcollect()して返すのはイマイチだと>>605 で明言しているのだから 今回の結論はどちらもcollect()せずにイテレータのイテレータとなる>>632 のコードが正解 [] [ここ壊れてます]
666 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 00:10:53.62 ID:1+CNf8az.net] 無駄多くね?必要なくね?メモリとCPUを無駄遣いするクソコードでしかなくね?w >>605 で言ったのは上のコードで最初のcollectの話w 2個目は最初からないんだよw >>650 なら生成した瞬間に出力されるお得仕様だから無駄がないw collectするくらいならそもそもVecをcapacity指定して作ってforループしてそこに埋めてった方が速いw つまり>>632 はゴミで>>650 が正解w
667 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 01:32:33.30 ID:+zPQ2FRY.net] >>657 ダメです C++やRustを含めて各言語のcombination, permutation, subsetなどの実装はいずれも 与えられた入力があってその要素を使って返します 今回もその仕様で確定です あとはイテレータを使わずに普通に>>656 でもよいですし イテレータを使える言語ならば>>632 のイテレータのイテレータを返す仕様がベターでしょう
668 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 01:40:13.83 ID:1+CNf8az.net] >>658 ダメじゃねーよwwww むしろロジックが脆弱なのに余計にいろいろ浪費するコードでベターとか言ってんじゃねーよwwww こんな短いコードでこんなにダメなやつは初めて見たぞw
669 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 01:51:34.86 ID:+zPQ2FRY.net] >>659 あなたはダメです 既存のものの仕様に合わせるならば>>658 に書いた通りですし 浪費をせずにインデックスだけ渡せばよいとの主張ならば皆が書いているように 0..(1 << len) がその答えです ビット表現の方がサイズも小さく包含関係などもビット演算のみで得られるなど利点が多いです あなたの>>650 はそのどちらでもない中途半端です
670 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 01:58:09.59 ID:1+CNf8az.net] >>660 頭悪いの?遅延評価されてるので、必要にならない限り計算されないんだけどw その値も必要時に計算され、その結果を引数に与えられたiteratorが生成されて返ってくるだけだろw そのときにiteratorがセットになってないindexだけ返ってきてそれがsubsetsになるの?wwww 足りない頭に脳味噌もう少し充填した方がいいよw
671 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 02:52:06.33 ID:fen0VFs0.net] ガイガー君の主張だと 入力として集合をスライスとしてもらって 出力としてその部分集合をイテレータとして返す>>522 は無駄で 出力としてその部分集合もイテレータで返し二段イテレータとなる>>632 も無駄で そもそも入力としての集合を関数に渡す必要がなく長さだけ渡してインデックスだけ返せばいいとの主張で>>650 なんだろ それならばもっと無駄を排除して次で十分だ fn subsets(len: usize) -> impl Iterator<Item=usize> { 0..(1 << len) } これで各部分集合をビット表現で得られる サイズも最小となりビット演算も可能で使い回しもよい fn main() { let input = ["a", "b", "c"]; let len = input.len(); for bits in subsets(len) { println!("{:b} ({})", bits, (0..len).filter(|i| bits & (1 << i) != 0).map(|i| &input[i]).format(",")); } } このように文字列として必要になった場合に初めて変換すればよい ついでにビット表現文字列も同時に表示できる ガイガー君の無駄を無くす主張を認めるならばこのほうがさらに優れていることになる したがってこの件もガイガー君の敗北だ
672 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 02:58:15.92 ID:1+CNf8az.net] バカだなw コードにしなくてもそんなのは分かってんだよwwww それじゃ意味が不明である上にI/Fとしても稚拙極まりないと言ってるんだよw 返ってくる数字が何なのか意味不明だろうにw 今回は元作者がアホなために30個そこそこしか作成できないわけで、まあそれでもなんとかなるわけだが、いずれロジックを修正して無限に生成できるようにしたときにまだそんなビット列に拘るのかい? 敗北はお前wwww
673 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 03:15:01.33 ID:fen0VFs0.net] ところがガイガー君はsubsetsがビット表現から生成できることに気付かなかった そのためガイガー君が示した最初のコードは>>463 でありcombinationsイテレータを使ってsubsetsを生成するコードだった ちなみにググるとsubsetsはcombinationsを使って実装できるとのページが多数ヒットする ガイガー君がそこからカンニングしたのかどうかは知らないが少なくともビット表現から生成できることに気付かずcombinations頼みとなったのは事実だ>>463
674 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 03:23:47.90 ID:1+CNf8az.net] >>664 お猿さんの妄想が事実と食い違ってたところで俺にはどうでもいいんだけど、事実はC、P、階乗みたいな計算や集合みたいなのは俺小学校時代から知ってるw だから冪集合と聞くだけで、君のようにカンニングすることなく答えに辿りついてしまうんだよw ビット表現から生成する方法を必死に提唱してたのは俺一人しか知らないけど、この手の処理は原則変更可能な元データのセットを用意すればスワップするだけで生成出来るものだよw 可哀想にねw
675 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 03:33:20.84 ID:fen0VFs0.net] ガイガー君はsubsets関数をプログラミングする時になぜか非常に遠回りとなるitertools.combinationsを使った ソース>>463 この事実からガイガー君はアルゴリズムや数学などが不得意であると断言できる ここまでコピペ改変しか披露できていないことからプログラミングが不得意なのだろう
676 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 03:58:13.20 ID:1+CNf8az.net] >>666 こいつはアホなのか?普通に>>460 が求める簡単な方法なんだがwwww 妄想を自分で断言しちゃうとかもうねw 久しぶりにこれを使ってあげようwwww お前がそう思うんならそうなんだろう / ̄ ̄ ̄ ̄\ / / | ヽ ヽ\ / / /|||ハ||ヽ> `/ /ィ-トノレ| N十トハ||ヽ /V レ/テヾ |/ /テヾ|||| レ∧ |ヒOソ| ヒOソiNV | ヽ ̄ `  ̄ ハ( ヽ|ヽ \  ̄ 人ソお ヽレ\_≧ー-イレソ 前 / ̄ ̄ ̄\\ ん / / ̄ ̄\_ヽ) 中 |( )ヽヽ で ヒ∧ \/ |゚| は || ヽ | | な
677 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 05:21:36.47 ID:1V6eoYkY.net] >>460 を見てみたけど 最終的ににべき集合のべき集合が欲しいみたいよ MathematicaだとSubsets[Subsets[{a, b, c}]]で済むと言ってるね それに対して>>463 はitertools.combinationsを使ってsubsetsを実装 今回のケースでわざわざcombinationsを用いた実装が必要なのかどうかは不明 そして空集合が出力されないバグ実装 rangeを1開始でなくて0開始にしないと駄目ですよ それはさておき元と同じインタフェースならばRust版は>>656 の実装でOK subsets(subsets(&["a", "b", "c"])) でべき集合のべき集合がちゃんと得られますね
678 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 11:54:10.51 ID:1+CNf8az.net] まだ言ってんのかよw 空集合はお茶目なバグだ許せw combinationを使わない実装の方が珍しいわw 同じI/Fにする必要はないし、それが必要なら簡単に実装出来るw fn subsets_collect<T>(s: &Vec<T>) -> Vec<Vec<&T>> { subsets(s.len()).map(|iter| iter.map(|i| &s[i]).collect::<Vec<&T>>()).collect::<Vec<Vec<&T>>>() } fn main() { let input = vec!["a", "b", "c"]; println!("{:?}", subsets_collect(&subsets_collect(&input))); } 始めから同じ実装にしてないからなw そして>>656 の実装でsubsets(subsets(&["a", "b", "c"]))はエラーwwww
679 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 17:12:41.85 ID:URBujIbQ.net] ストレス発散オナニーRusterスレッド
680 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 17:36:53.71 ID:1+CNf8az.net] いや、Rusterは尽く俺にやられてるんだがw しかもC++できないただの駆け出しw
681 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 17:51:03.84 ID:HHTijYmK.net] >>669 は嘘つき やってみたら>>656 の実装で動いた fn main() { println!("{:?}", subsets(&subsets(&["a"]))); println!("{:?}", subsets(&subsets(&["a", "b"]))); println!("{:?}", subsets(&subsets(&["a", "b", "c"]))); } ちゃんとべき集合のべき集合が出力されている 1つ目 [[], [[]], [["a"]], [[], ["a"]]] 2つ目 [[], [[]], [["a"]], [[], ["a"]], [["b"]], [[], ["b"]], [["a"], ["b"]], [[], ["a"], ["b"]], [["a", "b"]], [[], ["a", "b"]], [["a"], ["a", "b"]], [[], ["a"], ["a", "b"]], [["b"], ["a", "b"]], [[], ["b"], ["a", "b"]], [["a"], ["b"], ["a", "b"]], [[], ["a"], ["b"], ["a", "b"]]] 3つ目は長いので略
682 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 18:08:01.19 ID:1+CNf8az.net] >>672 嘘つきはお前w &が余計についてるやんけw やはり駆け出しRust使いは嘘付きしかいないw
683 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 18:22:11.71 ID:6IwS75Da.net] >>673 ガイガー君の書き込み>>669 でも&が同じように付いている つまりガイガー君は自分の誤りを認めたことになる
684 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 18:28:57.25 ID:1+CNf8az.net] >>674 俺はちゃんとその>>669 で > そして>>656 の実装でsubsets(subsets(&["a", "b", "c"]))はエラーwwww と言ってるので誤っていないw 誤っているのは、>>669 で > それはさておき元と同じインタフェースならばRust版は>>656 の実装でOK > subsets(subsets(&["a", "b", "c"])) でべき集合のべき集合がちゃんと得られますね という部分w なんでこうまで説明されないと間違いを認められないんだろうなwwww 駆け出しRuster推しのお馬鹿さんたちがRustも使えないことが判明w
685 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 18:37:30.55 ID:GV4qdrT7.net] 実際に>>672 で動作してるのだからRustの勝利 C++はコードの片鱗すら出てこない
686 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 18:44:09.03 ID:1+CNf8az.net] >>572 でFAなんだもんw 想像もできないくらいC++書けない人が文句言ってても何も気にならんw 両方書けるようになってから、ほらこんなになるじゃんって持ってきたら添削してやるよw
687 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 19:01:47.10 ID:eXUaH9c5.net] C++20を使いこなせる人がいないことが敗北原因 Rustよりも利用者少ない だからこのスレにもC++で書ける人が誰もいない
688 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 19:03:19.57 ID:1+CNf8az.net] 俺は書けるけどねwwwww というかお前が書けないのに書き込んでるからこんな変な話になってるだけで、本来は書ける前提でああでもないこうでもないやるスレだろwwww
689 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 19:05:31.63 ID:DiBIkIVz.net] それ、昔のコンパイラを今でも使ってる人達にも言えるの?
690 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 19:11:26.79 ID:1+CNf8az.net] は?俺だって必要なら昔のコンパイラ使うぞw 特定CPU用のなんて安定したバージョンでないとバグ踏むからなw
691 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 19:59:25.97 ID:kJ/tleYc.net] C++使えなくてRustは使えますとか、 あと10年はなんの価値もないんじゃ...
692 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 22:31:20.58 ID:271cfGdl.net] そんな妄想をしても場所によりけり うちはC++以外の諸言語からRustへ移行したので Rust使えずC++使える人は価値ゼロ といったように
693 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 23:04:08.64 ID:1+CNf8az.net] それは最高にやばそうだなw
694 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 23:25:08.78 ID:Ftc+D3LS.net] 業界標準ツールのRust化も激しいよな 例えばJavaScriptでおなじみのトランスパイラBabel 遅いので当然ながらRust版のSWCというのが作成されて React/Next.jp環境でもBabelからそのRust版へと移行された
695 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 23:39:52.49 ID:1+CNf8az.net] 全部であるかのごとくに書いてるけどごくごく一部だし、しかも期待したほど速度が上がらずに困ってたよねw JavaScriptに比べてだぞ?w
696 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 23:57:33.12 ID:jG5ySy9q.net] >>686 swcはbabelより20〜50倍速い
697 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 00:09:57.25 ID:BAdp3agq.net] 公称だろ?w 実際試した人がそうでもなかった(忘れたけど1.x倍くらい)って言ってたよw
698 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 00:10:28.20 ID:BAdp3agq.net] しかも場合によっては遅くなるって言ってたw
699 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 00:53:26.08 ID:1rsJ1Bxd.net] >>688 >>689 虚言癖
700 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 01:13:09.95 ID:BAdp3agq.net] まあ自分で試したわけじゃないから、そう言われても何とも言えんけどなw
701 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 03:44:24.39 ID:qXBNR9Nr.net] >>669 > fn subsets_collect<T>(s: &Vec<T>) ガイガー君は相変わらず素人のままだな そこは&Vec<T>ではなく&[T]と書くのだよ Vec自体の固有機能に関する動作の場合を除き 狭くVecのみを対象にするのはバカげている スライスを対象にするのが鉄則 &Vec<T> ←Vecしか受け付けられない &[T] ←Vecも配列もスライスも受け付ける
702 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 04:14:12.72 ID:BAdp3agq.net] >>692 そんなこと言われなくても知っとるわwwww それは俺のポリシーとして、可能ならVecを返すならVecを受けたいだけw 今回のケースではメリットとかないよw 同様にsliceで受けたらArrayで返したいし、iteratorを受けたらiteratorを返したいw
703 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 04:24:26.11 ID:Czlt7YRo.net] >>693 arrayとsliceは別物ですよ arrayで受けたらarrayで返したいなら意味がわかりますし実際にmapはその仕様ですけど
704 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 04:53:35.01 ID:BAdp3agq.net] >>694 [i32] ... Array &[i32] ... スライス T ... T &T ... Tの参照 という理解で、 ・特定の型の参照はスライスとして扱える ・Arrayの参照はスライスと区別できない と思ってて →スライスで渡されたらArrayで返す という発想なんだが、違うの?
705 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 05:13:22.29 ID:Czlt7YRo.net] >>695 違います [T] … これがスライス (動的サイズ) [T; N] … これが配列 (固定サイズ) 明確に異なるprimitive typeです
706 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 05:32:43.26 ID:BAdp3agq.net] >>696 なん。。だと!?!?そんな基本的なところを気付いていなかったのかw では ・Arrayの参照(&[T;N])はスライス([T])と区別できる let a = &[1,2,3]; のaは俺はずっとスライスと思ってたけど、そうではなく、 let a = &[1,2,3] as &[i32]; とかでないとスライス(の参照)にはならんってことかwwww これはすまんかったw ちょっともう一度最初から整理し直さないといかんかもw ありがとw
707 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 06:00:44.84 ID:Czlt7YRo.net] >>697 そこはコアースされます 配列とスライスの違いをわかりやすく使用例で示しましょう まず「配列を受け取り」その各値を2倍にした「配列を返す」関数twice()です fn twice<const N: usize>(input: &[isize; N]) -> [isize; N] { let mut output: [isize; N] = [0; N]; for i in 0..N { output[i] = input[i] * 2; } output } わかりやすいようforで回して代入しています fn main() { let input = [1, 2, 3]; println!("{:?}", twice(&input)); } もちろんちゃんと動いて[2, 4, 6]となりますね この関数の引数をスライスを受け取るように型を&[isize]へ変えても大丈夫なのですが ただし関数を使う時にちょっと状況が変わってきます そこには様々な違いと問題が生じますので実体験しましょう これがスライスと配列の違いを理解するためのあなたへの宿題です
708 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 06:10:12.41 ID:BAdp3agq.net] >>698 それは蛇足w Rust信者はそういうことするからダメなんだよw 別に必ず同じ固定サイズになるとは限らないから、そんな方法は考えてもいないw
709 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 06:18:10.57 ID:Czlt7YRo.net] >>699 ほら、理解できていませんね その発言からあなたはまだ机上の妄想の世界にいます わかった気になって宿題をしていないダメな子パターン
710 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 06:22:52.71 ID:BAdp3agq.net] >>700 一応配列で渡されたら配列で返したい心理の説明をしておくと、例えばベクタなど配列と同じような構造で動的に拡張可能なコレクションをずっと持ち回っていると、そいつが過去に持っていたデータなどが後ろにくっついてる可能性があったり、余計なメモリを確保していたり、gcなどが効きにくくなったりするので、内部処理で使ったオブジェクトではない、綺麗な生成データを固定で作って返す風習があるんだよw