about summary refs log tree commit diff
path: root/users/tazjin/predlozhnik/src/main.rs
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-07-26T20·19+0300
committertazjin <tazjin@tvl.su>2022-07-27T21·54+0000
commit7bfc859bfce91d8a33b829e439141269ea6647d4 (patch)
treef7997a83bc2c4836df3858b906a410caad479079 /users/tazjin/predlozhnik/src/main.rs
parent282ad0015b85df11a686d4fe3f8da9975210206b (diff)
feat(tazjin/predlozhnik): check in initial list of предлоги r/4323
Change-Id: I3bc4f46964e50c8748306e579126be0192a89284
Reviewed-on: https://cl.tvl.fyi/c/depot/+/5978
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
Diffstat (limited to '')
-rw-r--r--users/tazjin/predlozhnik/src/main.rs105
1 files changed, 105 insertions, 0 deletions
diff --git a/users/tazjin/predlozhnik/src/main.rs b/users/tazjin/predlozhnik/src/main.rs
new file mode 100644
index 0000000000..73b19201fb
--- /dev/null
+++ b/users/tazjin/predlozhnik/src/main.rs
@@ -0,0 +1,105 @@
+use lazy_static::lazy_static;
+use maplit::hashmap;
+use std::collections::HashMap;
+
+#[derive(Debug, Hash, PartialEq, Eq)]
+enum Падеж {
+    Именительный,
+    Родительный,
+    Дательный,
+    Винительный,
+    Творительный,
+    Предложный,
+}
+
+impl Падеж {
+    const ВСЕ: [Self; 6] = [
+        Self::Именительный,
+        Self::Родительный,
+        Self::Дательный,
+        Self::Винительный,
+        Self::Творительный,
+        Self::Предложный,
+    ];
+
+    fn вопрос(&self) -> &str {
+        use Падеж::*;
+        match self {
+            Именительный => "Кто? Что?",
+            Родительный => "Кого? Чего?",
+            Дательный => "Кому? Чему?",
+            Винительный => "Кого? Что?",
+            Творительный => "Кем? Чем?",
+            Предложный => "О ком? О чём?",
+        }
+    }
+}
+
+lazy_static! {
+    static ref ПО_ПРЕДЛОГУ: HashMap<&'static str, Vec<Падеж>> = {
+        use Падеж::*;
+
+        hashmap! {
+            "без" => vec![Родительный],
+            "близ" => vec![Родительный],
+            "в" => vec![Винительный, Предложный],
+            "вместо" => vec![Родительный],
+            "вне" => vec![Родительный],
+            "возле" => vec![Родительный],
+            "вокруг" => vec![Родительный],
+            "вроде" => vec![Родительный],
+            "для" => vec![Родительный],
+            "до" => vec![Родительный],
+            "за" => vec![Винительный, Творительный],
+            "из" => vec![Родительный],
+            "из-за" => vec![Родительный],
+            "из-под" => vec![Родительный],
+            "к" => vec![Дательный],
+            "кроме" => vec![Родительный],
+            "между" => vec![Творительный, Родительный],
+            "на" => vec![Винительный, Предложный],
+            "над" => vec![Творительный],
+            "нет" => vec![Именительный],
+            "о" => vec![Винительный],
+            "обо" => vec![Винительный],
+            "около" => vec![Родительный],
+            "от" => vec![Родительный],
+            "перед" => vec![Творительный],
+            "по" => vec![Винительный, Дательный, Предложный],
+            "под" => vec![Винительный, Творительный],
+            "при" => vec![Предложный],
+            "про" => vec![Винительный],
+            "ради" => vec![Родительный],
+            "с" => vec![Родительный, Винительный, Творительный],
+            "сквозь" => vec![Винительный],
+            "среди" => vec![Родительный],
+            "у" => vec![Родительный],
+            "через" => vec![Винительный],
+        }
+    };
+    static ref ПО_ПАДЕЖУ: HashMap<Падеж, Vec<&'static str>> = {
+        let mut m = hashmap!();
+
+        for c in Падеж::ВСЕ {
+            let mut предлоги: Vec<&'static str> = vec![];
+            for (k, v) in &*ПО_ПРЕДЛОГУ {
+                if v.contains(&c) {
+                    предлоги.push(k);
+                }
+            }
+
+            m.insert(c, предлоги);
+        }
+
+        m
+    };
+}
+
+fn main() {
+    for (пд, пги) in &*ПО_ПАДЕЖУ {
+        println!("Падеж: {:?}", пд);
+        for п in пги {
+            println!("\t{}", п);
+        }
+    }
+}