bouzuya.hatenablog.com

ぼうずやのにっき

impl From<Infallible> for Error / 『詳解 Rust アトミック操作とロック』 / PAST #16 G

昨日 (2024-01-08) の impl TryFrom<T> for TError = Infallible https://doc.rust-lang.org/std/convert/trait.TryFrom.html#impl-TryFrom%3CU%3E-for-T の件は、 crates:httphttp::uri::Builder https://docs.rs/http/1.0.0/http/uri/struct.Builder.html にならって、 impl From<Infallible> for Error https://docs.rs/http/1.0.0/http/struct.Error.html#impl-From%3CInfallible%3E-for-Error を定義することで回避することにした。

おそらく到達しないと思うので unreachable!() で実装した。


『詳解 Rust アトミック操作とロック』を読んだ。

https://www.oreilly.co.jp/books/9784814400515/

Rustでは並行性を持つプログラムを安全に記述することができます。本書はその並行プログラムの基盤となる、アトミック操作とロックの仕組みについての理解を深め、より安全で効率の良いコードを書くための指南書です。難解だと思われがちなアトミック処理、ロック、メモリオーダリングのような低レイヤを詳細に理解し、アーキテクチャやOSによる相違を知ることで、安全で高性能な並行処理プログラムを実装できるようになります。Rustユーザはもちろん非ユーザにとっても低レイヤプログラミングの優れたリソースとなる一冊です。

アトミック操作・メモリオーダリングなどを学び、 ArcMutex などを実装する。あまり理解せず読み流したけど、きちんとやれば Rust の並行処理の基礎的な部品についての理解が深まりそう。時間があれば手を動かしたい。


PAST #16 第16回 アルゴリズム実技検定(過去問)

use proconio::input;

fn dfs(a: &[usize]) -> usize {
    if a.is_empty() {
        return 1;
    }
    let mut count = 0_usize;
    let (i, a_i) = (0, a[0]);
    for j in 1..a.len() {
        let a_j = a[j];
        for k in j + 1..a.len() {
            let a_k = a[k];
            let (a_i, a_j) = (a_i.min(a_j), a_i.max(a_j));
            let (a_j, a_k) = (a_j.min(a_k), a_j.max(a_k));
            if a_i + a_j > a_k {
                let b = a
                    .iter()
                    .copied()
                    .enumerate()
                    .filter(|(l, _)| l != &i && l != &j && l != &k)
                    .map(|(_, x)| x)
                    .collect::<Vec<usize>>();
                count += dfs(&b);
            }
        }
    }
    count
}

fn main() {
    input! {
        n: usize,
        a: [usize; 3 * n],
    };

    let ans = dfs(&a);
    println!("{}", ans);
}

今日のコミット。