こんにちは。谷口です。
paizaでは、プログラミングスキルチェック問題を公開しています。
また、プログラミング初心者の方向けに「スキルチェック入門編」も全編無料公開をしています。
スキルチェック入門編では、スキルチェックのレベルアップ問題集を題材に、プログラミング問題の解き方だけでなく、さらにコードを見やすく・シンプルな処理に改善する方法や考え方なども解説しています。「プログラミングの勉強がしたい」「問題を解けるようになりたい」という方の役に立つ内容になっています。
先日「スキルチェック入門編5:宝くじ(Cランク)」が追加されましたので、今回はその内容をご紹介します。
※スキルチェック入門編5:宝くじ(Cランク)ではRubyで問題を解いていますが、解き方やアルゴリズムに関してはどの言語でも通じます。
スキルチェック入門編5:宝くじ(Cランク)の問題内容
今年もパイザ宝くじの季節がやってきました。パイザ宝くじ券には 100000 以上 199999 以下の 6 桁の番号がついています。毎年1つ当選番号 (100000 以上 199999 以下)が発表され、当たりクジの番号が以下のように決まります。
1等:当選番号と一致する番号
前後賞:当選番号の ±1 の番号(当選番号が 100000 または 199999 の場合,前後賞は一つしかありません)
2等:当選番号と下 4 桁が一致する番号(1等に該当する番号を除く)
3等:当選番号と下 3 桁が一致する番号(1等および2等に該当する番号を除く)たとえば、当選番号が 142358 の場合、当たりの番号は以下のようになります。
1等:142358
前後賞:142357 と 142359
2等:102358, 112358, 122358, …, 192358 (全 9 個)
3等:100358, 101358, 102358, …, 199358 (全 90 個)あなたが購入した n 枚の宝くじ券の各番号が入力されるので、それぞれの番号について、何等に当選したかを出力するプログラムを書いて下さい。
入力される値:入力は以下のフォーマットで与えられます。
b
n
a_1
a_2
:
a_nここで、b は当選番号、n は購入した宝くじの数、a_1,…,a_n は購入した宝くじ券の番号をそれぞれ表します。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力は n 行からなります。各 i 行目 (1 ≦ i ≦ n) には、a_i が何等に当たったかに応じて、以下の文字列を出力して下さい。
1等の場合: first
前後賞の場合: adjacent
2等の場合: second
3等の場合: third
それ以外(はずれ)の場合: blank最後は改行し、余計な文字、空行を含んではいけません。
条件:すべてのテストケースにおいて、入力される値は全て整数であり、以下の条件をみたします。
100,000 ≦ b ≦ 199,999
1 ≦ n ≦ 100
100,000 ≦ a_i ≦ 199,999 (1 ≦ i ≦ n)
問題文の整理
問題文を整理すると「購入した n 枚の宝くじ券がそれぞれ何等に当選したかを出力する」ということになります。
最初に「当選番号」と「購入した宝くじ券の枚数 n」、「n枚の宝くじ券の番号」という3種類の入力が与えられ、 出力すべき内容は「n枚の宝くじ券がそれぞれ何等に当選しているか」です。
一等のときには「first」、前後賞のときには「adjacent」、二等のときには「second」、三等のときには「third」、 それ以外の、はずれだった場合には「blank」を出力します。
入出力例の解説
入力例1では、宝くじ券の当選番号が 142358 となっていて、この番号を基準にして宝くじ券の当選結果が決まります。 次に3が入力されていて、購入した宝くじ券は3枚であることがわかります。
まず1枚目の宝くじ券の番号を見てみると、195238 となっています。 この番号は、下3桁が異なっていて、前後賞でもないようなので「はずれ」となります。 そのため、はずれをあらわす「blank」を出力しています。
次に入力される宝くじ券の番号は 167358 です。 この番号は、下3桁が当選番号と一致します。そのため三等をあらわす「third」を出力しています。
その次の宝くじ券の番号は 142359 です。 この番号は当選番号に1を足した値になっていますので、前後賞をあらわす「adjacent」を出力しています。
よって、期待する出力は、 「blank」「third」「adjacent」となります。
こんな感じで、与えられた番号を 一等、前後賞、二等、三等、の順番で調べ、どれでもなかったら「はずれ」 とすれば正しく動作しそうですよね。
実際にコードを書く
まずは、入力を受け取る処理を書きます。
1行目に当選番号bが入力されて、2行目に購入した宝くじの数nが入力されるので、 こんな感じで受け取ります。
b = gets.chomp n = gets.chomp.to_i
bにはgetsで受けとった文字列を、改行を取り除いて代入しています。 nには入力を整数値に変換したものを代入しています。
続いて、ループ処理の部分を書いてみましょう。
n回宝くじ券の番号が入力されるので、このように書きます。
b = gets.chomp n = gets.chomp.to_i n.times do query = gets.chomp end
これでn回宝くじ券の番号を受け取れるようになりました。
それでは、このループの中に、n枚の宝くじ券が何等であるかを出力するコードを書きましょう。 条件分岐にはifを使います。
b = gets.chomp n = gets.chomp.to_i n.times do query = gets.chomp if query == b puts "first" elsif query.to_i == b.to_i + 1 || query.to_i == b.to_i - 1 puts "adjacent" elsif query[2..5] == b[2..5] puts "second" elsif query[3..5] == b[3..5] puts "third" else puts "blank" end end
まとめ
とりあえずこれで答えは出ますので、ひとまず正解の解答コードができました。
スキルチェック入門編5:宝くじ(Cランク)では、このコードの冗長な部分をもっとシンプルに改良する方法も解説しています。
「まずはRubyの使い方を学びたい!」という方は、paizaラーニングの「Ruby入門編」から初めてみると、無理なく学べるかと思います。
Ruby入門1: プログラミングを学ぶ
Ruby入門2: 条件分岐、比較演算子を学ぶ
Ruby入門3: ループ処理を学ぶ
Ruby入門4: 配列の基礎
Ruby入門編5: ハッシュ(連想配列)の基礎
Ruby入門編6: 2次元配列を理解しよう
Ruby入門編7: メソッドを理解しよう
Ruby入門編8: クラスを理解しよう
Ruby入門編9: さらにクラスを理解しよう
Ruby入門編10: 例外処理を理解しよう
「Rubyの使い方はある程度理解できているから、実際にWeb開発をしてみたい!」という方には「Webアプリ開発入門 Sinatra編」「Webアプリ開発入門 Rails編」もあります。
Webアプリ開発入門 Sinatra編について、詳しくはこちら
Sinatra編1:RubyでWebアプリケーションを作ろう
Sinatra編2:Rubyでフォーム処理の基本を身に付けよう
Sinatra編3:Rubyでデータベースの基本を理解しよう
Sinatra編4:ActiveRecordでデータベースを操作しよう
Sinatra編5:ActiveRecordでメモ帳アプリを作ろう
Webアプリ開発入門 Rails編について、詳しくはこちら
Rails入門1-1: Ruby on Railsを理解しよう
Rails入門1-2: RailsのDBの動作を理解しよう
Rails入門1-3: Railsのデータの流れを理解しよう
Rails入門2: 実用的なRailsサービスを作ろう
Rails入門3: Railsサービスを機能アップしてみよう
Rails入門4: deviseでユーザー認証してみよう
Rails入門5: deviseのユーザー情報を利用しよう
「もっと難しい問題をやってみたい」「まずはヒントなしで問題を解いてみたい」という方は、スキルチェック問題に挑戦してみてください。
「paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。
詳しくはこちら
そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。
詳しくはこちら