kei0425tan’s blog

技術的なことを主に

POH7「サンタ服」ゲットチャレンジ!

POH8の問題を全部解いてしまったので、昔のにも挑戦してみます。

paiza.jp

問題

(適当に省略しています。)

幅 X cm、奥行き Y cm、高さ Z cm の直方体の形をしたケーキがあります。 このケーキに「側面と平行な方向」および「前面と平行な方向」に何回か包丁を入れて、小さなケーキに切り分けることを考えます。 上面と平行な方向(水平方向)には包丁を入れません。

包丁を入れる場所が与えられたとき、切り分けられたケーキの中で最も体積が小さいものを求めてください。

条件

すべてのテストケースにおいて、以下の条件をみたします。

1 ≦ X, Y, Z, N ≦ 100
d_i は 0 または 1
d_i = 0 のとき 1 ≦ a_i ≦ X-1
d_i = 1 のとき 1 ≦ a_i ≦ Y-1
同じ場所に 2 回以上包丁を入れることはない
入力される値はすべて整数

今回も範囲が狭いため普通に探せば問題なさそうです。
単純に、横に切った一番小さいとこと縦に切った一番小さいところを探してかければOK

切った幅を出すのに、reduceを利用しています。
普通にインデックスを使っても全然いいのですが、こんなやり方もあるよということで。
reduce使うなら、minも統合できるのですが、pythonのlambdaが複雑なこと書きにくいのでやっていません。
普通に関数別に書けばよいのですが。。。。

POH7「プログラミングで彼女をつくる」「めがね」ゲットチャレンジ!

POH8の問題を全部解いてしまったので、昔のにも挑戦してみます。

paiza.jp

問題

(適当に省略しています。)

あなたはクライアントから画像分析の仕事を受けました。

N × N ピクセルの白黒画像と M × M ピクセルの白黒画像が与えられます。 白黒画像の各画素は 0 または 1 のいずれかです。 N × N ピクセルの画像を入力、M × M ピクセルの画像をパターンと呼ぶことにします。

あなたの仕事は、入力からパターンとの完全一致を探すことです。

入力とパターンがピクセルの位置 (y, x) で完全一致するとは、 全ての i, j (i = 0, 1, ... M - 1, j = 0, 1, ... M - 1) について、 (入力の位置 (y + j, x + i) におけるピクセル) = (パターンの位置 (j, i) におけるピクセル) が成立することをいいます。

また、依頼主からは、入力にはパターンと完全一致する箇所は必ず 1 つだけ存在するということを 伝えられています。

条件

すべてのテストケースにおいて、以下の条件をみたします。

10 ≦ N ≦ 100, 2 ≦ M ≦ 10
q_{i, j}, p_{i, j} は 0 または 1
パターンと完全一致する箇所は必ず1つだけ存在します

入力例1

入力
4
0 0 1 0
0 1 1 0
0 1 0 1
1 1 1 0
3
0 1 1
0 1 0
1 1 1

出力
1 0

今回は範囲が狭いため(高々1万個)普通に探せば問題なさそうです。
さらに、一致するかどうかもいったん文字列化すると簡単に比較できるのでよいでしょう。

POH8「恋するハッカソン〜君色に染まるアイドル」 「制服」ゲットチャレンジ!

ランクB相当だそうです。

最初適当にさらさらっと書いたら、なかなかうまく動作しなかったため、ちょっと真面目に書いてみました。
わざわざクラスまで作成するのもどうかなーと思いつつ、pythonだとハッシュが面倒なのでクラス化しています。

paiza D007:N倍の文字列

初めて1位を取れました!

paiza.jp

まあ、Dランクなので以下に速く問題を理解して(全部読む必要はない)キーを打つのか勝負なんですけどね。
あとは、タイトルでどんな問題なのか想像して、それに適した言語を選ぶのがポイントです。

codingame ASCII Art

久しぶりに、codingameをやってみました。

codingame.com


超意訳で問題説明してみます。

アスキーアートを作ろう

入力

Line 1: the width L of a letter represented in ASCII art. All letters are the same width.
1行目はアスキーアートの幅です。全部の文字は同じ幅です。Lとします。
Line 2: the height H of a letter represented in ASCII art. All letters are the same height.
2行目はアスキーアートの高さです。全部の文字は同じ高さです。Hとします。
Line 3: The line of text T, composed of N ASCII characters.
3行目はアスキーアートに変換する文字です。Tとします。
Following lines: the string of characters ABCDEFGHIJKLMNOPQRSTUVWXYZ? Represented in ASCII art.
その後ろには、ABCDEFGHIJKLMNOPQRSTUVWXYZ?のアスキーアートの元ネタです。

出力

The text T in ASCII art.
入力のTをアスキーアートにしてください。
The characters a to z are shown in ASCII art by their equivalent in upper case.
小文字a-zは大文字に変換してください。
The characters that are not in the intervals [a-z] or [A-Z] will be shown as a question mark in ASCII art.
アルファベット以外の場合は?のアスキーアートにしてください。

そんなわけでpythonで書いてみました。

import sys
import math

# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.

l = int(raw_input())
h = int(raw_input())
t = raw_input()
rows = [raw_input() for i in xrange(h)]

# Write an action using print
# To debug: print >> sys.stderr, "Debug messages..."
def convert(x):
    c = ord(x.upper()) - 65
    if c < 0 or 25 < c:
        c = 26
    return c

indexes = [convert(x) for x in t]

for row in rows:
    print ''.join([row[l * i:l * i + l] for i in indexes])

アスキーアートの元ネタを変換して持たせようかとも思いましたが、pythonの場合はそのまま保持していてもスライス表記で簡単に扱えるため、変換せず。
一方、アルファベット以外は逆に事前に変換しています。

Pythonで末尾再帰最適化

今までソースはpaiza.ioでコーディング&実行して、それをGist経由で貼り付けしてたのですが、実は、paiza.ioで直接張り付けられることに気が付きました。

全然楽ですね。

で、それだけだとさみしいので、Pythonで末尾再帰最適化ができるデコレーションがあるそうなので、そちらを紹介

あんまり処理時間かわらないですね。

再帰を手でループに変換するとこんな感じ。

これも処理速度はたいして変わりませんでした。

なんでだろう???