bouzuya.hatenablog.com

ぼうずやのにっき

bouzuya/firestore-structured-query 0.1.0, 0.2.0 をつくった / ABC218 D

bouzuya/firestore-structured-query 0.1.0, 0.2.0 をつくった。

firestore-structured-query は Rust から Firestore の RunQueryRequest のパラメーターに使用する StructuredQuery を構築するための helper を提供する crate 。

現状は README にあるとおり、 whereorder_by のためのものしか生成できない。

#[test]
fn test_simple_example() -> firestore_structured_query::Result<()> {
    use firestore_structured_query::{
        FieldPath, FieldPathFilterExt as _, FieldPathOrderExt as _, Filter,
    };
    use google_api_proto::google::firestore::v1::StructuredQuery;

    let _ = StructuredQuery {
        select: None,
        from: vec![],
        r#where: Some(
            Filter::and([
                FieldPath::raw("field1").less_than(&1)?,
                FieldPath::raw("field2").less_than_or_equal(&2)?,
                FieldPath::raw("field3").greater_than(&3)?,
                FieldPath::raw("field4").greater_than_or_equal(&4)?,
                FieldPath::raw("field5").equal(&5)?,
                FieldPath::raw("field6").not_equal(&6)?,
                FieldPath::raw("field7").array_contains(&7)?,
                FieldPath::raw("field8").r#in(&[8])?,
                FieldPath::raw("field9").array_contains_any(&[9])?,
                FieldPath::raw("field10").not_in(&[10])?,
                Filter::or([
                    FieldPath::raw("f").equal(&"a")?,
                    FieldPath::raw("f").equal(&"b")?,
                ]),
            ])
            .into(),
        ),
        order_by: vec![
            FieldPath::raw("field1").ascending(),
            FieldPath::raw("field2").descending(),
        ],
        start_at: None,
        end_at: None,
        offset: 0_i32,
        limit: None,
    };
    Ok(())
}

最終的には StructuredQuery を生成するものにしようかと思っている。

ドキュメントコメントもついていないのでそちらも書かないといけない。


ABC218 : AtCoder Beginner Contest 218

use std::collections::HashSet;

use proconio::input;

fn main() {
    input! {
        n: usize,
        xy: [(i64, i64); n],
    };
    let mut ans = HashSet::new();
    let set = xy.iter().collect::<std::collections::HashSet<_>>();
    for i in 0..n {
        let (x_i, y_i) = xy[i];
        for j in i + 1..n {
            let (x_j, y_j) = xy[j];
            if x_i == x_j || y_i == y_j {
                continue;
            }
            if set.contains(&(x_i, y_j)) && set.contains(&(x_j, y_i)) {
                ans.insert((x_i.min(x_j), y_i.min(y_j), x_i.max(x_j), y_i.max(y_j)));
            }
        }
    }
    println!("{}", ans.len());
}

今日のコミット。