Kgtkr's Blog
Profile image
Web Developer.
RSS
2018/10/13
何かツイート流れてきたので 証明 n, an,\ an, aが整数の時、n0+n1+n2n^0+n^1+n^2n0+n1+n2、すなわちn+n2n+n^2n+n2が6a+56a+56a+5の倍数にならないことを証明する 6a+56a+56a+5の倍数はkkkを整数とすると(6a+5)k(6a+5)k(6a+5)kと表す事が出来る 1+n+n21+n+n^21+n+n2が6a+56a+56a+5の倍数だと仮定すると、 1+n+n2=(6a+5)k1+n+n^2=(6a+5)k1+n+n2=(6a+5)k n, an,\ an, aが555の倍数の時、p, qp,\ qp, qを整数としn=5pn=5pn=5p、a=5qa=5qa=5qとすると、 (左辺)=1+5p+(5p)2=1+5p+25p2=1+5(p+5p2)\begin{aligned} \text{(左辺)} &=& 1+5p+(5p)^2 \\ &=& 1+5p+25p^2 \\ &=& 1+5(p+5p^2) \end{aligned}(左辺)​===​1+5p+(5p)21+5p
2018/10/02
Extracting and spreading parameter lists with tuples TS3.0で追加されたタプル型をより強力に扱うための機能です。 型パラメーターとして受け取ったタプルを展開したり出来ます。 基本的な構文は解説しないので公式ブログあたりを見ておいて下さい。 参考 Tuples in rest parameters and spread expressions #24897 このPRで紹介されているものを主に解説していきます。 注意 TypeScript3.0.xにはバグがありコンパイラやエディタ(正格にはtsserver)がクラッシュすることがあるのでTypeScript3.1.xを使って下さい。 前提知識 TSの基本的な型システムの知識宣言的なリスト操作(Haskellなどでやるあれ) 用語 この記事では、type F<T>=...;を関数のように扱うので、Fを関数、Tを引数、タプル型をリスト、type V=...;を値と表現します。 紹介 Head リストの先頭の要素を返す基本的な関数で
2018/09/19
メモ -- リスト(右結合) [1,2,3,4,5] ++ ([6,7] ++ [8]) [1,2,3,4,5] ++ [6,7,8] -- コスト2(合計2) [1,2,3,4,5,6,7,8] -- コスト5(合計7) -- リスト(左結合) ([1,2,3,4,5] ++ [6,7]) ++ [8] [1,2,3,4,5,6,7] ++ [8] -- コスト5(合計5) [1,2,3,4,5,6,7,8] -- コスト7(合計12) -- 差分リスト(右結合) fromDiffList(toDiffList [1,2,3,4,5] <> (toDiffList [6,7] <> toDiffList [8])) fromDiffList((\a->[1,2,3,4,5] ++ a) <> ((\b->[6,7] ++ b) <> (\c->[8] ++ c))) fromDiffList((\a->[1,2,3,4,5] ++ a) <> (\x->(\b->[6,7] ++ b) ((\c->[8] ++ c) x))) fro
2018/09/18
はじめに TypeScript(TS)には高カインド型(HKT)がありません。一応提案がありますが… しかし様々な機能を組み合わせればHKTを実現することが出来るのでそれの方法と解説を行います。 この記事ではHKTとは何かなどといった解説は行いません。表記は*->*のような表記を使います。 またfp-tsというライブラリを参考にしています。 使う機能 interfaceのマージ(Declaration Merging) TypeScriptでは同名のinterfaceを複数定義出来ます。 そしてこれらは自動的にマージされます。 例えば次の2つの宣言は同等です。 export interface Hoge { x: number; } export interface Hoge { y: number; } export interface Hoge { x: number; y: number; } そしてこの機能は別ファイルや別モジュールで既に定義されているinterfaceを拡張する事も出来ます
2018/09/10
やり方 準備 test.ts export type TypeEq<A, B> = (<T>() => T extends A ? 1 : 2) extends (< T >() => T extends B ? 1 : 2) ? true : false export function assertType<_T extends true>() {} export function assertNotType<_T extends false>() {} 色々複雑になっていますが、これは any や union、never などに対応するためです。 ここらへんの型は少し特殊なため、このようにしないと正常にテスト出来ません。 テストの書き方 assertType<TypeEq<1, 1>>() assertNotType<TypeEq<1, 2>>() テストが正しくなければコンパイルエラーが発生します。 例 import { TypeEq, assertType, assertNotType } from "./t
2018/09/03
spread operator interface Tweet{ id:string; user:string; body:string; } //tweetはTweet型、userはUser型とする let tw={...tweet,...{user:user}}; この時の変数twの型を定義したい時どうしますか? 素直に書いてみましょう interface Tweet2{ id:string; user:User; body:string; } 面倒ですね。プロパティが増えるともっと大変です。 typelevel-ts typelevel-tsという便利なライブラリがあります。 このライブラリを使うとこう書けます。 import {ObjectOverwrite} from 'typelevel-ts'; type Tweet2=ObjectOverwrite<Tweet,{user:User}>; これだけです。 他のライブラリ type-zootypical というライブラリもあります。
2018/08/30
競プロで標準入力のパースがめんどうだったのでマクロ作りました。 AtCoderのRust(1.15.1)でテスト済みです。 ソースコード https://github.com/kgtkr/procon-lib-rs/blob/master/src/parser.rs 使い方 事前準備 標準入力を全て読み込む let text = { let mut s = String::new(); io::stdin().read_to_string(&mut s).unwrap(); s }; 例 入力値 5 10 20 1 a 2 b 3 c 4 d 5 e 1 2 3 4 5 input!(text=> (n:usize) (a:i64 b:i64) {n;list:(i64,#)} (arr:[i64]) ); assert_eq!(n, 5); assert_eq!(a, 10); assert_eq!(b, 20); assert_eq!(list, vec![(1,"a"
2018/08/22
今回のデータ (id,update) ページング処理は大変 要素が追加されていくだけのデータであればページング処理は簡単です。追加されたdateなどをキーにしてlimitするだけで出来ます。 しかしupdateをキーにしたい時などは上手いことしないと抜けが発生します。 まあやったことある人なら分かると思います。 elasticsearchのscrollAPIとか使えば出来ますが…あれスナップショットの有効期限とか設定する必要があるので好きじゃない。永続的に使いたい 今回やること add(id=1,update=1)add(id=2,update=2)add(id=3,update=3)get(key=INF,limit=2)update(id=1,update=4)get(key=2,limit=2) 単純にやると 1,2,3 id update3 3 2 2 1 1 4(result) id update3 3 2 2 5 id update1 4 3 3 2 2 6(result) (なし) 本当は以下のデータが欲しい id up
2018/08/17
CK/CS/TK/TSに認証情報を、LIST_NAMEにリスト名を入れて実行すると同期されます import os import tweepy def list_split(n: int, list): return [list[i:i+n] for i in range(0, len(list), n)] # 環境変数取得 ck = os.environ["CK"] cs = os.environ["CS"] tk = os.environ["TK"] ts = os.environ["TS"] list_name = os.environ["LIST_NAME"] # 認証 auth = tweepy.OAuthHandler(ck, cs) auth.set_access_token(tk, ts) api = tweepy.API(auth) # リストを検索 list_id = None for x in api.lists_all(): if x.name == list_name: li
2018/06/23
初めに TypeScript(以下TS)はJSに静的型システムを取り入れた言語です。 しかしTSの型システムには多くの穴があり、知らないと型の整合性を壊してしまいます。(型システムが健全でないという) そこで今回はそのような操作をまとめてみました。 間違え、不足等があればコメントで指摘してくださると助かります。 この記事の目的 この記事は「TSの型システムの穴」を批判することが目的ではありません。 実行時のオーバーヘッドを無くすことや利便性などとのトレードオフであることは理解しています。 TSを書く多くの人が「このような操作をすると型の整合性が壊れることがある」ということを理解した上で使ってほしいというのがこの記事の目的です。 型システムの健全性とは 静的言語に限ると、「コンパイルが通ったなら実行時に型情報と値が矛盾しない事が保証されている」事を言います。 例えば「number型の変数に"hello"が入っている事は絶対にありえない」といった感じです。Javaなど多くの静的型付け言語の型システムは健全、つまりこのような事が保証されている