電脳向量表記

BASIC言語では以下のように教わる  

行番号を `1`, `2`, `3` と振り番すると、あとで `2` と `3` の間に１行はさみたいときに  
挟めなくて困るから、行番号は `10`, `20`, `30` と 10 ずつ飛ばして振りなさい  

なるほど  

あとで `20` と `30` の間に行を書きたくなったときに `25` を挟める！　

……と思ったが、じゃあ `25` と `26` の間に挟みたいときはどうするのか！

────という長年の疑問から  
後からいくらでも挟めるような振り番が欲しかったので　仕様を発案した。  
数値型ではなく **文字列型の辞書順** を利用する  

一度に説明するのは難しいので、要点を分けて１つずつ説明する  

# O1o0 格納構造

## O1o1o0 もととなる数

```plain
[1 2 3 4]
```

👆 もととなる数は、要素を整数とするベクトルを想定している  

## O1o2o0 電脳向量

```plain
[1 2 3 4 0]
```

👆 要素を整数とするベクトルで、右端の要素が 0 のものを **電脳向量** （Cyber Vector） と呼ぶことにする  

## O1o3o0 右端に 0 の要素を追加する操作

```plain
[1 2 3 4]
         │
         │ trail_zero
         ↓
[1 2 3 4 0]
```

👆 右端の要素が 0 でない場合、 1列増やして 0 を入れる。  
これを **trail_zeroルール** と呼ぶことにする。 `With trailing zero` の略  

```plain
[1 2 3 4 0]
           │
           │ trail_zero
           ↓
[1 2 3 4 0 0]
```

👆 この操作をもう一度行うと、さらに 1列増やして 0 を入れる  

# O2o0 電脳向量の表記の手順

## O2o1o0 Ignore case

* 大文字と小文字は区別しない

## O2o2o0 零，または1桁の正の整数を要素にするベクトルの例

👇 以下のようなベクトルがあるとする  

```plain
[1 2 3 4 0]
```

👇 角括弧を外す  

```plain
1 2 3 4 0
```

👇 区切りとして `o` を使う。間隔は空けずに詰める  

```plain
1o2o3o4o0
```

👇 左端に `O` を付ける。間隔は空けずに詰める  

```plain
O1o2o3o4o0
```

これが **電脳向量表記** （Cyber Vector Notation）の代表的なケースだ  

## O2o3o0 2桁以上の正の整数を要素にするベクトルの例

👇 以下のようなベクトルがあるとする  

```plain
[21 321 4321 0]
```

👇 角括弧を外す  

```plain
21 321 4321 0
```

👇 区切りとして `o` を使う。間隔は空けずに詰める  

```plain
21o321o4321o0
```

👇 `桁数×2-1` の横幅があると考える  

```plain
 21o  321o   4321o0
--- ----- -------
```

👇 `前A` を詰める

```plain
A21oAA321oAAA4321o0
--- ----- -------
```

👇 左端に `O` を付ける。間隔は空けずに詰める  

```plain
OA21oAA321oAAA4321o0
```

これも **電脳向量表記** だ  

## O2o4o0 負の整数を要素にするベクトルの例

👇 以下のようなベクトルがあるとする  

```plain
[-1 -21 -321 -4321 0]
```

👇 角括弧を外す  

```plain
-1 -21 -321 -4321 0
```

👇 区切りとして `o` を使う。間隔は空けずに詰める  

```plain
-1o-21o-321o-4321o0
```

👇 負数の符号 `-` を外すとともに、 `残った桁数×2` の横幅があると考えて、 `前_` を詰める  

```plain
_1o__21o___321o____4321o0
```

👇 負数だったその残った数より1桁多い数の中で最小の数を 上に添える  

```plain
10  100   1000    10000
_1o__21o___321o____4321o0
```

👇 引く  

```plain
10  100   1000    10000
_1o__21o___321o____4321o0
--  ---   ----    -----
_9o__79o___679o____5679o0
```

👇 その差の左端に `O` を付ける。間隔は空けずに詰める  

```plain
O_9o__79o___679o____5679o0
```

これも **電脳向量表記** だ  

# O2o5o0 電脳向量表記の結合

👇 以下の２つのベクトルを１つにまとめたいとき  

```plaintext
[1  0]  [2  0]
```

👇 まず それぞれを電脳向量表記にする  

```plaintext
O1o0  O2o0
```

👇 `g` でつなぐ。間隔は詰める。 `g` の右隣の `O` は除去する  

```plaintext
O1o0g2o0
```

# O3o0 テクニック

# O3o1o0 兄弟の追加

「数と数の間隔がすぐ足りなり、ベクトルの要素を増やす」ことが頻発することがある。  
このベクトルの要素数の増加速度を遅くするテクニックをパターン化しておく  

👇 `[2  0]` と `[3  0]` の間に数を挿入するときのテクニック  

```plaintext
    [2  0]
    [3  0]
```

👇 （例） `[3  0]` の方に `[0  -9]` 増やす  

```plaintext
    [2   0]
👉  [3  -9  0]
    [3   0]
```

👇 `[3  -1  0]` と `[3  0]` の間に数を挿入するときのテクニック  

```plaintext
    [3  -1  0]
    [3   0]
```

👇 （例） `[3 0]` の方に `[0 0 -99]` 増やす  

```plaintext
    [3  -1    0]
👉  [3   0  -99  0]
    [3   0]
```

👇 `[3  0  -99  0]` と `[3  0]` の間に数を挿入するときのテクニック  

```plaintext
    [3  0  -99  0]
    [3  0]
```

👇 （例） `[3  0]` の方に `[0  0  0  -999]` 増やす  

```plaintext
    [3  0  -99     0]
👉  [3  0    0  -999  0]
    [3  0]
```

以降、同様に１桁ずつ増えていく  

# O3o2o0 正規表現

```textplain
([0-9AaGgOo_]+)
```

# OAA100o0 関連する記事

## OAA100o1o0 Pythonコード

Example: 📖 [cyber-vector-notation](https://github.com/muzudho/cyber-vector-notation)

## OAA100o2o0 辞書順記数法

📖 [辞書順記数法 Crieit版](https://crieit.net/posts/Dictionary-Ordinal-Number-Notation) - ブログ  
📖 [辞書順記数法 Qiita版](https://qiita.com/muzudho1/items/95852145eceddecd1503) - 固い記事  

## OAA100o3o0 数珠玉表記

📖 [数珠玉表記 Crieit版](https://crieit.net/posts/Beads-Nested-Number-Notation) - ブログ  
📖 [数珠玉表記](https://qiita.com/muzudho1/items/7aafcf17fc4bb8fe551b) - 固い記事  

## OAA100o4o0 電脳向量表記

👇 辞書順記数法と 数珠玉記数法を組み合わせたもの  

📖 [電脳向量表記 Crieit版 ブログ](https://crieit.net/posts/Cyber-Number) - ブログ  
📖 [電脳向量表記 Crieit版 固い記事](https://crieit.net/posts/Cyber-Number-Notation) - この文章の元  
📖 `電脳向量表記 Qiita版` - この記事  

おわり