From 7bfc859bfce91d8a33b829e439141269ea6647d4 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Tue, 26 Jul 2022 23:19:29 +0300 Subject: feat(tazjin/predlozhnik): check in initial list of предлоги MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I3bc4f46964e50c8748306e579126be0192a89284 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5978 Tested-by: BuildkiteCI Reviewed-by: tazjin --- users/tazjin/predlozhnik/.gitignore | 2 + users/tazjin/predlozhnik/Cargo.lock | 23 ++++++++ users/tazjin/predlozhnik/Cargo.toml | 8 +++ users/tazjin/predlozhnik/src/main.rs | 105 +++++++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+) create mode 100644 users/tazjin/predlozhnik/.gitignore create mode 100644 users/tazjin/predlozhnik/Cargo.lock create mode 100644 users/tazjin/predlozhnik/Cargo.toml create mode 100644 users/tazjin/predlozhnik/src/main.rs diff --git a/users/tazjin/predlozhnik/.gitignore b/users/tazjin/predlozhnik/.gitignore new file mode 100644 index 000000000000..eccd7b4ab85e --- /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 000000000000..cf08a1f510d5 --- /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 000000000000..316ed717ebba --- /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 000000000000..73b19201fbb4 --- /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{}", п); + } + } +} -- cgit 1.4.1