walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

彼女をプログラムするときに使ったBashのTips

某オンラインハッカソンのプログラミング問題で,彼女を着せ替える時に使ったBashのTipsを自分用にlog.

ワンライナー

セミコロンで区切れば基本なんでも繋げられる.

read n; for i in `seq $n`; do echo $i; done

お手軽計算

$(())で囲った式は簡単に計算できる.

echo $((100*22))

readで2変数に同時入力

スペースで2個並べればおk.

read a b;read c d; if [ $((a+b)) -gt $((c+d)) ]; then echo 1; else echo 0; fi

入力した文字列を繋げてく

連続して入力される文字列を連結する.

read n; read str; for i in `seq $((n-1))`; do read t; str=$str"-"$t; done; echo $str

標準入力から配列を作る

ちょい複雑.コマンドライン上では{}がいらないのに,.shを使うときは必要だったりよくわからなかった.

while true; do read t; arr=(${arr[@]} $t); echo ${arr[@]}; done

配列内の数値をsort

参考URLはどこかへ行ってしまった...

arr=(`for t in ${arr[@]}; do echo $t; done|sort -n`)

二次元配列を実現する方法

1次元配列を二次元配列のように扱うためには.
n*nのmatrixのy行x列目の要素は,indexが0~nの場合 matrix[y*n+x] のように表せる.Bashでは配列のindexが0と1どちらから始まるかを見極めるのが重要.以下は配列のindexが1から始まる場合の例.

read n
for i in `seq $((n*n))`; do read t; matrix=(${matrix[@]} $t); done
for y in `seq $n`;do
	for x in `seq $n`;do
		printf "${matrix[$(((y-1)*n+x))]} "
	done
	printf "\n"
done

こんなのもあった.
シェルスクリプトで2次元配列を扱ってみた|黒ぶちメガネのblog
http://www.kurobuti.com/blog/?p=4880

まとめ

多分,あちら側のシステムの問題かコードのシンタックスエラーかなんかでBashで解答通らなくて,最終的にはCで同じアルゴリズム実装して解いたんだけど,とりあえずシェルプログラミング楽しかった.

あとは,脱衣ブロック崩しならぬ,プログラミングで脱がせられる脱衣プログラミングがあれば,日本のITはめざましい進歩を遂げそうと思いました.ブロック崩しとかありえないくらい頑張ったもんね

おわり

echo "プログラミング最高!"