POJ3176

蟻本の練習問題として載ってるPOJの問題3176。 簡単なDPの解答。 大雑把にO(n2)で収まるぐらいの計算量で解いた。以下、解答

#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX_A 500

int n, a[MAX_A][MAX_A], dp[MAX_A+1][MAX_A+1];

int solve(int n) {
    int ans = 0;
    dp[0][0] = a[0][0];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i+1; j++) {
            if (j-1>=0){
                dp[i+1][j] = max(dp[i][j-1], dp[i][j])+a[i+1][j];
            } else {
                dp[i+1][j] = dp[i][j]+a[i+1][j];
            }
            ans = max(ans, dp[i+1][j]);
        }
    }
    return ans;
}


int main() {
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        for(int j = 0; j <= i; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    printf("%d\n", solve(n));
    return 0;
}

C++だけどほぼCみたいな。 配列を2次元にしたけど、逆三角形の部分は使ってないからメモリがもったいないかなと思った。1 次元にすれば節約できる。

タイガーブックを読む前に2

前記事で、smlnjのインストールをやった。 そのあと本通りにやると、

CM.make();

で以下のようなエラーが。

stdIn:1.2-1.11 Error: operator and operand do not agree [tycon mismatch]
  operator domain: string
  operand:         unit
  in expression:
    CM.make ()

CM.makeは引数渡さなきゃいけないらしかった。

CM.make "sources.cm";

で、実行すると、

sources.cm:8.1-8.14 Error: Io: openIn failed on "/smlnj-lib.cm", No such file or directory

これは、実際はライブラリがインストールされてるけど、適切に探せてなかったらしい。 なので、sources.cmをsmlnj-lib.cmを以下に修正。

$/smlnj-lib.cm

で、次のエラーは

errormsg.sml:7.24-7.39 Error: unbound structure: TextIO in path TextIO.instream
errormsg.sml:21.26-21.38 Error: unbound structure: TextIO in path TextIO.stdIn
errormsg.sml:27.18-27.30 Error: unbound structure: TextIO in path TextIO.stdIn
errormsg.sml:36.12-36.24 Error: unbound structure: Int in path Int.toString
errormsg.sml:34.12-34.24 Error: unbound structure: Int in path Int.toString
errormsg.sml:49.8-49.23 Error: unbound structure: TextIO in path TextIO.flushOut
errormsg.sml:49.24-49.37 Error: unbound structure: TextIO in path TextIO.stdOut

こんなの。 次は、

takoeight0821.hatenablog.jp

この人のを参考にして、basisを追加。

$/basis.cm

そうすると、

Standard ML of New Jersey v110.85 [built: Sat Dec 22 16:51:02 2018]
- CM.make "sources.cm";
- Parse.parse;
val it = fn : string -> unit

Parse.parseが使えるようになっている。

タイガーブックを読む前に

コンパイラでそこそこ有名なタイガーブックを読む前に、MLについて知っておくべきだったと読む前に思った。その際のos x上でのインストールと構文を見るのに最適なところ。

brew install mlsnj

brewでインストールできる。 インストールしたらpathを通してsmlが実行できるようにする。

終わったら

https://www.cs.princeton.edu/courses/archive/fall08/cos441/notes/lect-SMLNJ.pdf

ここを見るのが良いと思われる。

smlを起動するとインタープリターになる。 ctrl+dで終了。

djangoとvueのテンプレート

djangoのテンプレートエンジンとvue.jsのテンプレートの構文が似ているので、同時に使うのは厳しいと思っていた時期が僕にもありました。

いちいち、別の静的ファイルに書き出してscriptタグで指定は正直だるかった。

たまたま検索かけてみたら、vue.jsのdelimitersを指定するだけで、回避できるっぽい。

<html>
    <head>
       <meta charset="utf-8" />
       <title>Delimiters Sample</title>
       <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
   </head>
    <body>
        <div id="app">
            <p>[[message]]</p>
            <ul>
                <li v-for="m in items" :key="m.id">
                    [[m.text]]
                </li>
            </ul>
        </div>
        <script>
           var app = new Vue({
               delimiters: ['[[', ']]'],
               el: '#app',
               data: {
                   message: 'Hello Vue',
                   items: [{id: 1, text:"sample1"},{id: 2, text: "sample2"}],
               },
           })
       </script>
    </body>
</html>

delimitersで色々変えられるみたいなので、いちいち外部にやったりしなくてもいい!!最高!!

python3系とherokuでdjango channelsのデプロイ

django channelsのdeployingを見れば載ってる。

""" myproject/asgi.py """
import os
import django
from channels.routing import get_default_application


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
django.setup()
application = get_default_application()

まずはasgi.py。

Procfileは以下のように。

web: daphne -b 0.0.0.0 -p $PORT myproject.asgi:application -v2

たまたまネットサーフィンしてたらworkerつけなくても大丈夫だよって書いてあったのでこれで実行できた。 daphneだけ実行でオッケーっぽい。

あと、早くするならuvicornっていうのを使うといいらしいのでやってみたいと思う。軽量なasgiサーバーらしい。 アドオンはredisを入れ忘れないように。

djangoのpythonコード内で時間のフォーマットを取得する

djangoローカライズされたフォーマットで時間の文字列を取得したい時は、

from django.utils.formats import date_format

をDateTimeFieldとかDateFieldと"DATETIME_FORMAT"を渡したりすれば文字列が返ってくるけど、時間があってない(l10nされてない)。 そんなときは、諦めてテンプレートがレンダーした結果を返してもらえばいい。

from django.template import Context, Template

def get_datestr(datetime):
    t = Template("{{ date }}")
    c = Context({"date": datetime})
    return t.render(c)

こうすれば、ローカライズされて時間も日本のだし、フォーマットも日本のになる。まぁローカライズの設定がちゃんとしていたらだけど。

ちなみにローカライズのフォーマットは

django.conf.locale.ja.formats

にある。 ちなみにちなみにこのフォーマットは普通のフォーマットじゃないみたい。 websocketやるとTemplateをconsumers内で使った方がいいんじゃないかとふと思った。 あと数日以内に完成するかなぁ

verilogを書くことになりそうなので。

CPU作るぞ〜っていうことでverilogを読むことになりそうなので、書いてみた(は?w)

使用したツール群

チュートリアル

インストールは省略

/* AndNand.v */
module ANDNAND(a, b, o1, o2);

input a,b;
output o1,o2;

and AndInstance(o1, a, b);
assign o2 = ~(a&b);

endmodule

o1 にand、o2 にnand。 assignとプリミティブモジュール?を使ってみたパターン。 バス幅とかは軽くみただけだからまだ何も言えないかなぁ。

/ * AndNandTb.v */
module ANDNANDTB;

reg a, b;
wire o1, o2;

ANDNAND mod (a, b, o1, o2);

initial begin
    $dumpfile("andnandtb.vcd");
    $dumpvars(0, ANDNANDTB);
    $monitor("%t: a = %b, b = %b, o1 = %b, o2 = %b", $time, a, b, o1, o2);
        a = 0; b = 0;
    #10 a = 1;
    #10 a = 0; b = 1;
    #10 a = 1;
    #10 a = 0; b = 0;
    #10 $finish;
end
endmodule

コンパイルのコマンド

% iverilog -d AndNandTb -s ANDNANDTB AndNand.v AndNandTb.v

gtkwaveがうまく入っていれば、openでシミュレーションがみれる。f:id:b1u3:20190125235951p:plain

% open andnandtb.vcd