Git Product home page Git Product logo

neonmori.github.io's People

Contributors

bitmori avatar

Stargazers

 avatar

Watchers

 avatar

neonmori.github.io's Issues

C++ `new(p, f) T[s]` 调用

new(p, f) T[s] -> operator new[](sizeof(T) * s + x, p, f)

Here, each instance of x is a non-negative UNSPECIFIED value representing array allocation overhead;
the result of the new-expression will be offset by this amount from the value returned by operator new[].
This overhead may be applied in all array new-expressions, including those referencing the library function
operator new[](std::size_t, void*) and other placement allocation functions.
The amount of overhead may vary from one invocation of new to another.

给C++程序员的Rust入门 (翻译)

给C++程序员的Rust入门

原文地址:https://qiita.com/EqualL2/items/a232ab0855f145bd5997

因为想要学习新的语言,所以开始尝试Rust了。

选择Rust的理由

当时的候补语言包括:D、Go、Rust。

在这其中选中了Rust的理由如下:

  • 想要使用运算符重载
    • Go没有提供此功能
  • 想要泛型(模板)
    • Go还是没有提供
  • 不在意垃圾回收(GC)
    • Go和D好像都可以关闭GC,但是似乎不太常见呢

说实话Go和D并没有什么错处。

只是自己不想大的变化。

Rust的发布种类

  • Nightly 每天的master分支的最终成功构建版本,一直会有新功能
  • Beta 每隔6个星期从Nightly升格而来,为了Stable版本而进行过许多bug修复
  • Stable 每隔6个星期从Beta升格而来

在macOS上安装Rust的方法

  1. 使用Homebrew (只能安装 Stable)
    1. 在终端输入brew install rust
  2. 使用rustup
    1. 在终端输入curl https://sh.rustup.rs -sSf | sh

Rust的语法

Rust的资料

下列全都是英文资料。中文翻译搜索一下也很易得

  • The Rust Programming Language(TRPL)
    • Rust的教科书。
    • 读完之后就能写简单的代码了
  • Rust By Example(RBE)
    • 面向那些更喜欢读代码的人。
    • 请和TRPL一起读
  • Rust Cookbook
    • 面向想要学习具体用法的人。
    • 没有特地去读
  • The Rustnomicon
    • 关于解除Rust的安全性桎梏unsafe代码块,以及内存排布,还有FFI写法的内容
    • 没有读
  • The Rust Reference
    • 目标是成为Rust的标准书一样的文书。因为语言本身还在快速发展,所以这本书很容易就老化了,但是总能有点帮助。
    • 稍微读了一下

这篇文章基本上是对TRPL内容的添油加醋

可是,我觉得对于基础内容,还是稍微重构一下好一些呢

注释

// 行注释

/* 
块注释
    /*
    可以嵌套
    */
*/

/// 文档注释
/// 似乎可以在内部使用Markdown

//! 文档注释 改
//! 比起用在单个函数上,这种注释更多的用在模块的全体说明上

变量类型

  • 布尔类型
  • 整数类型(u8, u16, u32, u64, i8, i16, i32, i64
  • 浮点类型 (f32, f64
  • 架构依赖的整数类型 (usize, isize
  • 32位字符类型
  • 8位字符串类型
  • 元组类型 (tuple)
  • 数组类型和切片类型 (array & slice)
  • 结构体 (struct)
  • 枚举 (enum)
  • 函数指针

变量声明

Rust中,变量默认是不可变的,想要其可变,需要添加mut

因为拥有现代语言的类型推导所以很棒

let a = 1;     // 不变
let mut b = 3; // 可变
let c: i32 = 0; // 指定类型

变量声明和初始化也可以分开

分开时类型推导还是能正常工作

let i; // 声明
i = 1; // 初始化

let mut j; // 可变变量声明
j = 3;     // 初始化
j = 7;     // 修改

也能像下面这样在一行中一次初始化多个变量:

let (t,u,v) = ("alpha","beta","charlie"); // t,u,v不可变
let (mut w, mut x) = ("delta","echo");    // w,x可变
let (y,z): (&str,&str) = ("foxtrot","golf")// 类型指定 (感谢@JunSuzukiJapan)

Rust还可以做到覆盖声明这种C++没有的事情

而且覆盖声明还可以接受不同类型:

let a: i64 = 1;
println!("{}",a); // => "1"

let a: f64 = 3.14;
println!("{}",a); // => "3.14"

TRPL的"Guessing game"中提供了具体实例

能够无视资源分配的特殊变量_:

let _ = 1; // 舍弃分配的内存
let _ = test(); // 舍弃函数的返回值

这种用法主要是和后文要说的析构赋值模式匹配等搭配使用

同时,有些函数带有must_use的时候(要求一定使用返回值),_可以舍弃这些返回值

变量属性(conststatic

在Rust中也有conststatic

const提供类似C++11以后的constexpr的功能

作为编译时的常量,会被内连所以内存地址不确定

static与C++中的功能相同

只会在启动时初始化一次,以后的内存地址都是相同的

要这两种变量属性,需要在变量声明时指定类型

同时这两种变量也可以被放置在全局作用域中

但是它们既不能进行覆盖声明也不能进行分离式初始化

这两种变量在命名上,约定都是使用全大写字母

/* 全局作用域 */
const C: i64 = 1;   // 不可变
static S1: i64 = 2; // 不可变
static mut S2: i64 = 3; // 可变

类型的限制

Rust对于类型限定非常严格

隐式转换基本不存在

let i: i64 = 3.5;     // 错误:声明与初始化类型不同
println!("{}",3/4.); // 错误:除法运算符两侧类型不一致

let j = 1;
let k: f64 = j; // 错误:声明和初始化类型不同

当然了,类型转换还是存在的("one of the most dangerous features of Rust!"/Rust最危险的特性之一!

不过,只提供了as这种相当于static_cast的转换;像C中那种“什么都能转换”的效果需要别的方法。

let l = 1;
let m: f64 = j as f64; // j(整型)转换成f64

函数

不指定返回值类型的时候默认返回Unit(空元组()

除此之外必须指定类型。返回值不能进行类型推导

同时还必须要指定参数的类型

来试着写一个i32的加法函数:

fn add(x: i32, y: i32) -> i32 {
    x + y
}

省略分号的时候相当于使用了return

当然也可以像C++一样使用return

函数内嵌函数也是允许的

Rust还提供了类似C++中lambda函数的闭包

函数指针

之前写过的fn add(x: i32, y: i32) -> i32 函数指针长这样:

let x: fn(i32,i32) -> i32 = add;

数组

提供边界检查,越界访问将会异常停机

访问的语法和C++一样,数组下标从0开始

访问时下标必须是usize类型

let a = [1,2,3,4,5]; // 含有5个元素的数组
let b = [3;5];       // 含有5个元素的数组,所有元素都初始化为
let c: [i32;10];      // 含有10个元素的数组,所有元素都是i32类型

数组除了能够与下面的切片进行隐式转换,自身并没有特别重要的功能

切片

对数组的一部分进行引用

有点像C++的valarray

let a = [1,2,3,4,5]; // 数组
let whole = &a[..];  // 引用整个数组
let part = &a[1..4];  // 只引用第1,2,3个元素

在切片a支持的各种方法中,下面几个特别方便:

方法 功能
a.contains(x) 返回a中是否包含x
a.iter() 返回一个a的迭代器(相当于C++的const_iterator
a.iter_mut() 返回一个a的可变迭代器(相当于C++的iterator
a.len() 返回a的元素数量
a.reverse() a中的元素逆向重排
a.swap(x,y) a的第x个元素与第y个元素交换位置
a.sort() a进行排序 (稳定的 onlogn

元组

与C++不同,Rust中是基础类型

元素数量和全部元素的类型都相同时可以代入

let a = (1,2); // (i32,i32)的元组
let b = (4.0,) // (f64)的元组

创建只有一个元素的元组时,最后的元素必须后接逗号

从元组中取出元素的方法有两种:

析构赋值(destructuring let

使用let语句将元组中的对应值分配给新变量

左右两边的元素数量不同时当然回报错:

let t1 = (1,2);
let t2 = (3,4);
let (x,y) = t1; // x=1, y=2
let (_,z) = t2; // z=4 (使用_来忽略元素)

使用下标访问

可以使用下标访问元素。下标从0开始:

let t = (10,20,30);
let a = t.0 // a=10
let b = t.1 // b=20
let c = t.3 // 编译时错误

不能用变量作为下标。越界访问会在编译时报错

if

条件语句不需要用括号包起来

下例引用自TRPL

let x = 5;

if x == 5 {
    println!("x is five!");
}

C++的if属于语句(statement)而Rust的if是表达式(experssion)。(thanks to @moriturus)

表达式因为有返回值,所以可以替代三元操作符:

下例引用自TRPL

let x = 5;

let y = if x == 5 { 10 } else { 15 }; // y 初始化为 10

循环

Rust提供了无限循环专用的关键字loop。可以用在最合适的地方

loop{
    println!("infinity!"); // 无限的 infinity!
}

while语句:

let mut i = 5;

while i < 5 {
    println!("loop!");
    i -= 1;
}

for语句也有了range-based for一样的现代感:

let a = [0,1,2,3,4];
for v in a.iter() {   // 数组转换成迭代器
    println!("{}",v); // 按顺序输出0~4
}

也可以直接使用数字:

for i in 0..5 {
    println!("{}",i); // 按顺序输出0~4
}

除了breakcontinue这C++就有的用法,还可以与标签一同使用来更好的控制多重循环:

下例引用自TRPL

'outer: for x in 0..10 {
    'inner: for y in 0..10 {
        if x % 2 == 0 { continue 'outer; } // continues the loop over x
        if y % 2 == 0 { continue 'inner; } // continues the loop over y
        println!("x: {}, y: {}", x, y);
    }
}

下例引用自RBE

'outer: loop {
    println!("Entered the outer loop");

    'inner: loop {
        println!("Entered the inner loop");

        // This would break only the inner loop
        //break;

        // This breaks the outer loop
        break 'outer;
    }

    println!("This point will never be reached");
}

println!("Exited the outer loop");

Vec

用C++的话说就是vector

虽然不是基础类型,但是因为很方便,所以TRPL也是和其他的语言功能一起介绍了

与数组同样有越界检查

let v1: Vec<u64> = vec![]; // 生成空的Vec
let v2 = vec![0;10];       // 生成含有10个0作为元素的Vec
let v3 = vec![1,2,3,4,5];  // 从元素列表生成

for v in v3 { // 用for语句进行全元素遍历
    println!("{}",v); // 按顺序显示1~5
}

UnionFind並查集

兩個優化:

  1. find實現路徑優化,讓每一個路過的節點都最終指向根
  2. union實現rank優化,讓矮小的樹附加到高個的樹上,這樣高個的樹就不用增加高度;兩棵樹一樣的時候就隨便挑選一個,但是要增加高度

日本调色盘

[
{"name" : "桜色", "romaji" : "さくらいろ", "value" : 0xfef4f4},
{"name" : "薄桜", "romaji" : "うすざくら", "value" : 0xfdeff2},
{"name" : "桜鼠", "romaji" : "さくらねず", "value" : 0xe9dfe5},
{"name" : "鴇鼠", "romaji" : "ときねず", "value" : 0xe4d2d8},
{"name" : "虹色", "romaji" : "にじいろ", "value" : 0xf6bfbc},
{"name" : "珊瑚色", "romaji" : "さんごいろ", "value" : 0xf5b1aa},
{"name" : "一斤染", "romaji" : "いっこんぞめ", "value" : 0xf5b199},
{"name" : "宍色", "romaji" : "ししいろ", "value" : 0xefab93},
{"name" : "紅梅色", "romaji" : "こうばいいろ", "value" : 0xf2a0a1},
{"name" : "薄紅", "romaji" : "うすべに", "value" : 0xf0908d},
{"name" : "甚三紅", "romaji" : "じんざもみ", "value" : 0xee827c},
{"name" : "桃色", "romaji" : "ももいろ", "value" : 0xf09199},
{"name" : "鴇色", "romaji" : "ときいろ", "value" : 0xf4b3c2},
{"name" : "撫子色", "romaji" : "なでしこいろ", "value" : 0xeebbcb},
{"name" : "灰梅", "romaji" : "はいうめ", "value" : 0xe8d3c7},
{"name" : "灰桜", "romaji" : "はいざくら", "value" : 0xe8d3d1},
{"name" : "淡紅藤", "romaji" : "あわべにふじ", "value" : 0xe6cde3},
{"name" : "石竹色", "romaji" : "せきちくいろ", "value" : 0xe5abbe},
{"name" : "薄紅梅", "romaji" : "うすこうばい", "value" : 0xe597b2},
{"name" : "桃花色", "romaji" : "ももはないろ", "value" : 0xe198b4},
{"name" : "水柿", "romaji" : "みずがき", "value" : 0xe4ab9b},
{"name" : "時柄茶", "romaji" : "ときがらちゃ", "value" : 0xe09e87},
{"name" : "退紅", "romaji" : "あらぞめ", "value" : 0xd69090},
{"name" : "薄柿", "romaji" : "うすがき", "value" : 0xd4acad},
{"name" : "長春色", "romaji" : "ちょうしゅんいろ", "value" : 0xc97586},
{"name" : "梅鼠", "romaji" : "うめねず", "value" : 0xc099a0},
{"name" : "鴇浅葱", "romaji" : "ときあさぎ", "value" : 0xb88884},
{"name" : "梅染", "romaji" : "うめぞめ", "value" : 0xb48a76},
{"name" : "蘇芳香", "romaji" : "すおうこう", "value" : 0xa86965},
{"name" : "浅蘇芳", "romaji" : "あさすおう", "value" : 0xa25768},
{"name" : "真朱", "romaji" : "まそお", "value" : 0xec6d71},
{"name" : "赤紫", "romaji" : "あかむらさき", "value" : 0xeb6ea5},
{"name" : "躑躅色", "romaji" : "つつじいろ", "value" : 0xe95295},
{"name" : "牡丹色", "romaji" : "ぼたんいろ", "value" : 0xe7609e},
{"name" : "今様色", "romaji" : "いまよういろ", "value" : 0xd0576b},
{"name" : "中紅", "romaji" : "なかべに", "value" : 0xc85179},
{"name" : "薔薇色", "romaji" : "ばらいろ", "value" : 0xe9546b},
{"name" : "韓紅", "romaji" : "からくれない", "value" : 0xe95464},
{"name" : "銀朱", "romaji" : "ぎんしゅ", "value" : 0xc85554},
{"name" : "赤紅", "romaji" : "あかべに", "value" : 0xc53d43},
{"name" : "紅緋", "romaji" : "べにひ", "value" : 0xe83929},
{"name" : "赤", "romaji" : "あか", "value" : 0xe60033},
{"name" : "猩々緋", "romaji" : "しょうじょうひ", "value" : 0xe2041b},
{"name" : "紅", "romaji" : "くれない", "value" : 0xd7003a},
{"name" : "深緋", "romaji" : "こきひ", "value" : 0xc9171e},
{"name" : "緋色", "romaji" : "ひいろ", "value" : 0xd3381c},
{"name" : "赤丹", "romaji" : "あかに", "value" : 0xce5242},
{"name" : "紅赤", "romaji" : "べにあか", "value" : 0xd9333f},
{"name" : "臙脂", "romaji" : "えんじ", "value" : 0xb94047},
{"name" : "朱\\緋", "romaji" : "あけ", "value" : 0xba2636},
{"name" : "茜色", "romaji" : "あかねいろ", "value" : 0xb7282e},
{"name" : "紅海老茶", "romaji" : "べにえびちゃ", "value" : 0xa73836},
{"name" : "蘇芳", "romaji" : "すおう", "value" : 0x9e3d3f},
{"name" : "真紅", "romaji" : "しんく", "value" : 0xa22041},
{"name" : "濃紅", "romaji" : "こいくれない", "value" : 0xa22041},
{"name" : "象牙色", "romaji" : "ぞうげいろ", "value" : 0xf8f4e6},
{"name" : "練色", "romaji" : "ねりいろ", "value" : 0xede4cd},
{"name" : "灰白色", "romaji" : "かいはくしょく", "value" : 0xe9e4d4},
{"name" : "蒸栗色", "romaji" : "むしぐりいろ", "value" : 0xebe1a9},
{"name" : "女郎花", "romaji" : "おみなえし", "value" : 0xf2f2b0},
{"name" : "枯草色", "romaji" : "かれくさいろ", "value" : 0xe4dc8a},
{"name" : "淡黄", "romaji" : "たんこう", "value" : 0xf8e58c},
{"name" : "白茶", "romaji" : "しらちゃ", "value" : 0xddbb99},
{"name" : "赤白橡", "romaji" : "あかしろつるばみ", "value" : 0xd7a98c},
{"name" : "洗柿", "romaji" : "あらいがき", "value" : 0xf2c9ac},
{"name" : "鳥の子色", "romaji" : "とりのこいろ", "value" : 0xfff1cf},
{"name" : "蜂蜜色", "romaji" : "はちみついろ", "value" : 0xfddea5},
{"name" : "肌色", "romaji" : "はだいろ", "value" : 0xfce2c4},
{"name" : "薄卵色", "romaji" : "うすたまごいろ", "value" : 0xfde8d0},
{"name" : "雄黄", "romaji" : "ゆうおう", "value" : 0xf9c89b},
{"name" : "洒落柿", "romaji" : "しゃれがき", "value" : 0xf7bd8f},
{"name" : "赤香", "romaji" : "あかこう", "value" : 0xf6b894},
{"name" : "砥粉色", "romaji" : "とのこいろ", "value" : 0xf4dda5},
{"name" : "肉色", "romaji" : "にくいろ", "value" : 0xf1bf99},
{"name" : "人色", "romaji" : "ひといろ", "value" : 0xf1bf99},
{"name" : "丁子色", "romaji" : "ちょうじいろ", "value" : 0xefcd9a},
{"name" : "香色", "romaji" : "こういろ", "value" : 0xefcd9a},
{"name" : "薄香", "romaji" : "うすこう", "value" : 0xf0cfa0},
{"name" : "浅黄", "romaji" : "うすき", "value" : 0xedd3a1},
{"name" : "枯色", "romaji" : "かれいろ", "value" : 0xe0c38c},
{"name" : "淡香", "romaji" : "うすこう", "value" : 0xf3bf88},
{"name" : "杏色", "romaji" : "あんずいろ", "value" : 0xf7b977},
{"name" : "東雲色", "romaji" : "しののめいろ", "value" : 0xf19072},
{"name" : "曙色", "romaji" : "あけぼのいろ", "value" : 0xf19072},
{"name" : "珊瑚朱色", "romaji" : "さんごしゅいろ", "value" : 0xee836f},
{"name" : "深支子", "romaji" : "こきくちなし", "value" : 0xeb9b6f},
{"name" : "纁", "romaji" : "そひ", "value" : 0xe0815e},
{"name" : "浅緋", "romaji" : "うすきひ", "value" : 0xdf7163},
{"name" : "真赭", "romaji" : "まそほ", "value" : 0xd57c6b},
{"name" : "洗朱", "romaji" : "あらいしゅ", "value" : 0xd0826c},
{"name" : "遠州茶", "romaji" : "えんしゅうちゃ", "value" : 0xca8269},
{"name" : "紅樺色", "romaji" : "べにかばいろ", "value" : 0xbb5548},
{"name" : "赭", "romaji" : "そほ", "value" : 0xab6953},
{"name" : "小豆色", "romaji" : "あずきいろ", "value" : 0x96514d},
{"name" : "枯茶", "romaji" : "からちゃ", "value" : 0x8d6449},
{"name" : "飴色", "romaji" : "あめいろ", "value" : 0xdeb068},
{"name" : "駱駝色", "romaji" : "らくだいろ", "value" : 0xbf794e},
{"name" : "土色", "romaji" : "つちいろ", "value" : 0xbc763c},
{"name" : "黄唐茶", "romaji" : "きがらちゃ", "value" : 0xb98c46},
{"name" : "桑染", "romaji" : "くわぞめ", "value" : 0xb79b5b},
{"name" : "櫨色", "romaji" : "はじいろ", "value" : 0xb77b57},
{"name" : "黄橡", "romaji" : "きつるばみ", "value" : 0xb68d4c},
{"name" : "丁字染", "romaji" : "ちょうじぞめ", "value" : 0xad7d4c},
{"name" : "香染", "romaji" : "こうぞめ", "value" : 0xad7d4c},
{"name" : "枇杷茶", "romaji" : "びわちゃ", "value" : 0xae7c4f},
{"name" : "芝翫茶", "romaji" : "しかんちゃ", "value" : 0xad7e4e},
{"name" : "焦香", "romaji" : "こがれこう", "value" : 0xae7c58},
{"name" : "胡桃色", "romaji" : "くるみいろ", "value" : 0xa86f4c},
{"name" : "渋紙色", "romaji" : "しぶかみいろ", "value" : 0x946243},
{"name" : "朽葉色", "romaji" : "くちばいろ", "value" : 0x917347},
{"name" : "桑茶", "romaji" : "くわちゃ", "value" : 0x956f29},
{"name" : "路考茶", "romaji" : "ろこうちゃ", "value" : 0x8c7042},
{"name" : "国防色", "romaji" : "こくぼうしょく", "value" : 0x7b6c3e},
{"name" : "伽羅色", "romaji" : "きゃらいろ", "value" : 0xd8a373},
{"name" : "江戸茶", "romaji" : "えどちゃ", "value" : 0xcd8c5c},
{"name" : "樺色", "romaji" : "かばいろ", "value" : 0xcd5e3c},
{"name" : "紅鬱金", "romaji" : "べにうこん", "value" : 0xcb8347},
{"name" : "土器色", "romaji" : "かわらけいろ", "value" : 0xc37854},
{"name" : "狐色", "romaji" : "きつねいろ", "value" : 0xc38743},
{"name" : "黄土色", "romaji" : "おうどいろ", "value" : 0xc39143},
{"name" : "琥珀色", "romaji" : "こはくいろ", "value" : 0xbf783a},
{"name" : "赤茶", "romaji" : "あかちゃ", "value" : 0xbb5535},
{"name" : "代赭", "romaji" : "たいしゃ", "value" : 0xbb5520},
{"name" : "煉瓦色", "romaji" : "れんがいろ", "value" : 0xb55233},
{"name" : "雀茶", "romaji" : "すずめちゃ", "value" : 0xaa4f37},
{"name" : "団十郎茶", "romaji" : "だんじゅうろうちゃ", "value" : 0x9f563a},
{"name" : "柿渋色", "romaji" : "かきしぶいろ", "value" : 0x9f563a},
{"name" : "紅鳶", "romaji" : "べにとび", "value" : 0x9a493f},
{"name" : "灰茶", "romaji" : "はいちゃ", "value" : 0x98623c},
{"name" : "茶色", "romaji" : "ちゃいろ", "value" : 0x965042},
{"name" : "檜皮色", "romaji" : "ひわだいろ", "value" : 0x965036},
{"name" : "鳶色", "romaji" : "とびいろ", "value" : 0x95483f},
{"name" : "柿茶", "romaji" : "かきちゃ", "value" : 0x954e2a},
{"name" : "弁柄色", "romaji" : "べんがらいろ", "value" : 0x8f2e14},
{"name" : "赤錆色", "romaji" : "あかさびいろ", "value" : 0x8a3319},
{"name" : " 褐色", "romaji" : "かっしょく", "value" : 0x8a3b00},
{"name" : "栗梅", "romaji" : "くりうめ", "value" : 0x852e19},
{"name" : "紅檜皮", "romaji" : "べにひはだ", "value" : 0x7b4741},
{"name" : "海老茶", "romaji" : "えびちゃ", "value" : 0x773c30},
{"name" : "唐茶", "romaji" : "からちゃ", "value" : 0x783c1d},
{"name" : "栗色", "romaji" : "くりいろ", "value" : 0x762f07},
{"name" : "赤銅色", "romaji" : "しゃくどういろ", "value" : 0x752100},
{"name" : "錆色", "romaji" : "さびいろ", "value" : 0x6c3524},
{"name" : "赤褐色", "romaji" : "せっかっしょく", "value" : 0x683f36},
{"name" : "茶褐色", "romaji" : "ちゃかっしょく", "value" : 0x664032},
{"name" : "栗皮茶", "romaji" : "くりかわちゃ", "value" : 0x6d3c32},
{"name" : "黒茶", "romaji" : "くろちゃ", "value" : 0x583822},
{"name" : "葡萄茶", "romaji" : "えびちゃ", "value" : 0x6c2c2f},
{"name" : "葡萄色", "romaji" : "えびいろ", "value" : 0x640125},
{"name" : "萱草色", "romaji" : "かんぞういろ", "value" : 0xf8b862},
{"name" : "柑子色", "romaji" : "こうじいろ", "value" : 0xf6ad49},
{"name" : "金茶", "romaji" : "きんちゃ", "value" : 0xf39800},
{"name" : "蜜柑色", "romaji" : "みかんいろ", "value" : 0xf08300},
{"name" : "鉛丹色", "romaji" : "えんたんいろ", "value" : 0xec6d51},
{"name" : "黄丹", "romaji" : "おうに", "value" : 0xee7948},
{"name" : "柿色", "romaji" : "かきいろ", "value" : 0xed6d3d},
{"name" : "黄赤", "romaji" : "きあか", "value" : 0xec6800},
{"name" : "人参色", "romaji" : "にんじんいろ", "value" : 0xec6800},
{"name" : "橙色", "romaji" : "だいだいいろ", "value" : 0xee7800},
{"name" : "照柿", "romaji" : "てりがき", "value" : 0xeb6238},
{"name" : "赤橙", "romaji" : "あかだいだい", "value" : 0xea5506},
{"name" : "金赤", "romaji" : "きんあか", "value" : 0xea5506},
{"name" : "朱色", "romaji" : "しゅいろ", "value" : 0xeb6101},
{"name" : "小麦色", "romaji" : "こむぎいろ", "value" : 0xe49e61},
{"name" : "丹色", "romaji" : "にいろ", "value" : 0xe45e32},
{"name" : "黄茶", "romaji" : "きちゃ", "value" : 0xe17b34},
{"name" : "肉桂色", "romaji" : "にっけいいろ", "value" : 0xdd7a56},
{"name" : "赤朽葉色", "romaji" : "あかくちばいろ", "value" : 0xdb8449},
{"name" : "黄櫨染", "romaji" : "こうろぜん", "value" : 0xd66a35},
{"name" : "蒲公英色", "romaji" : "たんぽぽいろ", "value" : 0xffd900},
{"name" : "黄色", "romaji" : "きいろ", "value" : 0xffd900},
{"name" : "中黄", "romaji" : "ちゅうき", "value" : 0xffea00},
{"name" : "菜の花色", "romaji" : "なのはないろ", "value" : 0xffec47},
{"name" : "黄檗色", "romaji" : "きはだいろ", "value" : 0xfef263},
{"name" : "卵色", "romaji" : "たまごいろ", "value" : 0xfcd575},
{"name" : "花葉色", "romaji" : "はなばいろ", "value" : 0xfbd26b},
{"name" : "刈安色", "romaji" : "かりやすいろ", "value" : 0xf5e56b},
{"name" : "玉蜀黍色", "romaji" : "とうもろこしいろ", "value" : 0xeec362},
{"name" : "金糸雀色", "romaji" : "かなりあいろ", "value" : 0xebd842},
{"name" : "黄支子色", "romaji" : "きくちなしいろ", "value" : 0xffdb4f},
{"name" : "支子色", "romaji" : "くちなしいろ", "value" : 0xfbca4d},
{"name" : "向日葵色", "romaji" : "ひまわりいろ", "value" : 0xfcc800},
{"name" : "山吹色", "romaji" : "やまぶきいろ", "value" : 0xf8b500},
{"name" : "鬱金色", "romaji" : "うこんいろ", "value" : 0xfabf14},
{"name" : "藤黄", "romaji" : "とうおう", "value" : 0xf7c114},
{"name" : "金色", "romaji" : "こんじき", "value" : 0xe6b422},
{"name" : "黄金", "romaji" : "こがね", "value" : 0xe6b422},
{"name" : "櫨染", "romaji" : "はじぞめ", "value" : 0xd9a62e},
{"name" : "黄朽葉色", "romaji" : "きくちばいろ", "value" : 0xd3a243},
{"name" : "山吹茶", "romaji" : "やまぶきちゃ", "value" : 0xc89932},
{"name" : "芥子色", "romaji" : "からしいろ", "value" : 0xd0af4c},
{"name" : "豆がら茶", "romaji" : "まめがらちゃ", "value" : 0x8b968d},
{"name" : "麹塵", "romaji" : "きくじん", "value" : 0x6e7955},
{"name" : "山鳩色", "romaji" : "やまばといろ", "value" : 0x767c6b},
{"name" : "利休鼠", "romaji" : "りきゅうねずみ", "value" : 0x888e7e},
{"name" : "海松茶", "romaji" : "みるちゃ", "value" : 0x5a544b},
{"name" : "藍海松茶", "romaji" : "あいみるちゃ", "value" : 0x56564b},
{"name" : "藍媚茶", "romaji" : "あいこびちゃ", "value" : 0x555647},
{"name" : "千歳茶", "romaji" : "せんさいちゃ", "value" : 0x494a41},
{"name" : "岩井茶", "romaji" : "いわいちゃ", "value" : 0x6b6f59},
{"name" : "仙斎茶", "romaji" : "せんさいちゃ", "value" : 0x474b42},
{"name" : "黒緑", "romaji" : "くろみどり", "value" : 0x333631},
{"name" : "柳煤竹", "romaji" : "やなぎすすたけ", "value" : 0x5b6356},
{"name" : "樺茶色", "romaji" : "かばちゃいろ", "value" : 0x726250},
{"name" : "空五倍子色", "romaji" : "うつぶしいろ", "value" : 0x9d896c},
{"name" : "生壁色", "romaji" : "なまかべいろ", "value" : 0x94846a},
{"name" : "肥後煤竹", "romaji" : "ひごすすたけ", "value" : 0x897858},
{"name" : "媚茶", "romaji" : "こびちゃ", "value" : 0x716246},
{"name" : "白橡", "romaji" : "しろつるばみ", "value" : 0xcbb994},
{"name" : "亜麻色", "romaji" : "あまいろ", "value" : 0xd6c6af},
{"name" : "榛色", "romaji" : "はしばみいろ", "value" : 0xbfa46f},
{"name" : "灰汁色", "romaji" : "あくいろ", "value" : 0x9e9478},
{"name" : "利休茶", "romaji" : "りきゅうちゃ", "value" : 0xa59564},
{"name" : "鶯茶", "romaji" : "うぐいすちゃ", "value" : 0x715c1f},
{"name" : "木蘭色", "romaji" : "もくらんじき", "value" : 0xc7b370},
{"name" : "砂色", "romaji" : "すないろ", "value" : 0xdcd3b2},
{"name" : "油色", "romaji" : "あぶらいろ", "value" : 0xa19361},
{"name" : "利休色", "romaji" : "りきゅういろ", "value" : 0x8f8667},
{"name" : "梅幸茶", "romaji" : "ばいこうちゃ", "value" : 0x887938},
{"name" : "璃寛茶", "romaji" : "りかんちゃ", "value" : 0x6a5d21},
{"name" : "黄海松茶", "romaji" : "きみるちゃ", "value" : 0x918754},
{"name" : "菜種油色", "romaji" : "なたねゆいろ", "value" : 0xa69425},
{"name" : "青朽葉", "romaji" : "あおくちば", "value" : 0xada250},
{"name" : "根岸色", "romaji" : "ねぎしいろ", "value" : 0x938b4b},
{"name" : "鶸茶", "romaji" : "ひわちゃ", "value" : 0x8c8861},
{"name" : "柳茶", "romaji" : "やなぎちゃ", "value" : 0xa1a46d},
{"name" : "海松色", "romaji" : "みるいろ", "value" : 0x726d40},
{"name" : "鶯色", "romaji" : "うぐいすいろ", "value" : 0x928c36},
{"name" : "緑黄色", "romaji" : "りょくおうしょく", "value" : 0xdccb18},
{"name" : "鶸色", "romaji" : "ひわいろ", "value" : 0xd7cf3a},
{"name" : "抹茶色", "romaji" : "まっちゃいろ", "value" : 0xc5c56a},
{"name" : "若草色", "romaji" : "わかくさいろ", "value" : 0xc3d825},
{"name" : "黄緑", "romaji" : "きみどり", "value" : 0xb8d200},
{"name" : "若芽色", "romaji" : "わかめいろ", "value" : 0xe0ebaf},
{"name" : "若菜色", "romaji" : "わかないろ", "value" : 0xd8e698},
{"name" : "若苗色", "romaji" : "わかなえいろ", "value" : 0xc7dc68},
{"name" : "青丹", "romaji" : "あおに", "value" : 0x99ab4e},
{"name" : "草色", "romaji" : "くさいろ", "value" : 0x7b8d42},
{"name" : "苔色", "romaji" : "こけいろ", "value" : 0x69821b},
{"name" : "萌黄", "romaji" : "もえぎ", "value" : 0xaacf53},
{"name" : "苗色", "romaji" : "なえいろ", "value" : 0xb0ca71},
{"name" : "若葉色", "romaji" : "わかばいろ", "value" : 0xb9d08b},
{"name" : "松葉色", "romaji" : "まつばいろ", "value" : 0x839b5c},
{"name" : "夏虫色", "romaji" : "なつむしいろ", "value" : 0xcee4ae},
{"name" : "鶸萌黄", "romaji" : "ひわもえぎ", "value" : 0x82ae46},
{"name" : "柳色", "romaji" : "やなぎいろ", "value" : 0xa8c97f},
{"name" : "青白橡", "romaji" : "あおしろつるばみ", "value" : 0x9ba88d},
{"name" : "柳鼠", "romaji" : "やなぎねず", "value" : 0xc8d5bb},
{"name" : "裏葉柳", "romaji" : "うらはやなぎ", "value" : 0xc1d8ac},
{"name" : "山葵色", "romaji" : "わさびいろ", "value" : 0xa8bf93},
{"name" : "老竹色", "romaji" : "おいたけいろ", "value" : 0x769164},
{"name" : "白緑", "romaji" : "びゃくろく", "value" : 0xd6e9ca},
{"name" : "淡萌黄", "romaji" : "うすもえぎ", "value" : 0x93ca76},
{"name" : "柳染", "romaji" : "やなぎぞめ", "value" : 0x93b881},
{"name" : "薄萌葱", "romaji" : "うすもえぎ", "value" : 0xbadcad},
{"name" : "深川鼠", "romaji" : "ふかがわねずみ", "value" : 0x97a791},
{"name" : "若緑", "romaji" : "わかみどり", "value" : 0x98d98e},
{"name" : "浅緑", "romaji" : "あさみどり", "value" : 0x88cb7f},
{"name" : "薄緑", "romaji" : "うすみどり", "value" : 0x69b076},
{"name" : "青鈍", "romaji" : "あおにび", "value" : 0x6b7b6e},
{"name" : "青磁鼠", "romaji" : "せいじねず", "value" : 0xbed2c3},
{"name" : "薄青", "romaji" : "うすあお", "value" : 0x93b69c},
{"name" : "錆青磁", "romaji" : "さびせいじ", "value" : 0xa6c8b2},
{"name" : "緑青色", "romaji" : "ろくしょういろ", "value" : 0x47885e},
{"name" : "千歳緑", "romaji" : "ちとせみどり", "value" : 0x316745},
{"name" : "若竹色", "romaji" : "わかたけいろ", "value" : 0x68be8d},
{"name" : "緑", "romaji" : "みどり", "value" : 0x3eb370},
{"name" : "常磐色", "romaji" : "ときわいろ", "value" : 0x007b43},
{"name" : "千草鼠", "romaji" : "ちぐさねず", "value" : 0xbed3ca},
{"name" : "千草色", "romaji" : "ちぐさいろ", "value" : 0x92b5a9},
{"name" : "青磁色", "romaji" : "せいじいろ", "value" : 0x7ebea5},
{"name" : "青竹色", "romaji" : "あおたけいろ", "value" : 0x7ebeab},
{"name" : "常磐緑", "romaji" : "ときわみどり", "value" : 0x028760},
{"name" : "木賊色", "romaji" : "とくさいろ", "value" : 0x3b7960},
{"name" : "天鵞絨", "romaji" : "びろうど", "value" : 0x2f5d50},
{"name" : "虫襖", "romaji" : "むしあお", "value" : 0x3a5b52},
{"name" : "革色", "romaji" : "かわいろ", "value" : 0x475950},
{"name" : "深緑", "romaji" : "ふかみどり", "value" : 0x00552e},
{"name" : "鉄色", "romaji" : "てついろ", "value" : 0x005243},
{"name" : "萌葱色", "romaji" : "もえぎいろ", "value" : 0x006e54},
{"name" : "花緑青", "romaji" : "はなろくしょう", "value" : 0x00a381},
{"name" : "翡翠色", "romaji" : "ひすいいろ", "value" : 0x38b48b},
{"name" : "青緑", "romaji" : "あおみどり", "value" : 0x00a497},
{"name" : "水浅葱", "romaji" : "みずあさぎ", "value" : 0x80aba9},
{"name" : "錆浅葱", "romaji" : "さびあさぎ", "value" : 0x5c9291},
{"name" : "青碧", "romaji" : "せいへき", "value" : 0x478384},
{"name" : "御召茶", "romaji" : "おめしちゃ", "value" : 0x43676b},
{"name" : "湊鼠", "romaji" : "みなとねずみ", "value" : 0x80989b},
{"name" : "高麗納戸", "romaji" : "こうらいなんど", "value" : 0x2c4f54},
{"name" : "百入茶", "romaji" : "ももしおちゃ", "value" : 0x1f3134},
{"name" : "錆鼠", "romaji" : "さびねず", "value" : 0x47585c},
{"name" : "錆鉄御納戸", "romaji" : "さびてつおなんど", "value" : 0x485859},
{"name" : "藍鼠", "romaji" : "あいねず", "value" : 0x6c848d},
{"name" : "錆御納戸", "romaji" : "さびおなんど", "value" : 0x53727d},
{"name" : "舛花色", "romaji" : "ますはないろ", "value" : 0x5b7e91},
{"name" : "熨斗目花色", "romaji" : "のしめはないろ", "value" : 0x426579},
{"name" : "御召御納戸", "romaji" : "おめしおなんど", "value" : 0x4c6473},
{"name" : "鉄御納戸", "romaji" : "てつおなんど", "value" : 0x455765},
{"name" : "紺鼠", "romaji" : "こんねず", "value" : 0x44617b},
{"name" : "藍鉄", "romaji" : "あいてつ", "value" : 0x393f4c},
{"name" : "青褐", "romaji" : "あおかち", "value" : 0x393e4f},
{"name" : "褐返", "romaji" : "かちかえし", "value" : 0x203744},
{"name" : "褐色", "romaji" : "かちいろ", "value" : 0x4d4c61},
{"name" : "月白", "romaji" : "げっぱく", "value" : 0xeaf4fc},
{"name" : "白菫色", "romaji" : "しろすみれいろ", "value" : 0xeaedf7},
{"name" : "白花色", "romaji" : "しらはないろ", "value" : 0xe8ecef},
{"name" : "藍白", "romaji" : "あいじろ", "value" : 0xebf6f7},
{"name" : "白藍", "romaji" : "しらあい", "value" : 0xc1e4e9},
{"name" : "水色", "romaji" : "みずいろ", "value" : 0xbce2e8},
{"name" : "瓶覗", "romaji" : "かめのぞき", "value" : 0xa2d7dd},
{"name" : "秘色色", "romaji" : "ひそくいろ", "value" : 0xabced8},
{"name" : "空色", "romaji" : "そらいろ", "value" : 0xa0d8ef},
{"name" : "勿忘草色", "romaji" : "わすれなぐさいろ", "value" : 0x89c3eb},
{"name" : "青藤色", "romaji" : "あおふじいろ", "value" : 0x84a2d4},
{"name" : "白群", "romaji" : "びゃくぐん", "value" : 0x83ccd2},
{"name" : "浅縹", "romaji" : "あさはなだ", "value" : 0x84b9cb},
{"name" : "薄花色", "romaji" : "うすはないろ", "value" : 0x698aab},
{"name" : "納戸色", "romaji" : "なんどいろ", "value" : 0x008899},
{"name" : "浅葱色", "romaji" : "あさぎいろ", "value" : 0x00a3af},
{"name" : "花浅葱", "romaji" : "はなあさぎ", "value" : 0x2a83a2},
{"name" : "新橋色", "romaji" : "しんばしいろ", "value" : 0x59b9c6},
{"name" : "天色", "romaji" : "あまいろ", "value" : 0x2ca9e1},
{"name" : "露草色", "romaji" : "つゆくさいろ", "value" : 0x38a1db},
{"name" : "青", "romaji" : "あお", "value" : 0x0095d9},
{"name" : "薄藍", "romaji" : "うすあい", "value" : 0x0094c8},
{"name" : "縹色", "romaji" : "はなだいろ", "value" : 0x2792c3},
{"name" : "紺碧", "romaji" : "こんぺき", "value" : 0x007bbb},
{"name" : "薄群青", "romaji" : "うすぐんじょう", "value" : 0x5383c3},
{"name" : "薄花桜", "romaji" : "うすはなざくら", "value" : 0x5a79ba},
{"name" : "群青色", "romaji" : "ぐんじょういろ", "value" : 0x4c6cb3},
{"name" : "杜若色", "romaji" : "かきつばたいろ", "value" : 0x3e62ad},
{"name" : "瑠璃色", "romaji" : "るりいろ", "value" : 0x1e50a2},
{"name" : "薄縹", "romaji" : "うすはなだ", "value" : 0x507ea4},
{"name" : "瑠璃紺", "romaji" : "るりこん", "value" : 0x19448e},
{"name" : "紺瑠璃", "romaji" : "こんるり", "value" : 0x164a84},
{"name" : "藍色", "romaji" : "あいいろ", "value" : 0x165e83},
{"name" : "青藍", "romaji" : "せいらん", "value" : 0x274a78},
{"name" : "深縹", "romaji" : "こきはなだ", "value" : 0x2a4073},
{"name" : "紺色", "romaji" : "こんいろ", "value" : 0x223a70},
{"name" : "紺青", "romaji" : "こんじょう", "value" : 0x192f60},
{"name" : "留紺", "romaji" : "とめこん", "value" : 0x1c305c},
{"name" : "濃藍", "romaji" : "こいあい", "value" : 0x0f2350},
{"name" : "鉄紺", "romaji" : "てつこん", "value" : 0x17184b},
{"name" : "漆黒", "romaji" : "しっこく", "value" : 0x0d0015},
{"name" : "淡藤色", "romaji" : "あわふじいろ", "value" : 0xbbc8e6},
{"name" : "藤色", "romaji" : "ふじいろ", "value" : 0xbbbcde},
{"name" : "紅掛空色", "romaji" : "べにかけそらいろ", "value" : 0x8491c3},
{"name" : "紅碧", "romaji" : "べにみどり", "value" : 0x8491c3},
{"name" : "紺桔梗", "romaji" : "こんききょう", "value" : 0x4d5aaf},
{"name" : "花色", "romaji" : "はないろ", "value" : 0x4d5aaf},
{"name" : "紺藍", "romaji" : "こんあい", "value" : 0x4a488e},
{"name" : "紅桔梗", "romaji" : "べにききょう", "value" : 0x4d4398},
{"name" : "桔梗色", "romaji" : "ききょういろ", "value" : 0x5654a2},
{"name" : "藤納戸", "romaji" : "ふじなんど", "value" : 0x706caa},
{"name" : "紅掛花色", "romaji" : "べにかけはないろ", "value" : 0x68699b},
{"name" : "紫苑色", "romaji" : "しおんいろ", "value" : 0x867ba9},
{"name" : "白藤色", "romaji" : "しらふじいろ", "value" : 0xdbd0e6},
{"name" : "藤紫", "romaji" : "ふじむらさき", "value" : 0xa59aca},
{"name" : "菫色", "romaji" : "すみれいろ", "value" : 0x7058a3},
{"name" : "青紫", "romaji" : "あおむらさき", "value" : 0x674598},
{"name" : "菖蒲色", "romaji" : "しょうぶいろ", "value" : 0x674196},
{"name" : "竜胆色", "romaji" : "りんどういろ", "value" : 0x9079ad},
{"name" : "江戸紫", "romaji" : "えどむらさき", "value" : 0x745399},
{"name" : "本紫", "romaji" : "ほんむらさき", "value" : 0x65318e},
{"name" : " 葡萄色", "romaji" : "ぶどういろ", "value" : 0x522f60},
{"name" : "深紫", "romaji" : "ふかむらさき", "value" : 0x493759},
{"name" : "紫黒", "romaji" : "しこく", "value" : 0x2e2930},
{"name" : "紫", "romaji" : "むらさき", "value" : 0x884898},
{"name" : "薄葡萄", "romaji" : "うすぶどう", "value" : 0xc0a2c7},
{"name" : "紫紺", "romaji" : "しこん", "value" : 0x460e44},
{"name" : "暗紅色", "romaji" : "あんこうしょく", "value" : 0x74325c},
{"name" : "桑の実色", "romaji" : "くわのみいろ", "value" : 0x55295b},
{"name" : "古代紫", "romaji" : "こだいむらさき", "value" : 0x895b8a},
{"name" : "茄子紺", "romaji" : "なすこん", "value" : 0x824880},
{"name" : "二藍", "romaji" : "ふたあい", "value" : 0x915c8b},
{"name" : "京紫", "romaji" : "きょうむらさき", "value" : 0x9d5b8b},
{"name" : "蒲葡", "romaji" : "えびぞめ", "value" : 0x7a4171},
{"name" : "若紫", "romaji" : "わかむらさき", "value" : 0xbc64a4},
{"name" : "紅紫", "romaji" : "べにむらさき", "value" : 0xb44c97},
{"name" : "梅紫", "romaji" : "うめむらさき", "value" : 0xaa4c8f},
{"name" : " 菖蒲色", "romaji" : "あやめいろ", "value" : 0xcc7eb1},
{"name" : "紅藤色", "romaji" : "べにふじいろ", "value" : 0xcca6bf},
{"name" : "浅紫", "romaji" : "あさむらさき", "value" : 0xc4a3bf},
{"name" : "紫水晶", "romaji" : "むらさきすいしょう", "value" : 0xe7e7eb},
{"name" : "薄梅鼠", "romaji" : "うすうめねず", "value" : 0xdcd6d9},
{"name" : "暁鼠", "romaji" : "あかつきねず", "value" : 0xd3cfd9},
{"name" : "牡丹鼠", "romaji" : "ぼたんねず", "value" : 0xd3ccd6},
{"name" : "霞色", "romaji" : "かすみいろ", "value" : 0xc8c2c6},
{"name" : "藤鼠", "romaji" : "ふじねず", "value" : 0xa6a5c4},
{"name" : "半色", "romaji" : "はしたいろ", "value" : 0xa69abd},
{"name" : "薄色", "romaji" : "うすいろ", "value" : 0xa89dac},
{"name" : "薄鼠", "romaji" : "うすねず", "value" : 0x9790a4},
{"name" : "鳩羽鼠", "romaji" : "はとばねずみ", "value" : 0x9e8b8e},
{"name" : "鳩羽色", "romaji" : "はとばいろ", "value" : 0x95859c},
{"name" : "桔梗鼠", "romaji" : "ききょうねず", "value" : 0x95949a},
{"name" : "紫鼠", "romaji" : "むらさきねず", "value" : 0x71686c},
{"name" : "葡萄鼠", "romaji" : "ぶどうねずみ", "value" : 0x705b67},
{"name" : "濃色", "romaji" : "こきいろ", "value" : 0x634950},
{"name" : "紫鳶", "romaji" : "むらさきとび", "value" : 0x5f414b},
{"name" : "濃鼠", "romaji" : "こいねず", "value" : 0x4f455c},
{"name" : "藤煤竹", "romaji" : "ふじすすたけ", "value" : 0x5a5359},
{"name" : "滅紫", "romaji" : "けしむらさき", "value" : 0x594255},
{"name" : "紅消鼠", "romaji" : "べにけしねずみ", "value" : 0x524748},
{"name" : "似せ紫", "romaji" : "にせむらさき", "value" : 0x513743},
{"name" : "灰黄緑", "romaji" : "はいきみどり", "value" : 0xe6eae3},
{"name" : "蕎麦切色", "romaji" : "そばきりいろ", "value" : 0xd4dcd6},
{"name" : "薄雲鼠", "romaji" : "うすくもねず", "value" : 0xd4dcda},
{"name" : "枯野色", "romaji" : "かれのいろ", "value" : 0xd3cbc6},
{"name" : "潤色", "romaji" : "うるみいろ", "value" : 0xc8c2be},
{"name" : "利休白茶", "romaji" : "りきゅうしろちゃ", "value" : 0xb3ada0},
{"name" : "茶鼠", "romaji" : "ちゃねずみ", "value" : 0xa99e93},
{"name" : "胡桃染", "romaji" : "くるみぞめ", "value" : 0xa58f86},
{"name" : "江戸鼠", "romaji" : "えどねず", "value" : 0x928178},
{"name" : "煤色", "romaji" : "すすいろ", "value" : 0x887f7a},
{"name" : "丁子茶", "romaji" : "ちょうじちゃ", "value" : 0xb4866b},
{"name" : "柴染", "romaji" : "ふしぞめ", "value" : 0xb28c6e},
{"name" : "宗伝唐茶", "romaji" : "そうでんからちゃ", "value" : 0xa16d5d},
{"name" : "砺茶", "romaji" : "とのちゃ", "value" : 0x9f6f55},
{"name" : "煎茶色", "romaji" : "せんちゃいろ", "value" : 0x8c6450},
{"name" : "銀煤竹", "romaji" : "ぎんすすだけ", "value" : 0x856859},
{"name" : "黄枯茶", "romaji" : "きがらちゃ", "value" : 0x765c47},
{"name" : "煤竹色", "romaji" : "すすたけいろ", "value" : 0x6f514c},
{"name" : "焦茶", "romaji" : "こげちゃ", "value" : 0x6f4b3e},
{"name" : "黒橡", "romaji" : "くろつるばみ", "value" : 0x544a47},
{"name" : "憲法色", "romaji" : "けんぽういろ", "value" : 0x543f32},
{"name" : "涅色", "romaji" : "くりいろ", "value" : 0x554738},
{"name" : "檳榔子染", "romaji" : "びんろうじぞめ", "value" : 0x433d3c},
{"name" : "黒鳶", "romaji" : "くろとび", "value" : 0x432f2f},
{"name" : "赤墨", "romaji" : "あかすみ", "value" : 0x3f312b},
{"name" : "黒紅", "romaji" : "くろべに", "value" : 0x302833},
{"name" : "白", "romaji" : "しろ", "value" : 0xffffff},
{"name" : "胡粉色", "romaji" : "ごふんいろ", "value" : 0xfffffc},
{"name" : "卯の花色", "romaji" : "うのはないろ", "value" : 0xf7fcfe},
{"name" : "白磁", "romaji" : "はくじ", "value" : 0xf8fbf8},
{"name" : "生成り色", "romaji" : "きなりいろ", "value" : 0xfbfaf5},
{"name" : "乳白色", "romaji" : "にゅうはくしょく", "value" : 0xf3f3f3},
{"name" : "白練", "romaji" : "しろねり", "value" : 0xf3f3f2},
{"name" : "素色", "romaji" : "そしょく", "value" : 0xeae5e3},
{"name" : "白梅鼠", "romaji" : "しらうめねず", "value" : 0xe5e4e6},
{"name" : "白鼠", "romaji" : "しろねず", "value" : 0xdcdddd},
{"name" : "絹鼠", "romaji" : "きぬねず", "value" : 0xdddcd6},
{"name" : "灰青", "romaji" : "はいあお", "value" : 0xc0c6c9},
{"name" : "銀鼠", "romaji" : "ぎんねず", "value" : 0xafafb0},
{"name" : "薄鈍", "romaji" : "うすにび", "value" : 0xadadad},
{"name" : "薄墨色", "romaji" : "うすずみいろ", "value" : 0xa3a3a2},
{"name" : "錫色", "romaji" : "すずいろ", "value" : 0x9ea1a3},
{"name" : "素鼠", "romaji" : "すねずみ", "value" : 0x9fa0a0},
{"name" : "鼠色", "romaji" : "ねずみいろ", "value" : 0x949495},
{"name" : "源氏鼠", "romaji" : "げんじねず", "value" : 0x888084},
{"name" : "灰色", "romaji" : "はいいろ", "value" : 0x7d7d7d},
{"name" : "鉛色", "romaji" : "なまりいろ", "value" : 0x7b7c7d},
{"name" : "鈍色", "romaji" : "にびいろ", "value" : 0x727171},
{"name" : "墨", "romaji" : "すみ", "value" : 0x595857},
{"name" : "丼鼠", "romaji" : "どぶねずみ", "value" : 0x595455},
{"name" : "消炭色", "romaji" : "けしずみいろ", "value" : 0x524e4d},
{"name" : "藍墨茶", "romaji" : "あいすみちゃ", "value" : 0x474a4d},
{"name" : "羊羹色", "romaji" : "ようかんいろ", "value" : 0x383c3c},
{"name" : "蝋色", "romaji" : "ろういろ", "value" : 0x2b2b2b},
{"name" : "黒", "romaji" : "くろ", "value" : 0x2b2b2b},
{"name" : "烏羽色", "romaji" : "からすばいろ", "value" : 0x180614},
{"name" : "鉄黒", "romaji" : "てつぐろ", "value" : 0x281a14},
{"name" : "濡羽色", "romaji" : "ぬればいろ", "value" : 0x000b00},
{"name" : "黒檀", "romaji" : "こくたん", "value" : 0x250d00},
{"name" : "憲法黒茶", "romaji" : "けんぽうくろちゃ", "value" : 0x241a08},
{"name" : "暗黒色", "romaji" : "あんこくしょく", "value" : 0x16160e}
]

排列組合/DFS+backtracking

找powerset之類的問題都是這樣

C(m, n): 關鍵在於:

  • 需要記住starting point
  • 入stack之後遞歸進入下一個,完成後pop

P(m, n): 關鍵在於:

  • 用used數組記住是否看過,不用s變量
  • 遞歸後記得要把used還原

Rust 生命周期 初级

!!长生命周期是短生命周期的子类型

写法:
生命周期参数名称必须以一个单引号 ' 开头,其名称通常全是小写,类似于泛型其名称非常短
生命周期参数注解位于引用的 & 之后,并有一个空格来将引用类型与生命周期注解分隔开
对引用进行标识以后,拥有相同注解的引用其生命周期至少一样长

&i32 // 引用
&'a i32 // 引用带有生命周期标识
&'a mut 32 // 可变引用带有生命周期标识

关于用户命名空间和文件系统

文件系统会记录一个文件关联的uid/gid,因为内核需要根据这些信息判断进程是否有权限。
但是进入用户命名空间之后,进程关联的uid是不同的(因为内核uid映射),如果进程需要操作文件系统,那应该如何进行权限检查?

When a process accesses a file, its user and group IDs are mapped into the initial user namespace for the purpose of permission checking and assigning IDs when creating a file. When a process retrieves file user and group IDs via stat(2), the IDs are mapped in the opposite direction, to produce values relative to the process user and group ID mappings.

进程读写文件时,会进行逆向映射层层向上知道最后找到进程在初始的用户命名空间中对应的uid/gid。

所以docker容器中文件系统的owner就算是显示为root(容器内),在host里也是显示成一个不是root的uid。

关于上帝一样的`idle`进程

idle进程,也就是0号进程,不参与schedule机制,当系统中没有任何进程可以调度(就绪队列为空),CPU会进入该进程。多CPU系统中每个CPU一个idle

void cpu_idle (void)
{
    // 此处应有代码
    while (1) {
         void (*idle)(void) = pm_idle;
    if (!idle)
         idle = default_idle;
    while (!current->need_resched)
        idle();
    schedule();
    // 此处应有代码
}

内核初始化后,所有core都会进入该函数。pm_idle为电源管理idle函数不讨论。所以使用default_idle

#define safe_halt()  __asm__ __volatile__("sti; hlt": : :"memory")

进入default_idle后,会执行hlt, 也就是硬件停机,处于该状态时CPU不能执行任何指令,只有通过中断请求才能唤醒。中断函数中设置need_resched就会进入schedule又开始正常进程调度。
否则继续idle

Rust 所有权/变量与资源的互动

  1. Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
  2. 值有且只有一个所有者。
  3. 当所有者(变量)离开作用域,这个值将被丢弃。

Rust 智能指针

智能指针是一类数据结构
智能指针 拥有 指向的内存,而 引用 只是 借用
智能指针 实现了 DerefDrop 两个trait

  • Box<T>,用于在堆上分配值 <=> 对应 C++ 的 std::unique_ptr
  • Rc<T>,一个引用计数类型,其数据可以有多个所有者 <=> 对应 C++ 的 std::shared_ptr
  • Ref<T>RefMut<T>,通过 RefCell<T> 访问,一个在运行时而不是在编译时执行借用规则的类型。

Rust 引用与借用 + slice类型

总纲:

  • 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
  • 引用必须总是有效。

声明变量类型时使用&可以将这个变量定义为一个“引用”
引用允许使用值而不获取所有权
引用离开作用域时也不会释放资源,因为它不拥有这个资源

*操作符 = 解除引用 (C/C++的一套概念)

获取引用作为函数参数称为 借用(borrowing)

sudo实际上是fork + exec,不是单独只有exec

If sudo merely called exec, then sudo couldn't do things like run any cleanup tasks when the exec'd code completed. Take pam_open_session and pam_close_session for example.

如果sudo只调用exec,那么sudo就不能在exec的任务结束后执行任何清理工作。

背包問題

0-1背包問題

一共有N件物品,第i件物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够获得的最大价值是多少?每件物品可以使用0或者1次。

NP-Complete

dp[i][j]定義為使用前i件物品並且總重量為j時能獲得的最大價值

dp[i][j] = max(dp[i-1][j], # 第i件物品沒有選中
			   dp[i-1][j-w[i]] + v[i] # 第i件物品選中了,注意重量
			   ), for 0<=j<=W

max(dp[N])

T = O(NW), S = O(NW) -> O(W)
模板

def knapsack01(w, v, W):
    N = len(w)
	dp = int[N+1][W+1]
	for i in irange(1, N):
		for j in irange(0, W): # 對剩下可選擇的物品進行挑選
			dp[i][j] = max(dp[i-1][j], # 不選中當前物品
						   dp[i-1][j-w[i]]+v[i]) # 選中當前物品,從上一個狀態加上當前物品價值,j-w[i]是上一個狀態的重量
	return max(dp[N])

悲しみの森 歌词翻译

背中をそっとなぞるような感覚は || 在心中轻轻跟随着后背的触感
いつかも知った 幕がまた下りてくる予感 || 一直都是这样 好似幕布缓缓放下的预感

霞んだ笑顔 遠くなる笑い声 || 慢慢模糊的笑容 渐渐远去的笑声
今振り向けばきっと 剥がれて落ちてくから || 假如现在我回头望去 他们一定会逐渐消失

人は何故過ち 繰り返してくのか || 为什么人们要一遍遍重复他们的错误
後にも引けぬ道 面影だけ残して || 直到最后这无尽的路途上 只剩残存的痕迹

深くなるこの傷口を 更に深く切り裂いて || 深深切开的伤口 只会伤得更深
もう戻れないのなら 沈めて悲しみの森へ || 如果已经无法回头 那就向着这悲伤的森林的更深处走去吧

多分いつかはグレイの空も晴れて || 或许有一天这灰暗的天空也会放晴
光射す時 新たな肌に触れるだろう || 我就能站在阳光下 抚摸我愈合的肌肤

陽を浴びた木は緑を深くさせて || 沐浴在阳光下的树会变得更绿
もっと伸びてゆく 太陽を求めていくように || 会为了追求太阳而更努力的生长

過去の匂いがした だけど寂しくない || 我嗅到了过去的味道 可那并不让人感到寂寞
移りゆく季節は 色を変えてゆくけど || 即便季节变换 色彩流转

浅くなる呼吸の波を 呼び起こして || 变浅的呼吸让我惊醒
未来など見たくはないの今は 落として樹海の底まで || 不想看见未来的我 只想沉入树海的深处

深くなるこの傷口を 更に深く切り裂いて || 深深切开的伤口 只会伤得更深
もう戻れないのなら 沈めて悲しみの森へ || 如果已经无法回头 那就向着这悲伤的森林的更深处走去吧

DPDPDDP - Tabulation (B->T)

表格化 状态转移 自底向上
每一次循环都更新坐标系中相邻的格子

val@(x, y, z, ...) => (x+1, y, z, ...) += val, (x, y+1, z, ...) += val, (x, y, z+1, ...) += val, ...

要点:

  • 把问题可视化为表格
  • 表格大小视输入大小决定
  • 表格中的值初始化为默认值
  • 把base case等简单答案放入表格
  • 遍历表格
  • 基于当前格子的值,把后面的位置填充对应的结果

Linux 碎片知识

查看端口 netstat 常用组合

sudo netstat -tunlp # 数字方式 显示tcp udp 正在监听端口的进程信息
sudo netstat -anp # 数字方式 显示协议的端口

-a -> all, -l -> listening (mutually exclusive)
-t -> tcp
-u -> udp
-n -> numeric
-p -> process info

樹相關題目的模板

one root:

def solve(root):
	if not root:
		return ... # leaf
	if condition(root):
		return ... # 對當前root進行判斷,有時可以沒有
	l = solve(root.left)
	r = solve(root.right)
	return comparison(root, l, r) # 進行比較並且返回

two root:

def solve(p, q):
	if not p and not q:
		return ...
	if condition(p, q):
		return ...
	c1 = solve(p.childA, q.childA)
	c2 = solve(p.childB, q.childB)
	return comparison(p, q, c1, c2)

Rust 双向链表

//! A doubly-linked list in 50 LOCs of stable and safe Rust.
use std::cell::RefCell;
use std::rc::{Rc, Weak};
use std::fmt::Display;

// The node type stores the data and two pointers.
//
// It uses Option to represent nullability in safe Rust. It has zero overhead
// over a null pointer due to the NonZero optimization.
//
// It uses an Rc (Reference Counted) pointer to give ownership of the next node
// to the current node. And a Weak (weak Reference Counted) pointer to reference
// the previous node without owning it.
//
// It uses RefCell for interior mutability. It allows mutation through
// shared references.
struct Node<T> {
    pub data: T,
    pub prev: Option<Weak<RefCell<Node<T>>>>,
    pub next: Option<Rc<RefCell<Node<T>>>>,
}

impl<T> Node<T> {
    // Constructs a node with some `data` initializing prev and next to null.
    pub fn new(data: T) -> Self {
        Self { data, prev: None, next: None }
    }

    // Appends `data` to the chain of nodes. The implementation is recursive
    // but one could rewrite it to use a while-let imperative loop instead
    // without too much effort.
    pub fn append(node: &mut Rc<RefCell<Node<T>>>, data: T) -> Option<Rc<RefCell<Node<T>>>> {
        let is_last = node.borrow().next.is_none();
        if is_last {
            // If the current node is the last one, create a new node,
            // set its prev pointer to the current node, and store it as
            // the node after the current one. 
            let mut new_node = Node::new(data);
            new_node.prev = Some(Rc::downgrade(&node));
            let rc = Rc::new(RefCell::new(new_node));
            node.borrow_mut().next = Some(rc.clone());
            Some(rc)
        } else {
            // Not the last node, just continue traversing the list:
            if let Some(ref mut next) = node.borrow_mut().next {
                Self::append(next, data)
            } else { None }
        }
    }
}

// The doubly-linked list with pointers to the first and last nodes in the list.
struct List<T> {
    first: Option<Rc<RefCell<Node<T>>>>,
    last: Option<Rc<RefCell<Node<T>>>>,
}

impl<T> List<T> {
    // Constructs an empty list.
    pub fn new() -> Self {
        Self { first: None, last: None }
    }
    // Appends a new node to the list, handling the case where the list is empty.
    pub fn append(&mut self, data: T) {
        if let Some(ref mut next) = self.first {
            self.last = Node::append(next, data);
        } else {
            let f = Rc::new(RefCell::new(Node::new(data)));
            self.first = Some(f.clone());
            self.last = Some(f);
        }
    }
}

// Pretty-printing
impl<T: Display> Display for List<T> {
    fn fmt(&self, w: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
        write!(w, "[")?;
        let mut node = self.first.clone();
        while let Some(n) = node {
            write!(w, "{}", n.borrow().data)?;
            node = n.borrow().next.clone();
            if node.is_some() {
                write!(w, ", ")?;
            }
        }
        write!(w, "]")
    }
}

fn main() {
    let mut list = List::new();
    println!("{}", list);
    for i in 0..5 {
        list.append(i);
    }
    println!("{}", list);
}

C 中的 左值 和 右值

左值 = 可以出现在赋值操作符左边的表达式 或者是 有内存地址的表达式
右值 = 所有其他的表达式

動態規劃大總結

1維 情況1

輸入規模O(n)
dp[i]是一個子問題的最優解,輸入元素A[1..i]
dp[i]只與常數個子問題相關
T = O(n), S = O(n) 優化後可 O(1)

模板:

dp = int[n+1]
for i in irange(1, n): # 問題規模i
	dp[i] = f(dp[i-1], dp[i-2], ...) # 常數個子問題
return dp[n]

例子:

prefix sum
dp[i] -> sum(A[1..i])
dp[i] = dp[i-1] + A[i]

例題

  • 70
  • 198
  • 746
  • 790
  • 801

KMP算法

KMP 關鍵在於跳轉表

next[i] = len(p[0..<i]的最長prefix同時也是suffix)

len(next) = len(p) + 1

DPDPDDP - Memoization (T->B)

Make it work!

  1. 先画出tree来找出暴力递归思路
  2. 用递归实现tree
  3. 测试

DP问题应该都能画出递归树,把问题简化成子问题+从父问题到子问题的一个步骤

Make it fast!

  1. 添加memo词典
  2. 添加新的base case来返回从memo中找到的结果
  3. 把新生成的值保存到memo里

超现实C++

C++ 支持Elvis操作:

int a = 0;
int b = 10;
int c = a ?: b;
std::cout << c << std::endl;

C++支持字符范围:

char ch = '3';

switch (ch) {
	case '\0':
	std::cout << "ZERO" << std::endl;
	break;
	case '0' ... '9':
	std::cout << "NUMBER" << std::endl;
	break;
	case 'a' ... 'z':
	std::cout << "ALPHA" << std::endl;
	break;
	default:
	std::cout << "OTHER" << std::endl;
	break;
}

关于(Abstract) Unix Domain Socket

UDS是POSIX的功能,用来提供方便的基于文件系统跨进程通信
AUDS是Linux的功能,创建一个不存在于文件系统中的文件描述符,不需要垃圾回收,真是非常方便。
注意macOS是不提供AUDS的,真是非常遗憾

Docker 原理

  • docker exec 这个指令是在容器隔离区中启动一个新的进程,但是这个进程不会链接在pid=1的主干进程树上,所以docker log看不到exec的stdout

docker_exec-2

二分搜索

左閉右開輸入區間 [l, r)

def binary_search(l, r):
	while l < r:
		m = l + (r - l) // 2
		if f(m):
			return m
		if g(m):
			r = m # new range [l, m)
		else:
			l = m + 1 # new range [m+1, r)
	return -1 # not found

关于StickyBit,SUID和SGID

rwS <- SUID
rwS <- SGID
rwT <- StickyBit

SUID (Set owner User ID up on execution)
SGID (Set Group ID up on execution)

  • StickyBit: /tmp文件夹就带有这个bit,能够保证所有人都能够读写创建文件,但是只有owner才能删除文件
  • SUID:一般执行文件时,都是依照当前用户的权限;当SUID设置时,将会依照文件owner的权限执行文件
  • SGID在文件上时:类似于SUID,将会依照文件owner所在group的权限执行文件
  • SGID在目录上时:所有的在此目录下创建的文件和子目录都会拥有和这个目录相同的group而非创建者的group

RAII 资源获取即初始化

RAII = Resource Acquisition Is Initialization
Java的try-with-resource是这个概念的一个简化/条件限定版本
RAII把资源和一个对象绑定在一起,只要这个对象死亡,对应的资源也会被释放
RAII可以通过move这个操作来移动资源,让资源跨对象/跨作用域/跨线程

RAII 可总结如下:

  • 将每个资源封装入一个类,其中
    • 构造函数请求资源,并建立所有类不变式,或在它无法完成时抛出异常,
    • 析构函数释放资源并决不抛出异常;
  • 始终经由 RAII 类的实例使用满足要求的资源,该资源
    • 自身拥有自动存储期或临时生存期,或
    • 具有与自动或临时对象的生存期绑定的生存期
std::mutex m;
 
void bad() 
{
    m.lock();                    // 请求互斥体
    f();                         // 若 f() 抛异常,则互斥体永远不被释放
    if(!everything_ok()) return; // 提早返回,互斥体永远不被释放
    m.unlock();                  // 若 bad() 抵达此语句,互斥才被释放
}
 
void good()
{
    std::lock_guard<std::mutex> lk(m); // RAII类:互斥体的请求即是初始化
    f();                               // 若 f() 抛异常,则释放互斥体
    if(!everything_ok()) return;       // 提早返回,互斥体被释放
}                                      // 若 good() 正常返回,则释放互斥体

C++ 标准库的情形:
STL 遵循 RAII 管理其自身的资源:std::stringstd::vectorstd::thread,以及多数其他类在构造函数中获取其资源(错误时抛出异常),并在其析构函数中释放之(决不抛出),而不要求显式清理。

另外,标准库提供几种 RAII 包装器以管理用户提供的资源:

  • std::unique_ptrstd::shared_ptr 用于管理动态分配的内存,或以用户提供的删除器管理任何以普通指针表示的资源;
  • std::lock_guardstd::unique_lockstd::shared_lock 用于管理mutex。

关于Linux的"Capabilities"功能

Linux为了系统安全考虑,引入了这个“capabilities”功能,把原先的单一root权限切成一个一个小碎片
比如ping这个功能,原本是通过suid让它拥有了root权限。但是如果有人把ping中植入恶意代码,那么这个不分青红皂白的root权限就会让这个邪恶的ping在系统中为所欲为。
于是Linux的大神们就引入了这个capabilities能力:
man 7 capabilities
通过setcap就能给一个可执行文件添加capabilities,把权限限制在最小化。

所以suid可以用CAP_SYS_ADMIN这个权限来替代吗?

快速排序

partition函數的思路:

注意slice,不是整個array

  1. 選擇一個pivot,然後移動到slice的末尾
  2. 開始從頭遍歷當前slice,比pivot小的就和最左邊的未確定元素交換,用一個變量儲存這個位置left
  3. 將pivot與slice[left]交換,left就是pivot的最終位置

quicksort就是二分調用partition:
隨意選出一個pivot,然後調用一次partition,獲得這個pivot的最終位置,順便還將左右的數值分好了
然後對左右兩半遞歸調用quicksort

EVA新剧场版🦐扯🥚

EVA新剧场版🦐🥚

第一次冲击前

设定:Guf之扉

猜测其设定:Guf之扉是由觉醒的使徒提供能量而打开的门,能吸收地球上所有的生物和非生物,如果门开启的时间够长,便会把整个地球吸收掉。被吸收的生物和非生物会在门的另一侧会逐渐形成新的星体。可以称之为[新世界]。这个设定的更多猜测请见下篇。
在[Evangelion 3.33 You Can (Not) Redo.][SP21][Rebuild Of Evangelion 3.33]视频4:25处,线稿上,这个星体表面写了"月"字。但根据这星体的自转速度和离地球的距离可以判定这星体最起码已经不是原来的月球。由此怀疑可能在近第三次冲击Guf之扉打开时,地球上被吸收的物质穿过门扉依附在了月球上。导致地球与月球之间的引力增加,使月球轨道拉近,并且有了更快的自转。

第一次冲击

猜测,神创造世界后在地球上造了人,但是看穿了人最后会自取灭亡。于是在人类文明极度发达即将走向衰亡时候派来了两个使徒,一男一女,Adam和Lilith,想让他们利用Guf之扉的仪式再造新地球,以让人类进化。关于仪式,见下篇。
Adam和Lilith分别携带卡西乌斯枪和朗基努斯枪以人的形态出现在人类面前,向人类说明了情况。人类自己也意识到自身的缺陷会令自己走向灭亡,所以对他们的到来没有反抗。人类跟Lilith进行了交涉,请求让一些推选出来的优秀的人类度过冲击,在新生的地球上引导仪式的进行,Lilith答应了,与人类签订了契约并制定了剧本。而被推选出来的优秀人类,就是7人团队Seele。关于契约和剧本,见于下篇。
契约签订后,Adam神化后开启了Guf之扉,Lilith神化后汇聚了生物的灵魂形成了黑之月,同时保护着Seele7人,穿过了门扉。旧地球被吸收,在门扉另一侧形成了新的地球,但旧地球没有被完全吸收,留下的一部分成了月球,Adam就留在了那里。
黑之月潜入新地球内部,Lilith守护着黑之月,而Seele7人就以固化灵魂的形态陪在Lilith身旁,等待剧本的开始。

第一次冲击后

下面猜测Adam与Lilith降临地球时对人类说的话:
神说,当初吃下智慧之果的人类终会走向灭亡,因此派我们来赐予你们生命之果,到时候你们将会与我们一样成为完全的存在。但在这之前必须进行仪式,要将智慧之果产生的恶消除。Lilith会收集你们的灵魂,Adam会打开灵魂之扉,你们的灵魂穿过门扉,恶便会现形,集合成为恶之使徒。这时我们会用圣枪摄制住这恶之使徒。你们失去的人形会再次经历大地洪荒,最终恢复到人的形体,这时消灭恶之使徒就交给你们来做了。使徒被消灭后,我们会再次打开灵魂之扉,这次你们的灵魂便会得到洗礼互相补完,并得到生命之果。这就是你们人类完全进化的仪式。
为此,人类们选出了7位优秀的人类代表,成立了Seele,负责制定剧本,引导新人类后代进行人类补完的仪式。Seele在Lilith的庇护下,以固化灵魂的形态度过了第一次冲击。Adam留在了月球待命。
第一次冲击后,恶之使徒现形并被Lilith用朗基努斯枪制住,进入了休眠。地球进入了生命的进化期,漫长的时间过去,进化之树达到了顶端,人类出现了。没有人形的Seele依赖幻化成人形的Lilith指导着人类文明的进步。终于人类文明发展到了有能力消灭使徒的程度。Seele派出了团队前往恶之使徒的所在地,南极。调查研究发现恶之使徒远比想象中强大,他集结了上一代人类所有的生命力,并有着强大的防御力A.T. Field。商议之下,Seele制定了将恶使徒分化成个体再逐个消灭的计划。而要让恶之使徒分化,则需要再次打开灵魂之扉。因此,第二次冲击写进了剧本。

第二次冲击前。

1.lilith分身化为的女性人形是凌波唯,除了不死,几乎与常人无异。
2.唯可以和adam进行远距离心灵交涉。
3.唯复刻了朗枪,为第二次冲击做准备,并负责引导全球的E计划。
4.seele本体所在只有唯知道,seele暗中控制了人类世界。
5.存在反对seele的份子。
6.以后的使徒会以黑之月所在的日本为攻击目标。
7.唯能从感性上理解人类的情感,对人类感兴趣,adam对人类的认知只在理性层面。
8.adam可以复数分身,所以剧场里有adams的叫法,lilith只能有一个分身。
9.与tv版不同,源度在与唯相见时已经是nerv前身的领导。

第二次冲击

首先要讲讲adam和lilith,他们是没有A.T Field的(以下简称atf),atf是lilin一族特有的东西,猜测是智慧之果所造成的,神认为拥有atf的生命是不完全的,所以在造adam和lilith时用了生命之果,因此他们是完全的生命。同时,adam和lilith可以分身成为人形,但是他们的情况有所不同。adam的灵魂是共享的,因此可以有多个分身,所以新剧场称adam为adams。而lilith更接近人类,灵魂不共享,因此只有一个分身,并且lilith还拥有创造生命的能力,可能神在造lilith时就给予了lilith人类之母的身份。adam和lilith的人形模样便是渚薰和凌波唯。分身之后,他们原来巨大的身躯便会沉睡,直到灵魂回来。
下面讲seele,seele在几百年前开始干涉人类文明,起初是依赖lilith唯来与人类沟通。后来seele的信徒多了,seele就以石碑的样子显现在他们面前指挥他们,凌波唯则逐渐边缘化。凭借上世代的人类文明,seele通过宗教和科技逐渐掌控了人类社会。
人类文明发展到了一定的程度,seele派出了南极科考队。在冰层下面发现了被朗枪封印的恶之使徒。恶之使徒拥有atf,adam和lilith无法消灭或者分化他。所以根据情况,seele制定了E计划。

E计划分为两个阶段。第一阶段,利用lilith唯改造地球上拥有atf的生物,造出可人为控制的EVA,初步生产的4台EVA由adam的4个分身驾驶。在南极展开具有反atf的门扉,分化使徒。目的达成后,用唯复刻的4把朗枪封印住4台EVA防止其暴走。第二阶段,在使徒沉睡期间,世界各地继续生产EVA,用于对战。
第二次冲击前夕,四处奔波的唯完成了E计划的部署,来到了最后的目的地,日本的人类进化研究所。在那里遇到了nerv前身的领导碇源度和赤木直子。为了招揽人才,唯伪装成大学生,找到了在生物学领域颇有建树的冬月教授。不久之后,冬月就加入了nerv的前生组织。

时机成熟了,第二次冲击开始。南极的恶之使徒被分化,分化出的10个使徒分散到了世界各地,陷入沉睡。冲击之后,南极区域变成了反atf强烈的L结界,lilin无法接近,4枪与4EVA因无法回收而报废。
不久后,adams从南极的L结界出来,并带着恶之使徒的遗体。他已经失去了生命力,因此没有被计入使徒排位之中,作为使徒的研究样本而被封印保存,代号,Lost Number。

追加seele设定,虽然seele可以用石碑的幻象显现在任何地方,但是他们的感知是受到限制的,无法随时随地跟着人跑,更别说跟踪什么的。所以,seele指挥手下都是在确定位置的会议室里,以防止他们的存在被世人得知。adam在仪式之前也不会太多过问地球之事,因此,身为lilith的唯,有很大的自由度。而seele的手下,没有人知道seele补完计划的实质,大概很多人都是认为seele是在指挥人类迎击使徒,而唯则是制造EVA的指挥员,并不知道唯身为lilith的身份。

场景一

第二次冲击前几年,唯进入人类进化研究所,与源度和直子同事,参与制作零号机的工作。同时为了招揽人才,伪装进入了大学。
几年间,唯和源度开始熟知,逐渐相爱。

以下,想象。
两人约会,走在回去的路上。
「我爱你」源度冷不防地说到。
唯脸上没有变化「我不是人类。」
两人继续走着。
「啊,我知道,多少察觉了。」
唯微笑「是吗?」
「以你这年纪不可能拥有这么多知识,也不可能这么被seele重用。想必你也是和seele那些家伙一样来自上世代吧。」
「不,虽然我不是人类,但也和seele不一样。」
「什么?」源度停下了脚步,脸上满是诧异。
「人类补完计划」唯回过头「你知道吗」
「那是什么?」
「看来seele只把你们当做棋子来用啊。」
「告诉我,唯。」源度露出焦急的表情。
唯沉默。
「请告诉我,唯」源度再次恳求。
「我是」唯犹豫片刻「其实我是lilith」
(说明中。。。)
源度脸色大变「seele竟然是要毁灭人类。。」
「这不是毁灭,是人类的补完。」
「告诉我,唯。你要帮seele毁灭人类吗?到时候你连我都要杀吗?告诉我,唯!」
唯低头不语。
两人都沉默了,片刻后,源度收回了激动的心情。
「唯,你真觉得现在的人类是无法救赎走向灭亡的生物吗?」
唯继续低着头「不是的,我眼中的人类是可爱而脆弱的存在,但,那是神给我的使命。」
「神?我不信什么神。唯,难道因为神的旨意,我们就不能相爱吗?」
听到这话,唯抬起了头,目光闪烁,看着眼前这个真挚而深情的男人,留下了泪水。

场景二

以下,想象。
大学实验室。
「冬月老师」唯叫道。
「什么事,唯?」
「你觉得,灵魂,可以复制吗?」
「现在的学界还没有关于灵魂的定义。不过可以确定的是,灵魂最初是产生于肉体的,如果复制原型的肉体,加之后天给予适当的干涉和刺激。那么,也许灵魂可以复制吧。」
「冬月老师,其实。。。」

场景三

第二次冲击后。初号机接触实验前。
以下,想象。
司令室餐桌上。
「真的是最后的晚餐呢」唯微笑着。
源度沉默。
「不用担心,我的灵魂是永存的,我们只是暂时告别罢了。」
「初号机」源度说话了「真的是拯救人类的福音吗?」
「嗯,他是我肉体的一部分,只要由他发动冲击,情势就会由我掌控,人类不会有事的。」
「seele和adam可不会坐视不管啊」
「那可是你的差事了,老公。」唯笑着说。
源度抬头,看着唯,不说话。
两人对视。
「老公,真嗣就交给你了。」
源度低下头,只顾着切牛排。
「啊,唯,我们会再相见的。」

EVA新剧场版:序

长期以来seele的计划是这样的:第一次冲击排斥出人类物种里智慧之果的恶。第二次冲击打散恶之使徒,并在之后消灭这些分散后的使徒。第三次冲击完成人类的补完。而最后的补完,需要的是没有智慧之果污秽且能打开guf之扉的使徒,和拥有重构世界和生命的两把圣枪。

而源度在遇见了唯得知真相后,和唯决定阻止seele的人类补完计划。为此,唯复制了几把朗枪用来到时候对抗adams。还取了lilith肉体的一部分造出了初号机,并把自己融入其中,初号机成为了可以打开guf之扉拥有神之力的存在,便可以让seele和adams从世界上消失。但为了瞒过seele,初号机被束缚成了普通EVA的样子,只在关键时通过某些条件觉醒。与此同时,冬月和直子也启动了凌波丽计划,为的是让其驾驶零号机,同时还寄希望于凌波丽能拥有完整的灵魂,万一初号机有意外可以用她进入lilith肉体来代替初号机。简单来讲就是双保险。除此之外,源度还派了加持这样的卧底打探seele及其下属组织的动作。

这些准备完成之后,源度向seele报告了初号机实验的事故,声称唯在实验中因为事故在初号机里消失了,并告知seele唯在几年前已经和他结婚并有了孩子。seele大为震惊,他们最大的疑惑就是为什lilith唯会和人类结婚生子,但他们没法问源度,因seele认为源度对唯和人类补完的真相一无所知。但seele考虑到lilith创造黑之月的使命其实已在第一次冲击时便已完成,她的死并不会对仪式有影响,第三次冲击只需要依靠adam就能完成。商讨之下,决定命令源度用朗枪封印lilith的肉体,从此弃用她。并且顾忌唯的儿子真嗣,命令源度把真嗣送到乡下去,不得和儿子交流。在此前提下,将人类进化研究所升格成了nerv,对战使徒的作战组织,源度担任了总司令。

这里还需一提的便是,当初引发第二次冲击的四个adam,也就是渚熏模样的人形分身,应该是陪在了seele本体的旁边,协助seele派遣手下。以及凌波丽,是以唯的克隆体作为驾驶员的名义而被seele允许投入使用的。

由于失去了lilith,seele开始建立月球基地,利用adam的肉体制造仪式用的EVA。6号机。而在月球上一字排开的箱子,就是adam人形的分身,等待时机苏醒。
EVA新剧场版:序。开始。
由于当时的战力不足,无法迎击第四使徒,无奈之下seele允许了源度召回儿子真嗣。

真嗣成为了第三适格者坐上了EVA。

一切都按着seele的剧本在进行,但同时,这也在源度的意料之中。

使徒被一个个消灭,于是第五个adam分身苏醒了,他将作为6号机驾驶员引发第三次冲击。

「还是第三位啊,真是一点都没变呢。」由于灵魂和前四个adam分身共享,所以渚熏(五)一直都注视着真嗣,他也知道真嗣是lilith的儿子,对其抱有强烈的好奇心。

「我期待与你相见呢,真嗣君。」

EVA新剧场版:破

追加初号机设定,为什么唯要融入初号机?猜测,融入初号机后adam无法感知lilith灵魂的存在,因此lilith反叛seele和adam便不会暴露。同时初号机也拥有了神之力,可以让adam和seele消失,阻止人类补完。

除了初号机和6号机(不包括破之后),其他普通EVA是什么?猜测,是唯利用地球上拥有atf的生物改造成的对战用人形机器,可以对抗使徒,但没有神之力。因此才会有beast mode。

真希波是谁?猜测,当初唯在全球指挥E计划时结交的朋友。由于EVA的诅咒(见Q)不会变老。真希波在起初时也许不知道seele的内幕,但随时间的推移察觉了自己的异样,并开始打听情报得知了一部分seele的秘密。可能还加入了wille的前身组织。源度和真希波可能通过唯而结识,但源度和唯并没有把全部计划透露给真希波。尽管如此,双方却还是互相信任的状态。破中,真希波潜入日本,一是卧底,二是在必要时支援nerv对抗使徒。

明日香是谁?答,元气少女。

EVA新剧场版:破。开始。

nerv还是按着seele的剧本打使徒。

但暗中源度派加持偷得了lost number尼布甲尼撒之钥(系列4中末尾提到),用途不明,但猜测可能这时源度已经有了三保险(系列6提到双保险)。此外,源度还得知seele在制造6号机,于是和冬月一起去了月球基地打探,得知了6号机的制作方式和其他EVA不同并看到了渚熏(五),卡西乌斯枪也在月球之上。冬月似乎还摸不到头脑,但源度十分清楚情况。
但出乎意料的是,第九使徒的消灭后,真嗣闹矛盾出走。

第十使徒出现,真希波出击,凌波丽出击,失败。凌波丽被使徒吸收。

关键时候,真希波劝说了真嗣,真嗣又坐回了初号机,迎击第十使徒。能量用尽之时,真嗣用自己的意识使初号机觉醒,瞬秒使徒。为了救出凌波丽真嗣使用了神之力打开了guf之扉。
seele所要的条件还没达成,使徒还未消灭完毕,人类智慧之果的恶还未清除。这意味着人类补完会以失败告终。
眼看源度和唯的计划就要成功,渚熏(五)架6号机射出卡西乌斯枪,封住了初号机。源度的第一套方案以失败告终。

14年间,科技发展,wille造出了aaa wunder舰艇,并集结了绝大多数人类对抗seele和nerv。另外,类人造使徒也投入了作战。

有了这前面14年的猜想,Q的剧情就不用怎么解释了。但我还是解释几点吧。

  1. 为什么美里他们对真嗣的态度大变?因为他们得知了真嗣是唯的儿子,而唯是lilith,于是真嗣就被摆在了异类的立场上,真嗣想再驾驶EVA,在他们看来是非常危险的,因为他们只知道真嗣是lilith唯之子,却不知道初号机里的唯是他们的伙伴,都是为了阻止seele。他们也不知道源度也是要阻止seele,把源度当敌人。

  2. 为什么明日香见到真嗣就一拳,而且打碎钢玻璃?因为明日香被EVA诅咒了,力量上可能已经超出了人类。啥?你说为什么想打真嗣?她心里是这么想的「臭真嗣,人家想死你了」

  3. 为什么真嗣可以听到复制体凌波丽的呼唤?凌波丽是唯的复制体,真嗣是唯的儿子,继承了唯作为lilith心灵互通的能力。

  4. 13号机是什么?adam的纯复制体,因此没有atf。为什么两个人驾驶?因为要突破lilith那里布下的结界,所以需要有真嗣和渚熏(六),他们一个代表adam,一个代表lilith,拥有强大的力量。这也是渚熏(六)想和真嗣搞基的原因。

  5. 为什么最终教条区两把枪的情况跟渚熏(六)想的不一样?因为渚熏(六)本来与前面adam分身共享的记忆在苏醒之前被源度删去了一小段,让他认为最终教条区里的两把枪是卡和朗。但实际上当时的情况是只有一把朗插在6号机上,lilith上的朗枪是由复制体凌波丽后来插上去的(枪是当初唯造的)。这就是一个陷阱

  6. 既然渚熏(六)想要和真嗣利用卡和朗加上觉醒的13号机重造世界,为什么源度还是设陷阱?因为渚熏(六)口中的重造世界就是人类补完,都是为了安慰缩卵的真嗣而敷衍了事模糊不清的承诺。进入垂直沟的时候也是,叫真嗣不要在意周围环境,其实就是为了平定真嗣的情绪。

  7. 垂直沟和guf之扉打开时乱飘的像EVA的东西是什么?是制作的失败品。啥?为什么这么多?因为E计划已经启动很久了,当时实验失败的样本不要太多根本就是堆成山,没有地方扔只能留在地下,近第三次冲击把它们露出来了地表。

  8. 源度终止了seele本体的生命为什么他们还满足了?因为他们没有得知外界情况的途径,已经完全信任了源度。当时在他们看来,这次冲击已经势在必行,人类补完已经要成功了。于是源度连蒙带骗送他们先走了一步。

  9. 最后升起来的蘑菇一样黑色的东西是什么?线稿里标明了是黑之月。为什么变残了而且坑坑洼洼?因为近第三次冲击吸收了不少,坑坑洼洼是E计划开采原料挖的。

  10. 为什么真嗣拔枪后失控了,而且渚熏(六)堕落成了13使徒?拔枪后类似dammy system的东西启动(是源度的安排),然后残存在6号机里的12使徒在两把朗枪的13号机面前失去atf变成核心,13号机吞食了这种类似智慧之果的东西让渚熏(六)堕落成了13使徒。

  11. 为什么渚熏自插两枪阻止了第四次冲击?因为他知道中圈套了,由堕落的13号使徒发动的冲击不会实现人类补完。

  12. 渚熏说的还会再见是什么意思?就是字面意思,adam的分身还会出现。根据Q里的局势,seele已死,剩下的问题就只是源度怎么和wille和好并且怎么对付adam了。

從不同traversal order重建BST

最簡單的,Preorder
直接進行二分法搜索插入即可

class Solution:
    def bstFromPreorder(self, preorder: List[int]) -> TreeNode:
        n = len(preorder)
        root = TreeNode(preorder[0])
        for i in range(1, n):
            self.addToTree(root, preorder[i])
        return root

    def addToTree(self, node, num):
        if num < node.val:
            if node.left is None:
                node.left = TreeNode(num)
                return
            else:
                return self.addToTree(node.left, num)
        else:
            if node.right is None:
                node.right = TreeNode(num)
                return
            else:
                return self.addToTree(node.right, num)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.