KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

CodeIQの「進捗まあまあマーク」解答

CodeIQの「進捗まあまあマーク」を解いたので、私が作成したコードを晒します。

12月21日の10時に回答締切なので、ネタバレを避けるためそれ以降に投稿しています。

www.kato-eng.info

設問

「進捗まあまあマーク」は高さ X 幅 X の正方形の中に M のカタチをした文字を半角小文字の「m」で描きます。 すべての行の左右の端は「m」です。
1行目から真ん中の行まではR行目の場合に、左からR列目と右からR列目を「m」にします。
それ以外を半角ドット「.」にします。

例1:高さ1幅1の進捗まあまあマーク

m

例2:高さ3幅3の進捗まあまあマーク

m.m
mmm
m.m

例3:高さ5幅5の進捗まあまあマーク

m...m
mm.mm
m.m.m
m...m
m...m

仕様

  • 標準入力として1から100の整数が与えられる。
  • 標準入力の数字が奇数の場合には「進捗まあまあマーク」を出力する。
  • 標準入力の数字が偶数の場合には「invalid」を出力する。

解答

言語はPython3を選択しました。

# coding: utf-8
import fileinput
import math

def print_upper_harf(count, line_num):
    ret_line = list(print_first_last(count))
    ret_line[line_num] = "m"
    ret_line.reverse()
    ret_line[line_num] = "m"
    return "".join(ret_line)


def print_first_last(count):
    ret_line = [dot for dot in ("." * count)]
    ret_line[0] = "m"
    ret_line[-1] = "m"
    return "".join(ret_line)


for temp_count in fileinput.input():
    count = int(temp_count)

    if count % 2 == 0:
        print("invalid")
    else:
        middle_line = math.ceil(count / 2)
        for line_num in range(count):
            if line_num < middle_line:
                print(print_upper_harf(count, line_num))
            else:
                print(print_first_last(count))