commit 8578d2fe781dd4c9d3d6bc958c5d858034bd32e4 Author: UndeadMaelys Date: Mon May 24 13:13:48 2021 +0200 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/helper_functions.lua b/helper_functions.lua new file mode 100644 index 0000000..3a28d8b --- /dev/null +++ b/helper_functions.lua @@ -0,0 +1,68 @@ +-- enum helper +function Enum(tbl) + for i = 1, #tbl do + local v = tbl[i] + tbl[v] = i + end + return tbl +end + +-- doesnt work +function GetTerminalSize() + io.write("\027[s") + io.write("\027[9999;B") + io.write("\027[9999;C") + --io.write("\027[6n") + io.write("\027[u") +end + +COLORMODE = Enum { + "Normal", + "Bold", + "Dim", + "Italic", + "Underline", + "BlinkSlow", + "BlinkFast", + "Invert", + "Conceal", + "CrossedOut" +} + +COLOR = Enum { + "Black", + "Red", + "Green", + "Yellow", + "Blue", + "Purple", + "Cyan", + "LightGray", + "Gray", + "HighRed", + "HighGreen", + "HighYellow", + "HighBlue", + "HighPurple", + "HighCyan", + "White" +} + +function Colorize(Text,Color,Background,Colormode) + + if Colormode then + lColormode = "\027["..tostring(Colormode-1).."m" + else + lColormode = "" + end + + if Background then + lBackground = "\027[48;5;"..tostring(Background-1).."m" + else + lBackground = "" + end + + lColoredText = "\027[38;5;"..tostring(Color-1).."m"..Text + + return lColormode..lBackground..lColoredText.."\027[0;m" +end diff --git a/kanji_data.lua b/kanji_data.lua new file mode 100644 index 0000000..f7ea3fd --- /dev/null +++ b/kanji_data.lua @@ -0,0 +1,477 @@ +KanjiData = { +-- FIRST GRADE ELEMENTARY KANJIS + { + Symbol = "一", + Meaning = "One", + On = {"イチ","イツ"}, + Kun = {"ひと"} + }, + { + Symbol = "右", + Meaning = "Right", + On = {"ウ","ユウ"}, + Kun = {"みぎ"} + }, + { + Symbol = "雨", + Meaning = "Rain", + On = {"エン"}, + Kun = {"まる","まる(い)","つぶ(ら)","まろ(やか)"} + }, + { + Symbol = "王", + Meaning = "King", + On = {"オウ"}, + Kun = {} + }, + { + Symbol = "音", + Meaning = "Sound", + On = {"オン","イン"}, + Kun = {"おと","ね"} + }, + { + Symbol = "下", + Meaning = "Down", + On = {"カ","ゲ"}, + Kun = {"した","しも","もと","くだ(る・さる)","さ(がる)","お(りる)"} + }, + { + Symbol = "火", + Meaning = "Fire", + On = {"カ"}, + Kun = {"ひ","ほ"} + }, + { + Symbol = "花", + Meaning = "Flower", + On = {"カ"}, + Kun = {"はな"} + }, + { + Symbol = "学", + Meaning = "Learn", + On = {"ガク"}, + Kun = {"まな(ぶ)"} + }, + { + Symbol = "気", + Meaning = "Spirit", + On = {"キ","ケ"}, + Kun = {} + } , + { + Symbol = "九", + Meaning = "Nine", + On = {"キュウ","ク"}, + Kun = {"ここの(つ)"} + }, + { + Symbol = "休", + Meaning = "Rest", + On = {"キュウ"}, + Kun = {"やす(む)"} + }, + { + Symbol = "金", + Meaning = "Gold, Money", + On = {"キン","コン"}, + Kun = {"かね","かな-"} + }, + { + Symbol = "空", + Meaning = "Sky, Empty", + On = {"クウ"}, + Kun = {"そら","から","あ(く)","むな(しい)","す(く)","うつ(ろ)","あだ"} + }, + { + Symbol = "月", + Meaning = "Moon, Month", + On = {"ゲツ","ガツ"}, + Kun = {"つき"} + }, + { + Symbol = "犬", + Meaning = "Dog", + On = {"ケン"}, + Kun = {"いぬ"} + }, + { + Symbol = "見", + Meaning = "See", + On = {"ケン"}, + Kun = {"み(る・せる・える)"} + }, + { + Symbol = "五", + Meaning = "Five", + On = {"ゴ"}, + Kun = {"いつ(つ)"} + }, + { + Symbol = "口", + Meaning = "Mouth", + On = {"コウ","ク"}, + Kun = {"くち"} + }, + { + Symbol = "校", + Meaning = "School", + On = {"コウ"}, + Kun = {} + }, + { + Symbol = "左", + Meaning = "Left", + On = {"サ"}, + Kun = {"ひだり"} + }, + { + Symbol = "三", + Meaning = "Three", + On = {"サン"}, + Kun = {"み(つ)","みっ(つ)"} + }, + { + Symbol = "山", + Meaning = "Mountain", + On = {"サン","ザン"}, + Kun = {"やま"} + }, + { + Symbol = "子", + Meaning = "Child", + On = {"シ","ス"}, + Kun = {"こ","ね"} + }, + { + Symbol = "四", + Meaning = "Four", + On = {"シ"}, + Kun = {"よん","よ(つ)","よっ(つ)"} + }, + { + Symbol = "糸", + Meaning = "Thread", + On = {"シ"}, + Kun = {"いと"} + }, + { + Symbol = "字", + Meaning = "Letter", + On = {"ジ"}, + Kun = {"あざ"} + }, + { + Symbol = "耳", + Meaning = "Ear", + On = {"ジ"}, + Kun = {"みみ"} + }, + { + Symbol = "七", + Meaning = "Seven", + On = {"シチ"}, + Kun = {"なな"} + }, + { + Symbol = "車", + Meaning = "Vehicle", + On = {"シャ"}, + Kun = {"くるま"} + }, + { + Symbol = "手", + Meaning = "Hand", + On = {"シュ"}, + Kun = {"て"} + }, + { + Symbol = "十", + Meaning = "Ten", + On = {"ジュウ"}, + Kun = {"とお"} + }, + { + Symbol = "女", + Meaning = "Woman", + On = {"ジョ","ニョウ","ニョ"}, + Kun = {"おんな","め"} + }, + { + Symbol = "小", + Meaning = "Small", + On = {"ショウ"}, + Kun = {"こ-","お-","ちいさ(い)"} + }, + { + Symbol = "上", + Meaning = "Up", + On = {"ジョウ"}, + Kun = {"うえ","うわ-","かみ","のぼ(る)","あ(がる・げる)"} + }, + { + Symbol = "森", + Meaning = "Woods", + On = {"シン"}, + Kun = {"もり"} + }, + { + Symbol = "人", + Meaning = "Person", + On = {"ジン","ニン"}, + Kun = {"ひと"} + }, + { + Symbol = "水", + Meaning = "Water", + On = {"スイ"}, + Kun = {"みず"} + }, + { + Symbol = "正", + Meaning = "Correct", + On = {"セイ","ショウ"}, + Kun = {"まさ","ただ(しい・す)"} + }, + { + Symbol = "生", + Meaning = "Life", + On = {"セイ","ショウ"}, + Kun = {"なま","い(きる)","う(む)","は(える)","き","ふ","む(す)","お-"} + }, + { + Symbol = "青", + Meaning = "Blue", + On = {"セイ","ショウ"}, + Kun = {"あお"} + }, + { + Symbol = "夕", + Meaning = "Evening", + On = {"セキ"}, + Kun = {"ゆう"} + }, + { + Symbol = "石", + Meaning = "Stone", + On = {"セキ","シャク","コク"}, + Kun = {"いし"} + }, + { + Symbol = "赤", + Meaning = "Red", + On = {"セキ","シャク"}, + Kun = {"あか"} + }, + { + Symbol = "千", + Meaning = "Thousand", + On = {"セン"}, + Kun = {"ち"} + }, + { + Symbol = "川", + Meaning = "River", + On = {"セン"}, + Kun = {"かわ"} + }, + { + Symbol = "先", + Meaning = "Previous, Tip", + On = {"セン"}, + Kun = {"さき"} + }, + { + Symbol = "早", + Meaning = "Early, Fast", + On = {"ソウ","サッ"}, + Kun = {"はや(い)"} + }, + { + Symbol = "足", + Meaning = "Leg, Sufficient", + On = {"ソク"}, + Kun = {"あし","た(りる)"} + }, + { + Symbol = "村", + Meaning = "Village", + On = {"ソン"}, + Kun = {"むら"} + }, + { + Symbol = "大", + Meaning = "Large", + On = {"ダイ","タイ"}, + Kun = {"おお(きい)"} + }, + { + Symbol = "男", + Meaning = "Man", + On = {"ダン","ナン"}, + Kun = {"おとこ"} + }, + { + Symbol = "中", + Meaning = "Middle", + On = {"チュウ"}, + Kun = {"なか","あ(てる)"} + }, + { + Symbol = "虫", + Meaning = "Bug", + On = {"チュウ"}, + Kun = {"むし"} + }, + { + Symbol = "町", + Meaning = "Town", + On = {"チョウ"}, + Kun = {"まち"} + }, + { + Symbol = "天", + Meaning = "Heaven", + On = {"テン"}, + Kun = {"あま-"} + }, + { + Symbol = "田", + Meaning = "Rice Field", + On = {"デン"}, + Kun = {"た"} + }, + { + Symbol = "土", + Meaning = "Earth", + On = {"ド","ト"}, + Kun = {"つち"} + }, + { + Symbol = "二", + Meaning = "Two", + On = {"ニ"}, + Kun = {"ふた(つ)"} + }, + { + Symbol = "日", + Meaning = "Sun, Day", + On = {"ニチ","ジツ"}, + Kun = {"ひ","-か"} + }, + { + Symbol = "入", + Meaning = "Enter", + On = {"ニュウ"}, + Kun = {"はい(る)","い(れる・る)"} + }, + { + Symbol = "年", + Meaning = "Year", + On = {"ネン"}, + Kun = {"とし"} + }, + { + Symbol = "白", + Meaning = "White", + On = {"ハク"}, + Kun = {"しろ"} + }, + { + Symbol = "八", + Meaning = "Eight", + On = {"ハチ"}, + Kun = {"や(つ)","やっ(つ)"} + }, + { + Symbol = "百", + Meaning = "Hundred", + On = {"ヒャク"}, + Kun = {"もも"} + }, + { + Symbol = "文", + Meaning = "Text", + On = {"ブン","モン"}, + Kun = {"ふみ","あや"} + }, + { + Symbol = "木", + Meaning = "Tree", + On = {"ボク","モク"}, + Kun = {"き","こ-"} + }, + { + Symbol = "本", + Meaning = "Book", + On = {"ホン"}, + Kun = {"もと"} + }, + { + Symbol = "出", + Meaning = "Exit, Emerge", + On = {"シュツ"}, + Kun = {"で(る)","だ(す)"} + }, + { + Symbol = "名", + Meaning = "Name", + On = {"メイ","ミョウ"}, + Kun = {"な"} + }, + { + Symbol = "目", + Meaning = "Eye", + On = {"モク","ボク"}, + Kun = {"め","ま-"} + }, + { + Symbol = "立", + Meaning = "Stand", + On = {"リツ","リュウ"}, + Kun = {"た(つ)"} + }, + { + Symbol = "力", + Meaning = "Strength", + On = {"リョク","リキ"}, + Kun = {"ちから","りき(む)","つと(める"} + }, + { + Symbol = "林", + Meaning = "Forest", + On = {"リン"}, + Kun = {"はやし"} + }, + { + Symbol = "六", + Meaning = "Six", + On = {"ロク"}, + Kun = {"む(つ)","むっ(つ)"} + }, + { + Symbol = "草", + Meaning = "Grass", + On = {"ソウ"}, + Kun = {"くさ"} + }, + { + Symbol = "玉", + Meaning = "Ball", + On = {"ギョク"}, + Kun = {"たま"} + }, + { + Symbol = "竹", + Meaning = "Bamboo", + On = {"チク"}, + Kun = {"たけ"} + }, + { + Symbol = "貝", + Meaning = "Seashell", + On = {"バイ"}, + Kun = {"かい"} + } +} \ No newline at end of file diff --git a/kanji_learner.lua b/kanji_learner.lua new file mode 100644 index 0000000..2fdcf15 --- /dev/null +++ b/kanji_learner.lua @@ -0,0 +1,135 @@ +require "kanji_data" +require "helper_functions" + +function GetUnrepeatedKanji(lAvoid) + lKanji = KanjiData[math.random(#KanjiData)] + for i=1, #lAvoid do + if lKanji == lAvoid[i] then + lKanji = GetUnrepeatedKanji(lAvoid) + break + end + end + return lKanji +end + +function AskMeaning() + io.write(Colorize("Q: ",COLOR.HighBlue).."What does "..CurrentKanji.Symbol.." mean? \n") + io.write("\n") + + for i=1, 4 do + if i == Solution then + io.write(Colorize(" ("..i..") ",COLOR.HighYellow)..CurrentKanji.Meaning) + io.write("\n") + else + lRandomKanji = GetUnrepeatedKanji(AvoidList) + table.insert(AvoidList,lRandomKanji) + io.write(Colorize(" ("..i..") ",COLOR.HighYellow)..lRandomKanji.Meaning) + io.write("\n") + end + end +end + +function AskKanji() + io.write(Colorize("Q: ",COLOR.HighBlue).."Which is the kanji for \""..CurrentKanji.Meaning.."\"? \n") + io.write("\n") + + for i=1, 4 do + if i == Solution then + io.write(Colorize(" ("..i..") ",COLOR.HighYellow)..CurrentKanji.Symbol) + io.write("\n") + else + lRandomKanji = GetUnrepeatedKanji(AvoidList) + table.insert(AvoidList,lRandomKanji) + io.write(Colorize(" ("..i..") ",COLOR.HighYellow)..lRandomKanji.Symbol) + io.write("\n") + end + end +end + + +function Ask(Type) + + Solution = math.random(4) + + AvoidList = {} + table.insert(AvoidList,CurrentKanji) + + if Type == QuestionType.KANJI then + AskKanji() + elseif Type == QuestionType.MEANING then + AskMeaning() + end + + io.write("\n") + io.write(Colorize("A: ",COLOR.HighPurple)) +end + +function Check(answer) + if answer == "" then + io.write("\027[1F".."\027[3C") + Check(io.read()) + else + io.write("\n") + if answer == tostring(Solution) then + io.write(Colorize("Correct!",COLOR.HighGreen)) + io.write(Colorize(" [Streak +1]",COLOR.HighCyan,nil,COLORMODE.BlinkFast)) + Streak = Streak + 1 + Correct = Correct + 1 + else + io.write(Colorize("Wrong!",COLOR.HighRed).." Answer is ("..Solution..")") + if Streak >= 5 then io.write(Colorize(" [Streak Lost]",COLOR.Cyan,nil,COLORMODE.BlinkFast)) end + Streak = 0 + Wrong = Wrong + 1 + end + UpdateProgress() + io.write("\n") + io.read() + end + Total = Total + 1 +end + +QuestionType = Enum { + "KANJI", + "MEANING", + "ON", + "KUN" +} + +function ShowProgress() + io.write("#"..tostring(Total+1).."\t") + + io.write("Right: "..Colorize(tostring(Correct),COLOR.HighGreen).."\t") + io.write("Wrong: "..Colorize(tostring(Wrong),COLOR.HighRed).."\t") + + if Streak >= 5 then + io.write(Colorize("CURRENT STREAK: ", COLOR.HighCyan,nil,COLORMODE.BlinkFast)..Colorize(Streak,COLOR.White,nil,COLORMODE.BlinkFast)) + end + io.write("\n\n") +end + +function UpdateProgress() + io.write("\027[s") + io.write("\027[1;1H") + ShowProgress(true) + io.write("\027[u") +end + +Correct = 0 +Total = 0 +Streak = 0 +Wrong = 0 +while 1 do + os.execute("clear") + + CurrentKanji = KanjiData[math.random(#KanjiData)] + + ShowProgress() + + --Ask(math.random(#QuestionType)) + Ask(math.random(2)) + --Ask(QuestionType.KANJI) + + response = io.read() + + Check(response) +end