Author Topic: Простое тестовое задание. Алгоритм Луна  (Read 8482 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Простое тестовое задание 1

Предлагаю простое тестовое задание для новичков. В процессе его выполнения можно подучиться писать скрипты на Clickermann и повысить свой скилл.
Задание НЕ игровое. НЕ на поиск изображений или работе с экраном. Просто вычисления, циклы, работа со строками и вводом информации.

Алгоритм Луна — алгоритм вычисления контрольной цифры номера пластиковой карты в соответствии со стандартом ISO/IEC 7812
[spoiler]Не является криптографическим средством, а предназначен в первую очередь для выявления ошибок, вызванных непреднамеренным искажением данных (например, при ручном вводе номера карты, при приёме данных о номере социального страхования по телефону). Позволяет лишь с некоторой степенью достоверности судить об отсутствии ошибок в блоке цифр, но не даёт возможности нахождения и исправления обнаруженной неточности.

Наиболее распространённые применения для подсчёта контрольной цифры:
•   Номера всех банковских карт
•   Номера некоторых дисконтных карт
•   Коды социального страхования
•   IMEI-коды.
•   Расчёт контрольного знака единого 8-значного номера железнодорожного вагона на РЖД.
•   Расчёт ICCID (от англ. Integrated Circuit Card Id) — уникальный серийный номер SIM-карты.[/spoiler]
Оригинальный алгоритм, описанный разработчиком
[spoiler]1. Цифры проверяемой последовательности нумеруются справа налево.
2. Цифры, оказавшиеся на нечётных местах, остаются без изменений.
3. Цифры, стоящие на чётных местах, умножаются на 2.
4. Если в результате такого умножения возникает число больше 9, оно заменяется суммой цифр получившегося произведения — однозначным числом, то есть цифрой.
5. Все полученные в результате преобразования цифры складываются. Если сумма кратна 10, то исходные данные верны.
В примере: последняя цифра — контрольная. Для того, чтобы номер был верен в соответствии с алгоритмом Луна, контрольная цифра должна быть равна 7.
4  5  6  1     2  6  1  2     1  2  3  4     5  4  6  7
8     12       4     2        2     6        10    12
8     3        4     2        2     6        1     3

8+5+3+1 + 4+6+2+2 + 2+2+6+4 + 1+4+3+7 = 60
Сумма кратна 10 – значит номер верный.[/spoiler]


Ссылка на описание в википедии. Там же и описан алгоритм. Алгоритм очень простой.

Нужно сделать два скрипта. Или один общий.

1.   Скрипт проверки верности существующей контрольной цифры. Т.е. вводим номер с контрольной цифрой на конце. Результат должен быть в сообщении есть в номере ошибки или нет.
2.   Скрипт вычисления контрольной цифры и вывод номера уже с контрольной цифрой.

Скрипты должны быть не наброском «примерно так», а в уже законченном рабочем виде, чтобы ими можно было пользоваться. Вариант реализации – произвольный. Можно использовать массивы, можно не использовать. Для красоты и визуальной разбивки кода можно использовать деление на подпрограммы.
Понятно, что совсем новичкам достаточно будет сделать базовые функции. Массивы, подпрограммы, и остальное, можно оставить на будущее – на «вырост».


Какие команды Clickermann-а вероятно могут понадобиться (из справки):
[spoiler]Основные конструкции:
IF (expression) ... END_IF - проверяет истинность выражения и выполняет блоки инструкций в зависимости от результата
FOR ($var, expression, [step]) ... END_CYC - организует цикл с параметром
WHILE (expression) ... END_CYC - организует цикл с предусловием
SUB (sub_name, [$par1, ...]) ... END_SUB - описывает подпрограмму
WAITMS (delay) - приостанавливает выполнение сценария на несколько миллисекунд
HALT([close]) - полностью останавливает выполнение сценария

Работа с числами:
INT (num) - числовая функция; возвращает целую часть числа без округления. Так же используется для перевода строки в целое число
INC ($var, [value]) - увеличивает значение переменной

Диалоговые окна ввода/вывода:
INPUTBOX("message", "default", [delay]) - строковая функция; выводит диалоговое окно для ввода строки
DIALOGBOX("message", buttons, icon) - числовая функция; выводит диалоговое окно с текстом и кнопками
RADIOBOX("message", radio1, ...) - числовая функция; выводит диалоговое окно с переключателями

Функции работы со строками:
STRLEN ("str") - числовая функция; возвращает длину строки в символах
STRFILTER ("str", "set", mode) - строковая функция; возвращает отфильтрованную строку
STRCUT ("str", begin, size) - строковая функция; возвращает кусок строки
STRCONCAT ("str1", "str2", ...) - строковая функция; возвращает объединенную строку

Для отладки кода использовать вывод в лог и трей:
LOGSHOW (show, [x, y]) - скрывает/отображает окно лога программы
HINTPOPUP ("message", ["title"]) - выводит всплывающее сообщение в системный трей [/spoiler]
Полное описание команд и функций с примерами  можно посмотреть в справке.


Для примера берём номер из вики

Code: [Select]
4561 2612 1234 5467  - проверить, нет ли в номере ошибок
4561 2612 1234 546   - найти контрольную цифру, в данном случае «7»

Во вложении мой пример реализации Luhn_algorithm.cms. Код пока скрыт, но полностью рабочий.
Для Clickermann версии 4.12 build 001

При вводе удаляются все символы, кроме цифр. Если в буфере обмена есть цифры, при вводе они предлагаются как значение по умолчанию.
Если определяли контрольную цифру, по окончании число+кэта цифра помещены в буфер обмена.

Делайте свои варианты и выкладывайте. Можете и не выкладывать  :D.


« Last Edit: March 29, 2017, 02:49:34 PM by Vint »


Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
 :o Для новичков это слишком резкий старт.
Сюда влетаю иногда... Возник вопрос и завелась метла

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Так кажется. Там всё очень просто.
Половина кода это ввод-вывод данных.
Сам алгоритм - один цикл и пара тройка условий.


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Нет, слово "Новички" здесь и рядом не стояло  ;D

Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
Тут новички только познают, что не надо задавать в начале скрипта переменные с нулевыми значениями, а вы говорите Алгоритм Луна простое задание...
Задание - это очень хорошая идея. Только пусть продвинутые сдают зачет через личку, чтобы у новичков было время побуксовать и поднять лапки кверху  ;D
Сюда влетаю иногда... Возник вопрос и завелась метла

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Да как же так :-\. Я, когда натолкнулся на страницу в вики, сразу подумал, что задание довольно простое и подходит на роль обучающего, чтоб не тренироваться на синтетических заданиях высосанных из пальца.
И алгоритм придумывать не нужно, он описан в 5 пунктах. Где 4 первых пункта - это всего один цикл с двумя вложенными условиями.
Видать я текстом перегрузил  :)
« Last Edit: March 08, 2017, 09:58:41 PM by Vint »


Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
Дядя Vint, а у вас нет в заначке для нас, новеньких, другого задания, скажем, из категории примитивных нулевых?  ::)
Сразу говорю, Примитивное квестовое задание 0 - найти справку Clickermann, я уже выполнила  ;D
« Last Edit: March 09, 2017, 04:15:20 PM by Tochka »
Сюда влетаю иногда... Возник вопрос и завелась метла

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
а мне вот некогда в школу к дяде-винту
пичаль ;)

Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
а мне вот некогда в школу к дяде-винту
пичаль ;)
А ещё активный участник называется... Как не стыдно прогуливать?  ;D
Сюда влетаю иногда... Возник вопрос и завелась метла

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Дядя Vint, а у вас нет в заначке для нас, новеньких, другого задания, скажем, из категории примитивных нулевых?  ::)
Сразу говорю, Примитивное квестовое задание 0 - найти справку Clickermann, я уже выполнила  ;D

Вот не мои 3 задания. Не знаю какой там уровень.
http://crapware.aidf.org/forum/index.php?topic=2369.0;topicseen
« Last Edit: March 09, 2017, 04:35:28 PM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ладно. Вот ещё одно задание. Сам давно подумывал сделать и вот только что натолкнулся и вспомнил. Вполне себе бытовое и нужное.
https://www.codewars.com/kata/checking-groups

Гуглоперевод

В принципе всё понятно, проверить правильность вложенности скобок в строке. Выдать ответ "правильно" / "неправильно".


Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
Надеюсь, сайт не сломаю, пока правильно выполню...  ???
Сюда влетаю иногда... Возник вопрос и завелась метла

Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
Спасибо. Увлекательно. Возможно, я потеряюсь на какое-то время.
Сюда влетаю иногда... Возник вопрос и завелась метла

Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Если школа дяди-винта еще открыта, попробую показать результат.
 В принципе, задание и правда не очень сложное.  С отладкой немного помучалась. Предпочла все-таки  номер с начала анализировать - вроде для поиска контрольного числа это удобнее.
В общем,  получилось как-то так. Не факт, что всё рационально построено, но уже работает.

Какая там у вас восхитительная абракадабра! Даже возникло безумное желание расшифровать , а что на самом деле там написано.
« Last Edit: June 04, 2017, 05:41:03 PM by Qwerry »

vvm32

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Кстати, приятно, что винт сослался на мою тему(кликермен) с задачками. Я сейчас для одного сайта с книгами пишу скриптики для выкладывания файлов, и так далее. Все игры забросил. Кому будут нужны книги или баллы на twirpx.com - обращайтесь)