Closed10
Rust で競プロをしてみるかもしれない
なんかやるかもしれない。アルゴリズムまで完全に移行するかはわからないが、ヒューリスティックを Rust でできたらいいなとは思っている。
Motivation
- 安全
- iterator をメソッドチェーンでわちゃわちゃしてみたい
- C++ 以外も書いてみたい
とりあえず環境構築が微妙にわからない(エディタ)ので neovim を使っておく。Clion に移行したい。fannheyward/coc-rust-analyzer
let g:rustfmt_autosave = 1
cargo-compete
を使ってみる。
なんか coc-nvim がうるさいので https://qiita.com/yuku_t/items/6db331e7084f88b43fe4 をやる。
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
)。あとは&str
をString
にしてsplit_whitespace()
した iterator にしてnext()
で読み進めていくっぽい。めんどくさいね。AtCoder は proconio があるからいいけど他コンテストサイト用にそれっぽいマクロがあってもいいかも。
+ 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()!
- }
}
}
浮動小数点型はOrdered
でないのでmax()
を取れない。https://qiita.com/lo48576/items/343ca40a03c3b86b67cb
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 がよくわかっていない?
String
を&str
にするときはstd::string::String::as_str()
std::iter::Iterator::enumerate()
、C++ にも欲しい
このスクラップは2021/08/31にクローズされました