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

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

平成30年 春期 基本情報・応用情報 偏差値表(大体)

自分が基本情報に受かったときも作ったけど、今回応用情報を受けて合格しましたのでまた作ってみました。
正規分布に従うと過程すればもっと正確に近い偏差値が出せるんですが、めんどくさいのでだいぶはしょって計算しています。

応用情報 午前

点数 人数 偏差値
90~100 107 76.91509161
80~89 1474 69.37786546
70~79 5052 61.8406393
60~69 8194 54.30341314
50~59 8048 46.76618698
40~49 5330 39.22896083
30~39 1951 31.69173467
20~29 260 24.15450851
10~19 17 16.61728235
0~9 2 9.080056197

μ=59.29045507
σ=13.26748036

応用情報 午後

点数 人数 偏差値
90~100 21 79.92948455
80~89 386 71.68944914
70~79 2099 63.44941373
60~69 4411 55.20937832
50~59 4489 46.96934291
40~49 2474 38.7293075
30~39 698 30.48927209
20~29 136 22.24923668
10~19 32 14.00920127
0~9 4 5.769165863

μ=58.6779661
σ=12.13587018

基本情報 午前

点数 人数 偏差値
90~100 177 73.99590791
80~89 2823 66.97312243
70~79 9502 59.95033696
60~69 11848 52.92755148
50~59 9490 45.904766
40~49 6182 38.88198052
30~39 2936 31.85919504
20~29 757 24.83640957
10~19 39 17.81362409
0~9 6 10.79083861

μ=60.83135283
σ=14.23936418

基本情報 午後

点数 人数 偏差値
90~100 625 73.60067585
80~89 2605 68.1938841
70~79 5285 62.78709234
60~69 8108 57.38030059
50~59 9928 51.97350883
40~49 9744 46.56671708
30~39 7908 41.15992533
20~29 4588 35.75313357
10~19 1500 30.34634182
0~9 437 24.93955006

μ=51.3499448
σ=18.49525644


ただし上記は次のように計算した。
ある得点範囲Aの下限をkとする。(例えば、30~39点ならk=30)
Aの範囲内の得点を取った人数をn(A)とするとき、k+5点を取った人がn(A)人であると仮定する。(例えば、基本情報午後の30~39点なら、n(30~39)=7908)
あとは正規分布に従うと仮定して、偏差値を通常通り導出する。


ちなみに自分の結果はこんな感じです。
f:id:wintermaples:20180622003049p:plain
午前偏差値: 66.55
午後偏差値: 67.57

基本情報よりなぜかかなり上がった(*´艸`*)

前言ってた企画について

お久しぶりです。色々あって更新できてなかったです(´・ω・`)

前いってたPython学習計画ですが、Courseraの機械学習コースでPythonに移植するという形で行きたいと思います。


理由としては、機械学習をやってみたい(今やってる)のとPythonそのものが機械学習に多く使われているという観点からそうしようかなと思います。


www.coursera.org

AOJ Volume 0022, 0023

いつものやっていきまーす
HHKB買いました。まだなれないので打ちにくいですが、タイプする感覚はGOODです!

AOJ Volume 0 Q22

Maximum Sum Sequence | Aizu Online Judge

問題の概要

連続する項の和が最大となる時、その和を出力せよ。

つまづいた所

総当りしか思いつかなくて、それでいいのか迷って他の方々の答えみたら総当りばっかだったのでもうそれでいいやってなりました(笑)
あと、intの最小値を出すのが不思議だった。

解説

総当りでなんとか見つけます。

ソース
import sys

def solve(numbers):
    max = -sys.maxsize
    for i in range(0, len(numbers)):
        sum = 0
        for j in range(i, len(numbers)):
            sum += numbers[j]
            if sum > max:
                max = sum
    return max


while True:
    n = int(input())
    if n == 0:
        break
    numbers = []
    for i in range(0, n):
        numbers.append(int(input()))

    print(solve(numbers))

AOJ Volume 0 Q23

円の交差 | Aizu Online Judge

問題の概要

2つの円があり、それぞれの円をA, Bとする。ただし、A≠Bとする。
BがAの中にある時2, AがBの中にある時-2, AとBが共有点を持つ時1, AとBが重ならない場合0を出力せよ。

解説

数学がわかってればつまづくところはないと思う。

つまづいたところ

内包表記を忘れて戸惑った。でもこれ便利ですね。

ソース
import sys

def solve(circleA, circleB):
    xa, ya, ra = circleA
    xb, yb, rb = circleB
    # まず、円の中に円が含まれる場合を判定
    if ra <= rb:
        if distancePow2(xa, ya, xb, yb) < pow(rb - ra, 2):
            return -2
    else:
        if distancePow2(xa, ya, xb, yb) < pow(rb - ra, 2):
            return 2

    # 共有点を持つ時を判定
    if pow(rb - ra, 2) <= distancePow2(xa, ya, xb, yb) <= pow(rb + ra, 2):
        return 1

    return 0

def distancePow2(xa, ya, xb, yb):
    return pow(xb - xa, 2) + pow(yb - ya, 2)

n = int(input())
for i in range(0, n):
    inStr = input()
    circleAInfo = [float(data) for data in inStr.split(" ")[0:3]]
    circleBInfo = [float(data) for data in inStr.split(" ")[3:6]]
    print(solve(circleAInfo, circleBInfo))

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

入門 Python3を2章まで読んだ

入門 Python3を大学の図書館で借りて、2章まで読みました。
Javaしかそこそこできない僕が、記憶の整理もかねて違いとかPython独自の機能とかをざっくり書いていこうと思います。

JavaPythonの違い

コンパイル型言語とスクリプト言語

Java Python
コンパイル型(ジャストインタイムコンパイル方式) スクリプト

Javaコンパイル言語(実行を高速化するために、機械に読まれることに特化した形に変換して実行する言語)であり、対してPythonは直接コンピューターにプログラムを読ませます。
この辺は曖昧のなのであってるかどうかよくわかんないです。

型付け

JavaPythonでは、型付けの方法が違います。

Java Python
静的 動的

静的型付けは、プログラマが自分で変数の型を指定して、その変数にはその型の値しか代入できなくなります。
それに対して動的型付けは、プログラマが自分で変数の型を指定しなくても、Pythonの実行プログラム(インタプリタ)が勝手に型を判定してくれます。
僕的には、静的型付けの方が今のところ好きです。何を代入すればいいのか明確になって判断がしやすいんで。

Pythonの文法

プリミティブ型変換

Javaでは「(Type) variable」や「Class.valueOf(variavble)」で型変換をしていましたが、Pythonでは関数を使って型変換をします。

文字列から整数へ

Java:

Integer.valueOf("123");


Python:

int("123")
浮動小数点数から文字列へ

Java:

String.valueOf(123.45);

Python:

str(123.45)

この型変換機能はスッキリしてて読みやすいですし便利ですね。

スライス

これがすごく便利そうな機能。リストの中身をいい感じに取り出せる機能。
文法的には次な感じ。

list[start:end:step]

startとかendとかの値は省略可能で、省略すると、

  • startには0
  • endにはlen(list)
  • stepには1

が入るようだ。
start, end, stepには負の数も指定することができ、その場合は「len(list) - n」のような数値になるらしい。
例えば、list[-3:]であれば、list[len(list)-3:list(len):1]のような感じになる。

文字列の掛け算

文字列に演算子「*」を適用すると、右項の値だけ左項の文字列が繰り返される。
例えば、「a*4」は「aaaa」になる。

感想?

まだまだPythonの魅力にあまり触れられていない自分ですがどんどん触れていきたいと思います。
実は、既にPythonで監視カメラを作った経験がありPython自体にはある程度触れています。でも調べながらだったので文法とかその場その場で覚えていく感じで中途半端なんですよね。
なので、本を使ってがっつりやろうと思った次第です。
水曜日にテストあるのに何やってんだって感じですが、どっちもそこそこやっていきます(*´﹃`*)。

CSS Design created by satotaka99. Thankyou.