paiza×Qiitaコラボキャンペーンとの事で、日本語プログラミング言語「なでしこ」でpaizaラーニングレベルアップ問題集にチャレンジしてみました。
ご注意
この記事は「paizaラーニングレベルアップ問題集」を解説した記事です。
通常の「paizaスキルチェック問題」の解答公開は禁止されていますのでご注意ください。
「なでしこ」とは?
日本語を基にしたプログラミング言語で、大きく分けると「なでしこ1」と「なでしこ3」があります。
違いや用途、インストール方法などは公式サイト( https://nadesi.com/ )に詳しく書かれています。
開発環境
公式サイトからダウンロードして自前の環境でコーディングしても良いですが、とりあえず使ってみたいという場合は、paiza.IO( https://paiza.io/ja )がオススメです。
※ なでしこ3(v3.3.63)です。
今回の問題
コード
# *** 入力 ***
「/dev/stdin」から開いて《入力文字列》に代入
# *** 《入力文字列》をパース ***
《入力文字列》を改行で区切って《一時保管配列》に代入
《一時保管配列》@0を整数変換して《当選番号》に代入
《一時保管配列》@1を整数変換して《購入枚数》に代入
《購入くじリスト》は【】
《添字》を0から(《購入枚数》-1)まで繰り返す
《購入くじリスト》に《一時保管配列》@(《添字》+2)を整数変換したそれを追加
ここまで
# *** 《購入くじリスト》の当選判定 ***
《前番号》は《当選番号》-1
《後番号》は《当選番号》+1
《二等番号》は《当選番号》%10000
《三等番号》は《当選番号》%1000
《判定結果リスト》は【】
《くじ番号》で《購入くじリスト》を反復
もし《くじ番号》が《当選番号》と等しいならば
《判定結果》は「first」
違えば、もし(《くじ番号》が《前番号》と等しい)または(《くじ番号》が《後番号》と等しい)ならば
《判定結果》は「adjacent」
違えば、もし(《くじ番号》%10000)が《二等番号》と等しいならば
《判定結果》は「second」
違えば、もし(《くじ番号》%1000)が《三等番号》と等しいならば
《判定結果》は「third」
違えば
《判定結果》は「blank」
ここまで
《判定結果リスト》に《判定結果》を追加
ここまで
# *** 出力 ***
《判定結果リスト》を反復
対象を表示
ここまで
解説
1.入力 の部分
問題文の入力例1の場合、当選番号が142358、購入枚数が3、購入した各くじの番号が「195253, 167358, 142359」という文字列が改行区切りで入力されますので、一旦、《入力文字列》という変数に代入します。
# *** 入力 ***
「/dev/stdin」から開いて《入力文字列》に代入
「/dev/stdin」から開いて《入力文字列》に代入
標準入力から一括で文字列を受け取り《入力文字列》に代入します。
↓
《入力文字列》=「142358\n3\n195283\n167358\n142359」
2.《入力文字列》をパース の部分
《入力文字列》に代入された文字列を、プログラムで使いやすいように整理して各変数に代入します。
《当選番号》: 一等賞のくじ番号(整数型)
《購入枚数》: 購入したくじの枚数(整数型)
《購入くじリスト》: 購入したくじの番号(整数型を要素に持つ配列)
# *** 《入力文字列》をパース ***
《入力文字列》を改行で区切って《一時保管配列》に代入
《一時保管配列》@0を整数変換して《当選番号》に代入
《一時保管配列》@1を整数変換して《購入枚数》に代入
《購入くじリスト》は【】
《添字》を0から(《購入枚数》-1)まで繰り返す
《購入くじリスト》に《一時保管配列》@(《添字》+2)を整数変換したそれを追加
ここまで
《入力文字列》を改行で区切って《一時保管配列》に代入
《入力文字列》を改行で区切って《一時保管配列》に代入します。
↓
《一時保管配列》=【「142358」, 「3」, 「195283」, 「167358」, 「142359」】
《一時保管配列》@0を整数変換して《当選番号》に代入
《一時保管配列》の1番目要素(「142358」)を整数に変換して《当選番号》に代入します。
↓
《当選番号》=142358
《一時保管配列》@1を整数変換して《購入枚数》に代入
《一時保管配列》の2番目要素(「3」)を整数に変換して《購入枚数》に代入します。
↓
《購入枚数》=3
《購入くじリスト》は【】
《購入くじリスト》を空配列で初期化します。
↓
《購入くじリスト》=【】
《添字》を0から(《購入枚数》-1)まで繰り返す
《購入くじリスト》に《一時保管配列》@(《添字》+2)を整数変換したそれを追加
ここまで
《添字》を0から(《購入枚数》-1)まで1ずつ増やしながら繰り返します。
(《購入枚数》=3なので、《添字》=0、《添字》=1、《添字》=2で、3回繰り返す設定)
《添字》=0のとき、
《購入くじリスト》に《一時保管配列》@2(0+2)を整数変換したそれを追加します。
(《一時保管配列》@2=「195283」なので、整数変換した 195283 を《購入くじリスト》に追加)
↓
《購入くじリスト》=【195283】
《添字》=1のとき、
《購入くじリスト》に《一時保管配列》@3(1+2)を整数変換したそれを追加します。
(《一時保管配列》@3=「167358」なので、整数変換した 167358 を《購入くじリスト》に追加)
↓
《購入くじリスト》=【195283, 167358】
《添字》=2のとき、
《購入くじリスト》に《一時保管配列》@4(2+2)を整数変換したそれを追加します。
(《一時保管配列》@4=「142359」なので、整数変換した 142359 を《購入くじリスト》に追加)
↓
《購入くじリスト》=【195283, 167358, 142359】
3.《購入くじリスト》の当選判定 の部分
# *** 《購入くじリスト》の当選判定 ***
《前番号》は《当選番号》-1
《後番号》は《当選番号》+1
《二等番号》は《当選番号》%10000
《三等番号》は《当選番号》%1000
《判定結果リスト》は【】
《くじ番号》で《購入くじリスト》を反復
もし《くじ番号》が《当選番号》と等しいならば
《判定結果》は「first」
違えば、もし(《くじ番号》が《前番号》と等しい)または(《くじ番号》が《後番号》と等しい)ならば
《判定結果》は「adjacent」
違えば、もし(《くじ番号》%10000)が《二等番号》と等しいならば
《判定結果》は「second」
違えば、もし(《くじ番号》%1000)が《三等番号》と等しいならば
《判定結果》は「third」
違えば
《判定結果》は「blank」
ここまで
《判定結果リスト》に《判定結果》を追加
ここまで
《前番号》は《当選番号》-1
《後番号》は《当選番号》+1
《二等番号》は《当選番号》%10000
《三等番号》は《当選番号》%1000
後で当選の判定をするときに使用するため《当選番号》から前後賞、二等賞、三等賞の番号を算出しておきます。
《当選番号》=142358
《前番号》=142357(142358-1) *当選番号-1の前後賞
《後番号》=142359(142358+1) *当選番号+1の前後賞
《二等番号》=2358(142358%10000) *当選番号の下4桁
《三等番号》=358(142358%1000) *当選番号の下3桁
《判定結果リスト》は【】
《判定結果リスト》を空配列で初期化します。
↓
《判定結果リスト》=【】
《くじ番号》で《購入くじリスト》を反復
もし《くじ番号》が《当選番号》と等しいならば
《判定結果》は「first」
違えば、もし(《くじ番号》が《前番号》と等しい)または(《くじ番号》が《後番号》と等しい)ならば
《判定結果》は「adjacent」
違えば、もし(《くじ番号》%10000)が《二等番号》と等しいならば
《判定結果》は「second」
違えば、もし(《くじ番号》%1000)が《三等番号》と等しいならば
《判定結果》は「third」
違えば
《判定結果》は「blank」
ここまで
《判定結果リスト》に《判定結果》を追加
ここまで
《くじ番号》で《購入くじリスト》の先頭から順番に繰り返します。
(《購入くじリスト》=【195283, 167358, 142359】なので、《くじ番号》=195283、《くじ番号》=167358、《くじ番号》=142359で、3回繰り返す設定)
《くじ番号》=195283 の判定
一等賞の 142358 と等しくなく、
前後賞の 142357 または 142359 と等しくなく、
二等賞の下四桁 2358 と等しくなく、
三等賞の下三桁 358 と等しくないので、
《判定結果リスト》末尾に「blank」を追加
《くじ番号》=167358 の判定
一等賞の 142358 と等しくなく、
前後賞の 142357 または 142359 と等しくなく、
二等賞の下四桁 2358 と等しくなく、
三等賞の下三桁 358 と等しいので、
《判定結果リスト》末尾に「third」を追加
《くじ番号》=142359 の判定
一等賞の 142358 と等しくなく、
前後賞の 142357 と等しくないが、 142359 と等しいので、
《判定結果リスト》末尾に「adjacent」を追加
↓
《判定結果リスト》=【「blank」, 「third」,「adjacent」】
4.出力
《判定結果リスト》を反復
対象を表示
ここまで
《購入くじリスト》の先頭から次々と参照し、表示します。
コードの提出
ここまでで一旦完了したのですが、paizaラーニングでは提出言語に「なでしこ」の選択項目がありません!( ;∀;)ぁぅー
でも大丈夫!「なでしこは」paizaの環境に存在するので、「なでしこ」を呼び出してあげれば良いのです!
bash から コマンドライン版なでしこ(cnako3)を呼び出してあげます。
cnako3 -e "$(cat << 'EOF'
# *** 入力 ***
「/dev/stdin」から開いて《入力文字列》に代入
# *** 《入力文字列》をパース ***
《入力文字列》を改行で区切って《一時保管配列》に代入
《一時保管配列》@0を整数変換して《当選番号》に代入
《一時保管配列》@1を整数変換して《購入枚数》に代入
《購入くじリスト》は【】
《添字》を0から(《購入枚数》-1)まで繰り返す
《購入くじリスト》に《一時保管配列》@(《添字》+2)を整数変換したそれを追加
ここまで
# *** 《購入くじリスト》の当選判定 ***
《前番号》は《当選番号》-1
《後番号》は《当選番号》+1
《二等番号》は《当選番号》%10000
《三等番号》は《当選番号》%1000
《判定結果リスト》は【】
《くじ番号》で《購入くじリスト》を反復
もし《くじ番号》が《当選番号》と等しいならば
《判定結果》は「first」
違えば、もし(《くじ番号》が《前番号》と等しい)または(《くじ番号》が《後番号》と等しい)ならば
《判定結果》は「adjacent」
違えば、もし(《くじ番号》%10000)が《二等番号》と等しいならば
《判定結果》は「second」
違えば、もし(《くじ番号》%1000)が《三等番号》と等しいならば
《判定結果》は「third」
違えば
《判定結果》は「blank」
ここまで
《判定結果リスト》に《判定結果》を追加
ここまで
# *** 出力 ***
《判定結果リスト》を反復
対象を表示
ここまで
EOF
)"
コードを提出!
やったね!
Ruby から提出することも出来ます。
↓
exec "cnako3", "-e", DATA.read
__END__
# *** 入力 ***
「/dev/stdin」から開いて《入力文字列》に代入
# *** 《入力文字列》をパース ***
《入力文字列》を改行で区切って《一時保管配列》に代入
《一時保管配列》@0を整数変換して《当選番号》に代入
《一時保管配列》@1を整数変換して《購入枚数》に代入
《購入くじリスト》は【】
《添字》を0から(《購入枚数》-1)まで繰り返す
《購入くじリスト》に《一時保管配列》@(《添字》+2)を整数変換したそれを追加
ここまで
# *** 《購入くじリスト》の当選判定 ***
《前番号》は《当選番号》-1
《後番号》は《当選番号》+1
《二等番号》は《当選番号》%10000
《三等番号》は《当選番号》%1000
《判定結果リスト》は【】
《くじ番号》で《購入くじリスト》を反復
もし《くじ番号》が《当選番号》と等しいならば
《判定結果》は「first」
違えば、もし(《くじ番号》が《前番号》と等しい)または(《くじ番号》が《後番号》と等しい)ならば
《判定結果》は「adjacent」
違えば、もし(《くじ番号》%10000)が《二等番号》と等しいならば
《判定結果》は「second」
違えば、もし(《くじ番号》%1000)が《三等番号》と等しいならば
《判定結果》は「third」
違えば
《判定結果》は「blank」
ここまで
《判定結果リスト》に《判定結果》を追加
ここまで
# *** 出力 ***
《判定結果リスト》を反復
対象を表示
ここまで
さいごに
こんな感じで、「なでしこ3」でpaizaラーニング問題集を解くことが出来ます。
日本語プログラミングも結構楽しいので皆さんもやってみて下さい!