paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

アンドロイドと冒険しながら解いたプログラミング問題の解答コード公開


paizaで公開していた『エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』、みなさんチャレンジしていただけましたでしょうか?

今回はこちらで出題されているプログラミング問題の解答コードを公開いたします。「挑戦してみたけど、解けない問題があった」「一応解けたけど、誰かが考えたコードも見てみたい」という方の参考になればと思います。

エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』とは

エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』は、プログラミング問題を解きながら物語を進める近未来SFアドベンチャーゲームです。死滅したエンジニアたちが遺したシステムを復旧させ、失われた【RIN】の記憶と文明社会を取り戻すのがミッションです。

各地の探索スポットは、長い時を経てシステムが止まっていますが、あなたがプログラミング問題に正解することで復活します。さらに、施設が復活すれば【RIN】の記憶とパーツがGETできます。集めたパーツは【RIN】に自由に装備させることができ、ビジュアルを自在にチューニングすることも可能。世界にたった1つ、あなただけの【RIN】を作り上げることができます。

各問題の解答コード

※この記事に掲載している解答コードはすべてPythonです。
※実際の問題ページには、より詳しい条件や図式、入力例や期待される出力なども記載されていますので、実際に問題にチャレンジする際は参考にしてください。
※プログラミング問題の解き方や正解はひとつではありません。解答コードはあくまでひとつの解き方として参考にし、ぜひご自分でも解き方を考えてみてください。

荒れ果てた警察署 [MISSION LEVEL: D]

あなたは 0 から 9 の数字を 3 つ入力すると開く扉を開こうとしています。
鍵の番号は左から 2 つまで判明しています。 3 つ目に関しては以下の法則で決まることがわかりました。
・2 つ目までをすべて足す
・足したものを 10 で割ったときの余り
2 つ目までの数字が与えられるので 3 つ目を計算し出力してください。

荒れ果てたオフィス [MISSION LEVEL: D]

あなたは書類の整理をしています。
書類には 1 から 3 までの重要度 e が設定されています。数字が大きいほど重要な書類とされています。
書類のタイトル文字列 S_i と重要度 e_i が n 件与えられます。
重要度が 3 の書類のタイトルのみを入力された順に出力してください。

アンドロイドの生産工場 [MISSION LEVEL: D]

ある暗号化された文字列 S が与えられます。
文字列 S のうち奇数文字目を取り出せば解読できることがわかりました。
文字列 S が与えられるので奇数文字目の文字を取り出して解読した文字列を出力してください。

錆びついた電波塔 [MISSION LEVEL: D]

電波でデータ通信するプログラムが壊れてしまっており、あなたはそれを直そうとしています。
n回の通信をしたとき、受信した各データ各電波強度 d_i が与えられます。各電波強度 d_i は 0 から 10 の整数で表され、 5 以下では通信に失敗します。
n 回の通信のうち通信に成功した回数を出力してください。

お金が引き出せない銀行 [MISSION LEVEL: D]

あなたは残高からお金を引き出すプログラムを作成しています。
残高 n と引き出したい額 w が与えられます。
この時、引き出し額が残高を上回ってマイナスになる場合は "error" と出力し、引き出せる場合は残高を出力するプログラムを作成してください。

機械の総合病院 [MISSION LEVEL: C]

PAIZA病院のシステムを解析します。
不正アクセスを試みるクラッカーからユーザーを守るために、ユーザーが設定するパスワードが十分に複雑であるようにしなくてはなりません。
PAIZA病院は、パスワードの複雑さの条件として以下の 3 つを定めました。
・長さが 6 以上
・英字と数字の両方を含む必要がある
・同じ文字を 3 つ以上連続で使用することはできない
なお、英字の大文字と小文字は区別する必要はありません。
パスワードの候補が入力として与えられるので、複雑さの条件をすべて満たす場合は "Valid"、そうでない場合は "Invalid" と出力してください。

学べない学校 [MISSION LEVEL: C]

学校の子どもたちがじゃんけんをしています。特にA くんと B くんはじゃんけんが大好きで毎日しており、それぞれ「自分のほうが強い」と言い合っています。
そこであなたは二人のじゃんけんの結果を記録し、どちらが強いのか判定するプログラムを作ってあげることにしました。
これからAくんとBくんは N 回じゃんけんをします。
A くんと B くんの出した手が N 回分与えられるので、A くんが勝った回数と B くんが勝った回数を数えるプログラムを作成してください。
じゃんけんの手はグー、チョキ、パーのいずれかで、グーはチョキに勝ち、チョキはパーに勝ち、パーはグーに勝ちます。

入力では
・グーは "g"
・チョキは "c"
・パーは "p"
で表現されます。

荒れ果てたショップ [MISSION LEVEL: C]

あなたは、ファイルの管理をしようとしています。
各ファイルは番号で管理されていますが、一目でどの番号かわかるように、番号の左に適当な数の 0 を埋め込んで、番号の長さを固定することにしました。
例えば、番号の長さを 3 で固定したい場合、0 は 000, 4 は 004, 13 は 013, 144 は 144 というようにファイル番号をつけます。
3 つの整数 N, A, B が与えられます。
A 以上 B 以下の数それぞれについて、番号の長さが N にするようなゼロ埋めをするとファイル番号はどのように表示されるかを出力してください。

高層タワー [MISSION LEVEL: B]

単語を組み合わせて新単語を作ります。
新単語は N 個の文字列を、前から順に結合して作ります。
この時、冗長さをなくすため、 前から結合した単語の末尾 と 後ろの単語の先端 が一番長く一致するように結合します。
例えば、 入力例 1 の "paiza", "apple", "letter" の場合、先頭から "paiza", "apple" を条件どおり重ねると "paizapple" となります。
この単語を更に次の単語と重ねると "paizappletter" となります。
なお、必ず前から順番に重ねるため、 入力例 2 の "poh", "p", "oh" を結合する場合は、"poh" と "p" を重ねた後の単語 "pohp" と "oh" を重ね "pohpoh" となります。
N 個の単語が与えられるので、前から順番に単語を結合した場合の新単語を出力してください。

砂漠の公園 [MISSION LEVEL: B]

昔この公園ではある競技の大会がよく開催されていました。各試合結果の記録が見つかりましたが、どのチームが優勝したかの記録は欠損しています。
そこであなたは各試合結果から優勝チームを調べるプログラムを作成することにしました。
大会は勝ち点方式の総当たり戦で行います。勝つと2点、引き分けで1点、負けると0点勝ち点が増えます。
すべての試合が終わったあと、勝ち点が一番多いチームが優勝です。
大会の参加人数と、試合結果が入力されたときに、何番目のチームが勝ち点いくつの何勝何敗何引き分けで優勝したか出力するプログラムを書いてください。

隔離された街のゲート [MISSION LEVEL: B]

あなたは作りかけのゲームプログラムを発見しましたが、キャラクターの動きの制限する方法が未実装でした。

制作中のゲームは、縦方向に H マスと横方向に W マスだけ広がる格子上のマップを用います。
左下のマスが原点であり、その座標を (0, 0) とします。
原点から横方向に x マス、縦方向に y マス進んだ座標を (x, y) と表記します。
現在の開発段階では障害物などはなく、キャラクターの初期座標が必ず (0, 0) です。
この状態から合計で N 回の上下左右への移動操作が行われます。
各移動操作はキャラクターの座標 (x, y) を以下のように変更します。

・上への移動 : キャラクターの座標を (x, y) から (x, y + 1) へ変更する。
・下への移動 : キャラクターの座標を (x, y) から (x, y - 1) へ変更する。
・左への移動 : キャラクターの座標を (x, y) から (x - 1, y) へ変更する。
・右への移動 : キャラクターの座標を (x, y) から (x + 1, y) へ変更する。

開発依頼書には、N 回の操作中にキャラクターが不正な座標にいることがないか判定するプログラムの作成が指示されています。
ここで不正な座標とは、マップ外の座標、すなわち格子上に存在しない座標すべてのことを指します。
N 回の移動操作の中で、キャラクターが不正な座標にいることがある場合は"invalid"を、そうでない場合は"valid"を 1 行に出力してください。

有名なプールサイド [MISSION LEVEL: A]

あなたは今度新しくできる町のデザインを任されました。
町は南北に H、東西に W の広さで、計 H × W 個の区画からなっています。
また、それぞれの区画には、次の図のように座標が割り当てられているものとします。
f:id:paiza:20190312194406p:plain
町に建設したい建物のリストが与えられます。
どの建物も長方形の形をしており、ただ一つの扉を持っています。

リストにはたくさんの建物が含まれているため、リストに載っているすべての建物を建設することができるとは限りません。
そこで、町のどこにどの建物を建設するかを決めるのがあなたの仕事です。

建物を建設する場所を決める際には、次の 3 つのルールを守らなくてはいけません。
1. どの 2 つの建物も重なってはいけない。
2. 建設する建物の向きはリストに与えられたとおりでないといけない (建物を回転して配置してはいけない)。
3. どの 2 つの建物についても、それらの扉の間を「建物がない区画」を通って移動できる。
ルール 3 を正確に述べると、次のようになります: すべての建設する建物の組に対して、それらの扉の座標を P, Q とするとき、 以下の条件 (i)-(iii) を満たすような座標の列 (r_1, c_1), (r_2, c_2), ..., (r_m, c_m) が存在する (m は 0 以上の整数)。

(i) 1 ≦ r_i ≦ H, 1 ≦ c_i ≦ W が成り立つ (1 ≦ i ≦ m)。
(ii) 座標 (r_i, c_i) にはどの建物も建設されていない (1 ≦ i ≦ m)。
(iii) 座標 (r_i, c_i) と (r_{i+1}, c_{i+1}) は上下左右のいずれかで隣接している (0 ≦ i ≦ m)。ただし、P = (r_0, c_0), Q = (r_{m+1}, c_{m+1}) とする。

次の図は条件 (i)-(iii) が守られている建物の配置と守られていない配置の例を表しています。
f:id:paiza:20190312194457p:plain
灰色の建物と緑の建物については、それらの扉の間を「建物がない区画」を通って移動することができます。
一方、灰色の建物と青の建物については、そのような移動方法は存在しません。
町の区画 X 個分の大きさの建物は、X 万円の利益を生み出します。

建物が生み出す利益の合計ができるだけ多くなるような、建物の配置を求めるプログラムを書いてください。

最低1個以上の利益を生み出す建物を配置することで正解となり、建物の面積がスコアとして計算されます。

単純に、左上から置けそうなら1個だけ置いていく方法


少し工夫をして、左上から扉の横は1つ開けて置いていく方法

※単純な解き方のコードは、提出前動作確認でエラーとなることがありますが、問題文の『最低1個以上の利益を生み出す建物を配置することで正解となり』を満たしているため、提出するとクリアとなります。

最後の「有名なプールサイド [MISSION LEVEL: A]」の問題は、上記の単純な解き方でも提出をすればとりあえず正解はできますが、点数はあまり高くなりません。ほかにももっと効率のよい解き方は複数ありますので、これについては、後日担当のエンジニアが詳しく解説する記事を書きます。

これらの問題にはいつでもオンライン上で挑戦・実行して採点結果を見ることができます。プログラミング問題を解いてみたい方は、ぜひ挑戦してみてください!

エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』はこちら





paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

詳しくはこちら

paizaラーニング

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら

paizaのスキルチェック





※このブログで紹介しているキャンペーンやイベント、およびサイト内の情報については、すべて記事公開時の情報となります。閲覧されたタイミングによっては状況が変わっている場合もございますのでご了承ください。

ITプログラマー・エンジニア転職・就活・学習のpaiza

プログラミング入門講座|paizaラーニング

PHP入門編Ruby入門編Python入門編Java入門編JavaScript入門編C言語入門編C#入門編アルゴリズム入門編AI機械学習入門

エンジニアのためのプログラミング転職サイト|paiza転職

プログラミング スキルチェックエンジニア求人一覧

未経験からエンジニアを目指す人の転職サイト|EN:TRY

プログラミング スキルチェックエンジニア未経験可求人一覧

エンジニアを目指す学生の就活サイト|paiza新卒

プログラミング スキルチェックエンジニア求人一覧

ブラウザを開くだけで エディタ、Webサーバ、DB等の開発環境が整う|PaizaCloud