差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming:nim:programming_contest [2018/10/12] – [入力] ikatakos | programming:nim:programming_contest [2018/10/18] – [入力] ikatakos | ||
---|---|---|---|
行 23: | 行 23: | ||
|critbits|crit-bit木(効率のよい文字列検索木)|[[https:// | |critbits|crit-bit木(効率のよい文字列検索木)|[[https:// | ||
|future|実験的な機能(リスト内包表記 etc.)|[[https:// | |future|実験的な機能(リスト内包表記 etc.)|[[https:// | ||
+ | |||
+ | まとめて | ||
+ | |||
+ | <sxh> | ||
+ | import strutils, sequtils, math, algorithm, tables, sets, lists, queues, intsets, critbits, future | ||
+ | </ | ||
=====入力===== | =====入力===== | ||
行 51: | 行 57: | ||
分割代入(Destructuring assignment)は、直接行うにはこうするしかない? | 分割代入(Destructuring assignment)は、直接行うにはこうするしかない? | ||
- | テンプレートとして関数を定義しておけば、letでも受け取れる(参考: | + | 関数を定義しておけば、letでも受け取れる(参考: |
< | < | ||
行 91: | 行 97: | ||
# または | # または | ||
echo "$1 $2 $3" % [$n, $m, $k] | echo "$1 $2 $3" % [$n, $m, $k] | ||
+ | |||
+ | =====リストの作成===== | ||
+ | |||
+ | arrayが固定長配列(コンパイル時に長さがわかっている必要がある)、seqが可変長リスト | ||
+ | |||
+ | # 空の1次元Seq | ||
+ | var aaa: seq[int] = @[] # 型の自動推定が働かないため明言する必要がある | ||
+ | # または | ||
+ | var aaa = newSeq[int]() | ||
+ | | ||
+ | # N要素の1次元Seq(その型のデフォルト値で初期化) | ||
+ | var aaa = newSeq[int](N) | ||
+ | | ||
+ | # N要素の1次元Seq(その型のデフォルト値以外で初期化) | ||
+ | var aaa = newSeq[int](N) | ||
+ | aaa.fill(x) | ||
+ | |||
+ | # N行M列の2次元Seq | ||
+ | var aaa = newSeq[seq[int]](N) | ||
+ | aaa.fill(newSeq[int](M)) | ||
+ | # または | ||
+ | var aaa = newSeqWith(N, | ||
+ | | ||
+ | 配列の値埋めについては、newSeqWithより、fillした方が速いらしい。これは、randなどが渡されたとき、fillだと引数として渡す際に評価された1つの値が全て入ってしまうが、newSeqWithは毎回initして別々の要素を作成するなどの挙動の違いによる。 | ||
+ | |||
+ | * [[https:// | ||
+ | |||
+ | <sxh> | ||
+ | import sequtils, algorithm, random | ||
+ | |||
+ | var aaa = newSeq[int](10) | ||
+ | aaa.fill(rand(100)) | ||
+ | echo $aaa | ||
+ | # => @[3, 3, 3, 3, 3, 3, 3, 3, 3, 3] | ||
+ | |||
+ | var bbb = newSeqWith(10, | ||
+ | echo $bbb | ||
+ | # => @[89, 18, 2, 95, 20, 9, 54, 37, 80, 51] | ||
+ | |||
+ | |||
+ | # 2次元配列の作成などは、fillでも独立した要素が作られる模様 | ||
+ | # (参照が同じでccc[0][0]を変更したらccc[1][0], | ||
+ | |||
+ | var ccc = newSeq[seq[int]](3) | ||
+ | ccc.fill(newSeq[int](3)) | ||
+ | ccc[0][0] = 5 | ||
+ | echo $ccc | ||
+ | # => @[@[5, 0, 0], @[0, 0, 0], @[0, 0, 0]] | ||
+ | |||
+ | var ddd = newSeqWith(3, | ||
+ | ddd[0][0] = 5 | ||
+ | echo $ddd | ||
+ | # => @[@[5, 0, 0], @[0, 0, 0], @[0, 0, 0]] | ||
+ | </ | ||
+ | |||
=====要素数の数え上げ===== | =====要素数の数え上げ===== |