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

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

CodeIQの「カードを上手く並べよう」解答

CodeIQの「カードを上手く並べよう」を解いたので、私が作成したコードを晒します。

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

www.kato-eng.info

設問

あなたは、11から99までの、89枚のカードを持っています。 問題では、横幅と高さの整数が与えられます。 この横幅と高さで作られるマス目に、カードを左上から順に並べていきます。

その際、縦に順番に並べ、高さいっぱいになると、次の列にカードを並べます。 カードがなくなった場合は「–」を代わりに置きます。

標準入力から得られる数字は「,」で区切られた2つの数値です。1つ目は横幅、2つ目は高さになります。

標準出力に出力する際は、各行の「数値」や「–」は、「,」で区切ります。列は改行で区切ります。

入力例1

11,9

出力例1

11,20,29,38,47,56,65,74,83,92,--
12,21,30,39,48,57,66,75,84,93,--
13,22,31,40,49,58,67,76,85,94,--
14,23,32,41,50,59,68,77,86,95,--
15,24,33,42,51,60,69,78,87,96,--
16,25,34,43,52,61,70,79,88,97,--
17,26,35,44,53,62,71,80,89,98,--
18,27,36,45,54,63,72,81,90,99,--
19,28,37,46,55,64,73,82,91,--,--

解答

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

# coding: utf-8
import numpy as np

try:
    input_num = input().strip().upper()
    temp_width = int(input_num.split(',')[1])
    temp_height = int(input_num.split(',')[0])

    start_width_num = 11
    card_list = list()

    for height in range(temp_height):
        temp_card_list = list()
        for width in range(start_width_num, start_width_num + temp_width):
            if width < 100:
                temp_card_list.append(width)
            else:
                temp_card_list.append("--")
        card_list.append(temp_card_list)
        start_width_num += temp_width

    npdata = np.array(card_list)
    answer = npdata.T

    for line in answer:
        return_num = ""
        for i in line:
            return_num += i + ","
        else:
            return_num = return_num[:-1]
        print(return_num)
except EOFError:
    pass

解法としては、11から始まり、高さ分の値(上記出力例の場合9)までの数値をリストで取得にする。それを横幅分(上記出力例の場合11)繰り返す。

そうすると下記のようなリストのリストが作られる。

[['11' '20' '29' '38' '47' '56' '65' '74' '83' '92' '--']
 ['12' '21' '30' '39' '48' '57' '66' '75' '84' '93' '--']
 ['13' '22' '31' '40' '49' '58' '67' '76' '85' '94' '--']
 ['14' '23' '32' '41' '50' '59' '68' '77' '86' '95' '--']
 ['15' '24' '33' '42' '51' '60' '69' '78' '87' '96' '--']
 ['16' '25' '34' '43' '52' '61' '70' '79' '88' '97' '--']
 ['17' '26' '35' '44' '53' '62' '71' '80' '89' '98' '--']
 ['18' '27' '36' '45' '54' '63' '72' '81' '90' '99' '--']
 ['19' '28' '37' '46' '55' '64' '73' '82' '91' '--' '--']]

後は行列計算の転置を行い、順に出力してあげれば期待した結果が得られる。