[過去ログ] Rust part21 (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
453
(6): デフォルトの名無しさん [sage] 2023/10/08(日) 18:19:11.05 ID:WAd1DVRF(3/3) AAS
enumのリストで書いてみたわ
rust不慣れだから所々おかしいかも
外部リンク:ideone.com
enum List<T> {
Cons(T, Box<List<T>>),
Nil,
}
impl<T: Copy + PartialOrd> List<T> {
// 略
fn qsort(&self) -> Self {
match self {
List::Nil => List::Nil,
List::Cons(pivot, tail) => {
let (smaller, rest) = tail.partition(|x| *x < *pivot);
smaller.qsort().concat(&rest.qsort().prepend(*pivot))
}
}
}
}
fn main() {
let list = List::<i32>::nil().prepend(4).prepend(8).prepend(8).prepend(3).rev();
list.each(|n| print!("{}", n));println!("");
list.qsort().each(|n| print!("{}", n));println!("");
}
463: 453 [sage] 2023/10/09(月) 01:16:03.20 ID:VBg3Yonc(1) AAS
>>444
444(1): デフォルトの名無しさん [sage] 2023/10/08(日) 10:38:24.03 ID:lCt9aeoq(1/3) AAS
in-placeなqsort書いてよ
>>455
455(1): デフォルトの名無しさん [sage] 2023/10/08(日) 20:05:18.10 ID:lCt9aeoq(3/3) AAS
で、みなさんは単方向リストを使う綺麗だけどクソ遅いコードを並べて何がしたいんですか?
外部リンク:ideone.com
これでクイックソートになってるはず?
なってなくても笑って許してほしい
488: 453 [sage] 2023/10/12(木) 19:51:44.10 ID:viHBcoi7(1/2) AAS
今度はDartで書いてみた
3.0でパターンマッチがちょっと強化されたらしい?
3.0新登場のスイッチ式の=>の右側には式だけしか書けない?
dartにはそもそもpartitionはない?
というわけで>>445
445(1): デフォルトの名無しさん [sage] 2023/10/08(日) 10:39:23.48 ID:WAd1DVRF(2/3) AAS
>>443
Haskell
qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]

Erlang
qsort([]) -> [];
qsort([X|Xs]) ->
qsort([ Y || Y <- Xs, Y < X]) ++ [X] ++ qsort([ Y || Y <- Xs, Y >= X]).
のHaskell方式で書いてみた(程遠いけど)

List qsort(List list) {
return switch (list) {
[] => [],
[var pivot, ...var rest] => qsort(rest.where((x) => x < pivot).toList()) + [pivot] + qsort(rest.where((x) => pivot <= x).toList())
};
}
489: 453 [sage] 2023/10/12(木) 23:01:31.11 ID:viHBcoi7(2/2) AAS
こういう書き方もできた
こっちのほうが雰囲気出てるかな?

List qsort(List list) {
return switch (list) {
[] => [],
[var x, ...var xs] => qsort([for (var y in xs) if (y < x) y]) + [x] + qsort([for (var y in xs) if (x <= y) y])
};
}
543
(1): 453 [sage] 2023/10/24(火) 00:55:17.36 ID:Ei0IGfb9(1) AAS
>>500
500(3): デフォルトの名無しさん [sage] 2023/10/15(日) 09:39:38.68 ID:M8zy/AR3(1) AAS
Cで書いたプログラムを Rustで書いたらこうなります
っていうのをひたすら集めた本がほしい
今度は逆にrustで書いたもの>>453をcで書いてみた
外部リンク:ideone.com
・参照透過性は考慮していない
・型のパラメータ化?には挑戦してない
・パターンマッチ再現?にも挑戦してない
・クロージャが欲しいところには呼び出し元の文脈を手渡して誤魔化す
・グローバル変数一個使ってノードの再利用を試みてる
・とにかくlist_qsort内部がそれっぽい感じの手順になってたらヨシ
struct node {
int value;
struct node *next;
};
struct node *list_qsort(const struct node *list) {
int pivot;
struct node *sorted = 0, *tail, *smaller, *rest, *a, *b;
if (list) {
pivot = list->value, tail = list->next;
list_partition(&pivot, less_than_context, tail, &smaller, &rest);
sorted = list_append(a = list_qsort(smaller), b = list_cons(pivot, list_qsort(rest)));
list_available_push_all4(smaller, rest, a, b);
}
return sorted;
}
548
(1): 453 [sage] 2023/10/24(火) 22:19:05.86 ID:yQ/jFyOv(1) AAS
>>543 c
外部リンク:ideone.com
・ノード再利用やめた
・若干の整理
563: 453 [sage] 2023/10/28(土) 18:50:08.51 ID:U0JINWpQ(1) AAS
>>548 c
外部リンク:ideone.com
・ノードへのポインタとしてリストを表現していた(>>548)のを廃止
・共用体でリストを表現したことによりBoxの位置?がRust版(>>453)と同じに
・特に意味もなくループ文を再帰に置き換え
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.032s