今週のお題:目標を達成する手順は何通り?

ちょっと気力を使ったので・・・。

https://codeiq.jp/challenge/3302

例えば、横に m マス、縦に n マスの格子状のマスを左上から右下に移動するための手順を考える、という例があります。 使用可能な操作は「前に進む」「左を向く」「右を向く」の3つです。 このマスの外側には移動できず、最短の経路である必要はありません。

なお、右下のマスに着くとその時点で終了とします。 (つまり、右下のマスでは「左を向く」「右を向く」の操作はできません。)

m = 3, n = 2で、右向きに開始するとき、以下の4回の操作で左図のように移動できます。 1. 前に進む 2. 前に進む 3. 右を向く 4. 前に進む

イメージ

では、左上から右下に5回の操作で移動させるにはどうすればよいでしょうか?

状態をmn4方向の3次元行列で表現する。添字のスライスの仕方がnumpy風にいかずデバッグが難航。 表示は大切。 使う盤面をステップ毎にコピーするとO(Nmn)になり、1つのケースだけ間に合わないので、 2種類の盤面を交互に使いまわすが、新しい盤面をreturnして古い盤面に参照渡ししてしまっていて、 ハマった。

import numpy as np

def is_inner(x):
    global m,n

    if 1<=x[0] and x[0]<=m and 1<=x[1] and x[1]<=n:
        return True
    return False

def mdist(i,j,a,b):
    global m,n
    return np.abs(i-a)+np.abs(j-b)

def generatenext(states,nstates):
    global m,n,N,step

    count=0
    for i in range(1,m+1):
        for j in range(max(1,n-(N-step)+np.abs(m-i)-1),min(step-np.abs(i-1)+3,n+1)):
            if i==m and j==n:
                if step<N-2:
                    continue

            statesback=states[i][j][:]
            nstates[i][j][0]=states[i-1][j][0]
            nstates[i][j][1]=states[i][j-1][1]
            nstates[i][j][2]=states[i+1][j][2]
            nstates[i][j][3]=states[i][j+1][3]

            for k in range(4):
                nstates[i][j][(k-1)%4]+=statesback[k]
                nstates[i][j][(k+1)%4]+=statesback[k]

    return nstates,states


n,m,N=list(map(int,input().split(" ")))

states=[[[0 for k in range(4)] for j in range(n+2)] for i in range(m+2)]
nstates=[[[0 for k in range(4)] for j in range(n+2)] for i in range(m+2)]

for k in range(4):
    states[1][1][k]=1

for k in range(N):
    step=k
    if k%2==0:
        nstates,states=generatenext(states,nstates)
    else:
        states,nstates=generatenext(nstates,states)

    if step==N-2:
        if k%2==1:
            count=states[m-1][n][0]+states[m][n-1][1]
        else:
            count=nstates[m-1][n][0]+nstates[m][n-1][1]

print(count)

りずむん(リズムゲーム)

http://www.senzoku-online.jp/solfege/rhythmn/grade.html

音ゲーみたいにリズムを学べるゲームで、NEET生活のルーチンワークとして、1月ごろから3級(たしか)くらいから両手を初め、特急くらいで多少つまったので1級から片手を追加して、さきほど両手名人まで終わった(満点&申請はやってない、両手の覇王のときに気力があったらやってみます)。

ロマン派後期くらいから複雑なリズムが出てくるけど、これも1級くらいから、ねーよwwってくらい複雑なリズムが出てきます。

音大の教員で3級でもキツい人がいるらしいので、リズム名人がレッスン承ります(聴音、音楽理論、ピアノ指導も可能、ポピュラーもOK)。

ゼロ度、ゼロの和音

音程の数え方で同度を1度とするのは0という数を知らない人が作ってその風習がまだ使われているからで、 非合理的。

・音程は0,1,2度と数える ・ディグリー(調の和音)も0,1,2の和音と数える

音名はどうなんでしょう。 C-majorのⅤのⅠ転和音は0メジャー調の4の和音のⅠ転(展開指数は0オフセットで普通)となる。

テンションごく自然にあまりをとって 8==1 (mod7) (従来の9th)となる。 Ⅴ度のオクターブに関する転回音程も rev(4度)=7-4=3度(従来の4度のこと)と自然。

普及には物凄く時間がかかりそうですねw

ラ・フォル・ジュルネ

コンサート探し&某件でのコンサートの内訳を見て思ったのが、音楽と無関係なコストをかけすぎということ。

チラシ、無駄に多いスタッフ、演奏しない関係者への謝礼等。 演奏者も、運営スタッフもあまり合理的な思考力を持っていない人種だと思うので

・チケットは高い ・演奏者の収入は低い

地獄があるのだと思う。 数百人の音の良い音楽ホールで、室内楽のコンサートを開催するとか、ITを使えば殆ど演奏者以外不要なハズなのだけど、頭の悪い連中の考えはよくわからないし、↑もイベント屋のカモになってる感じがしますね。

あと、U-25と通常で倍以上違っていたりするコンサートも結構あるけど、人によって物の値段を大幅に変える事はOKなんですね。 個人的には不快なので、そういうコンサートには行かないです。

家財保険

アパートの更新で、保険も再加入するように言われて、自由に選んで良いというので知らてべみた。現在は損保ジャパンで15000yen/2year。

http://www.fdma.go.jp/neuter/topics/houdou/h27/07/270716_houdou_1.pdf によると住宅火災は年間13000件程度。

統計局ホームページ/日本の住宅・土地−平成20年住宅・土地統計調査の解説−/1-1 総住宅数と総世帯数 によると住宅数は5759万戸。

1年あたりに火事が起こる確率pは0.0002(≒0.02%=1/1万)。 損害額をSとすると期待値S*p≒0.22で2千円ちょい。料金は安い所で4000円くらいだから、 15-50%が還元率か。 集合住宅だったら家賃に上乗せすれば・・・と思うが、我が国の保険信仰は凄まじいので、そんな知性を求めるのは無理。 建物全体でも入ってたりするのでとってもクレイジーな世界。

物件を探す時に保険を強制されない事を条件にするのも良いのかなと思いますね。

「プライム・ペア」問題 

自然数 k に対し、1 から k までの自然数のうち k と互いに素なものの個数を F(k) と定義します。 (F(k) はオイラーのΦ関数とも呼ばれています。参考:オイラーのφ関数(Wikipedia))

オイラーのφ関数 - Wikipedia

例えば F(12)=4 です。1 から 12 のうち 12 と互いに素なのは 1, 5, 7, 11 の 4 つです。

標準入力から、自然数 n(1 ≦ n ≦ 105)が与えられます。 標準出力に F(n!) を 1000003 で割った余りを出力するプログラムを書いてください。

例えば n=10 のとき、F(10!)=F(3628800)=829440 です。 同様に、F(20!) を 1000003 で割った値は 961998 です

求めるものはΦ(n!)でphi関数をバラすと n!Π_i (1-1/prime[i]) を計算すると (nまでの素数以外の積)(nまでの素数の積) とシンプルになるので、エラトステネスの篩でnまでの素数とそれ以外に分けて計算する。

def mark(s, x):
    for i in range(x + x, len(s), x):
        s[i] = False

def sieve(n):
    s = [True] * n
    for x in range(2, int(n**0.5) + 1):
        if s[x]: mark(s, x)
    return [i for i in range(0,n) if s[i] and i > 1]


N=int(input())
primes=sieve(N+1)
not_primes=list(set(range(2,N+1))-set(sieve(N+1)))
mod=1000003

res=1
for i in not_primes: 
    res*=i
    res%=mod

for i in primes:
    res*=i-1
    res%=mod
    
print(res%mod)

ヴァイオリンとピアノのための小ロンド

という曲を作って、録音&編集してUPしました。 www.youtube.com

Violinの音色はまだ使いこなていないけど、何とか弾きました(キーボードで)。 フランス(ジャズ?)、モーツアルトベートーヴェンを混ぜて劣化させたような曲になりました。Vn主題の急に速くなる箇所はモーツアルトの急激にかわる表情みたいなのを真似してみました。

ロンド(rounde)という形式はABACADみたいにグルグル回るようにAが出現するのですが, ソナタやシンフォニーの終楽章に多いです(ソナタ形式と混ざっている事も多いです)。 この曲はABACAという形式ですね 冒頭のソッソーレというのが主要な部分モチーフで全体的に使い回しています。

クラシック曲がわかりにくい理由の一つに、形式がやたら複雑というのもあると思いますね。推移みたいな要素と主題の区別がつきにくい曲も多いし、ABサビみたいな曲が分かりやすいのは、内容もだけど、形式がつかみやすいというのもあると思います。 曲のタイトルに(ソナタ、ロンド、3部)とか書いてあったら聞く助けになるのかなと思います。あと、モチーフの解説も。 この曲は解説の必要がないくらい分かりやすいと思いますけど。

「初めてコンテンツを食べる感動」みたいなのとはガチ度の高い曲ほど無縁なので、その辺の事情をわかってもらうのも聞かれるのが簡単な曲ばかり、みたいな事情を何とかするのに必要だと思いますね。ゲーム内の音楽だと、必然的に繰り返して聞かれる事になるので、複雑な曲でも理解されやすいです。