この記事はpaizaのプログラミング問題をPowerShellで解いてみようという試みの記事です。
paizaのプログラミング問題とは?
ブラウザ上でコードを書いて実行できる、無料プログラミング練習問題集です。
- 難易度別に問題を選ぶ
- 問題文を読んで、解答コードを書く
- 提出するとテストケースが実行されて結果をわかる
正解・不正解だけではなく、解答コード例や解説も見ることができるので、プログラミングの習得から復習まで活用できます
こんな人におすすめ
- プログラミングスキルの腕試しをしたい方
- プログラミングのスキルアップしたい方
- 新しい言語にチャレンジをしたい方
通常は問題をc言語やJavaなどで解くのですがPowerShellで解いてみます。
問題
【殿堂入りキャンペーン】名刺バインダー管理 (paizaランク B 相当)
問題
あなたはこれまでに出会った人たちの名刺を集めています。
名刺は、複数枚のファイルを閉じることができるバインダーに保存されています。
1枚のファイルには、n個のポケットが横に並んでおり、表と裏の両面から名刺を眺めることができます。
このため、1つのポケットには、2枚の名刺が背中合わせに入っています。
各名刺には1から順に通し番号が付いているため、この番号の順に名刺を眺めることができるようにポケットに入っています。
1番からn番の名刺は、1枚目のファイルの表面から見たときに左詰めに並んでおり、
n+1番から2n番の名刺は、1枚目のファイルの裏面から見たときに左詰めに並んでいます。
2枚目以降のファイルにも同様に名刺が並んでいます。
入力: n m
出力: m番の名刺の裏側の番号
コード:
# 標準入力を読み込み、数値型に変換
$n, $m = (read-host).split()
$n = [int]$n
$m = [int]$m
# バインダーのページ番号を計算
$page=1
$tmp=($m - 1)
while($tmp -ge ($n * 2)){
$tmp -= ($n * 2)
$page+=1
}
# ページの最初と最後の名刺番号を計算
$page_last = $page * $n * 2
$page_first = $page_last - ($n * 2 - 1)
# 名刺の裏側の番号を計算
write-host ($page_first + $page_last - $m)
コードの説明:
1.標準入力を読み込み、数値型に変換:
$n, $m = (read-host).split()
$n = [int]$n
$m = [int]$m
- read-hostを使って標準入力から文字列を読み込みます
- split()で2つに分解して$n, $mに格納します
- $nと$mをint型に変換します
2.バインダーのページ番号を計算
$page=1
$tmp=($m - 1)
while($tmp -ge ($n * 2)){
$tmp -= ($n * 2)
$page+=1
}
- バインダーをめくってページを計算します
3.ページの最初と最後の名刺番号を計算
$page_last = $page * $n * 2
$page_first = $page_last - ($n * 2 - 1)
- ページ番号から名刺番号を計算によって求めます
4.名刺の裏側の番号を計算
write-host ($page_first + $page_last - $m)
- ページの最初と最後の名刺番号から$m番を引いて名刺裏の番号を計算してwrite-hostで出力します
終わりに
noteにPowerShellのサンプルコードの記事を書いています。そっちも見てね
PowerShellまとめ