読者です 読者をやめる 読者になる 読者になる

2016年の音楽30選

経緯

以下が全てです。

早速

対象はリリースまたはアルバム・ゲーム等への収録が2016年の曲です。
30曲挙げます。結局絞り込むのはすごく難しかった。
詳細は続きに書きます。近日中に。
01. Stonebank - Be Alright
02. Stonebank - The Only One feat. Ben Clark
03. Klubfiller, Chris Unknown - Falling
04. Nuton - Care For Me (DJ Edit)
05. Porter Robinson - Sad Machine (Dougal & Gammer Remix)
06. Madeon & Porter Robinson - Shelter (Assertive & Mitomoro Remix)
07. Callum Higby - Drop The Bomb
08. Da Tweekaz - Hewwego (Darren Styles Remix)
09. Wasted Penguinz - Bitterness (Fracus & Darwin Remix)
10. Srav3R - Disco Light
11. Yunomi feat. nicamoq - ロボティックガール (Srav3R Remix)
12. Getty - Pump It
13. Relect - All We Need Is Dominator
14. 天音 - Take Me Away From Here
15. 星野源 - 恋 (Tomggg Remix)
16. YUC'e - Future Cαndy
17. YUC’e - intro-duck-tion!!
18. Stereoman & Yunomi feat. アンテナガール - シンデレラベイビー
19. Yunomi feat. TORIENA - 大江戸コントローラー (YUKIYANAGI Remix)
20. the sub account - Into the Light
21. Aire - Macaron
22. Pa's Lam System - Twiststep
23. Dirty Androids - Rouge (feat. kors k)
24. Zekk - FeelsLeftOut
25. Streex - Alive
26. Marshmello - Alone
27. Botnek & I see Monstas - Deeper Love (Slushii Remix)
28. 中路もとめ - Caramel Macchiato feat. 砂糖子
29. 霜月凛 (CV. 水原薫) - フラッター現象の顛末と単一指向性の感情論
30. OSTER project feat.かなたん - Selfish Sweet

基本情報技術者試験を受けた

10/18実施のFEを受験しました

合否発表までもう少しという微妙な時期ではあるけれど、気が向いたので書きます。

自己採点

午前 : 61/80 76.25点
午後 : 34/43 だいたい78.5~80.5点だそう

午後詳細

問1(セキュリティ)5/8
問3(データベース)5/5
問4(ネットワーク)3/5
問5(ソフトウェア)5/6
問7(経営戦略)6/6
問8(アルゴリズム)4/6
問13(表計算)6/7

午後の方が点とれているみたいで笑った。マークミスさえしていなければ合格といった感じ。問1/6/7で満点とってあと全部最悪半分ぐらいで、アルゴリズムは取れるところだけ取って受かるぞ〜、みたいな作戦だったけれど、問6で混乱してネットワークを選ぶ羽目になった点だけは少し残念。

当日までにやったことなど

かんたん合格 基本情報技術者過去問題集 平成27年度秋期

かんたん合格 基本情報技術者過去問題集 平成27年度秋期

主に以上の2冊中心に、といっても本腰入れ始めた9月中旬からはほぼ過去問だけやって、過去問の解説でも納得いかなかった所は『1回で〜』で確認、といった感じで進めていた。

午前試験の対策

全く知識がなかったわけではないけれど、テクノロジ系に関しては全く分からない状況から着手。『1回で〜』を6月頃からダラダラ読み始めた(内容は濃いのだけれど、点数に直結するようなわかり易さではないし、分厚すぎて途中でやる気なくなったので、結局読み切っていないんじゃないか)。他には、特にネットワーク分野の知識が全くない上に、どうしてもきちんと勉強する気になれなかったので、3 Minutes Networkingを読んだり、論理回路の問題が苦手過ぎたけれど捨てるのもなぁと思ったので、

0と1の話 -ブール代数とシャノン理論-

0と1の話 -ブール代数とシャノン理論-

(試験対策としては明らかにオーバーワークなのだけれど)これを読んだりした。
過去問回していれば見たことがある問題で点数は稼げるので、覚えていないとどうしようもない公式などさえ覚えておけばいいという安心感は結構あった。あとはストラテジ系の知識はある程度持っていたので、午前も午後も過去問だけやっていればよかったのは非常に都合が良かった。

午後試験の対策

「どうせ初めから過去問解いても何も分からなくてやる気がなくなるので、午前で8割越えるぐらいまではインプットに徹しよう」と言い訳を続け、着手したのは試験1週間前ぐらいだったと思う。一応過去4回分解いて、「問題文が何言っているか全く分からない」のが2つあったハードウェアは捨てることに決定、先述の通りストラテジ・マネジメント・セキュリティで稼いであとは気合みたいな大雑把な作戦だけ立てて臨んだ。アルゴリズムは頼むから文字列操作出てくれ〜って祈って何もせず、言語は甘えて表計算にした(Javaをこれからちゃんとやります)。

今後に向けて

今回はとりあえず試験に受かるための勉強しかしていないので、この先生きのこるためにはもう少しまともな知識を身に付けなければならないと感じた。FE範囲のものは特にシステム屋さんとして(そうでなくても?)必ず持っておくべき教養みたいなものだろうし、実務やりながらそうしていけるとよいかなと。あと来春はAP受けたい。

12/1追記

そういえば、受かってました。
f:id:m4d0:20151202002113p:plain
春はAP受けるぞ―と言いたいところだけれど、1月下旬までは卒論に追われているだろうし、
その後も余裕があるかといえばそうではないので、満足に時間がとれなそうでちょっと悩む。
時間があるうちに少しずつ勉強だけしていこうかなぁ。

Pythonの集合(set)

set型とは

  • 集合.同じ要素を重複して持たない.
  • 生成には中カッコ{}またはset()関数を使用する.
>>> a = {1,2,3,4,5,6,7}
>>> b = set([2,4,6,8,10])
>>> a
{1, 2, 3, 4, 5, 6, 7}
>>> b
{8, 2, 10, 4, 6}

特徴

  • 重複しない要素を順不同で集めたものなので,順序の概念がない.
    • 順序の概念がない -> スライスとかは使えない.
    • 要素が重複しない -> 既に同じ要素が存在すると、要素が追加されない.
>>> a
{1, 2, 3, 4, 5, 6, 7}
>>> a.add(2)
>>> a
{1, 2, 3, 4, 5, 6, 7} #2が既に存在するので追加されない
  • ("集合"なので当然といえば当然ながら)集合演算ができる(後述).

操作

>>> b
>>> b.add(12)
>>> b
{2, 4, 6, 8, 10, 12}
>>> b.remove(2)
>>> b
{4, 6, 8, 10, 12}

集合演算

a = {1,2,3,4,5,6,7}
b = {4,6,8,10,12}
# a:{1,2,3,4,5,6,7, , ,  ,  ,  }
# b:{ , , ,4, ,6, ,8, ,10,  ,12}

>>> a&b #aとbの積集合(=共通部分,"aかつb")
{4, 6}
>>> a.intersection(b) #a&bに同じ
{4, 6}

>>> a|b #aとbの和集合("aまたはb")
{1, 2, 3, 4, 5, 6, 7, 8, 10, 12}
>>> a.union(b) #a|bに同じ
{1, 2, 3, 4, 5, 6, 7, 8, 10, 12}

>>> a^b #排他的論理和
{1, 2, 3, 5, 7, 8, 10, 12}

>>> a.difference(b) #差集合a-b
{1, 2, 3, 5, 7}
>>> a-b
{1, 2, 3, 5, 7}

>>> b.difference(a) #差集合b-a
{8, 10, 12}
>>> b-a
{8, 10, 12}
>>> c={4,6,8}
>>> c.issubset(a) #cはaの部分集合かどうか判定
False
>>> c.issubset(b)
True
>>> b.issuperset(c) #bはcの上位集合かどうか判定
True
>>> a.issuperset({1,2,5,7})
True

言語処理100本ノック 05-06

05. n-gram

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.
この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

n-gramとは

検索対象を単語単位ではなく文字単位で分解し、後続の N-1 文字を含めた状態で出現頻度を求める方法。Nの値が1なら「ユニグラム(uni-gram)」、2なら「バイグラム(bi-gram)」、3なら「トライグラム(tri-gram)」と呼ばれる。
全文検索 - Wikipedia

このあたり全くもって専門外なので意味わからなくて固まったけど,やることはシンプル.

解答

import re
def ngram(n,x):
	xw = re.split("\s",x)
	xc = "".join(xw)
	wordgram = [" ".join(xw[w:w+n]) for w in range(len(xw)-n+1)]
	chargram = [xc[c:c+n] for c in range(len(xc)-n+1)]
	print(wordgram)
	print(chargram)
ngram(2,'I am an NLPer')
['I am', 'am an', 'an NLPer']
['Ia', 'am', 'ma', 'an', 'nN', 'NL', 'LP', 'Pe', 'er']

方法としてはどちらもスライスで.
内包表記も少しずつ悩まずに書けるようになってきた.

06. 集合

"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,
それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.
さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.

ParaParaParadise - Wikipedia

解答

x,y = 'paraparaparadise','paragraph'
X = set(x[c:c+2] for c in range(len(x)-1))
Y = set(y[c:c+2] for c in range(len(y)-1))

print('X=',X)
print('Y=',Y)
print('和集合:',X.union(Y))
print('積集合:',X.intersection(Y))
print('差集合X-Y:',X.difference(Y))
print('差集合Y-X:',Y.difference(X))

if 'se' in X:
	print('"se"はXに含まれる')
else:
	print('"se"はXに含まれない')
if 'se' in Y:
	print('"se"はYに含まれる')
else:
	print('"se"はYに含まれない')
X= {'pa', 'ad', 'se', 'ap', 'ra', 'is', 'di', 'ar'}
Y= {'pa', 'ag', 'ap', 'gr', 'ra', 'ph', 'ar'}
和集合: {'pa', 'ad', 'se', 'ag', 'ap', 'ra', 'is', 'di', 'gr', 'ar', 'ph'}
積集合: {'ap', 'pa', 'ar', 'ra'}
差集合X-Y: {'di', 'ad', 'se', 'is'}
差集合Y-X: {'ph', 'ag', 'gr'}
"se"はXに含まれる
"se"はYに含まれない

集合X,Yを求めるところと,'se'が含まれるかどうかの判定はさておき.
集合演算について忘れていたのでまとめておく.

集合まわりの演算はsetが便利

(別記事にします)

言語処理100本ノック 03-04

03. 円周率

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

解答

import re
a = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
l = re.split('\W+',a)
print([len(i) for i in l])

単語に分解するのってsplit()でいいのかなと思ったけれど,カンマが残って困った.
どうやら正規表現を使えばいいとのこと(解答はそれ調べて書いた).
割とうまく書けたような気もする.

複数の区切り文字を用いて文字列を分割する(re.split)

string を、pattern があるたびに分割します。キャプチャグループの丸括弧が pattern で使われていれば、パターン内のすべてのグループのテキストも結果のリストの一部として返されます。maxsplit がゼロでなければ、最大 maxsplit 個の分割が発生し、残りはリストの最終要素として返されます。:

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']

6.2. re — 正規表現操作 — Python 3.3.6 ドキュメント

\d,\s,\wがそれぞれ数字,空白,英数字に対応.
小文字だとそれらとマッチ,大文字だとそれら以外とマッチする.

04. 元素記号

"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

解答

import re
l1 = (1,5,6,7,8,9,15,16,19)
g = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
g = re.split('\W+',g)
dic = {}
for i,j in zip(range(len(g)-1),g):
	if i+1 in l1:
		dic.update({i+1:j[0]})
	else:
		dic.update({i+1:j[:2]})
print(dic)

連想配列を作成せよ」なので空配列は仕方ないけれど.
zip()内もうちょっとなんとかできそう?(今度考えてみる.)

AtCoder Beginner Contest 027 B問題

B: 島と橋 - AtCoder Beginner Contest 027 | AtCoder

問題

  • N個の横一列に並んだ島にそれぞれ何人か住人がいる.
    • 左からi番目の島にはa_i人が住んでいる
  • 隣り合う島には橋をかけることができ,住人を相互に移動させることができる.
  • すべての島に均等に人を住まわせることは可能か.
    • 可能なら,少なくともいくつ橋が必要か.

解法

  • 住人の合計が島の数で割り切れなければ,均等に住まわせることが不可能.
  • 可能な場合,任意のiについて,以下が満たされればよい.

(Σ[k=1,i]a_k)/i = (Σ[k=i+1,N]a_k)/(N-i)

  • つまりどこで分けても(左側1島あたりの人口)=(右側1島あたりの人口)にしたらいい.

コード

"可能な場合"の解法が素敵だった(というか頭が悪くて思いつかなかった)ので.

N = int(input())
a = list(map(int,input().split()))

ans = 0
if sum(a) % N != 0:
	print(-1)
else:
	for i in range(N):
		if sum(a[:i+1])/(i+1) != sum(a)/N:
			ans += 1
	print(ans)

今のところ(コンテスト終了後1h30min経過)コード長最短っぽくてちょっと嬉しい.
しかしforブロック内がグッチャグチャで見にくい......

for i in range(1,N-1):
    if sum(a[:i])/i != sum(a)/N:

としたほうがよかった気もする.目が疲れて夏風邪悪化しましたとさ.

言語処理100本ノック 00-02

www.cl.ecei.tohoku.ac.jp
以前に見つけてから久しく手を付けていなかったのだけれど,暇ができたのでやってみる.

目標

  1. なるべくコードを綺麗に,なるべくコード長を短く(≠短いは正義)
  2. 分からないことを調べたらoutput(ここをメモ代わりとするわけだけれど)を忘れずに
  3. がんばって続ける
続きを読む