電波ビーチ

☆(ゝω・)v

消費したコンテンツ 9月2019

寒暖差、というのはひとえに気温単体ではなく、そこに相互作用する草花の匂いとか天気の様相とか虫の音とか、感覚全体で連続的なうつろいに気づいていく行為かもしれないねと思った季節。電気毛布出しました。業務面では気がついたらなんかしらんけどn件の急務にアサインされてたらしくて🔥🔥🔥です。平均睡眠時間は6時間ほどです

続きを読む

「数列の差集合を取る」shell script

さっき生まれて初めてseq コマンドの存在を知ったので。

s1=`seq 0 12`; s2=`seq 3 7`
(echo $s1 $s2 | sed -e 's/\s/\n/g' | sort -u; echo $s2 | sed -e 's/\s/\n/g') | sort | uniq -u

むかしこれに近いことするためわざわざpython書いた気がする。確かそんときは 「ランダムな数値をn個欲しいが、ある範囲に含まれる数値は除く」 とかだったので、時を越えて今シェルで実現してやろう。shufheadを使って、こうじゃ

s1=`seq -20 20`; s2=`seq -5 10`
(echo $s1 $s2 | sed -e 's/\s/\n/g' | sort -u; echo $s2 | sed -e 's/\s/\n/g') | sort | uniq -u | shuf | head -5

-11
-6
12
18
-7

参考(理屈がいまいちわからんけど)

kunst1080.hatenablog.com

消費したコンテンツ8月2019

8月です。就職しました。

  • 映画
  • ドラマ
    • 全裸監督
    • Life Below Zero(邦題:氷点下で生きるということ)
    • 三体(一巻)
    • はじめてのPHPプロフェッショナル開発
  • アニメ
  • 配信
    • 花譜1stLIVE『不可解』

就職したせいで可処分時間が激減し、各コンテンツの消費量が軒並み減ってしまい、QOLも減った。飲酒量は増えた。労働は健康に悪い。

続きを読む

WSL(ubuntu)でanacondaを使ってみる

setup WSL

WSLを入れる。

  • アプリと機能
  • プログラムと機能
  • Windowsの機能の有効化または無効化
  • Windows Subsystem for Linuxにチェックを入れる

次に開発者モードにて有効化。

  • 更新とセキュリティ
  • 開発者向け
  • 開発者モード

そしてストアにてUbuntuをインストールした。

install anaconda

wget https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-x86_64.sh
bash https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-x86_64.sh

どっかで設定を見逃したのか、起動時に自動的にconda環境にならなくなってしまった。以下を打ち込むと起動するので

eval "$(/home/<your wsl username>/anaconda3/bin/conda shell.bash hook)"

こいつを~/.profileに加えてやるといける。ubuntuだと.bash_profileじゃないんですね。初めて知った。

消費したコンテンツ7月2019

書くのはタダだけどネタがないのでなんか書こうと思うんだけど続けられないとアレなので続けられそうなネタと更新頻度を考えた結果タイトル、および家賃を振り込むタイミングで動機づけしようと思います

続きを読む

ABC132に参加した(WIP Dまで)

残り30分で4完までいったところで酒を飲んだよね。

A - Fifty-Fifty

4文字からなる文字列が2種類の文字それぞれ2文字ずつから成るかどうか判定させられる。

無限に実装のバージョンがあるので好きなやつを使う(解説になってない)。

s = sorted(input())
if s[0] == s[1] and s[2] == s[3] and len(set(s)) == 2:
    print("Yes")
else:
    print("No")

B - Ordinary Number

ある数列の連続する3要素 p_{i-1}, p_{i}, p_{i+1} のうちp_{i}が2番目に小さいところになる箇所の数を求める。

なにげに 二番目に小さい が罠で、3数なので 二番目に大きい とも言えることに注意して、1からn-1までiの前後をみてやる

n = int(input())
arr = list(map(int, input().split()))
count = 0
for i in range(1, n - 1):
    if arr[i - 1] < arr[i] < arr[i + 1] or arr[i - 1] > arr[i] > arr[i + 1]:
        count += 1

print(count)

C - Divide the Problems

偶数個の要素をもつ数列を2つに分けるとき、一方の最大値がK以下、他方の最小値がK以上になるような整数Kはいくつあるだろうか。

ソートしたら真ん中の二要素の差になるのでそうする。

n = int(input())
arr = list(sorted(list(map(int, input().split()))))
print(arr[n//2] - arr[n//2 - 1])

D - Blue and Red Balls

要約が難しいので抽象的にすると、 N - K 個の赤玉を並べ、そのそれぞれの間(両端含む)に0個以上のK個の青玉を並べるときの並び方。

まず青玉を並べられる場所は赤玉の間および両端でありこれがN-K+1箇所。ここにK個の青玉をiグループに分けて並べるとして、_{N-K+1}C_i通りの選択ができる。nCrの組み合わせの数はググるアルゴリズムが出てくる。

ここまでわかって、じゃあ残りの、各グループにふりわけるK個の青玉の組み合わせってどうすんだろ、となってK=5くらいまで書き出してみるとどっかでみたことある分け方だと気づき、適当に「高校数学 グループ分け」みたいなワードでググって 二項係数とかいう単語にぶちあたり、それっぽかったので更に適当に「python 二項定理」でググって最初に出てきたやつをコピペして貼って計算。 毎回10**9+7であまりをだす。pythonなので桁は気にせず最後にやりゃいいだろ(と、ビクビクしながら提出)

二項定理をpythonで計算する - Qiita

# ncrをうまく使う感じ
# 二項定理はググった https://qiita.com/r_u__r_u/items/5e5baeb0194854cbf156

from math import factorial

n, k = map(int, input().split())
nn = n - k + 1  # 使える箇所


def ncr(n, r):
    res = 1
    for i in range(1, r+1):
        res = res * (n-i+1)//i
    return res


def calc(k):
    return [factorial(k)//(factorial(i)*factorial(k-i)) for i in range(k+1)]


nikouteiri = calc(k-1)

for i in range(1, k + 1):
    # 使える箇所からi個とり、kをi個のグループに分けたやつをかける
    print((ncr(nn, i) * nikouteiri[i-1]) % (10**9+7))

本番中解けなかったE, Fについては後日〜

ジェネレータで再帰的に組み合わせを返す

たとえば0 1からなるビット列の配列がほしいみたいなとき。組み合わせが少なければ愚直にやってもいいが、多いとき、ビット演算でやると文字列の扱いになって変換処理が時間的にボトルネックになり、リストで管理するとメモリ的にボトルネックになる。

ジェネレータで毎回帰ってきた値を処理できれば嬉しいと思うのでそうする。これですべての組み合わせみたいなよくあるパターンも処理できるわけ。next_permutation的なこともできるんじゃないの。しらんけど

def f(arr, limit):
    if len(arr) == limit:
        yield arr
    else:
        for i in [0, 1]:
            next_arr= arr[:]
            next_arr.append(i)
            for j in f(next_arr, limit):
                yield j

g = f([], 10)
count = 0
for x in g:
    print(x)
    count += 1
print("count: {}".format(count))  # 1024

nCr的な組み合わせ列挙ならこうやるねぼかぁ

def nCr(i, cur, rest, target):
    if rest == 0:
        yield cur
    elif len(target) - i == rest:
        # 今回のやつを取るしかない
        nex = cur[:]
        nex.append(target[i])
        for ncr in nCr(i+1, nex, rest-1, target):
            yield ncr
    else:
        # 含めるか含めないか
        nex = cur[:]
        nex.append(target[i])
        for ncr in nCr(i+1, nex, rest-1, target):
            yield ncr
        for ncr in nCr(i+1, cur[:], rest, target):
            yield ncr
        

arr = list(range(8))
g = nCr(0, [], 5, arr)
for x in g:
    print(x)

参考っぽいの

これは引数にリストで渡したやつの組み合わせを考えるやつ。

再帰とジェネレータ