プログラミングしたい日記

いつもプログラミングとか音楽聞いてたりする人の日記です

AOJ Volume 0 - 0012, 0017

はい。今まで寝てました。やっていこうと思います。

既にやってある所は飛ばしているのでごめんなさい!

AOJ Volume 0 Q12

A Point in a Triangle | Aizu Online Judge

問題の概要

三角形の頂点の座標と、ある点Pの座標が与えられた時、点Pが三角形の内部にあれば「YES」、なければ「NO」を出力する。ただし、三角形の辺、頂点に交差する場合を除く。

つまづいた所

いい方法が思いつかんのでネットで調べたら、外積使うとうまく解けるみたいです。
大学で最近習った外積をここで使うことになるとは思わなかった(._.)

解説

三角形の辺のベクトルを「v1To2, v2To3, v3To1」とし、三角形の頂点から点Pまでのベクトルを「vNToP」とする。
vNTo(N+1) × vNToPの符号がすべて一致する時、点Pは三角形の内部にあるという性質(?)を利用してます。

ソース
import fileinput


class Vector2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def dot(self, vec2d):
        return (self.x * vec2d.y) - (self.y * vec2d.x)


for line in fileinput.input():
    x1, y1, x2, y2, x3, y3, xp, yp = [float(r) for r in line.split()]
    v1To2 = Vector2D(x2 - x1, y2 - y1)
    v2To3 = Vector2D(x3 - x2, y3 - y2)
    v3To1 = Vector2D(x1 - x3, y1 - y3)
    v1ToP = Vector2D(xp - x1, yp - y1)
    v2ToP = Vector2D(xp - x2, yp - y2)
    v3ToP = Vector2D(xp - x3, yp - y3)

    if (v1To2.dot(v1ToP) < 0 and v2To3.dot(v2ToP) < 0 and v3To1.dot(v3ToP) < 0) or (v1To2.dot(v1ToP) > 0 and v2To3.dot(v2ToP) > 0 and v3To1.dot(v3ToP) > 0):
        print("YES")
    else:
        print("NO")

AOJ Volume 0 Q17

シーザー暗号 | Aizu Online Judge

問題の概要

aをb, bをc、zをaといったように、ある文字xがあった時、その文字コードをxcとし、その文字を(xc + n) mod 26の文字コードに対応する文字に置換するような暗号化を行うものとする。

この時、ある文字列Sが与えられて、それを暗号化した文字列をS'とする。
Sには「the, this, that」のいずれかが含まれるので、なんとかしてS'からSを決める。
という問題。
例えば、
S' = uijt jt b qfo

S = this is a pen
となる。

解説

負のindexが使えるpython最強な気がする

つまづいたところ

文字列を変換して再代入を繰り返すと、「a」が「c」になった時、そのcがまた置換されてずれてしまうので対策するのがめんどくさかった。
最終的には、文字列を配列化して1文字1文字置換してく形になった。

ソース
import fileinput
import string

alphabetArray = list(string.ascii_lowercase)

for data in fileinput.input():
    for n in range(-26, 27):
        replacedStrAry = list(data.replace('\n', '').replace('\r', ''))
        for index in range(0, len(replacedStrAry)):
            if not replacedStrAry[index] in alphabetArray:
                continue
            if n >= 0:
                replacedStrAry[index] = alphabetArray[(alphabetArray.index(replacedStrAry[index]) + n) % 26]
            else:
                replacedStrAry[index] = replacedStrAry[index] = alphabetArray[alphabetArray.index(replacedStrAry[index]) + n]
        replacedStr = "".join(replacedStrAry)
        replacedStrSplitedBySpace = replacedStr.split(' ')
        if "the" in replacedStrSplitedBySpace or "this" in replacedStrSplitedBySpace or "that" in replacedStrSplitedBySpace:
            print(replacedStr)
            break
CSS Design created by satotaka99. Thankyou.