Last active
November 23, 2019 14:38
-
-
Save yue4u/7d46b432a397b70133b7349e250647c7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
問1.共有ファイル(int_list.txt)からデータを一行ごとに数として読み込み、 | |
数値が3の倍数なら"Fizz"、5の倍数なら"Buzz"、3および5の倍数なら"Fizz Buzz"、 | |
それ以外であれば読み込んだ数値をそのまま出力するプログラムを実装せよ | |
""" | |
with open('int_list.txt', 'r') as file: | |
for line in file.readlines(): | |
number = int(line) | |
t = (number % 3, number % 5) | |
print(t ,end=", ") | |
if t == (0, 0): | |
print(number,'Fizz Buzz') | |
elif t[0] == 0: | |
print(number,'Fizz') | |
elif t[1] == 0: | |
print(number,"Buzz") | |
else: | |
print(number) | |
""" | |
問3.inputを用いて数値を2回受け取り、aとbという変数に代入して、下記のようなフォーマット(a = 2, b = 3だった場合)で外部ファイルへ出力するプログラムを実装せよ。 | |
""" | |
a, b = int(input("a:")), int(input("b:")) | |
with open('sum.txt', 'w+') as f: | |
f.write(f"{a} + {b} = {a+b}") | |
""" | |
問5.曜日計算を求める公式として普及しているツェラーの公式が下記の定義である。 | |
y年m月d日の曜日を求める際に、グレゴリオ暦(Gregorian)での曜日hは | |
h = (d + [13 * (m + 1) / 5] + Y + [Y / 4] + 5 * C + [C / 4]) mod 7 | |
※ a mod bはaをbで割った余り(a % bと同様の定義) | |
※ [X]はガウス記号とし、xを超えない最大の整数とする(math.floorと同様の定義) | |
C = [y / 100] | |
Y = y mod 100 | |
と定義し、数値hの曜日との対応表は下記とする。 | |
1 = 日 | |
2 = 月 | |
3 = 火 | |
4 = 水 | |
5 = 木 | |
6 = 金 | |
0 = 土 | |
上記の式を適応して、inputから受けたy、m、dの数値に対して曜日hをラムダ式を用いて計算し、"月曜日"のような文字列に変換して出力するプログラムを実装せよ | |
""" | |
from math import floor as g | |
y, m, d = [int(input(v)) for v in ["y: ", "m: ", "d: "]] | |
C = g(y / 100) | |
Y = y % 100 | |
h = (d + g(13 * (m + 1) / 5) + Y + g(Y / 4) + 5 * C + g(C / 4)) % 7 | |
day = ["土","日","月","火","水","木","金"] | |
print(f"{day[h]}曜日") | |
""" | |
問7.ゴルフボールをドライバーでショットして、 | |
ボールの初速が60m/secで12°の角度で飛んだものとする。 | |
また、重加速度は9.8m/s^2で、空気の粘土や抵抗、 | |
レイノルズ数などの値は簡略化のために想定しないものとし、 | |
地面は水平で高低差がないものとする。 | |
この際の現在時間(単位はsec)とボールの水平方向の飛距離(単位はyard)を60FPSで計測し、 | |
最初に地面に着弾するまでの値をフレームごとに下記のフォーマットで表示するジェネレータを実装せよ。 | |
[frameNumber] : [Second] sec, [Distance] yard. | |
例えば10フレーム時点で、0.16秒経過し、8.54ヤード飛んだ場合は、下記の記載となる。 | |
10 : 0.16 sec, 8.54 yard. | |
なお、計算の際の精度は小数第2位までで良い | |
""" | |
from math import sin, cos | |
INIT_SPEED = 60 # m/sec | |
ANGLE = 0.20944 # 12 degrees | |
FPS = 60 | |
GRAVITY = 9.8 | |
FRAME_TIME = 1 / 60 | |
INIT_HORIZONTAL_SPEED = INIT_SPEED * cos(ANGLE) | |
INIT_VERTICAL_SPEED = INIT_SPEED * sin(ANGLE) | |
FLYING_TIME = 2 * INIT_VERTICAL_SPEED / GRAVITY | |
def frame_generator(): | |
frame = 0 | |
second = 0 | |
while second < FLYING_TIME: | |
frame += 1 | |
second = round(FRAME_TIME * frame, 2) | |
distance = round(INIT_HORIZONTAL_SPEED * second * 1.0936, 2) | |
yield f"{frame}: {second} sec, {distance} yard." | |
return "end" | |
for frame in frame_generator(): | |
print(frame) | |
""" | |
問9.共有ファイル(sample.fbx)はFBX形式の3Dモデルのフォーマットである、 | |
そのファイルからデータを一行ごとに読み込み、 | |
骨の名前が含まれた情報をリストして表示するプログラムを実装せよ。 | |
なお、骨は下記のようなフォーマットで定義されており、 | |
;Model::[ObjectName], SubDeformer::[BoneName] | |
骨盤にあたる骨(HipCenter)の定義はSubDeformerがHipCenterなので、 | |
;Model::HipCenter, SubDeformer::HipCenter | |
とする | |
""" | |
import re | |
bone_re = re.compile(';Model::.+?, SubDeformer::(.+?)$') | |
with open('sample.fbx','rb') as f: | |
for line in f.readlines(): | |
text = line.decode(errors='replace').strip() | |
if (bone_name := bone_re.match(text)): | |
print(bone_name.group(1)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment