質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • Python

    13380questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    11188questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1509questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

競技プログラミングの問題(Python)

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,451

super_tomato

score 32

下記のプログラミングの問題を解きました。
プログラミングの問題
みなさんはPythonでこの問題をどのように解きますか?
僕は以下のように解きました。
ぜひみなさんの解答を参考にさせてください。

from __future__ import print_function
n = int(raw_input())
bilding1 = [[" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"]
           ]
bilding2 = [[" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"]
           ]
bilding3 = [[" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"]
           ]
bilding4 = [[" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"],
           [" 0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0"]
           ]
bilding = []
bilding.append(bilding1)
bilding.append(bilding2)
bilding.append(bilding3)
bilding.append(bilding4)

for i in range(0,n):
    inf = raw_input()
    inf= inf.split(" ")
    b = int(inf[0]) -1
    f = int(inf[1]) -1
    r = int(inf[2]) -1
    v = int(inf[3])
    bilding[b][f][r] = int(bilding[b][f][r]) + v
    if(r == 0):
        bilding[b][f][r] = " " + str(bilding[b][f][r]) + " "
    elif(r < 9):
        bilding[b][f][r] = str(bilding[b][f][r]) + " "
    else:
        bilding[b][f][r] = str(bilding[b][f][r])

count = 0
for j in range(0,4):
    for k in range(0,3):
        for l in range(0,10):
            print((bilding[j][k][l]),end="")
        print("")
    if(count < 3):
        print("####################")
        count += 1
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+3

私も試しに書いてみました。python3

room_list = [[[0]*10,[0]*10,[0]*10],[[0]*10,[0]*10,[0]*10],[[0]*10,[0]*10,[0]*10],[[0]*10,[0]*10,[0]*10]]
for i in range(int(input())):
    b,f,r,v = map(int, input().split())
    room_list[b-1][f-1][r-1] += v
for b_ix in range(4):
    if b_ix > 0: print("#"*20)
    for f_ix in range(3):
        print(""," ".join(map(str, room_list[b_ix][f_ix])))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 09:10

    厳密に言えば、必要ですね。

    キャンセル

  • 2018/01/22 18:40

    ありがとうございます。条件漏れがありましたか。ちょっと直してみました。いかがでしょうか。

    キャンセル

  • 2018/01/22 19:01

    出力の仕方が厳密なルールからは反していますが、そこまでしてもらわなくても十分参考になりますので!わざわざありがとうございました。

    キャンセル

+3

こんにちは。

いろいろな書き方が出来ると思いますが、考え方の一例として回答します。
なお入力データは、標準入力から与えるものとしました。

import re
from collections import defaultdict

# データ行から、部屋の特定部分と人数との2つをキャプチャする正規表現
pattern = r"^(.+) (-?\d+)$"

# データ行を読み込み、人数をカウントしておく辞書(デフォルト値: 0)
counts = defaultdict(lambda: 0)

# 標準入力からの読み込み
for _ in range(int(input())):
    m = re.match(pattern, input())
    if m:
        counts[m.group(1)] += int(m.group(2))

# 結果の出力
for building in range(4):
    for floor in range(3):
        counts_of_residents = []
        for room in range(10):
            key = "{0} {1} {2}".format(building+1, floor+1, room+1)
            counts_of_residents.append(str(counts[key]))

        print(" ".join(counts_of_residents))

    if building < 3:
        print("#" * 20)


 
考え方としては、入力のデータ行、たとえば

3 2 2 7


を、部屋を特定する文字列"3 2 2"と、人数の7とに分けて、
前者をキーとして、後者を値とする辞書 counts に格納する
ことにしました。
辞書にまだないキーに対しては、0 をデフォルト値としたいために、
defaultdict を初期値が 0になるようにして作っています。

以下、実行例です。(上記のコードを count.py とし、データをinput.txtに入れました。)

$ cat input.txt
3
1 1 3 8
3 2 2 7
4 3 8 1
$ python count.py < input.txt
0 0 8 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
####################
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
####################
0 0 0 0 0 0 0 0 0 0
0 7 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
####################
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
$ 


以上参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 09:00

    詳しい解説ありがとうございました。参考になります。ご回答ありがとうございました。

    キャンセル

  • 2018/01/22 10:35

    defaultdict 使って、楽してみました(笑) でも、Pythonのリスト操作の腕を上げるには、他の皆様の回答のほうがよいと思います。私も勉強になりました。

    キャンセル

+3

私ならこうしますかね…入力は標準入力とします。

A_college = [[[0 for _ in range(10)] for _ in range(3)] for _ in range(4)]

N = int(input())
moves = [[int(i)-1 for i in input().split()] for _ in range(N)]

for m in moves:
    b,f,r,v = m
    v += 1
    A_college[b][f][r] += v

for b,building in enumerate(A_college):
    if 0 != b: print('#'*20)
    for flr in building:
        print('',*flr)

for文のところでbuilding(棟)とかflr(floor、階)とかわかりやすい単語にすると意味のあるプログラムに見えて、個人的には好きです。

Python 3.6.1

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 08:59

    とても分かりやすい(僕にとって)コードで参考になりました!ご回答ありがとうございました。

    キャンセル

+3

リファレンスをみたりREPLで試しつつ書いてみました。
特にフォーマットするコードは明快とは言いがたいので「コードはいくらでもヘンテコにできる」という悪い例かも知れません。

import numpy as np
import re

num_b = 4
num_f = 3
num_r = 10

b_separator = '\n' + ''.join(['#'] * num_r * 2) + '\n '

rooms = np.zeros((num_b, num_f, num_r), dtype=np.uint8)

n = int(input())
for i in range(n):
    b, f, r, v = map(int, input().split(' '))
    rooms[b - 1, f - 1, r - 1] += v

o = re.sub(r'[[\]]', '', ' ' + b_separator.join(map(str, rooms)))
print(o)

python 3.6.0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 08:58

    正規表現をまだ慣れていないので参考になりました!ご回答ありがとうございました。

    キャンセル

+2

最後の出力に苦労しますが、部屋を120室、直列に用意すればデータ構造がスッキリします。

from io import StringIO
from textwrap import dedent


_INPUT = iter(dedent('''\
    3
    1 1 3 8
    3 2 2 7
    4 3 8 1
''').splitlines())

def input():
    return next(_INPUT)


rooms = [0] * 10 * 3 * 4
for _ in range(int(input())):
    b, f, r, v = map(int, input().split())
    b, f, r = (x - 1 for x in (b, f, r))
    rooms[30 * b + 10 * f + r] += v

with StringIO() as fp:
    for n in range(0, len(rooms), 10):
        if n % 30 == 0:
            print('#' * 20, file=fp)
        print(*rooms[n:n+10], file=fp)
    for line in fp.getvalue().splitlines()[1:]:
        print(line)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 08:54

    ありがとうございます!参考になります!

    キャンセル

+1

みなさんのコードを参考に以下のように改良しました。ありがとうございました。

from __future__ import print_function
n = int(raw_input())
bilding = [[[0]*10,[0]*10,[0]*10],[[0]*10,[0]*10,[0]*10],[[0]*10,[0]*10,[0]*10],[[0]*10,[0]*10,[0]*10]]
for i in range(0,n):
    b,f,r,v = map(int,raw_input().split(" "))
    bilding[b-1][f-1][r-1] += v

lcnt = 0
for j in range(0,4):
    for k in range(0,3):
        for l in range(0,10):
            print(" ",end="")
            print(bilding[j][k][l],end="")
        if(lcnt < 11):
            print("")
            lcnt += 1
    if(j < 3):
        print("#"*20)
  • lcntは出力の最後に改行が入ってしまうのでそれをなくすためです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/22 10:16 編集

    pythonのif文の条件式は、条件が複数でないならば()で囲む必要はないですよ。また0始まりならばrange(4)でいいと思います。

    最後の改行を出さないというのは面白いですね!勉強になりました。

    キャンセル

  • 2018/01/22 11:41

    ありがとうございます。if文の条件式についてですがちょうど今それを発見したところでした笑。
    0からならrange(数値)でいいのですね。勉強になります。

    最後の改行についてですが、最後に改行を入れてしまうとサイトの方でエラーが出てしまうのであのように行いました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    13380questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    11188questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1509questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。