Skip to content

Instantly share code, notes, and snippets.

@zeratax
Last active May 4, 2021 21:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zeratax/de6dda9f29295f60a6baf920ae3161fc to your computer and use it in GitHub Desktop.
Save zeratax/de6dda9f29295f60a6baf920ae3161fc to your computer and use it in GitHub Desktop.
{
"kana": [
{"hiragana": "あ","romaji":"a", "value": 1},
{"hiragana": "い","romaji":"i", "value": 2},
{"hiragana": "う","romaji":"u", "value": 3},
{"hiragana": "え","romaji":"r", "value": 4},
{"hiragana": "お","romaji":"o", "value": 5},
{"hiragana": "か","romaji":"ka", "value": 6},
{"hiragana": "き","romaji":"ki", "value": 7},
{"hiragana": "く","romaji":"ku", "value": 8},
{"hiragana": "け","romaji":"ke", "value": 9},
{"hiragana": "こ","romaji":"ko", "value": 10},
{"hiragana": "さ","romaji":"sa", "value": 11},
{"hiragana": "し","romaji":"shi", "value": 12},
{"hiragana": "す","romaji":"su", "value": 13},
{"hiragana": "せ","romaji":"se", "value": 14},
{"hiragana": "そ","romaji":"so", "value": 15},
{"hiragana": "た","romaji":"ta", "value": 16},
{"hiragana": "ち","romaji":"chi", "value": 17},
{"hiragana": "つ","romaji":"tsu", "value": 18},
{"hiragana": "て","romaji":"te", "value": 19},
{"hiragana": "と","romaji":"to", "value": 20},
{"hiragana": "な","romaji":"na", "value": 21},
{"hiragana": "に","romaji":"ni", "value": 22},
{"hiragana": "ぬ","romaji":"nu", "value": 23},
{"hiragana": "ね","romaji":"ne", "value": 24},
{"hiragana": "の","romaji":"no", "value": 25},
{"hiragana": "は","romaji":"ha", "value": 26},
{"hiragana": "ひ","romaji":"hi", "value": 27},
{"hiragana": "ふ","romaji":"fu", "value": 28},
{"hiragana": "へ","romaji":"he", "value": 29},
{"hiragana": "ほ","romaji":"ho", "value": 30},
{"hiragana": "ま","romaji":"ma", "value": 31},
{"hiragana": "み","romaji":"mi", "value": 32},
{"hiragana": "む","romaji":"mu", "value": 33},
{"hiragana": "め","romaji":"me", "value": 34},
{"hiragana": "も","romaji":"mo", "value": 35},
{"hiragana": "や","romaji":"ya", "value": 36},
{"hiragana": "ゆ","romaji":"yu", "value": 37},
{"hiragana": "よ","romaji":"yo", "value": 38},
{"hiragana": "ら","romaji":"ra", "value": 39},
{"hiragana": "り","romaji":"ri", "value": 40},
{"hiragana": "る","romaji":"ru", "value": 41},
{"hiragana": "れ","romaji":"re", "value": 42},
{"hiragana": "ろ","romaji":"ro", "value": 43},
{"hiragana": "わ","romaji":"wa", "value": 44},
{"hiragana": "を","romaji":"wo", "value": 45},
{"hiragana": "ん","romaji":"n", "value": 46}
]
}
require "json"
class Kana
include JSON::Serializable
@[JSON::Field(key: "hiragana")]
getter hiragana : String
@[JSON::Field(key: "romaji")]
getter romaji : String
@[JSON::Field(key: "value")]
getter value : Int32
end
class Kanas
include JSON::Serializable
@[JSON::Field(key: "kana")]
@kana : Array(Kana)
def hiragana(kana)
@kana.find { |i| kana == i.hiragana }
end
def romaji(character)
@kana.find { |i| kana == i.character }
end
def value(number : Int32)
if number > @kana.size
raise "no matching kana!"
end
@kana[number]
end
def size
@kana.size
end
end
kana_json = File.read(Path.posix "./src/kana.json")
kanas = Kanas.from_json(kana_json)
vowels = ['a', 'i', 'o', 'u', 'e']
output_path = Path.posix "./output.json"
File.open(output_path, "w") { |f| f << %Q({"names": [\n) }
combinations = (1..kanas.size).to_a
combinations.repeated_permutations(8).each do |combination|
kana = combination.map { |x| kanas.value(x-1) }
hiragana = kana.map { |x| x.hiragana }.join
romaji = kana.map { |x| x.romaji }.join
if (romaji.chars & vowels).size == 8 && romaji.chars.size == 15 && combination.sum == 134
File.open(output_path, "a") { |f| f << %Q({"hiragana": "#{hiragana}", "romaji": "#{romaji}"},\n) }
end
end
File.open(output_path, "a") { |f| f << "]}" }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment