Pythonでパソコン甲子園に挑戦(エキシビションマッチ)

2009 年 9 月 11 日 | カテゴリー: LAMP奮闘記, Python

という事で!!

C言語のポインタに返り討ちを喰らう毎日に、さすがに心が折れそうですが、代わりにPHPで問題に取り組むのも敵前逃亡のようで何だかなぁ…という感じです。
ならば、同じ敵前逃亡でも、最近C言語以上にコッソリコッソリ勉強中のPythonで取り組んでみるのはどうだろう??という事ですね。

涼しい顔してカテゴリを追加しているのは内緒です(= ‘艸’)ムププ

今回は「2006年本選 問題03」です。時刻を入力して、その長針・短針の位置によって出力メッセージを変更する、という感じの問題です。

Pythonだと、raw_input()関数を利用すれば、PHPには出来ないインタラクティブな処理が可能みたいですね。…と思って調べてみたら、fgets()関数でPHPでもインタラクティブな処理は可能みたいです。

勉強不足を反省(-。−;)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

MAX = 10000

def judge_number(time):
  '''
  入力された時刻を受け取り、判定結果を返す
  '''
  h, m = time.split(':')

  # 型を揃える
  h = float(h)
  m = float(m)

  # 短針は、長針の場所によって角度が変わる
  h = (h * 30) + ((30.0 / 60.0) * h)

  # 長針は、1目盛で6°進む
  m = m * 6

  angle = abs(h - m)
  if angle > 0 and angle < 30:
    ret = 'alert'
  elif angle > 90 and angle <= 180:
    ret = 'safe'
  else:
    ret = 'warning'

  return ret

num = raw_input('Input numbers: ')
num = int(num)

if num > MAX or num < 0:
  print u'判別回数は0~10000回です\n'
  sys.exit()

ret = []
for x in range(num):
  time = raw_input('Input times: ')
  ret.append({time:judge_number(time)})

for x in ret:
  for k, v in x.items():
    print k, v

う~ん、一応正しい出力は得られるのですが、これで良いのかどうかが独学ではいつも通り、何ともはや…。

関数内で型を揃えてる箇所はint()だとエラーになってしまうのですね、何でだろう??最後の結果を格納しているリストも、辞書だと出力の順序が保証されないのでリストの値として辞書を持たせていますが、他にもっと単純な方法があるような…。あと、PHPだと「30 / 60」は「0.5」ですが、Pythonでは「0」になりますね。

まぁとにかく、どれもこれも中途半端にならないようにもっと勉強せんか!!という事ですね、頑張ります。C言語でちゃんと完成させなければ!!

最後にメモ。raw_input()関数は、入力値を文字列として受け取り、input()関数だと数値として受け取るそうです。Python面白いな~。

今日はここまでヾ(*’-'*)マタネー♪

  1. paz
    2009 年 9 月 11 日 13:15

    Python流行ってますね!
    自分のまわりの先輩もやりはじめてますし!

    自分もちょっと落ち着いたら勉強したいのでその時参考にさせていただきます!!

  2. taro
    2009 年 9 月 11 日 22:22

    >pazサン

    コンニチハ。
    Rubyとどちらを勉強するか散々悩んだのですが、yumやgwibberなんかでも使われているPythonに
    しました。PHPとの違いなんかもちゃんとまとめたいです^^

    今は座学ばかりですが、やっぱり何か作るのが習得への早道だと思いますので、よければ是非是非
    何か一緒に作ってみましょー!!