Closed10

Rust で競プロをしてみるかもしれない

atreeatree

なんかやるかもしれない。アルゴリズムまで完全に移行するかはわからないが、ヒューリスティックを Rust でできたらいいなとは思っている。

Motivation

  • 安全
  • iterator をメソッドチェーンでわちゃわちゃしてみたい
  • C++ 以外も書いてみたい
atreeatree

proconioが強いので使おうと思うが、とりあえず言語機能を使って入力してみる。

let (a, b) = {
        let mut buf = String::new();
        std::io::stdin()
            .read_line(&mut buf)
            .expect("Failed to read stdin!");
        let ws = buf.trim_end().to_string().split_whitespace();
        let a = ws
            .next()
            .expect("Not enough input!")
            .parse()
            .expect("Failed to parse!");
        let b = ws
            .next()
            .expect("Not enough input!")
            .parse()
            .expect("Failed to parse!");
        (a, b)
    };

Stringを生やして、行ごとに読んでResultが返ってくる(std::io::read_line)。あとは&strStringにしてsplit_whitespace()した iterator にしてnext()で読み進めていくっぽい。めんどくさいね。AtCoder は proconio があるからいいけど他コンテストサイト用にそれっぽいマクロがあってもいいかも。

atreeatree
+ use itertools::iproduct;

  fn main() {
-     for i in 0..n {
-         for j in 0..m {
+     for (i, j) in iproduct!(0..n, 0..m) {
          todo()!
-         }
      }
  }
atreeatree
use itertools::*;
use proconio::{fastout, input};
 
#[fastout]
fn main() {
    input! {
        n: usize,
        points:[(f64, f64); n],
    }
    let ans = points
        .iter()
        .tuple_combinations()
        .map(|((xi, yi), (xj, yj))| (xi - xj).hypot(yi - yj))
        .fold(0.0 / 0.0, |m, v| v.max(m));
    println!("{}", ans);
}

itertools::tuple_combinations()が便利。closure がよくわかっていない?

atreeatree

String&strにするときはstd::string::String::as_str()

このスクラップは2021/08/31にクローズされました