CodeIQの「カードを上手く並べよう」を解いたので、私が作成したコードを晒します。
9月7日の10時に回答締切なので、ネタバレを避けるためそれ以降に投稿しています。
設問
あなたは、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' '--' '--']]
後は行列計算の転置を行い、順に出力してあげれば期待した結果が得られる。
コメント