about summary refs log tree commit diff
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
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>
-rw-r--r--users/tazjin/predlozhnik/.gitignore2
-rw-r--r--users/tazjin/predlozhnik/Cargo.lock23
-rw-r--r--users/tazjin/predlozhnik/Cargo.toml8
-rw-r--r--users/tazjin/predlozhnik/src/main.rs105
4 files changed, 138 insertions, 0 deletions
diff --git a/users/tazjin/predlozhnik/.gitignore b/users/tazjin/predlozhnik/.gitignore
new file mode 100644
index 0000000000..eccd7b4ab8
--- /dev/null
+++ b/users/tazjin/predlozhnik/.gitignore
@@ -0,0 +1,2 @@
+/target/
+**/*.rs.bk
diff --git a/users/tazjin/predlozhnik/Cargo.lock b/users/tazjin/predlozhnik/Cargo.lock
new file mode 100644
index 0000000000..cf08a1f510
--- /dev/null
+++ b/users/tazjin/predlozhnik/Cargo.lock
@@ -0,0 +1,23 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
+[[package]]
+name = "predlozhnik"
+version = "0.1.0"
+dependencies = [
+ "lazy_static",
+ "maplit",
+]
diff --git a/users/tazjin/predlozhnik/Cargo.toml b/users/tazjin/predlozhnik/Cargo.toml
new file mode 100644
index 0000000000..316ed717eb
--- /dev/null
+++ b/users/tazjin/predlozhnik/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "predlozhnik"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+maplit = "1.0"
+lazy_static = "1.4"
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{}", п);
+        }
+    }
+}