4
0

はじめに

paizaxQiitaコラボキャンペーンに参加して、対象問題をすべて解いてみました。
言語は全問題Rustで記述しました。

標準入力からの受け取りについて

Rustは標準入力の受け取りがめんどくさいと巷でよく言われています。
普段自分が遊んでいる競技プログラミングサイトではproconioという偉大なるクレートを用いることができるためここら辺はストレスフリーなのですが、
残念ながらpaizaでは導入されていなかったため、proconioのソースから必要な一部分を拝借・修正して入力できるようにしています。(最小限のものだけとってきてるので簡易版です)

入力箇所のinputマクロは以下に記載しますが、問題の本質とはズレるので解答コードからは省略しています。

#!/usr/bin/env rust-script

use std::{collections::HashMap, io::Read};

macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let mut s = {
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};

    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };

    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };

    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };

    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };

    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

文字の一致

私の解答

文字列が一致してるかをみればいいですね!
== で判定できます。

fn main() {
    input! {
        a: String,
        b: String
    }
    if a == b {
        println!("OK");
    } else {
        println!("NG");
    }
}

一番小さい値

私の解答

5個の中で一番小さい数を出力してあげればいいので、
入力をベクタでまとめて取ってあげて最小値を出力します!

fn main() {
    input! {
        n: [usize; 5]
    }
    println!("{}", n.iter().min().unwrap());
}

足し算

私の解答

こんなに短いとコードゴルフをしたくなる方もいるかもしれませんが僕は全くできません。

fn main() {
    input! {
        a: usize,
        b: usize
    }
    println!("{}", a + b);
}

Eメールアドレス

私の解答

formatマクロでsとtを@を挟んだ文字列として出力します!

fn main() {
    input! {
        s: String,
        t: String
    }
    println!("{}", format!("{}@{}", s, t));
}

N倍の文字列

私の解答

repeatメソッドで"*"をn回繰り返します。

fn main() {
    input! {
        n: usize
    }
    println!("{}", "*".repeat(n));
}

まとめ・感想

この記事ではpaizaxQiitaコラボキャンペーン対象問題のDランク相当の問題5問を解きました。
まだDランクなので易しい問題が多かったです。
プログラミング始めたての方とか新しい言語の始めの一歩にぴったりだなと思いました。

他のランクの問題も記事があるので併せて読んでいただけると嬉しいです!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0