BASHであそぼ

この記事は UEC Advent Calendar 2023 の5日目です。

 

4日目はみみ(@mimi_chan_uec)さんのパソコン周りの紹介でした。

ThinkPadとかいう真ん中に赤いボタン?があって操作しやすいパソコン、学内で使っているのを何人か見かけていてとても気になっています。それと、自分もwslというLinuxのお友達みたいなものをwindowsに入れて使っているので、Arch Linuxはとても気になっています。今度新しいパソコンを買うので入れて遊んでみたいです。

 

自己紹介

トナカイ(@reindeeruec)です。1類CSプログラムの2年生をしています。今75単位取っていて、フル単すると今学期で100単位になる馬鹿の履修をしてるせいでとても忙しくて後悔しています。

初音ミクのライブをしてるVLLというサークルで会計したり権利処理したり3DCGで遊んだりしています。今年は鋭意製作中です!

 

今年も12/16, 17(土日)にMIKUECというライブを電通大の講堂でやってるので、よかったら来てね!!無料だけど予約が必要です(宣伝)

本題

1類の授業で「情報領域演習」という授業があります。これはC言語を使ってプログラミングの問題を解こう!というものです。

「迷路を解くプログラムを書いて」「最短経路を求めて」「配列を昇順に並び替えて」みたいな問題が出てきます。

 

確認するコードを通して提出する必要があるのですが、すべてのプログラムに対してコードを通すのがめんどくさいです。例えば、1クラスの人が第2回の授業の第3問のコードを提出する際には

/ced-home/staff/23jr3/02/checker1 3 解答のコード.c

みたいな風に打たないといけません。嫌です。そこで、bashで、コマンド一つでこれができるようにしてみました。

 

今回のコードは私が受けてる授業に特化して作られてますが、コードの構造は簡単です。なので、この記事でbashの使い方や読み方をここで理解して、普段のパソコン作業の手間を少し減らす、そんなコードぐらいなら書けるようになってくれたらうれしいです。

始める前に

これから作るbashとかMakefileは、最初に作った時の権限がreadとwriteしか与えられていません。そのため、そのまま実行すると

reindeer@DESKTOP-IF7E54E:~/4seme$ ./rta.sh
bash: ./rta.sh: Permission denied

のように、権限がないと怒られてしまいます。なので、

chmod 700 rta.sh

として権限を与えましょう。

また、bashwindowsでは対応してないので、windowsユーザーは大学のパソコンを使うかwslを入れてやりましょう。

Bash

全部提出してくれるやつ

問題が6~8個それぞれの回にあって一つ一つ提出するのが億劫なので、全部まとめて提出するものを作りました。名前はrta.shです。(授業が始まる前にすべてを終わらせておいて、始まったと同時にまとめて提出したいので)

#!/bin/bash

# 説明
# このスクリプトは、纏めてチェッカーに通すプログラムです
# file_numberは、第何回のプログラムかを表します
# problemsは、問題数を表します
# このプログラムは{file_number}_{i}.cを実行しています。5_8.cみたいな感じ>。
# あなたの命名に沿って書き換えてください。25行目のcommand=~の部分です。

# 第何回?
file_number=7

#   問題数
problems=7

if [ $# -ne 0 ] && [ $# -ne 2 ]; then # 引数の数が0か2以外の時にエラーを返す
  echo "Usage: $0 <probnum> <execfile>"
  exit 1
fi

directory="/ced-home/staff/23jr3/01/checker2" # 01の部分は回ごとに変える

for i in $(seq 1 $problems); do
  command="$directory $i ${file_number}_$i.c" # /ced-home/staff/23jr3/01/checker2 1 7_1.c みたいなコードを実行する
  eval "$command"
done

$directory

echo "executing $command"

最初に呪文#!/bin/bash(これは書くお約束)を書いて、変数に回ごとの数字を与えて、if文でエラー処理をして、for文で繰り返しコードを実行するだけです。基礎プロを触った電通大生なら、bashを見るのが初めてでも、何言ってるか割とわかるんじゃないでしょうか。

それと、bashでは problems みたいに宣言した変数は $ マークをつけて $problems とすることでそのあとで変数として使えるようになります

 

次に行きましょう

実行してくれるやつ

execute.shです。./input.in に入力したい内容を書いておくと、その中身を入力して実行してくれます。

個人的には、C言語を実行するときのオプションを覚えなくて済むのと、実行ファイルの名前を指定せずに実行できるのがうれしいポイントです。

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage: $0 "
  exit 1
fi

output=$(echo "$1" | sed 's/\.c$/.out/') # 5_2.c みたいなファイルを受け取って、5_2.out という出力ファイルの名前を吐き出す

command_to_run="cc -std=c99 -O2 -Wall $1 -o $output "
# コマンドを実行
eval "$command_to_run"
echo "Executing $command_to_run"


directory="./input.in"
eval "./$output < $directory"
echo "Executing ./$output < $directory"

$1は第一引数の意です。なので、こんな感じに使います。

reindeer@DESKTOP-IF7E54E:~/4seme$ ./execute.sh add.c
Executing cc -std=c99 -O2 -Wall add.c -o add.out 
Enter two numbers: Sum of 2 and 3 is 5
Executing ./add.out < ./input.in

ここで使ったadd.cはただの足し算プログラムです。

#include 

int main(void)
{
    int a, b, c;
    printf("Enter two numbers: ");
    if(scanf("%d %d", &a, &b) != 2)
    {
        printf("Invalid input\n");
        return 1;
    }
    c = a + b;
    printf("Sum of %d and %d is %d\n", a, b, c);
    return 0;
}


おわりに

はじめてのブログで右も左も分からずhtmlを書いていたら現在23時50分になってしまいました。なので、今回はここで終わりにします。

他にも、

  • 出力例と実際の出力を比較して正しく出力できてるか確認するプログラムchecker.py
  • 実行して、作った実行ファイルをchecker.pyにかけて正しいか確認してくれるMakefile
  • 離籍していてもマウスカーソルを動かすことで教師の出席をかいくぐるmouse.py

を作ったのですがとても便利なので、皆さんも自力で書いたりChat GPTに頼ったりしながら作ってみることをおすすめします。意外と簡単にできるので達成感が得られるし、友達にどや顔で自慢できます。何より、こういうのを作るのってとても楽しいです。

 

明日はlnさんのプロコンの話ですね。競技プログラミングにはとても興味があるので、とても楽しみにしてます。