Naba Blog

Programming, Compose, Travel

POH!5 「俺の許嫁と幼なじみが修羅場すぎる」をやってみた 【Java】

paiza.jp

Paiza Online Hackathon (POH!) 第5弾「俺の許嫁と幼なじみが修羅場すぎる」に参加してみました。

参加すると抽選で桃屋の商品セットや、Intel Edison Kit for Arduino(よく分かってない)が当たるそうです。

問題は全部で4問あり、3問目の答えによってルート分岐するという面白い内容です。 自分で書いたコードをブログにあげて良いとのことなので、折角なので載せたいと思います。

今回は、慣れているJavaで参加しました。

 

Mission 1 : 「レナたんが俺の許嫁!?手紙の暗号を解読せよ」

内容としては「入力文字列に対して、奇数番目の文字だけを出力せよ」とのことです。例として、

  • 「PXaeiTzVap」の入力に対して「Paiza」
  • 「abcdefg hijklmn」の入力に対して「aceghjln」

が出力されれば良いそうです。

私は「入力文字列を一文字ずつ読んで、奇数番目の文字だけを取り出して、出力する」という方法を考えました。

gist19dfac1b66218c4289f7

後々よく考えたら、outを格納しなくてもその場で出力していけば良さそうですね。 または、入力時に1文字ずつ読み込み、出力と破棄を繰り返しても良いと思います。

 

Mission 2 : 「レナたんのパパが経営する会社の入社試験に挑戦だ!」

問題は、「月曜日から始まるn日文の売上データs円が改行区切りで入力されるので、各曜日ごとの合計を改行区切りで出力する」という内容です。

入力される最初の行はデータ個数を表し、「データ個数,月,火,水,木,金,土,日,月,火,…,日」といった感じです。

以下が考えたコードです。

gist557adc95d8a5a7fa9279

入力文字列を改行区切りを挿入しつつ繋げ、それをまた分解しながら曜日ごとに足していきました。 これ、読み込みながらそのまま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

が出力されれば良いみたいです。

長くなりますがこんな感じに書きました。

gistfd8fb3a891e8c30e08ac

1行目の入力で盤面の大きさが指定されるので、その大きさでint配列xyを生成します。

その後、行を読み取りながら配列xyに格納する際に、2の入力に対してはその場で0にします。

y方向上位(盤面下方向)から処理し、マスが0の場合、y方向下位(盤面上方向)に1があれば、そこを0にし、処理中マスを1にします(1を落とす)。

これを全マスに繰り返せば、望む通りの処理が出来るはずです。

 

Mission 4(レナルート) : 「障害が起きている会社のメインシステムを改修だ!」

さて、これもまた盤面の問題で、「入力盤面の指定範囲内の数字の合計数を出力」とのことです。
これだけなら簡単なのですが、問題は「選択範囲は複数あり、お互いに干渉し合う」ということです。

そこで、盤面にフラグを用意し、選択範囲内の場合はフラグを立てて、最後にフラグが立っている場所の数字を足していく方法にしました。

gistc008eca96e9fa0a1336b

フラグを立てるので、選択範囲が被ってもフラグが立ったままの状態なので問題ありません。

ミナミルートよりも簡単だった気がします。

 

まとめ

問題の内容は、前の問題の答えを改変していくことで、比較的スムーズに進むことが出来ました。

問題に正解する毎に登録アドレス宛てにメールが届くのですが、失敗してもメールが届くので少しメールが多かったです(それだけテストケースで失敗したということ)。

 

初めてこういうプログラミングイベントに参加しましたが、とても楽しめました。

今回は生活の時間に比較的余裕があったため参加出来ましたが、今後もこういう機会があったらどんどん挑戦します。