2016年4月12日火曜日

POH7の追加問題を説明するよ(猫耳メイド編)

どうも黒い野良猫です。 今回はPOH7(https://paiza.jp/poh/ando)に2016年の3月に追加された【猫耳、猫セット、メイド服】の問題について説明します。
 回答自体はすでに過去の記事(http://blackstraycatreboot.blogspot.jp/2015/12/httpspaiza.html)に追記していますが問題の意味なども説明すると長くなりすぎるので別途記事を切りました。

言語は【Python2】ですが考え方は言語共通かと思います。
では簡単な順に問題を解きましょう。


猫耳問題

問題概要

入力処理に対して一度だけ半角文字列Sが渡される。
文字列には"cat"が含まれている場合があり(含まれると明言されていない)その"cat"が文字列に出現するかを出力する。

文字列Sの長さの範囲は「1 ≦ 文字列 S の長さ ≦ 100」

解法1

考え方てきにはまず文字列処理に対して指定の文字をカウントする処理があるか?
無い場合指定文字て分割するような処理があるか?
Pythonの場合文字列を数える処理がある為以下のようになる。

print raw_input().count("cat")

raw_input()で得た文字列に対して直接"cat"の文字列でcount処理を実行する。
これだけで終了です。

解法2

さて、別の解法だが文字列を分割(配列等)して要素数-1すれば良い。
たとえば"cat"という文字列で2分割できれば1つ含まれている事になる。

print len(raw_input().split("cat"))-1

入力値に対して"cat"でsplitし、要素の数をlenで得て、さらにそれを-1する事でcatの数を数えている。
ただ文字列のカウント処理があるのにあえてこんな解き方をする必要はない。
またPython2で今回のテストケースは全て通過するが0分割の場合等言語によってはエラーする可能性はある。


猫セット問題

問題概要

入力処理に対して一度だけ半角 "c", "a", "t" で構成される文字列 Sが渡される。
 "c", "a", "t" のうち、最も少ない文字の数の取得及び出力
最も多い文字数から各個数を引いた値の出力

文字列Sの長さの範囲は「1 ≦ 文字列 S の長さ ≦ 100」
S は半角小文字アルファベット "c", "a", "t" で構成された文字列

解法

問題のニュアンスは「catセットを何個作れるか?」「不足部品は?」となっているが、ようは最少個数を取得する事と最大か個数から各個数を引くだけで答えになる。

print "\n".join(map(str,[[min(w)]+[max(w)-z for z in w] for w in [[x.count(y) for y in "cat"] for x in[raw_input()]]][0]))

入力値を取得後、各個数を取得。
あとは最小値と各必要個数を取得しリストへ結合後mapで文字列化。
最後に出力用に改行でjoinして終了です。


メイド服問題

問題概要

1時就寝だが残業があった場合、就寝時間を「残業時間÷3」分早くし、その時間を出力。
入力一度目は何日分かを文字列Nでわたされ、それ以降の入力mは残業時間が「分」で入力される。
入力値は全て半角数字。

1 ≦ N ≦ 100
0 ≦ m ≦ 450 (m は3の倍数)

解法

問題自体は何時間寝て何時に起きるっていうのは飾りで、つまり通常は1時に寝るという事。

そしてまずは、言語にdatetime系の型が存在するかが問題になります。
もしも存在する場合非常に簡単で処理構成は

1:00-(入力値/3)

だけで良いのです。
まぁ、今回は言語共通の「時:分」の数値化による処理で説明します。

print"\n".join([[":".join([("0"+str(y))[-2:]for y in(b/60,b%60)])for b in[(60,1500)[60<a]-a for a in[input()/3]]][0]for x in[0]*input()])

と、まぁワンライナーだとこうなる訳ですが流石に可読性が酷いので同処理をきちんと書きます。


一行目は何回(何日分)回すかのfor

二行目は残業における追加睡眠時間の取得

三行目は時間の切り替わりにおける計算です。
0時から1時の場合はその分単純ひけばよく、0時より前になる場合は24時から引きます。
ただし、上記では計算を簡略化するために本来0時より前になった場合引く量を1時間分へらす必要がありますが引く量を減らさずに引く元に一時間分を追加しています。
具体的には「24*60+60=1500」となります。
後は結果を60で割り、商が時間、余りが分となります。
結果は時分ともに2ケタにする事と有る為文字列化後頭に0を追加し末尾2桁を取得する事で時分の整形しています。

駄文

このメイド服問題の何がやばいかと言うと起きた瞬間働いているという事。
出社までの移動時間ない=会社に泊まり込みという社畜って事じゃないですか・・・。
というか普段6時間しか寝ていないとか睡眠時間全然たりないよ・・・。

2016年4月9日土曜日

SHOW BY ROCK!!を始めて110日経過&ツアー終了

110日経過って事は3か月強ですか。
ランク228、ハートは150。
ハート1つで3分なのでクールタイムは450分=7時間30分ですね。
最後は最近追加されたBVLのツアーで終了。