Найти тему
Я, Golang-инженер

#40. Генератор хокку на Go

Оглавление

Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.

Хой, джедаи и амазонки!

Увидел на страничке ВК издательства АСТ такую иллюстрацию:

Илюстрация-игра
Илюстрация-игра

Решил написать код для реализации этой программы. Об этом сегодняшняя статья. А в конце - идея и концепция более продвинутой версии этой программы.

1. Что такое Хокку

Хокку (или хайку) – лирическое стихотворение, форма японской поэзии.

Если подходить строго, то хокку состоит не просто из трех строк: первый и последний стих (строка) хокку – пятисложные, а второй стих хокку – семисложный. Всего в хокку 17 слогов. Ниже пример хокку известного японского поэта:

Хокку
Хокку

Помните, как говорили про самураев - они и в оружии искусны, и стихи пишут, и дипломаты, и много ещё в чём преуспели. Вот - это не совсем те стихи, к которым мы привыкли. Ну разве что стихи Маяковского близки.

Переходим к разбору кода.

2. Принцип работы

Первое, что решил - вместо последней цифры лайка, буду использовать генерацию случайного числа. Это будет первая строка хокку.

Со второй и третьей строкой хокку всё понятно: вводим день и месяц рождения.

Что ещё интересного: храню строки в трёх массивах, каждый длиной 10.

Ещё из интересного: поскольку элементов в массиве 10, а количество дней в месяце и месяцев в году, больше 10, использовал лайфхак. После считывания с терминала даты рождения, брал её остаток от деления на десять:

var dayBirth int
fmt.Scan(&dayBirth)
dayBirth %= 10

Ещё решил стремиться к чистому коду. На данный момент для меня сложность - держать все мои функции в пределах 15 строк. В результате у меня получилось 7 функций, включая main. Хотя в одной функции строк получилось 24, но там обработка ошибок взяла прилично место.

3. Устройство массива

Для удобства чтения и редактирования кода, строки в массивах я хранил следующим образом:

Хранение информации в массиве
Хранение информации в массиве

Что здесь интересного: информацию записываем не в одну строку, записанную после фигурной скобки, а в отдельных строках кода. Ещё важно обращать внимание - ставить зпт после каждой строки, даже после последней.

Вопрос: что именно хранится в массивах?

Ответ: строки из произведений таких известных поэтов и писателей, как Афанасий Фет, Николай Гумилёв, Роберт Рождественский, Владимир Маяковский, Сергей Есенин, Роберт Бернс, Джон Толкин, Александр Пушкин, Фёдор Тютчев, Джордж Байрон, Евгений Евтушенко, Марина Цветаева, Александр Блок, Николай Некрасов и Анна Ахматова.

4. Архитектура

Пока я не знаком с архитектурой ЯП, но на интуитивном уровне расскажу, как устроил код и почему так.

  1. После пакета иморт я добавил констатой - длину трёх моих массивов. Далее эту константу использовал при объявлении массивов.
  2. В функции main создал бесконечный цикл, который прекращает генерировать хокку, когда пользователь сообщит об этом. Удобно - программа не требует повторного запуска, если хочешь сгенерировать несколько стихов.
  3. В этом бесконечном цикле, в самом начале прописал условие выхода из функции - это наглядно демонстрирует, когда цикл должен завершиться. Удобно.
  4. В функции main вызываю шесть других функций, которые между собой не общаются. Шесть функций вызываю, чтобы сократить длину этой функции, сделать её лаконичной.
  5. Есть три функции, в которых созданы массивы со строками произведений известных поэтов и выбираются какие строки будут в итоговом хокку.
  6. Есть функция, которая создаёт файл в случае его отсутствия и открывает его для записи. Записывает туда строки: удобно, может получиться интересное хокку, которое захочется перечитать. Благодаря этой функции, все хокку сохраняются в файл. Что можно улучшить: добавить лог с датой и временем создания хокку.
  7. Отдельная функция обработки информации после завершения хокку, которая даёт команду бесконечному циклу в функции main: завершить работу или повторить создание хокку.
  8. Есть функция печати хокку в терминал - чтобы результат сохранялся не только в файл, но и был сразу виден в IDE.

Графически это выглядит так:

Архитектура программы
Архитектура программы

Архитектуру я нарисовал за пять минут в редакторе mind-карт от Google.

5. Итоги

Сам код можно посмотреть на моём GitHub'e.

Ещё обещал поделиться идеей более продвинутого пет-проджекта на базе этой идеи. Суть в чём - в ВК есть генератор постов, результат его работы на пример ниже:

Генератор постов приложения ВК
Генератор постов приложения ВК

Хочу сделать такой же аналог. В чём его работа:

  1. Программа считывает текст с определённой веб-страницы. В частности, с частной страницы в соцсети.
  2. Выбирает текстовые фрагменты из разных записей и объединяет их.
  3. Рисует графику, создаёт jpeg-изображение.

Как поделились коллеги из чата SkillBox, тут два компонента:

  1. Спарсить исходник (со страницы ли, из чата ли), корректно выделив материал для работы (реплики одного человека, например, или цепь ответов на одно сообщение);
  2. Придумать и запрограммировать модель, которая будет собирать этот "афонаризм". Например, выбрать случайно первое слово, а следующие нанизывать, исходя из частоты встречаемости после предыдущего в исходнике (присыпать случайностью, чтоб не скучно было).
    Ну и плюс интерфейс написать.

Ребята считают, что всё равно придётся дополнительный материалы искать, документацию читать. В курсе (Skillbox) не научат разбирать веб-страницу и дергать из неё текст, например; но это несложно освоить.

Успехов, бро!

--//--//--

Если захочешь купить курс от SkillBox, воспользуйся моей реферальной ссылкой. Ты получишь огромную скидку на курс и плюс в карму за помощь каналу.

Akira Deng Available for hire https://unsplash.com/photos/gNZ6MHqtsLY
Akira Deng Available for hire https://unsplash.com/photos/gNZ6MHqtsLY

Бро, ты уже здесь? 👉 Подпишись на канал для новичков «Войти в IT» в Telegram, будем изучать IT вместе 👨‍💻👩‍💻👨‍💻