use crate::lab_trait::Lab; use eframe::egui; use std::collections::HashSet; enum State { Nothing, Cipher, Decipher, Line(u32), RDecipher, RLine(u32), } pub struct Window { state: State, line: u32, q1: Vec, q2: Vec, q3: Vec, q4: Vec, rq1: String, rq2: String, rq3: String, rq4: String, rline: u32, } impl Default for Window { fn default() -> Self { Self { state: State::Nothing, line: 1, q1: vec![ "Нечаянно пригрѣтый славой".to_string(), "Орла двуглаваго щипали".to_string(), "Остервененіе народа".to_string(), "Мы очутилися въ П".to_string(), "Скажи за чѣмъ ты въ сам дѣлѣ".to_string(), "Но стихоплетъ Великородный".to_string(), "Авось по манью — --".to_string(), "Сей всадникъ Папою вѣнчанный".to_string(), "Безрукій К. друзьямъ Мореи".to_string(), "А про тебя и въ усъ не дуетъ".to_string(), "Предавшихъ нѣкогда — --".to_string(), "Но искры пламени инова".to_string(), "Они за рюмкой руской водки".to_string(), "У безпокойнаго Никиты".to_string(), "Свои рѣшительныя мѣры".to_string(), "Блеститъ надъ К. тѣнистой".to_string(), "Надъ нами З — валъ тогда".to_string(), "У Б — шатра".to_string(), "Б., зима иль Р. Б.".to_string(), "А Р. З. главой З.".to_string(), "Меня уже предупредилъ".to_string(), "Семействамъ возвратитъ с".to_string(), "Изчезнувшій какъ тѣнь зари".to_string(), "Изъ К. ужъ мигалъ".to_string(), "Ты А. холопъ".to_string(), "Свирѣпой шайкѣ палачей".to_string(), "Уже издавно можетъ быть ".to_string(), ], q2: vec![ "Моря достались Албіону".to_string(), "Авось дороги намъ испр.".to_string(), "Измученъ казнію покоя".to_string(), "Кинжалъ… тѣмъ… ".to_string(), ], q3: vec![ "Вл. слабый и лукавый".to_string(), "Его мы очень смирн знали".to_string(), "Гроза 12 года".to_string(), "Но Богъ помогъ — сталъ ропотъ ниже".to_string(), "И чѣмъ жирнѣе тѣмъ тяжелѣ".to_string(), "Авось, о Шиболетъ народный".to_string(), "Авось аренды забывая".to_string(), "Сей мужъ судьбы, сей странникъ бранный".to_string(), "Тряслися грозно Пиринеи —".to_string(), "Я всѣхъ уйму съ моимъ народомъ".to_string(), "Потѣшный полкъ Петра титана ".to_string(), "Р. Р. снова присм…".to_string(), "У нихъ [свои бывали] сходки".to_string(), "Витійствомъ рѣзкимъ знамениты".to_string(), "Другъ Марса, Вакха и Венеры".to_string(), "[Но т] Такъ было надъ Невою льдистой".to_string(), "Плѣшивый щеголь врагъ труда".to_string(), "Когда ненаши повара".to_string(), "Насти… — кто тутъ намъ помогъ?".to_string(), "И скоро сило вещей".to_string(), "ОР… нашъ н".to_string(), "Тебѣ бъ я оду посвятилъ".to_string(), "Ханжа запрется въ монастырь".to_string(), "Предъ кѣмъ унизились З".to_string(), "Волканъ Неаполя пылалъ".to_string(), ], q4: vec![ "Нашъ З. въ покоѣ говорилъ".to_string(), "Дружина старыхъ усачей".to_string(), "И пуще З. пошелъ кутить".to_string(), "Они за чашею вина".to_string(), "Сбирались члены сей семьи".to_string(), "Тутъ [бы] Л. дерзко предлагалъ".to_string(), "Но тамъ гдѣ ранѣе весна ".to_string(), ], rq1: String::new(), rq2: String::new(), rq3: String::new(), rq4: String::new(), rline: 1, } } } impl Lab for Window { fn get_name(&self) -> &str { "Задача №7" } fn update(&mut self, ui: &mut egui::Ui) { if ui.button("Вывести оригинал").clicked() { self.state = State::Cipher; } if ui.button("Вывести дешифровку").clicked() { self.state = State::Decipher; } ui.horizontal(|ui| { if ui .add(egui::DragValue::new(&mut self.line).clamp_range(1..=56)) .changed() { self.state = State::Nothing; } if ui.button("Вывести строку").clicked() { self.state = State::Line(self.line); } }); let response = ui.add(egui::TextEdit::multiline(&mut self.rq1)); if response.changed() { self.state = State::Nothing; } let response = ui.add(egui::TextEdit::multiline(&mut self.rq2)); if response.changed() { self.state = State::Nothing; } let response = ui.add(egui::TextEdit::multiline(&mut self.rq3)); if response.changed() { self.state = State::Nothing; } let response = ui.add(egui::TextEdit::multiline(&mut self.rq4)); if response.changed() { self.state = State::Nothing; } if ui.button("Вывести дешифровку введённого текста").clicked() { self.state = State::RDecipher; } ui.horizontal(|ui| { let q1 = self.rq1.lines().collect::>().len(); let q2 = self.rq2.lines().collect::>().len(); let q3 = self.rq3.lines().collect::>().len(); let q4 = self.rq4.lines().collect::>().len(); if ui .add(egui::DragValue::new(&mut self.rline).clamp_range(1..=q1 + q2 + q3 + q4)) .changed() { self.state = State::Nothing; } if ui.button("Вывести строку введённого текста").clicked() { self.state = State::RLine(self.rline); } }); match self.state { State::Nothing => {} State::Cipher => { let mut cipher = Vec::new(); cipher.extend(&self.q1); cipher.extend(&self.q2); cipher.extend(&self.q3); cipher.extend(&self.q4); egui::ScrollArea::vertical().show(ui, |ui| { for line in cipher { ui.label(line); } }); } State::Decipher => { egui::ScrollArea::vertical().show(ui, |ui| { get_poem(&self.q1, &self.q2, &self.q3, &self.q4) .into_iter() .for_each(|x| { ui.label(x); }); }); } State::Line(n) => { let poem = get_poem(&self.q1, &self.q2, &self.q3, &self.q4); ui.label(format!("Строка {}: \"{}\"", n, poem[n as usize - 1])); } State::RDecipher => { let q1 = splitlines(&self.rq1); let q2 = splitlines(&self.rq2); let q3 = splitlines(&self.rq3); let q4 = splitlines(&self.rq4); let mut lens = HashSet::new(); lens.insert(q1.len()); lens.insert(q2.len()); lens.insert(q3.len()); lens.insert(q4.len()); if lens.len() != 1 { ui.label("Введённые тексты должны быть одинаковой длины"); } else { get_random_poem(&q1, &q2, &q3, &q4) .into_iter() .for_each(|x| { ui.label(x); }); } } State::RLine(n) => { let q1 = splitlines(&self.rq1); let q2 = splitlines(&self.rq2); let q3 = splitlines(&self.rq3); let q4 = splitlines(&self.rq4); let mut lens = HashSet::new(); lens.insert(q1.len()); lens.insert(q2.len()); lens.insert(q3.len()); lens.insert(q4.len()); if lens.len() != 1 { ui.label("Введённые тексты должны быть одинаковой длины"); } else { let poem = get_random_poem(&q1, &q2, &q3, &q4); ui.label(format!("Строка {}: \"{}\"", n, poem[n as usize - 1])); } } } } } fn splitlines(text: &String) -> Vec { text.lines().map(|x| x.to_string()).collect::>() } fn get_poem( q1: &Vec, _q2: &Vec, q3: &Vec, q4: &Vec, ) -> Vec { let mut cipher = Vec::new(); cipher.extend(q1); cipher.extend(q3); cipher.extend(q4); let mut key = vec![27, 43, 0, 16]; let mut poem = Vec::new(); let mut count = 1; while key[1] < cipher.len() { if count == 5 { for i in 0..=2 { poem.push(cipher[key[i]].clone()); key[i] += 1; } } else if count == 10 { for i in 0..=1 { poem.push(cipher[key[i]].clone()); key[i] += 1; } key[2] += 1; key[3] += 1; } else if count == 11 || count >= 13 && count <= 16 { for i in 0..=2 { poem.push(cipher[key[i]].clone()); key[i] += 1; } key[3] += 1; } else { for i in 0..=3 { poem.push(cipher[key[i]].clone()); key[i] += 1; } } count += 1; } return poem; } fn get_random_poem( q1: &Vec, q2: &Vec, q3: &Vec, q4: &Vec, ) -> Vec { let mut poem = Vec::new(); for i in 0..q1.len() { poem.push(q3[i].clone()); poem.push(q4[i].clone()); poem.push(q1[i].clone()); poem.push(q2[i].clone()); } return poem; }