Информация: Уважаемые посетители! В течение нескольких месяцев на форуме существовала проблема с регистрацией новых пользователей, о которой администрации стало известно недавно. Если вы ранее пытались зарегистрироваться на форуме, но не получили на ваш e-mail письмо с ссылкой для подтверждения регистрации, просим вас зарегистрироваться повторно. Приносим извинения за доставленные неудобства. Если вы все еще испытываете проблемы с регистрацией на форуме, обратитесь за помощью на e-mail: mr.angelo@railroadsim.net

Аватара пользователя
Света
 
Сообщения: 492
Зарегистрирован: 18.06.2016, 19:38
Играю в: Train Simulator 2018
Роль: Разработчик
Блог: Просмотр блога (7)
Архивы
Поиск в блогах

1 из 52 из 53 из 54 из 55 из 5

Генератор номеров ПС

Постоянная ссылка Света 05.05.2018, 17:02

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

В процессе работы скрипт генерирует номера согласно указанному шаблону, отслеживает и блокирует создание дубликатов, сохраняет результат работы в файл numbers.csv в требуемом игрой формате и параллельно в архивный файл для поиска дубликатов в дальнейшем.

Принцип работы
Номер генерируется согласно шаблону. Пример шаблона: "661:r1:rr1:d00:ca". Шаблон может состоять из любого количества блоков (частей, разделенных двоеточиями), формат блока определяет метод обработки. В данной версии скрипта может быть пять методов обработки - копирование, сборка блока из случайных чисел, сборка блока из случайных чисел с ограничением, последовательное инкрементирование и создание контрольного числа.
Копирование. Это просто перенос блока в будущий номер. Копирование применяется к блокам, которые полностью состоят из чисел, в случае с приведенным примером это будет блок "661". Этот кусок будет копироваться в каждый генерируемый номер.
Сборка блока из случайных чисел. Это действие будет произведено с блоком, начинающимся с литеры "r". Число, находящееся после "r", указывает количество разрядов случайного числа. Блок из примера заставит скрипт создать случайное однозначное число.
Сборка блока из случайных чисел с ограничением. Аналогично предыдущему, за исключением того, что цифры, указанные в таблице Restriction = {9} будут пропускаться. В данном случае это цифра "9". Если надо запретить ещё какие-то цифры, их нужно вписать в таблицу через запятую (Restriction = {9, 2, 6}).
Последовательное инкрементирование. Этот метод запускается, если блок начинается с литеры "d". Число после литеры будет вставлено в первый генерируемый номер, в следующий - это число + 1 и т.д., до тех пор, пока не будет набрано нужное количество номеров или не будет достигнут предел для указанного числа разрядов (в данном примере последним допустимым числом будет 99). Если достигнут предел, а заданное количество номеров не сгенерировано, скрипт выдаст сообщение об ошибке.
Создание контрольного числа. Этот метод запускается, если блок начинается с литеры "c". Следующая литера - тип метода. В данный момент это "а" - единственный на данный момент метод. Суть его работы - реализация вот этого алгоритма:
Восьмая цифра - контрольная.
Контрольным числом - является число, дополняющее под разрядную сумму до ближайшего целого десятка. Если, под разрядная сумма кратна 10, то контрольный знак равен 0. В примере контрольным знаком будет 8.
Номер вагона 7 4 8 5 4 6 8
Множитель 2 1 2 1 2 1 2
Произведение 14 4 16 5 8 6 16
Сумма 1 + 4 + 4 + 1 + 6 + 5 + 8 + 6 + 1 + 6 = 42
Обработке подвергнется собранный на текущем этапе номер, то есть, в приведенном примере контрольное число будет рассчитано на номер 606+4 случайных цифры. Если после этого блока в шаблоне есть ещё какие-нибудь, они учитываться не будут.

После того, как номер сгенерировался, он проходит сверку на дубликаты. Сначала происходит сверка с уже существующими номерами, вписанными в файл ReconciliationFile.csv, потом - проверятся, нет ли совпадения с номерами, созданными в текущей сессии. Если совпадений не обнаружено, номер вписывается в выходной файл. Если же есть совпадение, отмечается провал генерации, номер не сохраняется.
Скрипт будет пытаться генерировать номера до тех пор, пока не будет достигнуто указанное количество номеров либо пока не будет выполнен лимит попыток.
Когда генерирование будет закончено, результат работы будет сохранен в файле numbers.csv и дописан в файл ReconciliationFile.csv.

Использование.
Распакуйте архив в любое место на диске. Единственное ограничение - в пути к папке NumberGenerator не должно быть кириллицы!.
Откройте скрипт Main.lua любым текстовым редактором. Впишите свой шаблон, количество требуемых номеров и количество разрешенных попыток генерирования:
Изображение
Сохраните изменения.
Запустите выполнение скрипта, кликнув дважды run.cmd.
Успешный запуск и выполнение скрипта будет отмечен таким окном:
Изображение
В папке Result будет созданный файл numbers.csv со всеми успешно сгенерированными номерами.
В папке Reconciliation в файл ReconciliationFile.csv будут дописаны все успешно сгенерированные номера.
Файл numbers.csv перезаписывается при каждом запуске скрипта!

Пример работы
Если запустить скрипт, указав ему такие параметры:
Код: Выделить всё
Template = "606:r4:ca"
QuantityGenerations = 10
QuantityAttempts = 150
получим такой результат:
Изображение
Как можно увидеть на скриншоте, новые номера дописались в ReconciliationFile.csv и уже будут учитываться в дальнейшем.

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

За предоставленный run.cmd благодарю Артема ака dison202.
За идею блоков Сборка блока из случайных чисел с ограничением и Последовательное инкрементирование благодарю Андрея ака BooYa.

Скрипт рассчитан на использование в ОС Windows, корректную работу в других ОС не гарантирую!

Что бы увидеть скрытое сообщение Вам необходимо зарегистрироваться и войти на форум официально
Последний раз редактировалось Света Вчера, 22:13, всего редактировалось 2 раз(а).

Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
2 комментариев 3843 просмотров
Комментарии

Re: Генератор номеров ПС

Постоянная ссылка BooYa 07.11.2018, 01:24

Необходимо доработать скрипт на создание рандомного числа первого порядка, с ограничением по конкретной цифре.
К примеру, у грузовых это седьмая цифра номера:
Седьмая цифра номера вагона несет информацию о наличии у него переходной площадки (0-8 – без тормозной площадки, 9 – с тормозной площадкой).

То есть, нужен блок для создания рандомного числа от 0 до 9, с введением ограничения по конкретной цифре. В данном случае нам нужен блок r1 с ограничением до 8.
Ограничение по конкретной цифре будет удобнее, т.к. у локомотивов, пассажирских и иных вагонов могут быть подобные правила формирования номера, и этот блок будет универсальным, для любых номеров.
Последний раз редактировалось BooYa 07.11.2018, 01:26, всего редактировалось 1 раз.
Аватара пользователя
BooYa
 
Сообщения: 2587
Зарегистрирован: 24.01.2010, 16:30
Откуда: Екатеринбург
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Андрей
Блог: Просмотр блога (0)

Re: Генератор номеров ПС

Постоянная ссылка Света 07.11.2018, 08:52

Не вопрос, допишу такой блок, только надо придумать, как его обозначать в шаблоне :)
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 492
Зарегистрирован: 18.06.2016, 19:38
Играю в: Train Simulator 2018
Роль: Разработчик
Блог: Просмотр блога (7)

Кто сейчас на конференции

Зарегистрированные пользователи: Bing [Bot], Google [Bot], Просто_Александр

cron