💻

paizaのRustの問題を解いてみる(初心者向け)

2021/07/17に公開

機械学習という文脈だとRustのほうがよいのかも?と思い、Rust を学び始めました。

https://vaaaaaanquish.hatenablog.com/entry/2021/07/10/110000

https://techbookfest.org/product/6378148180525056?productVariantID=5707564777996288

https://www.amazon.co.jp/dp/1484251202

出来たら競プロの問題のような取り組みやすいモノがイイなと思い探したところ、まだ Beta ですが、paiza のレベルアップ問題集を見つけました。

https://paiza.jp/works/mondai?language_uid=rust

解答を共有してもよい、とのことでしたので学びもかねてまとめてみました。

なお、問題集ということもあり内容は偏っているので、普遍的に Rust を学びたい場合は下記をお勧めいたします。

https://doc.rust-jp.rs/

https://zenn.dev/mebiusbox/books/22d4c1ed9b0003

https://zenn.dev/toga/books/rust-atcoder

https://speakerdeck.com/helloyuk13/rusthanzuon-at-eurekashe

① 文字列を取得して出力

文字列の入力を取得して出力するシンプルな問題です。
https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step1

Rust は Python の input、Go の fscan のような入力を取得する関数はないようです。

下記のサイトの入力取得用のマクロを参照ください。
https://qiita.com/tubo28/items/e6076e9040da57368845

また、文字列の型については下記サイトを参照ください。
https://doc.rust-jp.rs/rust-by-example-ja/std/str.html

解答
use std::io::*;
use std::str::FromStr;

// 入力を取得する関数
fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char) 
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

fn main(){
    let a: String = read();
    println!("{}", a);
}

② 繰り返し取得&出力

for 文を使った繰り返し処理です。
https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step3

繰り返し処理については下記サイトを参照ください。
https://doc.rust-jp.rs/rust-by-example-ja/flow_control/for.html

解答
use std::io::*;
use std::str::FromStr;

// 入力を取得する関数
fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char) 
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

fn main(){
  let num: u32 = read();

  // 繰り返し処理
  for n in 0..num {
    let x: u32 = read();

    // 入力を取得し代入した変数を出力
    println!("{}", x);
  }
}

③ 入力した内容を配列に保存する

配列処理です。

https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step4

ベクターという連続する拡張可能な配列型を使用しました。
https://moshg.github.io/rust-std-ja/std/vec/struct.Vec.html

ベクターの並び替えはソート .sort() を使用します。
https://uma0317.github.io/rust-cookbook-ja/algorithms/sorting.html

ベクターの長さは .len() を使用します。
https://doc.rust-jp.rs/rust-by-example-ja/std/vec.html

解答
use std::io::*;
use std::str::FromStr;

// 入力を取得する関数
fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char) 
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

fn main(){

  let num = read();

  // ベクター
  let mut input_vector = Vec::new();

  for n in 0..num {
    let x: i32 = read();
    input_vector.push(x);
  }
  
  // 並び替え
  input_vector.sort();

  //並び替え後、もっとも最後のデータ=最大値を出力
  println!("{:?}", input_vector[input_vector.len()-1]);
}

本サイトでは以上ですが、下記サイトに少しずつ解答を追加していくのでよろしければご覧ください。

https://zenn.dev/megane_otoko/scraps/32a980aa6debd5

1日1問、コツコツ進めていきます。

以上になります、最後までお読みいただきありがとうございました。

Discussion