Skip to content

Instantly share code, notes, and snippets.

@JLChnToZ
Last active December 26, 2018 17:15
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JLChnToZ/4415af7d872ec2d170b4c8d5de6446a3 to your computer and use it in GitHub Desktop.
Save JLChnToZ/4415af7d872ec2d170b4c8d5de6446a3 to your computer and use it in GitHub Desktop.
If 346 characters are used as development code names of some software, this might be the best ordering
v1.0 ANZU (双葉杏)
v2.0 CATHY (キャシー・グラハム)
v3.0 DOMYOJI (道明寺歌鈴)
v4.0 ETOU (衛藤美紗希)
v5.0 FUMIKA (鷺沢文香)
v6.0 HAJIME (藤原肇)
v7.0 IBUKI (小松伊吹)
v8.0 JOUMU (美城常務)
v9.0 KAEDE (高垣楓)
v10.0 LAYLA (ライラ)
v11.0 MEIKO (並木芽衣子)
v12.0 NENE (栗原ネネ)
v13.0 OTOHA (梅木音葉)
v14.0 RANKO (神崎蘭子)
v15.0 SAORI (奥山沙織)
v16.0 TAKUMI (向井拓海)
v17.0 WAKUI (和久井留美)
v18.0 YASUHA (岡崎泰葉)
v19.0 ZAIZEN (財前時子)
v20.0 ASUKA (二宮飛鳥)
v21.0 CHIAKI (黒川千秋)
v22.0 EBIHARA (海老原菜帆)
v23.0 FUEIFUEI (楊菲菲)
v24.0 HASUMI (長富蓮実)
v25.0 IZUMI (大石泉)
v26.0 JOUGASAKI (城ケ崎美嘉)
v27.0 KAORU (龍崎薫)
v28.0 MIRIA (赤城みりあ)
v29.0 NAGISA (愛野渚)
v30.0 OHTA (太田優)
v31.0 REI (篠原礼)
v32.0 SUZUHO (上田鈴帆)
v33.0 TAMAMI (脇山珠美)
v34.0 WAKABA (日下部若葉)
v35.0 YURIKO (大西由里子)
v36.0 AYUNA (浜川愛結奈)
v37.0 CHIHIRO (千川ちひろ)
v38.0 FREDERICA (宮本フレデリカ)
v39.0 HIJIRI (望月聖)
v40.0 ITSUKI (真鍋いつき)
v41.0 KOUME (白坂小梅)
v42.0 MAHIRO (北川真尋)
v43.0 NAMBA (難波笑美)
v44.0 OGATA (緒方智絵里)
v45.0 RIKA (城ケ崎莉嘉)
v46.0 SACHIKO (輿水幸子)
v47.0 TSUBAKI (江上椿)
v48.0 YAMATO (大和亜季)
v49.0 AIHARA (相原雪乃)
v50.0 CHIZURU (松尾千鶴)
v51.0 FUKUYAMA (福山舞)
v52.0 HIKARU (南条光)
v53.0 ICHIHARA (市原仁奈)
v54.0 KOZUE (遊佐こずえ)
v55.0 MAKINO (八神マキノ)
v56.0 NISHIJIMA (西島櫂)
v57.0 OHNUMA (大沼くるみ)
v58.0 SETSUNA (井村雪菜)
v59.0 TSUKASA (桐生つかさ)
v60.0 YORITA (依田芳乃)
v61.0 ARIURA (有浦柑奈)
v62.0 COCHRAN (メアリー・コクラン)
v63.0 FURUSAWA (古澤頼子)
v64.0 HONAMI (西川保奈美)
v65.0 ICHINOSE (一ノ瀬志希)
v66.0 KOTOKA (西園寺琴歌)
v67.0 MEGUMI (伊集院惠)
v68.0 NORIKO (椎名法子)
v69.0 OHTSUKI (大槻唯)
v70.0 SHIZUKU (及川雫)
v71.0 TADA (多田李衣菜)
v72.0 YAGUCHI (矢口美羽)
v73.0 AKANISHI (赤西瑛梨華)
v74.0 CHIKA (横山千佳)
v75.0 FUKA (浅野風香)
v76.0 HONOKA (綾瀬穂乃香)
v77.0 IGARASHI (五十嵐響子)
v78.0 KUMIKO (松山久美子)
v79.0 MIDORI (水野翠)
v80.0 NARUMIYA (成宮由愛)
v81.0 OTOKURA (乙倉悠貴)
v82.0 SHUTO (首藤葵)
v83.0 TSUJINO (辻野あかり)
v84.0 YOSHIOKA (吉岡沙紀)
v85.0 AZUKI (桃井あずき)
v86.0 CHINATSU (相川千夏)
v87.0 FUJIMOTO (藤本里奈)
v88.0 HOTARU (白菊ほたる)
v89.0 IKEBUKURO (池袋晶葉)
v90.0 KUDO (工藤忍)
v91.0 MICHIRU (大原みちる)
v92.0 NONOMURA (野々村そら)
v93.0 SASAKI (佐々木千枝)
v94.0 TAKAMINE (高峯のあ)
v95.0 YANASE (柳瀬美由紀)
v96.0 ARAKI (荒木比奈)
v97.0 CLARICE (クラリス)
v98.0 HONDA (本田未央)
v99.0 IMAI (今井加奈)
v100.0 KOMURO (小室千奈美)
v101.0 MUTSUMI (氏家むつみ)
v102.0 NATSUKI (木村夏樹)
v103.0 SAWADA (沢田麻理菜)
v104.0 TAKAMORI (高森藍子)
v105.0 YOKO (斉藤洋子)
v106.0 AKANE (日野茜)
v107.0 HYODO (兵藤レナ)
v108.0 KISHIBE (岸部彩華)
v109.0 MATOBA (的場梨沙)
v110.0 NIWA (丹羽仁美)
v111.0 SAEJIMA (冴島清美)
v112.0 TSUCHIYA (土屋亜子)
v113.0 YUKIMI (佐城雪美)
v114.0 ASARI (浅利七海)
v115.0 HARADA (原田美世)
v116.0 KATAGIRI (片桐早苗)
v117.0 MIFUNE (三船美優)
v118.0 NATALIA (ナターリア)
v119.0 SAKURAI (櫻井桃華)
v120.0 TACHIBANA (橘ありす)
v121.0 YUMI (相葉夕美)
v122.0 ANASTASIA (アナスタシア)
v123.0 HAYAMI (速水奏)
v124.0 KAWASHIMA (川島瑞樹)
v125.0 MAEKAWA (前川みく)
v126.0 SENZAKI (仙崎恵磨)
v127.0 TAKAHASHI (高橋礼子)
v128.0 ABE (安部菜々)
v129.0 HATTORI (服部瞳子)
v130.0 KOBAYAKAWA (小早川紗枝)
v131.0 MIYOSHI (三好紗南)
v132.0 SHIBUYA (渋谷凛)
v133.0 TSUKIMIYA (月宮雅)
v134.0 HIIRAGI (柊志乃)
v135.0 KAREN (北条加蓮)
v136.0 MOCHIDA (持田亜里沙)
v137.0 SUGISAKA (杉坂海)
v138.0 TOTOKI (十時愛梨)
v139.0 HAYASAKA (早坂美玲)
v140.0 KIYORA (柳清良)
v141.0 MIZUMOTO (水本ゆかり)
v142.0 SUZUMIYA (涼宮星花)
v143.0 TAKAFUJI (鷹富士茄子)
v144.0 HIMEKAWA (姫川友紀)
v145.0 KIRINO (桐野アヤ)
v146.0 MORIKUBO (森久保乃々)
v147.0 SHIMAMURA (島村卯月)
v148.0 TOMOKA (若林智香)
v149.0 HAMAGUCHI (浜口あやめ)
v150.0 KITAMI (喜多見柚)
v151.0 MUNAKATA (棟方愛海)
v152.0 SANTACLAUS (イヴ・サンタクロース)
v153.0 TOGO (東郷あい)
v154.0 HINAKO (喜多日菜子)
v155.0 KOGA (古賀小春)
v156.0 MURAKAMI (村上巴)
v157.0 SYUKO (塩見周子)
v158.0 HORI (堀裕子)
v159.0 KOSEKI (小関麗奈)
v160.0 MATSUBARA (松原早耶)
v161.0 SHIORI (瀬名詩織)
v162.0 HOSHI (星輝子)
v163.0 KAMIYA (神谷奈緒)
v164.0 MATSUMOTO (松本沙理奈)
v165.0 SOMA (相馬夏美)
v166.0 HARUNA (上条春菜)
v167.0 KATE (ケイト)
v168.0 MATSUNAGA (松永涼)
v169.0 SEIRA (水木聖來)
v170.0 HIROMI (関裕美)
v171.0 KIBA (木場真奈美)
v172.0 MOROBOSHI (諸星きらり)
v173.0 SATOMI (榊原里美)
v174.0 HELEN (ヘレン)
v175.0 MURAMATSU (村松さくら)
v176.0 SHIN (佐藤心)
v177.0 MAYU (佐久間まゆ)
v178.0 MIHO (小日向美穂)
v179.0 MIYAKO (安斎都)
v180.0 MAKIHARA (槙原志保)
v181.0 MIMURA (三村かな子)
v182.0 MINAMI (新田美波)
v183.0 MANAKA (間中美里)
--- Missing Names ---
藤居朋
中野有香
結城晴
const { compareTwoStrings } = require('string-similarity');
const { default: toNarrowJapanese } = require('jaco/lib/fn/toNarrowJapanese');
const names = JSON.parse(require('fs').readFileSync('names.json', 'utf8'));
const oNames = new Set(),
nameMap = new Map(),
lNames = [],
fNames = new Map(),
scores = {};
let maxLength = 0;
for(let i = 0; i < names.length; i += 3) {
for(let j = 1; j < 3; j++) {
if(!names[i + j]) continue;
const temp = names[i + j].toLowerCase();
lNames.push(temp);
fNames.set(temp, temp.replace(/(.)\1+/, '$1'));
let override = !nameMap.has(temp);
switch(j) {
case 1: if(scores[temp] && !names[i + 2]) override = true; break;
case 2: override = true; break;
}
if(override)
nameMap.set(temp, names[i]);
maxLength = Math.max(maxLength, temp.length);
}
oNames.add(names[i]);
scores[names[i + 1].toLowerCase()] = names[i + 2] ? 1 : 2;
if(names[i + 2]) scores[names[i + 2].toLowerCase()] = 2;
}
const added = new Set(), filtered = new Set(), conflicts = new Map();
const sortednames = Array.from(nameMap.keys());
let result = [];
const aCode = 'a'.charCodeAt(0);
let iterations = 0;
while(iterations < 20) {
++iterations;
added.clear();
filtered.clear();
conflicts.clear();
result = toAZOrder(sortednames.sort(sortFilterNames).filter(name => {
const oName = nameMap.get(name);
if(added.has(oName)) return false;
for(const cmp of filtered) {
if(cmp && isSimilar(cmp, name)) {
addConflict(cmp, name);
addConflict(name, cmp);
return false;
}
}
filtered.add(name);
added.add(oName);
return true;
}));
if(result.length === nameMap.size)
break;
for(const [filteredName, oName] of nameMap) {
for(const [name, oName2] of nameMap)
if(oName === oName2 && filteredName !== name)
scores[name]++;
if(conflicts.has(filteredName))
for(const conflicted of conflicts.get(filteredName))
scores[conflicted] -= 2;
}
}
console.log(
result
.map((x, i) => `v${i + 1}.0\t${x.toUpperCase()} (${toNarrowJapanese(nameMap.get(x))})`)
.join('\n')
);
const missingNames = Array.from(oNames).filter(name => !added.has(name));
if(missingNames.length) {
console.log('\n--- Missing Names ---');
console.log(missingNames.map(toNarrowJapanese).join('\n'));
}
function sortFilterNames(l, r) {
return scores[r] - scores[l] || l.length - r.length || l.localeCompare(r);
}
function isSimilar(a, b) {
a = fNames.get(a);
b = fNames.get(b);
return a.indexOf(b) >= 0 || b.indexOf(a) >= 0 ||
compareTwoStrings(a.padStart(maxLength + 10, '_'), b.padStart(maxLength + 10, '_')) >= 0.9;
}
function addConflict(a, b) {
if(!conflicts.has(a))
conflicts.set(a, new Set([b]));
else
conflicts.get(a).add(b);
}
function isTruly(a) {
return !!a;
}
function toAZOrder(array) {
let lastLetterCode = -1, startIndex = -1;
const splitted = [];
for(let i = 0; i < array.length; i++) {
const letterCode = array[i].charCodeAt(0) - aCode;
if(!splitted[letterCode]) splitted[letterCode] = [array[i]];
else splitted[letterCode].push(array[i]);
}
const result = [];
for(let j = 0; ; j++) {
let notEmpty = false;
for(let i = 0; i < splitted.length; i++)
if(splitted[i] && splitted[i][j]) {
result.push(splitted[i][j]);
notEmpty = true;
}
if(!notEmpty) break;
}
return result.filter(isTruly);
}
[
"千川ちひろ", "Senkawa", "Chihiro",
"美城常務", "Mishiro", "Joumu",
"安部菜々", "Abe", "Nana",
"相葉夕美", "Aiba", "Yumi",
"相原雪乃", "Aihara", "Yukino",
"相川千夏", "Aikawa", "Chinatsu",
"愛野渚", "Aino", "Nagisa",
"赤城みりあ", "Akagi", "Miria",
"赤西瑛梨華", "Akanishi", "Erika",
"アナスタシア", "Anastasia", "",
"安斎都", "Anzai", "Miyako",
"荒木比奈", "Araki", "Hina",
"有浦柑奈", "Ariura", "Kanna",
"浅野風香", "Asano", "Fuka",
"浅利七海", "Asari", "Nanami",
"綾瀬穂乃香", "Ayase", "Honoka",
"キャシー・グラハム", "Graham", "Cathy",
"クラリス", "Clarice", "",
"道明寺歌鈴", "Domyoji", "Karin",
"海老原菜帆", "Ebihara", "Naho",
"江上椿", "Egami", "Tsubaki",
"衛藤美紗希", "Etou", "Misaki",
"イヴ・サンタクロース", "Santaclaus", "Eve",
"藤居朋", "Fujii", "Tomo",
"藤本里奈", "Fujimoto", "Rina",
"藤原肇", "Fujiwara", "Hajime",
"福山舞", "Fukuyama", "Mai",
"古澤頼子", "Furusawa", "Yoriko",
"双葉杏", "Futaba", "Anzu",
"浜口あやめ", "Hamaguchi", "Ayame",
"浜川愛結奈", "Hamakawa", "Ayuna",
"原田美世", "Harada", "Miyo",
"服部瞳子", "Hattori", "Toko",
"速水奏", "Hayami", "Kanade",
"早坂美玲", "Hayasaka", "Mirei",
"ヘレン", "Helen", "",
"柊志乃", "Hiiragi", "Shino",
"姫川友紀", "Himekawa", "Yuki",
"日野茜", "Hino", "Akane",
"北条加蓮", "Hojo", "Karen",
"本田未央", "Honda", "Mio",
"堀裕子", "Hori", "Yuko",
"星輝子", "Hoshi", "Syoko",
"兵藤レナ", "Hyodo", "Rena",
"市原仁奈", "Ichihara", "Nina",
"一ノ瀬志希", "Ichinose", "Shiki",
"五十嵐響子", "Igarashi", "Kyoko",
"伊集院惠", "Ijuin", "Megumi",
"池袋晶葉", "Ikebukuro", "Akiha",
"今井加奈", "Imai", "Kana",
"井村雪菜", "Imura", "Setsuna",
"城ヶ崎美嘉", "Jougasaki", "Mika",
"城ヶ崎莉嘉", "Jougasaki", "Rika",
"上条春菜", "Kamijo", "Haruna",
"神谷奈緒", "Kamiya", "Nao",
"神崎蘭子", "Kanzaki", "Ranko",
"片桐早苗", "Katagiri", "Sanae",
"ケイト", "Kate", "",
"川島瑞樹", "Kawashima", "Mizuki",
"木場真奈美", "Kiba", "Manami",
"木村夏樹", "Kimura", "Natsuki",
"桐野アヤ", "Kirino", "Aya",
"桐生つかさ", "Kiryu", "Tsukasa",
"岸部彩華", "Kishibe", "Ayaka",
"喜多日菜子", "Kita", "Hinako",
"北川真尋", "Kitagawa", "Mahiro",
"喜多見柚", "Kitami", "Yuzu",
"小早川紗枝", "Kobayakawa", "Sae",
"古賀小春", "Koga", "Koharu",
"小日向美穂", "Kohinata", "Miho",
"小松伊吹", "Komatsu", "Ibuki",
"小室千奈美", "Komuro", "Chinami",
"小関麗奈", "Koseki", "Reina",
"輿水幸子", "Koshimizu", "Sachiko",
"工藤忍", "Kudo", "Shinobu",
"栗原ネネ", "Kurihara", "Nene",
"黒川千秋", "Kurokawa", "Chiaki",
"日下部若葉", "Kusakabe", "Wakaba",
"ライラ", "Layla", "",
"前川みく", "Maekawa", "Miku",
"槙原志保", "Makihara", "Shiho",
"真鍋いつき", "Manabe", "Itsuki",
"間中美里", "Manaka", "Misato",
"メアリー・コクラン", "Cochran", "Mary",
"的場梨沙", "Matoba", "Risa",
"松原早耶", "Matsubara", "Saya",
"松本沙理奈", "Matsumoto", "Sarina",
"松永涼", "Matsunaga", "Ryo",
"松尾千鶴", "Matsuo", "Chizuru",
"松山久美子", "Matsuyama", "Kumiko",
"三船美優", "Mifune", "Miyu",
"三村かな子", "Mimura", "Kanako",
"宮本フレデリカ", "Miyamoto", "Frederica",
"三好紗南", "Miyoshi", "Sana",
"水木聖來", "Mizuki", "Seira",
"水本ゆかり", "Mizumoto", "Yukari",
"水野翠", "Mizuno", "Midori",
"持田亜里沙", "Mochida", "Arisa",
"望月聖", "Mochizuki", "Hijiri",
"桃井あずき", "Momoi", "Azuki",
"森久保乃々", "Morikubo", "Nono",
"諸星きらり", "Moroboshi", "Kirari",
"向井拓海", "Mukai", "Takumi",
"棟方愛海", "Munakata", "Atsumi",
"村上巴", "Murakami", "Tomoe",
"村松さくら", "Muramatsu", "Sakura",
"長富蓮実", "Nagatomi", "Hasumi",
"中野有香", "Nakano", "Yuka",
"難波笑美", "Namba", "Emi",
"並木芽衣子", "Namiki", "Meiko",
"南条光", "Nanjo", "Hikaru",
"成宮由愛", "Narumiya", "Yume",
"ナターリア", "Natalia", "",
"二宮飛鳥", "Ninomiya", "Asuka",
"西島櫂", "Nishijima", "Kai",
"西川保奈美", "Nishikawa", "Honami",
"新田美波", "Nitta", "Minami",
"丹羽仁美", "Niwa", "Hitomi",
"野々村そら", "Nonomura", "Sora",
"緒方智絵里", "Ogata", "Chieri",
"大原みちる", "Ohara", "Michiru",
"大石泉", "Ohishi", "Izumi",
"大西由里子", "Ohnishi", "Yuriko",
"大沼くるみ", "Ohnuma", "Kurumi",
"太田優", "Ohta", "Yuu",
"大槻唯", "Ohtsuki", "Yui",
"及川雫", "Oikawa", "Shizuku",
"岡崎泰葉", "Okazaki", "Yasuha",
"奥山沙織", "Okuyama", "Saori",
"乙倉悠貴", "Otokura", "Yuuki",
"龍崎薫", "Ryuzaki", "Kaoru",
"冴島清美", "Saejima", "Kiyomi",
"鷺沢文香", "Sagisawa", "Fumika",
"西園寺琴歌", "Saionji", "Kotoka",
"斉藤洋子", "Saito", "Yoko",
"佐城雪美", "Sajo", "Yukimi",
"榊原里美", "Sakakibara", "Satomi",
"佐久間まゆ", "Sakuma", "Mayu",
"櫻井桃華", "Sakurai", "Momoka",
"佐々木千枝", "Sasaki", "Chie",
"佐藤心", "Sato", "Shin",
"沢田麻理菜", "Sawada", "Marina",
"関裕美", "Seki", "Hiromi",
"瀬名詩織", "Sena", "Shiori",
"仙崎恵磨", "Senzaki", "Ema",
"渋谷凛", "Shibuya", "Rin",
"椎名法子", "Shiina", "Noriko",
"島村卯月", "Shimamura", "Uzuki",
"篠原礼", "Shinohara", "Rei",
"塩見周子", "Shiomi", "Syuko",
"白菊ほたる", "Shiragiku", "Hotaru",
"白坂小梅", "Shirasaka", "Koume",
"首藤葵", "Shuto", "Aoi",
"相馬夏美", "Soma", "Natsumi",
"杉坂海", "Sugisaka", "Umi",
"涼宮星花", "Suzumiya", "Seika",
"橘ありす", "Tachibana", "Arisu",
"多田李衣菜", "Tada", "Riina",
"鷹富士茄子", "Takafuji", "Kako",
"高垣楓", "Takagaki", "Kaede",
"高橋礼子", "Takahashi", "Reiko",
"高峯のあ", "Takamine", "Noa",
"高森藍子", "Takamori", "Aiko",
"東郷あい", "Togo", "Ai",
"十時愛梨", "Totoki", "Airi",
"土屋亜子", "Tsuchiya", "Ako",
"月宮雅", "Tsukimiya", "Miyabi",
"上田鈴帆", "Ueda", "Suzuho",
"氏家むつみ", "Ujiie", "Mutsumi",
"梅木音葉", "Umeki", "Otoha",
"若林智香", "Wakabayashi", "Tomoka",
"脇山珠美", "Wakiyama", "Tamami",
"和久井留美", "Wakui", "Rumi",
"八神マキノ", "Yagami", "Makino",
"矢口美羽", "Yaguchi", "Miu",
"大和亜季", "Yamato", "Aki",
"柳清良", "Yanagi", "Kiyora",
"柳瀬美由紀", "Yanase", "Miyuki",
"楊菲菲", "Yao", "Fueifuei",
"横山千佳", "Yokoyama", "Chika",
"依田芳乃", "Yorita", "Yoshino",
"吉岡沙紀", "Yoshioka", "Saki",
"遊佐こずえ", "Yusa", "Kozue",
"結城晴", "Yuuki", "Haru",
"財前時子", "Zaizen", "Tokiko",
"辻野あかり", "Tsujino", "Akari"
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment