IPLでセクタ読み込みエラー

OS自作入門をgasで書きなおしてみたいなぁって思って進めてたんだけど、セクター読み込みでエラーが出てた。

なんで読み込めないのかなぁって思って、調べてたら、ディスク番号が違かったらしい。

起動時に、%dlに起動したドライブ番号が入ってるらしいので、それを退避させておけばいいっぽい。qemuでドライブ番号って変えられるんかな。

ABC128 C Switches

出れなかったんだけど、AtCoderの解説動画が結構参考になったので、pythonで書く

数え上げ系すごく苦手なので、戒め兼補足。解説動画が少しわかりにくかったので。

問題概略。 ON/OFFスイッチが N 個と電球が M 個ある。それぞれのスイッチは複数の電球とランダムに接続されている。電球は、繋がっているスイッチのうちONになっているものの数が、偶奇どちらかの時(ランダム)、点灯する。それを決めるのは、P_i (1 ≦ i ≦ M)。全ての電球をつけるスイッチのパターンの数を求めよ。

解説では、bit全探索だった。N ≦ 10 なので、2 ^10 ≒ 10 ^3 なので十分。

まず、入力を表に接続表(隣接行列みたいなやつ)にする.

スイッチ番号\電球番号 0 1 2
0 1 1 0
1 1 0 1

こんな感じにしたい。bit全探索にすると、実装が楽になるので、2 進数にする。この時上の表と 桁が反転することになる。

スイッチ番号\電球番号 2 1 0
0 011
1 101

ここで、スイッチ 0 を押すと、それぞれの電球の押されているスイッチの数は

電球番号 2 1 0
押されているスイッチの数 0 1 1

になる。 さらに、スイッチ 1 を押すと

電球番号 2 1 0
押されているスイッチの数 1 1 2

こうなる。電球とスイッチが繋がっていない場合は、数は上がらず、スイッチを押すと、押したスイッチの接続表の行を足していく動作になる。

ここで、単純に押されているスイッチの数をそれぞれ 2 で割れば、あまりが出て、点灯しているかいないかがわかるが、単純に行を足すのではなく、排他的論理和をとれば、直接それぞれのあまりが出せて、実装が楽になる。

全探索の部分は、シフトを活かして、列挙する。1 が立っている桁と、スイッチのONが対応している具合に。

通った解答

def main():
    n, m = [int(i) for i in input().split()]
    # a[i] には i 番目のスイッチの 電球との接続情報が入っている
    a = [0 for i in range(n)]
    for j in range(m):
        k, *switch = [int(i) for i in input().split()]
        for s in switch:
            a[s-1] |= (1 << j)
    p = int(("".join(reversed([i for i in input().split()]))), base=2)

    ans = 0

    # bit全探索
    for i in range(1<<n):
        t = 0
        for j in range(n):
            if (i >> j & 1) == 1:
                t ^= a[j]
        if t == p:
            ans += 1
    print(ans)

if __name__ == '__main__':
    main()

gnu as のラベル参照に$付けるのと付けないのとの違い

gnu as(gas) には

label1:
    ...

という構文があって、label1はその部分のアドレスを表す。

例えば、

.code16

movw $label1, %ax

とすれば、axレジスタにlabel1のアドレスを入れることができる。

この時、

movw label1, %ax

と書いてもエラーにはならない。

この時の動作は label1 のアドレスから 2 バイト読み込みという動作になる

ちなみに

movw ($label1), %ax

とは書けないので、intel書きとは違うので注意する必要がある。

ABC125 C GCD on BalckBoard

i 番目の要素だけを除いた全体のGCDを求めるという愚直な案を書いて当然TLEだったので供養。

def gcd(x, y):
    xx = 0; yy = 0
    if x >= y:
        xx = x; yy = y
    else:
        xx = y; yy = x
    while yy > 0:
        xx, yy = yy, xx%yy
    return xx


def main():
    n = int(input())
    a = [int(i) for i in input().split()]
    ans = 1
    for i in range(n):
        tmp = -1
        for j in range(n):
            if j == i:
                continue
            if tmp == -1:
                tmp = a[j]
            tmp = gcd(tmp, a[j])
        ans = max(ans, tmp)
    print(ans)


if __name__ == '__main__':
    main()

ユークリッドの互除法の計算量がO(log(min(A,B))なので、これだとO(n2log(min(A,B))となってTLE。

解答を見ると、結合則を使って、左右のを求めて、最後に計算。といった具合だろうか。

def gcd(x, y):
    xx = 0; yy = 0
    if x >= y:
        xx = x; yy = y
    else:
        xx = y; yy = x
    while yy > 0:
        xx, yy = yy, xx%yy
    return xx


def main():
    n = int(input())
    a = [int(i) for i in input().split()]
    ans = 1
    # gcd の結合則を利用する(X, Y, Zがありgcd(gcd(x,y),z)==gcd(x,gcd(x, y)))
    l = [0 for i in range(n)]
    r = [0 for i in range(n+1)]
    for i in range(n-1):
        l[i+1] = gcd(l[i], a[i])
    for i in range(n-1, -1, -1):
        r[i] = gcd(r[i+1],a[i])
    for i in range(n):
        ans = max(ans, gcd(l[i], r[i+1]))
    print(ans)


if __name__ == '__main__':
    main()

これでAC出た。 結合則を用いて左右から計算していく発想は出なかったなぁ。

vue cli と webpack

vueの勉強。

バージョン

% vue -V                                                                             
3.7.0

vue create で作ったプロジェクトにvue-routerのサンプルを入れたらうごかねぇ。

エラーメッセージ

[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

ドキュメントでいう完全(コンパイラ+ランタイム)のがビルドされていないらしい。

公式にはどこに書けばいいのか書いてなかった。

正解は、ルートのvue.config.jsに以下を追加。

module.exports = {
    configureWebpack: {
      resolve: {
        alias: {
          'vue$': 'vue/dist/vue.esm.js'
        }
      }
    }
}

webpack.config.jsに書いてもダメだったし、色々ダメだった。githubのissueに書いてあった。

ディレクトリ構成は以下

% tree -I node_modules
.
├── README.md
├── babel.config.js
├── package-lock.json
├── package.json
├── public
│   ├── favicon.ico
│   └── index.html
├── src
│   ├── App.vue
│   ├── assets
│   │   └── logo.png
│   ├── components
│   │   └── HelloWorld.vue
│   └── main.js
└── vue.config.js

tkinterのTextのサンプル

もう平成も終わって令和になりますね。平和な世界になってくれるといいです。 tkinterの本読んでます。

www.amazon.co.jp

これですね。

tkinterのTextのサンプルです。無かったので書いてみました。

from tkinter import *
from tkinter import ttk


root = Tk()

"""
wrapはデフォはNone、選択肢は'char', 'word'です。日本語だとやっぱcharを多用しそうですね。
gridで自動拡張してるので、width, heightはあまり意味ないですね。
TextはStringVarと強調して動けません(仕様)普通に使いにくいですね。改善の余地がありそうです。
getの他に,insert, index, stringで修正、取り出すことができるようです。
"""
text = Text(root, wrap='char', width=10, height=4)
scroll = Scrollbar(root, orient=VERTICAL, command=text.yview)
text['yscrollcommand'] = scroll.set
text.grid(row=0, column=0, sticky=(N, W, E, S))
scroll.grid(row=0, column=1, sticky=(N, W, E, S))
button = Button(root, text='print', command=lambda x=None: print(text.get(1.0, 'end')))
button.grid(row=1, column=1)
# weightの設定
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.mainloop()

そもそもTextで日本語使えないっていうねw ワロタ

追記

import tkinter.font as tkFont

root = Tk()
customFont = tkFont.Font(family='arial', size=17)
content_text = Text(root, font=customFont, width=20, height=4)

これでフォント設定すればいける✋

スタートゥインクルプリキュア

最近、ブログの更新がなかったので、書こうかなって思いました。

最近は、tkinterとか、競プロとか、ディスクリートトランジスタアンプとか勉強してるんですけど、集中してるからか、ブログ書く気力がないんですよね。今まで、集中してなかったかって聞かれると、あれなんですけど。

閑話休題的に記事書きます💪

スタートゥインクルプリキュア、今年のプリキュアですね。前作のハグっとプリキュアに、負けず劣らず、面白いと思っています、僕は。

コンセプトがしっかりしてると思うので、大人な人が見ても、ふふって笑いながら観れると思います。

個人的に、対象年齢層が上がっているように感じます。コンセプトが宇宙・科学なので、しょうがない気がしますが、これはいい傾向だと思います。

少女アニメの難しさって、言い回し(単語)や、言動な部分があると思います。

スタプリは、言い回しが明らかに幼稚園児とか小学校低学年向けじゃないなと感じます。一方、言動は、謝る、感謝を述べるという動作などにしっかり演出があってとてもいいと感じています。
基本的な礼儀を抑えつつ、新しい知識を与えるきっかけを作るアニメこそ、少年少女向けのあるべきアニメの姿だと思います。

けもフレ(1期)とかもそんなイメージがあって、娘や息子がいたら、一緒に観たいなと思いました。いませんけど。できる予定もできる予兆もありませんけど。

あとは、僕が好きな分野がっていうのは、ありますね。勉強とか、物理化学分野好きですし、SFものの小説とかも結構好きなんですよね。

スタートゥインクルプリキュア、今後の展開に期待してます。