FizzBuzz (フィズバズ)
以下のような感じで表示されたらよい.
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 ...
とりあえず,20くらいまで表示してみる.
if [ $(( i % 3 )) -eq 0 ]; then echo Fizz fi
3の倍数かどうかで場合分けした後,5の倍数かどうかで場合分けする場合
if [ $(( i%3 )) -eq 0 ]; then if [ $(( i%5 )) -eq 0 ]; then echo FizzBuzz else echo Fizz fi else if [ $(( i%5 )) -eq 0 ]; then echo Buzz else echo $i fi fi
if [ $(( i%5 )) -eq 0 ]; then が2回出てきてダサいけど,ちゃんと動作する.
if [ $(( ( i % 3 )*( i % 5 ) )) -ne 0 ]; then echo $i fi
これを使うと,
#!/bin/bash i=0 while [ $i -lt 20 ]; do i=$(( i + 1 )) if [ $(( ( i % 3 ) )) -eq 0 ]; then echo -n Fizz fi if [ $(( ( i % 5 ) )) -eq 0 ]; then echo -n Buzz fi if [ $(( ( i % 3 )*( i % 5 ) )) -ne 0 ]; then echo -n $i fi echo done
もっとたくさん,たとえば100まで表示してみることにする. 普通にスクリプトを書くと一瞬で100まで表示されてしまう. あんまり速いと楽しくないので,sleep というコマンドを使ってみる. sleep は後ろに数字をひとつ書いて使う. 後ろに書いた数字の秒数だけ,処理を停止する. 例えば,
sleep 2
とすると,2秒間停止する(2秒も停止させたら鬱陶しくなるので数字は適当に調整しましょう).
世界のナベアツ
3の倍数と3のつく数字ではアホになる.
1 2 AHO 4 5 AHO 7 8 AHO 10 11 AHO AHO 14 AHO 16 ...
変数 text に文字列 word が含まれるかどうか調べる
if [ $( echo $text | grep $word ) ]; then echo 'found' else echo 'not found' fi
月の日数を答える
echo Enter year read year echo Enter month read month
if [ $month -lt 1 ]; then echo $month is invalid exit fi if [ $month -gt 12 ]; then echo $month is invalid exit fi
Gregorius XIII, 1502年1月7日 - 1585年4月10日. 第226代ローマ教皇(在位:1572年-1585年). 1582年にグレゴリオ暦を採用.
曜日判定
カレンダーを表示する cal というコマンドがあるので,それを使って正しく曜日判定できているかどうか確認することができる.使い方は,
$ cal 12 1867 December 1867 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
坂本龍馬が暗殺された1867年12月10日は火曜日(当時は曜日とか使ってないので曜日がわかっても意味ないけど).
カレンダー
--------------------------- 2020.10 --------------------------- Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ---------------------------
毎月22日はショートケーキの日.
素数判定
i=2 while [ $i -le $(( n - 1 )) ]; do echo $i i=$(( i + 1 )) done
i=2 while [ $i -le $(( n - 1 )) ]; do echo $(( n % i )) i=$(( i + 1 )) done
素数探索
素因数分解
スクリプトに引数 m を渡して,次の数列を計算させる \[ X_{0} = X_{1} = \cdots = X_{m-2} = 0, \ X_{m-1} = 1 \] \[ X_{n+m} = X_n + X_{n+1} + \cdots + X_{n+m-1} \ \ \text{for} \ \ n \ge 0 \]
アメダスのデータから年平均気温を計算する.
/home/atmos/ipesc/sample/amedas
y=$( echo $x | awk -F ',' '{print $2}' | awk '{print $1}' )
z=$( echo "$x + $y" | bc ) average=$( echo "scale=2; $sum / $num" | bc )
1945年の6月と7月の気温は欠測になっている. 1945年のデータを処理するためには,欠測の場合の処理を入れる必要がある.
2018 16.32 2019 16.58 2020 16.56 2021 16.46 2022 16.49
アメダスのデータから日最高気温の年平均を計算する.
2018 21.58 2019 21.82 2020 21.91 2021 21.84 2022 21.93
アメダスのデータから日最低気温の年平均を計算する.
2017 11.22 2018 11.80 2019 12.04 2020 11.98 2021 11.81 2022 11.84
1891年から2021年までの期間について,岡山の年平均気温を計算する.
DATADIR=/home/atmos/ipesc/sample/amedas for YYYY in $( seq 1891 2020 ); do DATAFILE=${DATADIR}/Okayama_Okayama_${YYYY}.csv done
/home/atmos/ipesc/sample/number/pi100000.txt には円周率の100,000桁が書かれている.0から9の各数字の出現頻度を調べよ.
円周率の小数点以下762桁目から767桁目は「9」が6個連続して並ぶ.これをファインマン・ポイントと呼ぶらしい.リチャード・ファインマンが円周率をこの桁まで暗記したいと言った,とされているためだが,ファインマンがそう言ったかどうかは明らかではないらしい.
円周率の各桁の数字はランダムに現れているように見えるが,乱数列であるとは証明されていない.乱数列であるなら,各数字が出現する確率は等しい.
/home/atmos/ipesc/sample/number/e.txt にはネイピア数の50,000桁が書かれている.0から9の各数字の出現頻度を調べよ.
$ cut -d ' ' -f 2 /home/atmos/ipesc/sample/number/e.txt
自然対数の底. 円周率と同格の偉さの数学定数だと思うのだが,円周率に比べると人気がないような気がする? (数学定数の「偉さ」とかいう基準が意味不明ではあるが)
文書中で使用されている各アルファベットの使用回数を数える.
/home/atmos/ipesc/sample/text/My_favorite_things.txt /home/atmos/ipesc/sample/text/Hotel_Mauna_Kea.txt /home/atmos/ipesc/sample/text/Potential_Vorticity.txt /home/atmos/ipesc/sample/text/Lorem_ipsum.txt /home/atmos/ipesc/sample/text/Pangram.txt
for char in {a..z}; do echo $char done
infile という名前のファイルに中にある Win を Mac に置き換える
$ sed -e "s/Win/Mac/g" infile
以下のようにすれば削除になる
$ sed -e "s/Win//g" infile
入力はパイプで流し込むことも可
$ cat infile | sed -e "s/Win/Mac/g"
[a-z] は a から z までのいずれかの文字
$ sed -e "s/[a-z]/X/g" infile
[^a-z] は a から z までのいずれかの文字以外
$ sed -e "s/[^a-z]/X/g" infile
$ echo ${word,,}
あるいは
$ echo ${word} | tr A-Z a-z
$ wc -m infile $ cat infile | wc -m
エドガー・アラン・ポーの有名な小説.下のリンク先を見るとネタバレしちゃうので,これから小説を読むつもりの人は考えてからクリックしてください.