Paiza Online Hackathon (POH!) 第5弾「俺の許嫁と幼なじみが修羅場すぎる」 に参加してみました。
参加すると抽選で桃屋の商品セットや、Intel Edison Kit for Arduino が当たるそうです。
問題は全部で4問あり、3問目の答えによってルート分岐するという面白い内容です。
自分で書いたコードをブログにあげて良いとのことなので、折角なので載せたいと思います。
今回は、慣れている Java で参加しました。
提出内容
Mission 1 「レナたんが俺の許嫁!?手紙の暗号を解読せよ」
内容としては「入力文字列に対して、奇数番目の文字だけを出力せよ」とのことです。
例として、
- 「PXaeiTzVap」の入力に対して「Paiza」
- 「abcdefg hijklmn」の入力に対して「aceghjln」
が出力されれば良いそうです。
私は「入力文字列を一文字ずつ読んで、奇数番目の文字だけを取り出して、出力する」という方法を考えました。
後々よく考えたら、out を格納しなくてもその場で出力していけば良さそうですね。
または、入力時に 1 文字ずつ読み込み、出力と破棄を繰り返しても良いと思います。
Mission 2 「レナたんのパパが経営する会社の入社試験に挑戦だ!」
問題は、「月曜日から始まる n 日文の売上データ s 円が改行区切りで入力されるので、各曜日ごとの合計を改行区切りで出力する」という内容です。
入力される最初の行はデータ個数を表し、「データ個数,月,火,水,木,金,土,日,月,火,…,日」といった感じです。
以下が考えたコードです。
入力文字列を改行区切りを挿入しつつ繋げ、それをまた分解しながら曜日ごとに足していきました。
これ、読み込みながらそのまま out 配列に格納していっても良さそうですね…。
Mission 3 「ミナミとレナ、どちらを選ぶか究極の選択です・・!」
ここで、物語の分岐です。内容は避けますが(タイトルがネタバレですが)、「RENA」か「MINAMI」を出力するだけなので、コードはパスします。
Mission 4(ミナミルート) 「会社を辞めて、一から自分でアプリ開発を頑張るぜ!」
問題は、「X マス x Y マスの盤面に 0 か 1 か 2 の数字が入力され、2 を消して、1 を Y 軸下方向に落として 0 と入れ替える」という内容です。分かりづらいですが、
4 4
1 0 1 0
2 2 2 0
2 2 1 1
1 1 2 2
の入力に対して
0 0 0 0
0 0 0 0
1 0 1 0
1 1 1 1
が出力されれば良いみたいです。
長くなりますがこんな感じに書きました。
1 行目の入力で盤面の大きさが指定されるので、その大きさで int 配列 xy を生成します。
その後、行を読み取りながら配列 xy に格納する際に、2 の入力に対してはその場で 0 にします。
y 方向上位(盤面下方向)から処理し、マスが 0 の場合、y 方向下位(盤面上方向)に 1 があれば、そこを 0 にし、処理中マスを 1 にします(1 を落とす)。
これを全マスに繰り返せば、望む通りの処理が出来るはずです。
Mission 4(レナルート) 「障害が起きている会社のメインシステムを改修だ!」
さて、これもまた盤面の問題で、「入力盤面の指定範囲内の数字の合計数を出力」とのことです。
これだけなら簡単なのですが、問題は「選択範囲は複数あり、お互いに干渉し合う」ということです。
そこで、盤面にフラグを用意し、選択範囲内の場合はフラグを立てて、最後にフラグが立っている場所の数字を足していく方法にしました。
フラグを立てるので、選択範囲が被ってもフラグが立ったままの状態なので問題ありません。
ミナミルートよりも簡単だった気がします。
まとめ
問題の内容は、前の問題の答えを改変していくことで、比較的スムーズに進むことが出来ました。
問題に正解する毎に登録アドレス宛てにメールが届くのですが、失敗してもメールが届くので少しメールが多かったです(それだけテストケースで失敗したということ)。
初めてこういうプログラミングイベントに参加しましたが、とても楽しめました。
今回は生活の時間に比較的余裕があったため参加出来ましたが、今後もこういう機会があったらどんどん挑戦します。