CodeIQ過去問集45:ロックオン!
本稿はCodeIQで出題された 第2回プロコン:ロックオン! という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
第1問:ロックオン!
【背景】
本問はCodeIQ第2回プログラミングコンテストで出題された問題の1つです。第1回が講評だったようで、第2回も昔話風でということになりました。
【ストーリー】
砂浜を歩いていた浦島太郎は、カメをいじめようとしている人たちを目撃してしまいました。
逃げようと思いましたが、足がすくんで動くことができません。
浦島太郎の存在に気付いたカメは言いました。
「これで奴らの急所を打ち抜くんだ」
浦島太郎はカメから受け取ったハンドガンを手に、戦う決意をしました。
【問題】
矩形の文字列データが与えられます。 その中に、急所を表す文字「*」の場所を見つけ、その座標を答えてください。 幅W、高さHの矩形について、左上を(1, 1)、右下を(W, H)とします。
【入力】
標準入力から、1行目に矩形文字列データの幅Wと高さHが、半角スペースで区切られた状態で与えられます。 2行目以降のH行には、幅Wの文字列が与えられます。文字列データの文字には「#」または「*」のみです。
【出力】
標準出力に、急所を表す「*」の座標を出力してください。 座標は横方向・縦方向の順に、半角スペースで区切り1行で出力してください。 ※1オリジンであることにご注意ください。
【入出力例】
5 4 ##### ##### ###*# #####
のような入力に対しては、
4 3
と出力してください。
CodeIQ過去問集44:最大の攻撃を繰り出せ!
本稿はCodeIQで出題された 第1回プロコン:【鬼】最大値をたたき出す攻撃を繰り出して鬼を倒そう という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
第4問:最大の攻撃を繰り出せ!
【ストーリー】
熱々のラーメンからメンマを取り出す作業で軽く手に火傷を負ったあなたですが無事偏食の猿も仲間にすることができました。
犬、雉、猿を仲間にしたあなたは、ついに姫を救い出すために鬼が島に乗り込みます!!!
鬼 「私をここまで追い込んだやつは今までいなかったぞ。やるな犬、雉、猿よ」
元々運動が得意でないあなたは前線で戦う犬、雉、猿を見ながら本当に3匹を仲間にしてよかったと思っています。
鬼 「だが、ここまでだ。私を倒すには力足らずだったな。」
先ほどまで鬼を押し込んでいた犬、雉、猿でしたが、鬼に攻撃が通らず、徐々に押し返されてきています。
犬 「桃太郎さん。ボク達がバラバラに攻撃していてもあの鬼には通じないみたいだ」
雉 「桃太郎さんも加わって、いちかばちか総攻撃を仕掛けよう」
猿 「桃太郎さんなら、私たちができる攻撃の中から最大値をたたき出す攻撃を考えられますよね?」
今まで岩の影に隠れていたあなたですが、ついに戦いの場に引きずりだされます。
お供の言うとおり、最大値をたたきださなければ全滅です。
でも、きっとここまできたあなたなら大丈夫ですよね。
鬼を倒して、あなただけの桃太郎を完結させてください。
※今さら補足
桃太郎+お供3匹が2×2の二手に分かれて、鬼の左右から大きな岩を同時にぶつけよう!というシチュエーションを想定して作った問題でした。
【問題】
4つのブロックを立方体と考えます。 一辺の長さをそれぞれa, b, c, dとして、
X = a3 + b3 Y = c3 + d3
とすると、X = Yを満たすX(=Y)の最大値を求めてください。
たとえば、1辺の長さが1~20までのとき、
(1) 13 + 123 = 93 + 103
(2) 23 + 163 = 93 + 153
のような場合が考えられますが、(1)を計算すると1729、(2)を計算すると4104となりますので、4104が条件を満たす最大値となります。
【入力】
標準入力から、整数値(20~1000)が与えられます。
【出力】
標準出力に、解となる整数値のみ出力してください。出力後の改行の有無は問いません。
【入出力例】
Case 1: Input
20
Case 1: Output
4104
Case 2: Input
50
Case 2: Output
110808
CodeIQ過去問集43:「MENMA」を探そう
本稿はCodeIQで出題された 第1回プロコン第3問:【猿】偏食の猿の好き嫌いを見極めよう という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
第3問:「MENMA」を探そう
【ストーリー】
くそ生意気な雉に頭の良さをみせつけたあなた。
今やウザいくらいあなたにべったりの雉を無事に仲間にできました。
そして、ついに最後の仲間、猿に出会います。
物語のように猿にキビ団子を渡すあなた。
猿 「おいら団子なんて食わねえよ」
あなた「…(てか、この世界でキビ団子全然役に立たねえな。)」
猿 「あ、そうだ。おいらラーメンっていう食い物を一度でいいから食ってみてえんだ」
あなた「まあ、インスタントでいいなら作ってやるぞ」
猿 「ほんとかい?ラーメンくれたら鬼でもなんでも倒してやる」
ラーメンを作って、猿に出そうとしたその瞬間でした。
猿 「あ、まさかとは思うがメンマは入れてないよな。入ってたら鬼の味方するからな」
メンマ入りのラーメンを作ってしまったあなたは、大慌てでメンマをラーメンから取り除くのでした。
※この画像は私が用意したものではないので、問題が発生した場合はすぐに差し替えるか消します。
【問題】
n×n(5≦n≦100)の文字列の中から、「MENMA」と連続する部分があるかどうかを判定してください。
のように一直線に並んでいる場合だけでなく、
や
のように途中で折れ曲がっていても構いません。
【入力】
標準入力から、n×n(5≦n≦100)の文字列が与えられます。 文字列に含まれる文字は「A, E, M, N」のいずれかで、改行コードはLFです。
【出力】
標準出力に、文字列に連続する「MENMA」が含まれる場合は「yes」、含まれない場合は「no」と出力してください。出力にはyes/no以外の文字は出力しないでください。行末の改行については有無を問いません。
【入出力例】
Case 1: Input
MENME NMENM ENMEN MENMA NMENM
Case 1: Output
yes
Case 2: Input
EMNME MNANE EAENN MEEEE EMNEM
Case 2: Output
no
CodeIQ過去問集42:少ない重りで重さを量ろう
本稿はCodeIQで出題された 第1回プロコン:【雉】くそ生意気な雉を黙らせよう という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
第2問:少ない重りで重さを量ろう
【ストーリー】
じゃんけんにわざと負けてあげることで自信を取り戻した犬を仲間にしたあなた。
鬼が島にむかって旅路を急いでいると、後ろから声が。
雉 「桃太郎さん桃太郎さん、お腰につけたキビ団子ひとつ私にくださいな」
あなた「(お、これは確か仲間になるフラグのあの有名なセリフだな)
では、これをやるから私と一緒に鬼退治に行こうではないか」
雉 「…。このキビ団子って何グラムですかね?
重さによっては鬼退治に同行するより、自分で働いて買った方が早いんで」
あなた「…(雉以外の鳥じゃだめかな)」
とはいえ、犬、雉、猿をそろえなければ鬼には勝てません(と、童話に書いてあった)。
雉の前でキビ団子の重さを計って、大きな団子であることを証明しましょう。
雉 「あ、あと自分頭悪いやつにはついていきたくないんで、最少のおもりの数で計ってくださいね。」
あなた「…(そこにいる雀でなんとか鬼退治できねえかな)」
※この画像は私が用意したものではないので、問題が発生した場合はすぐに差し替えるか消します。
【問題】
てんびんが1つあります。これを1回だけ使い、1グラムからnグラムまで、1グラム刻みの重さn通りをすべて量ることができるようにします。使用するおもりの個数をできるだけ少なくなるようにすると、おもりは最低いくつ必要になるかを計算してください。
例えば4グラムまですべて量るには、1グラムのおもり(A)と3グラムのおもり(B)を用意すると、次のように1~4グラムすべて量ることができます。
1グラム…(A)をてんびんの片側に置く
2グラム…(A)をてんびんの片側に、(B)をその反対側に置く(3-1=2グラムを量ることができる)
3グラム…(B)をてんびんの片側に置く
4グラム…(A)と(B)の両方をてんびんの片側に置く(3+1=4グラムを量ることができる)
【入力】
標準入力から、整数n(1≦n≦300)が与えられます。
【出力】
標準出力に、入力nに対するおもりの個数の最小値のみを出力してください。行末の改行コードは有無を問いません。
【入出力例】
Case 1: Input
4
Case 1: Output
2
Case 2: Input
10
Case 2: Output
3
CodeIQ過去問集41:接待じゃんけん
本稿はCodeIQで出題された 第1回プロコン:【犬】自信を無くした犬に自信を取り戻させよう という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
第1問:接待じゃんけん
【背景】
本問はCodeIQ第1回プログラミングコンテストで出題された問題の1つで、プログラミング初心者の方でも参加しやすいように『簡単』かつ『親しみやすい内容』ということで作成しました。「接待じゃんけん」というのは当初私が作成した問題案のタイトルです。桃太郎のストーリーはCodeIQの中の人が一生懸命考えたものですので、その後本問が【犬】問題となったのです。
【ストーリー】
おじいさんとおばあさんにきびだんごをもらい、さっそく鬼退治に出かけたあなた。
とりあえず、あなたは昔読んだ物語「桃太郎」を思い出してみます。
あなた「確か、動物を仲間にするんだっけな。まずは、犬を探そう!」
そして見つけた桃太郎の最強の仲間、犬。
あなた「犬よ。きびだんごをやるから私と一緒に鬼退治に向かおう」
犬 「いや、ボクなんかが鬼退治なんて無理ですよ」
あなた「…(話が違うぞ)」
犬 「私は何をやってもダメなんです。さっきも子供たちに<じゃんけん>という遊びで一回も勝てなくて。。そりゃ、鬼に勝てるって自信があればいくらでもついていきますよ」
あなた「(これはまずは自信をつけてやらないと鬼退治なんて無理だな‥)よし、ではそのじゃんけんとやらを私とやろう」
※この画像は私が用意したものではないので、問題が発生した場合はすぐに差し替えるか消します。
【問題】
犬が出そうとしている手を読み取って、負けてあげるように手を出してください。 グーを「G」、チョキを「C」、パーを「P」とすると、たとえば犬が「G」を出そうとしているときは「C」を出してあげてください。
【入力】
標準入力から、「G, C, P」のいずれかの1文字が与えられます。
【出力】
標準出力に、「G, C, P」のいずれか1文字を適切に選んで出力してください。出力後の改行の有無は問いません。
【入出力例】
Case 1: Input
G
Case 1: Output
C
CodeIQ過去問集50:「2人組を作って!〜欠席多くても頑張る編〜」
本稿はCodeIQで2014年9月18日~2014年9月24日に出題された プログラミング言語★総選挙 本選挙「2人組を作って!〜欠席多くても頑張る編〜」 という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
プログラミング言語★総選挙 本選挙
【2人組を作って!〜欠席多くても頑張る編〜】
先生「はーい、それじゃあ今から2人組になってくださーい」 と言われて、辛い思いをしなくても済むように、隣り合った人同士で、ペアを作りたいと思います。
このように、横に3人、縦に2人の合計6人いる場合、
のように、ペアを作ることができます。 ただし、
のようなペアの作り方では、左下の人と右上の人が離れてしまいますので、このようなペアの作り方は避けます。 そうすると、合計の人数が偶数であるかぎり、あぶれる人が出ることなく、かならずペアを作ることができます。
…が、現実はそれほど優しくはありません。欠席者がいるときもあります。
人数が奇数になってしまうと、どう頑張っても1人残ってしまいます。 逆に、元々奇数人の場合はうまくペアを作ることができる場合もあります。
ただし、欠席者の場所によってはうまくペアが作れない場合もあります。
欠席者が多数いた場合でも、とにかく出席者だけでペアを作ります。
上記の場合はうまくペアを作ることができますが、次の場合はペアを作ることができません。
【問題】
出欠情報が、標準入力からアルファベットの文字列で与えられます。 隣り合う人同士でペアを作り、出席者全員をペアにできる場合は「yes」、できない場合は「no」と出力するプログラムを書いてください。
◎出欠を表すアルファベットはすべて大文字で、出席の場合は”O”、欠席の場合は”X”とします。
◎アルファベットの並びは、必ず矩形(各行の文字数が等しい)で与えられます。また、矩形のタテの長さをH、ヨコの長さをWとすると、入力データの範囲は1≦H≦10、1≦W≦10とします。
◎欠席者の数には制限がありません。つまり、全員欠席の場合もあり得ます。 全員欠席の場合は、「no」と出力してください。
【入出力例】
◎sample(1)
[input]
OOO OOX
[output]
no
◎sample(2)
[input]
OOO OOO OOX
[output]
yes
◎sample(3)
[input]
OOO OOO OXO
[output]
no
◎sample(4)
[input]
XXX XOO XXX
[output]
yes
【提出方法】
本問はすでに終了した問題ですので、提出することはできません。個人で楽しみましょう。
※honsen.zipにテストデータがまとめてあります。
[【解説】]
CodeIQ過去問集49:「2人組作って!」
本稿はCodeIQで2014年9月4日~2014年9月16日に出題された プログラミング言語★総選挙 予備選挙「2人組作って!」 という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
プログラミング言語★総選挙 予備選挙
【2人組作って!】
先生「はーい、それじゃあ今から2人組になってくださーい。」 と言われて、辛い思いをしなくても済むように、隣り合った人同士で、ペアを作りたいと思います。
このように、横に3人、縦に2人の合計6人いる場合、
のように、ペアを作ることができます。 ただし、
のようなペアの作り方では、左下の人と右上の人が離れてしまいますので、このようなペアの作り方は避けます。 そうすると、合計の人数が偶数であるかぎり、あぶれる人が出ることなく、かならずペアを作ることができます。
…が、現実はそれほど優しくはありません。欠席者がいるときもあります。
人数が奇数になってしまうと、どう頑張っても1人残ってしまいます。 逆に、元々奇数人の場合はうまくペアを作ることができる場合もあります。
ただし、欠席者の場所によってはうまくペアが作れない場合もあります。
【問題】
出欠情報が、標準入力からアルファベットの文字列で与えられます。 隣り合う人同士でペアを作り、出席者全員をペアにできる場合は「yes」、できない場合は「no」と出力するプログラムを書いてください。
◎出欠を表すアルファベットはすべて大文字で、出席の場合は"O"、欠席の場合は"X"とします。
◎アルファベットの並びは、必ず矩形(各行の文字数が等しい)で与えられます。また、矩形のタテの長さをH(≧1)、ヨコの長さをW(≧1)とすると、入力データは2≦H×W≦30の条件を満たしています。
◎欠席者は、0人または1人のみです。つまり、"X"は多くて1か所のみということになります。
【入出力例】
◎sample(1)
[input]
OOO OOX
[output]
no
◎sample(2)
[input]
OOO OOO OOX
[output]
yes
◎sample(3)
[input]
OOO OOO OXO
[output]
no
【提出方法】
本問はすでに終了した問題ですので、提出することはできません。個人で楽しみましょう。
※yosen.zipにテストデータがまとめてあります。