Программная реализация решения головоломки «Господин S и господин P» по Арсаку в 1С::Журнал СА 12.2018
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Дата-центры  

Дата-центры: есть ли опасность утечки данных?

Российские компании уже несколько лет испытывают дефицит вычислительных мощностей. Рост числа проектов,

 Читать далее...

Книжная полка  

Защиты много не бывает

Среди книжных новинок издательства «БХВ» есть несколько изданий, посвященных методам социальной инженерии

 Читать далее...

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6447
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 7143
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4422
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 3095
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3892
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3910
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6396
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3242
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3539
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7378
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10735
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12454
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 14121
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9205
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7150
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5456
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4689
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3506
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3218
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3457
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3100
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 Программная реализация решения головоломки «Господин S и господин P» по Арсаку в 1С

Архив номеров / 2018 / Выпуск №12 (193) / Программная реализация решения головоломки «Господин S и господин P» по Арсаку в 1С

Рубрика: Разработка /  Изучаем «1С»   | Дополнительные материалы

Кирилл Ткаченко КИРИЛЛ ТКАЧЕНКО, инженер 1-й категории, ФГАОУ ВО «Севастопольский государственный университет», tkachenkokirillstanislavovich@gmail.com

Программная реализация решения
головоломки «Господин S и господин P» по Арсаку в 1С

Программная реализация решения головоломки «Господин S и господин P» по Арсаку в 1СПредлагается программная реализация головоломки «Господин S и господин P» по Арсаку. Используется язык программирования 1С, рассматривается работа с подпрограммами, циклами, ветвлением, одномерными массивами

Обучению языку программирования 1С посвящено немало публикаций. Особняком стоит подход на основе решения головоломок [1]. Рассмотрим непростую головоломку – «Господин S и господин P» [2]. Она довольно известна, имеет множество программных решений [3, 4]. По этой причине использование языка 1С для построения программы, находящей решение головоломки, выглядит целесообразным.

Головоломка имеет следующее условие. Были выбраны два целых положительных числа, каждое из которых не меньше двух и не больше 99. Значение суммы этих двух целых положительных чисел было сообщено господину S и только ему, значение их произведения – господину P и только ему. В ходе диалога между S и P господин S утверждает, что господин P не знает этих двух чисел. Тогда господин P понимает, что теперь он знает эти два числа. Вслед за ним господину Sтакже становятся ясны значения этих чисел.

Пусть искомые два числа есть А и Б. В соответствии с этим диалогом необходимо породить возможные пары чисел А и Б таким образом, чтобы выполнялись три условия:

  1. Значение суммы Д + Е невозможно представить в виде суммы некоторых двух простых чисел.
  2. Значение произведения В * Г имеет единственное представление в виде суммы некоторых двух целых положительных чисел Д + Е, удовлетворяющих условию I.
  3. Значение суммы А + Б имеет единственное представление в виде произведения двух целых положительных чисел В * Г, удовлетворяющих условию II.

В силу того, что условие III ссылается на II, а II – на I, проверку удобно осуществлять в порядке условий III, II, I.

Программный модуль управляемого приложения начинается с определения переменных ВЕРХ_ГРАН, целочисленной переменной для хранения верхней границы рассмотрения чисел, равной 99, и ПростыеЧисла – целочисленного одномерного массива, в котором будут располагаться простые числа на отрезке от 2 до 99:

Перем ВЕРХ_ГРАН;
Перем ПростыеЧисла;

Процедура Инициализация() производит установку начальных значений переменных. В частности, порождение списка простых чисел. Для построения списка простых чисел хорошо подходит решето Эратосфена [5, 6]. Процедура начинается с определения переменных Решето, в которой будут располагаться отметки о простоте чисел, а также АБ – счетчики циклов и индексные переменные:

Процедура Инициализация()
    Перем Решето;
    Перем А, Б;

Верхняя граница рассмотрения чисел равна 99:

    ВЕРХ_ГРАН = 99;

Создаются новые массивы Решето и ПростыеЧисла:

    Решето = Новый Массив();
    ПростыеЧисла = Новый Массив();

Вначале считается, что все числа в решете – простые. Для удобства адресации элементов массива заполнение начинается с нуля:

    Для А = 0 По ВЕРХ_ГРАН Цикл
        Решето.Добавить(Истина);
    КонецЦикла;

Построение решета не относится непосредственно к головоломке, простые числа первой сотни можно задать значениями в программном коде (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97). С первого простого числа, равного 2, по границу рассмотрения кратные числа отмечаются как составные:

    Для А = 2 По ВЕРХ_ГРАН Цикл
        Если Решето[А] Тогда
            Б = А + А;

Происходит увеличение кратного числа на шаг, равный рассматриваемому простому числу:

            Пока Б <= ВЕРХ_ГРАН Цикл
                Решето[Б] = Ложь;
                Б = Б + А;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;

Значения всех числа, отмеченных как простые, переносятся в массив простых чисел:

    Для А = 2 По ВЕРХ_ГРАН Цикл
        Если Решето[А] Тогда
            ПростыеЧисла.Добавить(А);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция Простое(А) возвращает значение истина, если число А является простым, то есть содержится в массиве ПростыеЧисла:

Функция Простое(А)
    Возврат ПростыеЧисла.Найти(А) <> Неопределено;
КонецФункции

Функция УсловиеI(Сум) проверяет условие I для значения Сум. Определяется целочисленная переменная А – слагаемое:

Функция УсловиеI(Сум)
    Перем А;

Для всех возможных значений А, когда А может являться слагаемым, проверяется условие простоты для слагаемых суммы Сум. Если оно выполняется, то условие I для Сум не выполняется и возвращается значение Ложь:

    Для А = 2 По Цел(Сум / 2) Цикл
        Если Простое(А) И Простое(Сум - А) Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;

Иначе условие I для Сум выполняется и получаем Истина:

    Возврат Истина;
КонецФункции

Функция УсловиеII(Произв) проверяет условие II для значения произведения Произв. Определяются целочисленные переменные А и Б – множители, а также Количество – количество раз, когда выполнялось для текущей проверяемой суммы условие I:

Функция УсловиеII(Произв)
    Перем А, Б;
    Перем Количество;

Вначале это количество равно 0:

    Количество = 0;

Для всех возможных значений первого целочисленного множителя А, если он является множителем, то определяется второй целочисленный множитель Б:

    Для А = 2 По Цел(Sqrt(Произв)) Цикл
        Если Произв % А = 0 Тогда
            Б = Цел(Произв / А);

Если второй множитель Б принадлежит отрезку [2; ВЕРХ_ГРАН] и для суммы А + Б выполняется условие I, то инкрементируется количество выполнения условия I:

            Если (2 <= Б) И (Б <= ВЕРХ_ГРАН) И УсловиеI(А + Б) Тогда
                Количество = Количество + 1;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

Условие II выполняется, когда условие I выполняется единственный раз:

    Возврат Количество = 1;
КонецФункции

Функция УсловиеIII(Сум) проверяет условие III для значения суммы Сум. Определяются целочисленные переменные А – слагаемое; НайденноеА – найденное, удовлетворяющее условию II, значение АКоличество – количество найденных значений А:

Функция УсловиеIII(Сум)
    Перем А;
    Перем НайденноеА;
    Перем Количество;

Вначале НайденноеА и Количество равны 0:

    НайденноеА = 0;
    Количество = 0;

Если для значения суммы Сум выполняется условие I, то для всех допустимых значений слагаемого А:

    Если УсловиеI(Сум) Тогда
        Для А = 2 По Цел(Сум / 2) Цикл

Если для произведения слагаемых выполняется условие II, то значение слагаемого А считается найденным и инкрементируется количество выполнения условий II:

            Если УсловиеII(А * (Сум - А)) Тогда
                НайденноеА = А;
                Количество = Количество + 1;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

Если условие II выполняется единственный раз, возвращается найденное значение слагаемого, иначе возвращается 0:

    Возврат ?(Количество = 1, НайденноеА, 0);
КонецФункции

Процедура Решение() осуществляет поиск решения головоломки. Целочисленные переменные Сум – рассматриваемая сумма, А – слагаемое по условию III, строковая переменная Рез – отображаемый результат:

Процедура Решение()
    Перем Сум;
    Перем А;
    Перем Рез;

Для возможных значений суммы Сум, если существует слагаемое А, удовлетворяющее условию III, то есть также всем условиям I, II, III, результат – найденная пара целых положительных чисел А и (Сум – А) – сообщается пользователю:

    Для Сум = 2 По ВЕРХ_ГРАН Цикл
        А = УсловиеIII(Сум);
        Если А > 0 Тогда
            Рез = "" + А + ", " + (Сум - А);
            Сообщить(Рез);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура Главная() производит инициализацию переменных и нахождение решения:

Процедура Главная()
    Инициализация();
    Решение();
КонецПроцедуры

Происходит вызов главной процедуры:

Главная();

В результате работы программы была получена только одна пара целых положительных чисел – 4 и 13 (см. рис.1).

Рисунок 1. Результат работы программы

Рисунок 1. Результат работы программы

Полный текст работы программы находится на сайте журнала http://samag.ru.

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

  1. Ткаченко К. Программная реализация в 1С варианта головоломки «Песенка спета» по Арсаку. // «Системный администратор», № 4, 2018. – С. 47-49. URL: http://samag.ru/archive/article/3631.
  2. Арсак Ж. Программирование игр и головоломок / Ж. Арсак. – М.: Наука, 1990. – 224 с.
  3. Sum and Product Puzzle // Wikipedia. URL: https://en.wikipedia.org/wiki/Sum_and_Product_Puzzle (дата обращения: 22.10.2018).
  4. Sum and Product Puzzle // Rosetta Code. URL: http://rosettacode.org/wiki/Sum_and_Product_Puzzle (дата обращения: 21.10.2018).
  5. Перминов О.Н. Программирование на языке Паскаль / О.Н. Перминов. – М.: Радио и связь, 1988. – 224 с.
  6. Sieve of Eratosthenes // Rosetta Code. URL: http://rosettacode.org/wiki/Sieve_of_Eratosthenes (дата обращения: 07.11.2018).

Ключевые слова: 1С, головоломка, программирование.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru