|   |   | 
| 
 | Не могу решить никак задачу. помогите! | ☑ | ||
|---|---|---|---|---|
| 0
    
        dalacovalexey 20.03.19✎ 16:41 | 
        Добрый день!
 Пудьте добры подсткажите, не могу никак решить задачу! Замок состоящий из определенного количества барабанов и каждый барабан имеет определенные цифры через переменные. переменные: КоличествоБарабанов - это количество барабанов на замке МаксимальноеЗначение - это максмальное значение барабана минимальное значение - это минимальное значение барабана Надо через обработку вывести все возможные комбинации не могу никак сообразить как написать правильно код! Спасибо всем и не судите строго! | |||
| 1
    
        dalacovalexey 20.03.19✎ 16:42 | 
        Както через массивы вроде как но ума не приложу как...     | |||
| 2
    
        ДенисЧ 20.03.19✎ 16:43 | 
        выбрать различные
 ? И что такое "переменная" в твоём контексте? | |||
| 3
    
        1Сергей 20.03.19✎ 16:44 | 
        три вопроса:
 1. На какую букву ударение в слове замок? 2. Почему он состоит из барабанов? 3. Что курил автор? | |||
| 4
    
        antgrom 20.03.19✎ 16:45 | 
        поскольку про оптимальность решения - ни слова, то почему бы не решить задачу через цикл ?
 От меньшего значения, до большего. Каждое значение выводить. Это такая простая задача или какие то ещё требования ? | |||
| 5
    
        dalacovalexey 20.03.19✎ 16:45 | 
        К примеру
 3 барабана максимум цифра 7 минимум 3 тоесть 333 334 335 336 337 343 344 итд | |||
| 6
    
        Про100Филя 20.03.19✎ 16:46 | 
        Зачем делать замок из барабанов? Как вариант барабаны соеденить через Внутренне соединение     | |||
| 7
    
        butterbean 20.03.19✎ 16:46 | 
        (5) рекурсия тебе поможет     | |||
| 8
    
        wowik 20.03.19✎ 16:46 | ||||
| 9
    
        Fish гуру 20.03.19✎ 16:47 | 
        (0) "не могу никак сообразить как написать правильно код! " - Пиши, что делал, что не получилось.     | |||
| 10
    
        ejikbeznojek 20.03.19✎ 16:48 | 
        для СчКоличествоБарабанов=1 по КоличествоБарабанов цикл
 для СчЗначенийБарабана = МинимальноеЗначение по МаксимальноеЗначений цикл сообщить(строка(СчКоличествоБарабанов)+строка(СчЗначенийБарабана)); конецццикла КонецЦикла Если нужно вывести все, а не только уникальные значения) | |||
| 11
    
        wowik 20.03.19✎ 16:49 | 
        (0) простая комбинаторика. в первом барабане 3 ячеек, во втором 2, в третьем 3, тогда общее количество вариантов 3*2*3 = 18.
 неважно какие цифры в ячейках. | |||
| 12
    
        Жан Пердежон 20.03.19✎ 16:49 | 
        (10) тест не прошёл)     | |||
| 13
    
        ejikbeznojek 20.03.19✎ 16:50 | 
        (12) Ну я и не ведущий прог))     | |||
| 14
    
        Про100Филя 20.03.19✎ 16:50 | 
        (5) Если учесть то в (6) циклом строишь запрос где кол - во соединений это барабаны. Потом загоняешь таблицу с столбцом от минимума до максимума     | |||
| 15
    
        Cyberhawk 20.03.19✎ 16:50 | 
        Это где такие задания раздают - в Сколково?     | |||
| 16
    
        dalacovalexey 20.03.19✎ 16:51 | 
        нужно вывезти все значения возможные!
 все правильно это мне такой тест сегодня впаяли) | |||
| 17
    
        SUA 20.03.19✎ 16:51 | 
        Псевдокод
 Состояние= [Минимум1..минимумК]; Печать(Состояние); Пока +1(Состояние) Печать(Состояние) КонецЦикла; функция +1([состояние1..состояниеК]){ Барабан=К; пока (Барабан И состояние(Барабан) = максимум(Барабан)){состояние(Барабан--)=минимум(Барабан)} Если (Не Барабан) Возврат Ложь; КонецЕсли;//был везде максимум закончили Состояние(Барабан) = Состояние(Барабан)+1; Возврат Истина;//следующее состояние} | |||
| 18
    
        Жан Пердежон 20.03.19✎ 16:51 | 
        (11) простой русский язык: Надо через обработку вывести все возможные комбинации     | |||
| 19
    
        Davalebor 20.03.19✎ 16:52 | 
        (11) в (0) "Надо через обработку вывести все возможные комбинации "     | |||
| 20
    
        dalacovalexey 20.03.19✎ 16:52 | 
        подсказал экзаминатор
 както через циклы и масивы и индексы | |||
| 21
    
        wowik 20.03.19✎ 16:52 | 
        (18) все, завалил)     | |||
| 22
    
        Gantosha 20.03.19✎ 16:53 | 
        150 тысяч ?     | |||
| 23
    
        Davalebor 20.03.19✎ 16:54 | 
        (20) максимальное и минимальное значение барабана к каждого барабана разные или одинаковые?     | |||
| 24
    
        palsergeich 20.03.19✎ 16:54 | 
        (22) а то и 200     | |||
| 25
    
        Fish гуру 20.03.19✎ 16:55 | 
        (23) Судя по (0) одинаковые.     | |||
| 26
    
        ejikbeznojek 20.03.19✎ 16:56 | 
        (20) Судя по всему экзаменатор тоже тест не пройдёт))
 Наверное правильнее всего. ТЗБарабанов= новый таблицазначений; ТЗБарабанов.Колонки.Добавить(ПорядковыйНомер) Для сч=1 по КолБарабанов цикл СтрТЗБарабанов=ТЗБарабанов.добавить(); СтрТЗБарабанов.ПорядковыйНомер=Сч; конеццикла Потом тоже самое с ТЗЦифрНаБарабане. А потом передаёшь их в запрос параметрами и соединяешь. | |||
| 27
    
        SUA 20.03.19✎ 16:56 | 
        ну или если все барабаны одинаковые то еще проще
 Для й=0 По Цифр**Барабанов //степень Значение = ""; Ключ = й; Для ц=1 По Барабанов Цикл Значение = Значение + (ключ%Цифр+Минимум);ключ=ключ\Цифр;//нацело конеццикла; печать(значение); конеццикла; | |||
| 28
    
        Вафель 20.03.19✎ 16:57 | ||||
| 29
    
        dalacovalexey 20.03.19✎ 16:59 | 
        (28) количество барабанов это тоже переменная     | |||
| 30
    
        dalacovalexey 20.03.19✎ 16:59 | 
        барабаны все одинаковые     | |||
| 31
    
        Gantosha 20.03.19✎ 17:00 | 
        круглые ?     | |||
| 32
    
        dalacovalexey 20.03.19✎ 17:03 | 
        (31) по количеству цифр да     | |||
| 33
    
        Gantosha 20.03.19✎ 17:04 | 
        ну и какакие у тебя есть предложения ?     | |||
| 34
    
        ejikbeznojek 20.03.19✎ 17:05 | 
        Сектор приз есть?))     | |||
| 35
    
        fisher 20.03.19✎ 17:05 | 
        (0) Ну, блин. Это же элементарная задачка на тренировку навыков программирования начинающих. Если дать тебе готовое решение, то половина эффекта до свидания. Это как списывать.     | |||
| 36
    
        dalacovalexey 20.03.19✎ 17:06 | 
        (34) возможно возьмут на работу     | |||
| 37
    
        dalacovalexey 20.03.19✎ 17:07 | 
        (35) На первый взгляд да     | |||
| 38
    
        wowik 20.03.19✎ 17:08 | 
        (35) есть другая сторона. Научить сразу правильно, чтобы потом другим ковырять без мата.     | |||
| 39
    
        Fish гуру 20.03.19✎ 17:10 | 
        (37) На (9) ответишь?     | |||
| 40
    
        MetaDon 20.03.19✎ 17:10 | 
        (0) проблема в том, что барабанов N,
 значит и циклов вложенности N для всех комбинаций,) поэтому вписываешь циклы в текст и Выполнить() его;)) | |||
| 41
    
        Garykom гуру 20.03.19✎ 17:10 | 
        Очень хорошая задачка на умение программировать.
 Умеющий только запросы не смогет никак. | |||
| 42
    
        dalacovalexey 20.03.19✎ 17:12 | 
        Чувствую что месяц мне потребуеться решить такую элементарную задачу (((((     | |||
| 43
    
        dalacovalexey 20.03.19✎ 17:13 | 
        Дайте пожалуйста код, люди добрые     | |||
| 44
    
        Gantosha 20.03.19✎ 17:13 | 
        как раз с запросами проще всего - там все комбинация получаются умножением столбцов.     | |||
| 45
    
        Garykom гуру 20.03.19✎ 17:14 | 
        (42) Нет, задача совершенно не элементарная.
 Она на использование только простейших операторов это да. | |||
| 46
    
        fisher 20.03.19✎ 17:14 | 
        (45) Не вижу ни одного подвоха в этой задаче ни со второго взгляда, ни с третьего. Простейшая алгоритмистика.     | |||
| 47
    
        Garykom гуру 20.03.19✎ 17:15 | 
        (46) Какой цикл будет внешний а какой внутренний?
 По барабанам или по их значениям? | |||
| 48
    
        fisher 20.03.19✎ 17:16 | 
        Хотя стоп. На одном барабане ЦИФРА или ЦИФРЫ?     | |||
| 49
    
        Fish гуру 20.03.19✎ 17:17 | 
        (48) ЦифрЫ. От минимального значения до максимального.     | |||
| 50
    
        Garykom гуру 20.03.19✎ 17:18 | 
        (48) Обычный кодовый замок с цифрами и надо перебрать все комбинации.     | |||
| 51
    
        ejikbeznojek 20.03.19✎ 17:18 | 
        Массив1Порядка=новый Массив;
 Массив2гоПорядка=новый Массив; Для сч=1 по КоличествоЦифрНаБарабане цикл Массив2гоПорядка.добавить(сч); конеццикла Для сч=1 по КоличествоБарабанов цикл Массив1Порядка.добавить(Массив2гоПорядка); конеццикла Для ИндексСтрока = 0 По Массив1Порядка.Количество() - 1 Цикл Для ИндексСтолбец = 0 По Массив1Порядка[ИндексСтрока].Количество() - 1 Цикл Сообщить(Массив[ИндексСтрока][ИндексСтолбец]); КонецЦикла; КонецЦикла; Может если экзаменатор хочет через индекс и массивы, то вот третий вариант Возможно где опечатался) | |||
| 52
    
        fisher 20.03.19✎ 17:19 | 
        (50) На обычном кодовом замке на одном барабане ОДНА цифра обычно. В этом случае это примитивнейшая задача.     | |||
| 53
    
        ejikbeznojek 20.03.19✎ 17:20 | 
        Обычный кодовый замок лобзиком спиливают)))     | |||
| 54
    
        laby1 20.03.19✎ 17:20 | 
        (МаксимальноеЗначение - Минимальное значение +1 ) в степени КоличествоБарабанов     | |||
| 55
    
        laby1 20.03.19✎ 17:21 | 
        (54) Это количество комбинаций     | |||
| 56
    
        Garykom гуру 20.03.19✎ 17:21 | 
        Через циклы Для По решение довольно сложное, как выше в (51)
 Намного проще через цикл Пока | |||
| 57
    
        Fish гуру 20.03.19✎ 17:21 | 
        (52) С чего одна? Обычно от 0 до 9 на каждом барабане. Иначе в чём смысл кодового замка, где только один код возможен? :))     | |||
| 58
    
        Fish гуру 20.03.19✎ 17:22 | 
        (55) Молодец, но автору нужно не количество, а список самих комбинаций.     | |||
| 59
    
        sqr4 20.03.19✎ 17:24 | 
        (51) и че работает?     | |||
| 60
    
        Радим1987 20.03.19✎ 17:25 | 
        МассивСтрок = РазложитьСтрокуВМассивПодстрок(СтрокаПоиска," ");
 СтрокаПоискаКомбинаторикаМассив = СформироватьКомбинаторику(МассивСтрок,МассивСтрок.Количество(),Истина); //////////////////////////////////////////////////////////////////////////////// // // Функция // // Описание: // // // Параметры (название, тип, дифференцированное значение) // // Возвращаемое значение: // Функция СформироватьКомбинаторику(МассивСтрок, МаксимальноеКоличествоСлов, БезПовторов = Ложь, Основание = Неопределено, Результат = Неопределено, ТекУровень = 0) Экспорт Если Основание = Неопределено Тогда Основание = Новый Массив КонецЕсли; Если Результат = Неопределено Тогда Результат = Новый Массив КонецЕсли; Если ТекУровень < МаксимальноеКоличествоСлов - 1 Тогда Для Каждого Элемент Из МассивСтрок Цикл Если БезПовторов И НЕ Основание.Найти(Элемент) = Неопределено Тогда Иначе Основание.Добавить(Элемент); Результат = СформироватьКомбинаторику(МассивСтрок, МаксимальноеКоличествоСлов, БезПовторов, Основание, Результат, ТекУровень + 1); Основание.Удалить(Основание.Количество() - 1); Если Результат.Количество() > 300 Тогда Возврат Результат; КонецЕсли; КонецЕсли; КонецЦикла; Иначе Для Каждого Элемент Из МассивСтрок Цикл Если БезПовторов И НЕ Основание.Найти(Элемент) = Неопределено Тогда Иначе Основание.Добавить(Элемент); Результат.Добавить(Новый ФиксированныйМассив(Основание)); Основание.Удалить(Основание.Количество()-1); КонецЕсли; КонецЦикла; КонецЕсли; Возврат Результат; КонецФункции | |||
| 61
    
        ejikbeznojek 20.03.19✎ 17:25 | 
        (59) хз, я же не в конфигураторе пишу, а тут. Но если отладить в конфигураторе и исправить возможные опечатки наверное будет работать)))     | |||
| 62
    
        fisher 20.03.19✎ 17:25 | 
        (57) Имел в виду, что "результат" барабана в каждом положении - одна цифра. Если бы результат каждого барабана мог быть числом из нескольких цифр без ведущих нулей, задачка была бы интересней. Правда, с практической точки зрения она была бы неюзабельна, так как по такому результату невозможно было бы заново набрать правильную комбинацию :)     | |||
| 63
    
        Kigo_Kigo 20.03.19✎ 17:25 | 
        Я так понимаю, что каждый барабан надо разложить в массив, потом крутить эти массивы в цикле, от последнего к первому с выводом каждого результата?     | |||
| 64
    
        Вафель 20.03.19✎ 17:25 | 
        код из (28) передалать достаточно легко. основаная логики по "обходу н циклов" уже реализована | |||
| 65
    
        Fish гуру 20.03.19✎ 17:28 | 
        (62) А. ну результат конечно одна цифра.     | |||
| 66
    
        Про100Филя 20.03.19✎ 17:28 | 
        (43) Лови
 Барабан = 3; Мин = 1; Макс = 3; ТекстЗапроса = "ВЫБРАТЬ |"""+Строка(Мин)+""" КАК Палочка | Поместить ВТ_Барабан"; Для сч = (Мин + 1) По Макс Цикл ТекстЗапроса = ТекстЗапроса +" |ОБЪЕДИНИТЬ ВСЕ |ВЫБРАТЬ | """+Строка(сч)+""""; КонецЦикла; Для сч = 1 по Барабан Цикл Если сч = 1 Тогда ТекстЗапроса2 = " Барабан"+Строка(Сч)+".Палочка"; ТекстЗапроса4 = " ВТ_Барабан как Барабан"+Строка(Сч); Иначе ТекстЗапроса2 = ТекстЗапроса2 + " + Барабан"+Строка(Сч)+".Палочка"; ТекстЗапроса4 = ТекстЗапроса4 + " ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Барабан как Барабан"+Строка(Сч)+" | ПО ("+Строка(Сч)+" = "+Строка(Сч)+")"; КонецЕсли; КонецЦикла; ТекстЗапроса = ТекстЗапроса + "; |ВЫБРАТЬ" + ТекстЗапроса2 + " КАК Палочка ИЗ " + ТекстЗапроса4; Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Результат = Запрос.Выполнить().Выгрузить(); Для каждого Стр из Результат Цикл Сообщить(Стр.Палочка); КонецЦикла | |||
| 67
    
        sqr4 20.03.19✎ 17:30 | 
        (61) а я уверен что вообще нет     | |||
| 68
    
        dalacovalexey 20.03.19✎ 17:31 | 
        (63) Походу да!!!
 вот только как это реальзовать | |||
| 69
    
        ejikbeznojek 20.03.19✎ 17:32 | 
        (67) 
 Вот так работает) Массив1Порядка=новый Массив; Массив2гоПорядка=новый Массив; Для сч=1 по КоличествоЦифрНаБарабане цикл Массив2гоПорядка.добавить(сч); конеццикла; Для сч=1 по КоличествоБарабанов цикл Массив1Порядка.добавить(Массив2гоПорядка); конеццикла; Для ИндексСтрока = 0 По Массив1Порядка.Количество() - 1 Цикл Для ИндексСтолбец = 0 По Массив1Порядка[ИндексСтрока].Количество() - 1 Цикл Сообщить(Строка(ИндексСтрока+1)+Массив1Порядка[ИндексСтрока][ИндексСтолбец]); КонецЦикла; КонецЦикла; | |||
| 70
    
        Kigo_Kigo 20.03.19✎ 17:32 | 
        (66) см (20)     | |||
| 71
    
        Garykom гуру 20.03.19✎ 17:33 | 
        (66) Не считается, надо не в цикле текст запроса составлять а всего 3 параметра передать в запрос и далее все там внтури.     | |||
| 72
    
        Said_We 20.03.19✎ 17:35 | 
        (66) Порождающий запрос будет красивее, но ограничение на максимальное количество. Но если оно в 1 000 000, то ....     | |||
| 73
    
        Про100Филя 20.03.19✎ 17:39 | 
        (70) Ну так это подсказка, вариантов решить 1000.
 (71) Ну это дольше писать, я так на вскидку. Как ты в запросе количество соединений посчитаешь? (72) Да с массивом тоже самое выйдет. | |||
| 74
    
        MetaDon 20.03.19✎ 17:39 | 
        (63)(68) нафига раскладывать комбинации в массив?, достаточно строки
 Для К[i] =кмин по кмакс Цикл ; и наделать N вложенных барабанов/циклов вложенных; | |||
| 75
    
        sqr4 20.03.19✎ 17:40 | 
        КоличествоБарабанов = 5;
 МаксимальнаяЦифра = 9; МинимальнаяЦифра = 2; Мин = МинимальнаяЦифра; Множитель = 1; Для Инд = 1 по КоличествоБарабанов-1 Цикл Множитель = Множитель*10; Сообщить(множитель); Мин = Мин + МинимальнаяЦифра*Множитель; КонецЦикла; Множитель = 1; Макс = МаксимальнаяЦифра; Для Инд = 1 по КоличествоБарабанов-1 Цикл Множитель = Множитель*10; Макс = Макс + МаксимальнаяЦифра*Множитель; КонецЦикла; Для Инд = Мин По Макс Цикл Сообщить(Инд); КонецЦикла; | |||
| 76
    
        sqr4 20.03.19✎ 17:42 | 
        (69) не работает     | |||
| 77
    
        ejikbeznojek 20.03.19✎ 17:45 | 
        (76) Честное пионерское работает.
 Хотя если верить замеру производительности, то (10) быстрее чем (69) https://prnt.sc/n0j84s https://prnt.sc/n0j92d | |||
| 78
    
        MetaDon 20.03.19✎ 17:47 | 
        (75) а может МаксимальноеЗначение неодназначное число?)-скажем секторов 77     | |||
| 79
    
        sqr4 20.03.19✎ 17:48 | 
        (78) Тогда не работает)     | |||
| 80
    
        sqr4 20.03.19✎ 17:48 | 
        (78) И с нулями не работает     | |||
| 81
    
        Про100Филя 20.03.19✎ 17:52 | 
        (80) С отрицательными числами тоже     | |||
| 82
    
        VladZ 20.03.19✎ 17:53 | 
        (75) Вот тут не понял:  
 Для Инд = Мин По Макс Цикл Сообщить(Инд); КонецЦикла; Допустим, максимум цифра 7, минимум 3. Как будет работать алгоритм? | |||
| 83
    
        ejikbeznojek 20.03.19✎ 17:53 | 
        (81) -1 это барабанов столько или цифра на барабане?     | |||
| 84
    
        Про100Филя 20.03.19✎ 17:54 | 
        (83) Прим. минимум = -2 максимальное = 2     | |||
| 85
    
        sqr4 20.03.19✎ 17:54 | 
        (81) +     | |||
| 86
    
        dalacovalexey 20.03.19✎ 17:57 | 
        (75) Для Инд = Мин По Макс Цикл
 Сообщить(Инд); КонецЦикла; он начинает перебирать абсолютно все цифры подряд а надо в пределах значений барабана | |||
| 87
    
        sqr4 20.03.19✎ 17:57 | 
        (84) можно конечно доработать, но интереса уже нет, да и подход наверно должен быть другой     | |||
| 88
    
        sqr4 20.03.19✎ 17:58 | 
        (86) да точно, в топку решение     | |||
| 89
    
        sqr4 20.03.19✎ 17:59 | 
        я тоже не сдал     | |||
| 90
    
        fisher 20.03.19✎ 17:59 | 
        Для положительных целых:
 &НаКлиенте Функция ПечатьКомбинации(МассивРазрядов) //печать новой комбинации ТекущаяКомбинация = ""; Для Каждого Разряд Из МассивРазрядов Цикл ТекущаяКомбинация = Формат(Разряд, "ЧН=") + ТекущаяКомбинация; КонецЦикла; Сообщить(ТекущаяКомбинация); КонецФункции &НаКлиенте Процедура Команда1(Команда) МинЦифра = 3; МаксЦифра = 7; КоличествоРазрядов = 3; // инициализация и печать первой комбинации МассивРазрядов = Новый Массив; Для НомерРазряда = 1 По КоличествоРазрядов Цикл МассивРазрядов.Добавить(МинЦифра); КонецЦикла; ПечатьКомбинации(МассивРазрядов); ПереборОкончен = Ложь; Пока НЕ ПереборОкончен Цикл // получение новой комбинации Для ИндексРазряда = 0 По КоличествоРазрядов - 1 Цикл МассивРазрядов[ИндексРазряда] = МассивРазрядов[ИндексРазряда] + 1; Если МассивРазрядов[ИндексРазряда] > МаксЦифра Тогда Если ИндексРазряда = КоличествоРазрядов - 1 Тогда ПереборОкончен = Истина; Прервать; Иначе МассивРазрядов[ИндексРазряда] = МинЦифра; КонецЕсли; Иначе Прервать; КонецЕсли; КонецЦикла; // печать новой комбинации Если НЕ ПереборОкончен Тогда ПечатьКомбинации(МассивРазрядов); КонецЕсли; КонецЦикла; КонецПроцедуры | |||
| 91
    
        fisher 20.03.19✎ 18:00 | 
        Одноразрядных. Но легко доработать для многоразрядных.     | |||
| 92
    
        Вафель 20.03.19✎ 18:00 | 
        хорошо что не перестановки попросилил.там то код существенно посложнее     | |||
| 93
    
        Garykom гуру 20.03.19✎ 18:33 | 
 | |||
| 94
    
        Garykom гуру 20.03.19✎ 18:33 | 
        Плиз потестите мое (93) на скорость в сравнении с другими     | |||
| 95
    
        fisher 20.03.19✎ 18:36 | 
        (93) Выглядит рабочим. И не знаю как там скорость, но явно симпатичнее моего. Плюсую :)     | |||
| 96
    
        Garykom гуру 20.03.19✎ 18:39 | 
        (95) Основано на системе счисления по произвольному основанию.
 Только подстановку "0" впереди (тут получилось позади) сделал слегка криво уже потом. Надо бы вставить в сам алгоритм и будет короче. | |||
| 97
    
        fisher 20.03.19✎ 18:43 | 
        (96) У меня тоже. Но у тебя красивее код. Но недоработано. Как минимум, много лишнего выводит.     | |||
| 98
    
        fisher 20.03.19✎ 18:46 | 
        (96) Недопилено. Проверь на
 КоличествоБарабанов = 2; МаксимальноеЗначение = 4; МинимальноеЗначение = 3; | |||
| 99
    
        Garykom гуру 20.03.19✎ 18:49 | 
        (98) Ага не с той стороны вставляет "0"     | |||
| 100
    
        Garykom гуру 20.03.19✎ 18:51 | 
        &НаКлиенте
 Процедура КрутимБарабаны(Команда) КоличествоБарабанов = 3; МаксимальноеЗначение = 4; МинимальноеЗначение = 3; Основание = МаксимальноеЗначение-МинимальноеЗначение+1; КоличествоВариантов = Pow(Основание, КоличествоБарабанов); Сообщить("Количество вариантов: "+КоличествоВариантов); Для НомерВарианта = 0 По КоличествоВариантов-1 Цикл тЗначение = НомерВарианта; тРезультат = ""; Пока тЗначение > 0 Цикл тРезультат = ""+((тЗначение%Основание)+МинимальноеЗначение) + " " + тРезультат; тЗначение = Цел(тЗначение/Основание); КонецЦикла; ЧислоРазрядов = СтрЧислоВхождений(тРезультат," "); ДобавитьСправа = КоличествоБарабанов-ЧислоРазрядов; Для Сч = 1 По ДобавитьСправа Цикл тРезультат = ""+МинимальноеЗначение+" "+тРезультат; КонецЦикла; Сообщить(""+тРезультат); КонецЦикла; КонецПроцедуры | |||
| 101
    
        Said_We 20.03.19✎ 18:52 | 
        Перечитал задание в (0).
 Я правильно понимаю. Есть некий замок (строение), которое строят из неких барабанов (кирпичей). Кирпичей очень много, но они имеют нумерацию от минимального до максимального значения. Необходимо показать все варианты как могут лежать эти номера кирпичей при строительстве здания. т.е. бесконечное количество кирпичей с номером 1, бесконечное количество кирпичей с номером 2 и т.д. Если номер кирпичей может быть только с номером 1, то у нас получается один вариант, при любой размерности строения. Если здание состоит из 2-х кирпичей и номера бывают только 1 и 2, то получается 4-ре варианта (11,12,21,22). Если здание состоит из 3-х кирпичей и номера бывают только 1, 2 и 3, то получается 9-ть вариантов (111,112,113,121,122, .... 333). Так? | |||
| 102
    
        Said_We 20.03.19✎ 18:55 | 
        три в степени три 27 вариантов - описался....     | |||
| 103
    
        Garykom гуру 20.03.19✎ 18:56 | 
        (101) Как это ни странно но твоя трактовка тоже верна и имеет тоже решение что и с замком (устройство)     | |||
| 104
    
        fisher 20.03.19✎ 19:00 | 
        (100) Красота нечеловеческая :) Про основание я думал, но плясать от количества вариантов не догадался.     | |||
| 105
    
        Сияющий в темноте 20.03.19✎ 23:56 | 
        Задача решается двумя вложенными циклами.
 для барабанов создаем массив и заполняем начальными значениями. внешний цикл пока в массиве не будут все значения большего. выводим значение. во внутреннем цикле берем ячейку,если в ней меньше максимального,то увеличиваем на единицу и выходим из цикла,если максимальное,то ставим минимальное,и шуруем в следующий элемент массива. когда массив кончится,то прерываем и внутренний и внешний цикл. если для каждой позиции минимум и максимум свои,то для них еще два массива. | |||
| 106
    
        Ластик 21.03.19✎ 00:51 | 
        может проще субд скормить и она сама все варики сгенерит     | |||
| 107
    
        Bigbro 21.03.19✎ 04:15 | 
        жесткая тема) вроде и не пятница ))     | |||
| 108
    
        rphosts 21.03.19✎ 04:21 | 
        (0)да вариантов море: рекурсия, вложененые циклы, запросом (каждый последующий способ из предложенных лучше предыдущего)     | |||
| 109
    
        Bigbro 21.03.19✎ 04:23 | 
        можно еще арендовать нейросеть и обучить ее по быстрому на куче вариантов )     | |||
| 110
    
        rphosts 21.03.19✎ 04:30 | 
        (109) это будет хуже, дольше и более ресурсоемко чем  рекурсии     | |||
| 111
    
        fisher 21.03.19✎ 08:39 | 
        (105) Этот подход я реализовал (90). Но в (100) более интересная и лаконичная реализация.
 (110) А предложи свой вариант на рекурсии. Я попробовал, прикинул что красиво не получается и плюнул. | |||
| 112
    
        rphosts 21.03.19✎ 08:53 | 
        (111) 
 а рекурсия красивая только для факториала и т.п. или через 2 вложеных цикла придётся делать на каждом начиная со второго шага рекурсии или ненормальная вложенность... | |||
| 113
    
        wowik 21.03.19✎ 09:53 | 
        ВЫБРАТЬ
 "1" КАК В1 ПОМЕСТИТЬ ВТ_1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "2" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "3" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ "1" КАК В1 ПОМЕСТИТЬ ВТ_2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "2" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "3" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ "1" КАК В1 ПОМЕСТИТЬ ВТ_3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "2" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "3" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_1.В1+ВТ_2.В1+ВТ_3.В1 как Комбинация ИЗ ВТ_1 КАК ВТ_1, ВТ_2 КАК ВТ_2, ВТ_3 КАК ВТ_3 пойдет так? | |||
| 114
    
        1Сергей 21.03.19✎ 10:01 | 
        (113) шоита? Давно запрос может конкатенацию?     | |||
| 115
    
        Vakhrin 21.03.19✎ 10:02 | 
        Точно работает )
 Процедура КрутимБарабаны(Количество, Минимум, Максимум)
 | |||
| 116
    
        wowik 21.03.19✎ 10:15 | 
        (114) проверьте в консоли запросов, работает?     | |||
| 117
    
        1Сергей 21.03.19✎ 10:20 | 
        (116) да     | |||
| 118
    
        Said_We 21.03.19✎ 10:33 | 
        (115) Ну или так
 Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("МинНомер", МинНомер); Запрос.УстановитьПараметр("МаксНомер", МаксНомер); Запрос.Текст = "ВЫБРАТЬ | 0 КАК А |ПОМЕСТИТЬ ВТ_Три | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | 1 | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | 2 | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | 3 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 11 | 3 * ВТ_Три.А + ВТ_Три1.А КАК А |ПОМЕСТИТЬ ВТ_Десять |ИЗ | ВТ_Три КАК ВТ_Три, | ВТ_Три КАК ВТ_Три1 | |УПОРЯДОЧИТЬ ПО | А |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТ_Три |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1001 | 100 * ВТ_Десять.А + 10 * ВТ_Десять1.А + ВТ_Десять2.А КАК А |ПОМЕСТИТЬ ВТ_Тысяча |ИЗ | ВТ_Десять КАК ВТ_Десять, | ВТ_Десять КАК ВТ_Десять1, | ВТ_Десять КАК ВТ_Десять2 | |УПОРЯДОЧИТЬ ПО | А |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТ_Десять |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_Тысяча.А КАК А |ПОМЕСТИТЬ ВТ_Номера |ИЗ | ВТ_Тысяча КАК ВТ_Тысяча |ГДЕ | ВТ_Тысяча.А МЕЖДУ &МинНомер И &МаксНомер |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТ_Тысяча"; Запрос.Выполнить(); ТекстВЫБРАТЬ = "ВЫБРАТЬ | ВТ_Позиция1.А КАК Позиция1"; ТекстИЗ = " |ИЗ | ВТ_Номера КАК ВТ_Позиция1"; ТекстУПОРЯДОЧИТЬ= " |УПОРЯДОЧИТЬ ПО | Позиция1"; Для А=2 По КоличествоПозиций Цикл ТекстВЫБРАТЬ = ТекстВЫБРАТЬ + " | ,ВТ_Позиция"+ А +".А КАК Позиция"+А; ТекстИЗ = ТекстИЗ + " | ,ВТ_Номера КАК ВТ_Позиция"+ А; ТекстУПОРЯДОЧИТЬ = ТекстУПОРЯДОЧИТЬ + " | ,Позиция" +А; КонецЦикла; Запрос.Текст = ТекстВЫБРАТЬ + ТекстИЗ + ТекстУПОРЯДОЧИТЬ; ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); Пока ВыборкаЗапроса.Следующий() Цикл Текст = ""+ ВыборкаЗапроса.Позиция1; Для А=2 По КоличествоПозиций Цикл Текст = Текст + Символы.Таб + ВыборкаЗапроса["Позиция"+А]; КонецЦикла; Сообщить(Текст); КонецЦикла; | |||
| 119
    
        Said_We 21.03.19✎ 10:35 | 
        В (118) ограничение, что не более 1001 позиций на барабане (от 0 до 1000).     | |||
| 120
    
        fisher 21.03.19✎ 10:48 | 
        (115,118) Как вариант, конечно.
 Но лично меня всегда коробит, когда банальную алгоритмистику на готовых данных в оперативке заменяют работой с СУБД. Даже когда это приемлемо на практике, это же все равно явный оверкилл плюс будет иметь больше ограничений для возможного рефакторинга в будущем. Ну и использование инструментов не совсем по назначению. Это как вместо шуруповерта использовать перфоратор с переходником. Можно, но зачем?? | |||
| 121
    
        Said_We 21.03.19✎ 10:59 | 
        (120) "для возможного рефакторинга в будущем" - в данном случае нет рефакторинга в будущем, так как нет будущего. Рекурсивные сложные алгоритмы всегда сложно сопровождать и поддерживать.
 Лучше проще да лучше. СУБД Сгенерирует варианты банально быстрее чем алгоритм 1С. Мы же на 1С пишем, поэтому лучше СУБД. | |||
| 122
    
        DrWatson 21.03.19✎ 11:29 | 
        Рекурсия тоже не сложная. Памяти не занимает, из вычислений только сравнения и +1.
 Сравнил со (100) - работает на 20% быстрее. &НаКлиенте Процедура КрутимБарабаны(Команда) СтруктураОграничений = Новый Структура( "КоличествоБарабанов,МинимальноеЗначение,МаксимальноеЗначение", 5, 2, 6); Если СтруктураОграничений.КоличествоБарабанов = 0 Тогда Возврат; КонецЕсли; СтрКомбинация = ""; КрутимБарабан(1, СтрКомбинация, СтруктураОграничений); КонецПроцедуры &НаКлиенте Процедура КрутимБарабан(НомерБарабана, СтрКомбинация, СтруктураОграничений) ОбработкаПрерыванияПользователя(); Для Номер = СтруктураОграничений.МинимальноеЗначение По СтруктураОграничений.МаксимальноеЗначение Цикл Если НомерБарабана = СтруктураОграничений.КоличествоБарабанов Тогда Сообщить(СтрКомбинация+"-"+Номер); Иначе КрутимБарабан(НомерБарабана+1, СтрКомбинация+"-"+Номер, СтруктураОграничений); КонецЕсли; КонецЦикла; КонецПроцедуры | |||
| 123
    
        fisher 21.03.19✎ 11:30 | 
        (121) "СУБД Сгенерирует варианты банально быстрее чем алгоритм 1С"
 Ну, твой вариант на 100000 комбинаций работает не быстрее, чем вариант в (100). Мой в (90) без оптимизаций в полтора раза медленнее за счет формата и иже с ним. Интерпретатор 1С - такой интерпретатор. Но и накладные расходы при работе с СУБД не стоит недооценивать (тестил на продуктовой конфигурации MSSQL). Плюс лишний серверный вызов. | |||
| 124
    
        fisher 21.03.19✎ 11:39 | 
        (122) На 100000 комбинаций у меня получилось в разы быстрее, а не на 20% (во всех тестах я отключаю Сообщить).
 Приветствуем победителя с самым красивым и быстрым решением :) | |||
| 125
    
        DrWatson 21.03.19✎ 11:41 | 
        (122) Не даже не так по скорости. Сообщить очень сильно мешает. Если отключить Сообщить и взять пример на 100 тыс комбинаций, то рекурсия будет 2,79 против 10,47 в (100).     | |||
| 126
    
        fisher 21.03.19✎ 11:46 | 
        (125) На моих замерах выигрыш даже больше. Примерно в пять раз.     | |||
| 127
    
        fisher 21.03.19✎ 11:48 | 
        Ну и понятно почему. Вычисления проще, вычислений меньше.     | |||
| 128
    
        fisher 21.03.19✎ 11:52 | 
        Реально самый простой и быстрый вариант. Странно, почему я не допер, ведь прикидывал как на рекурсии сделать. Старею.
 Но в (100) - самый интересный. | |||
| 129
    
        Said_We 21.03.19✎ 12:40 | 
        (125) У меня в консоле вариант из (118) на 100 000 выполняется менее секунды.     | |||
| 130
    
        Said_We 21.03.19✎ 12:43 | 
        К (129) т.е. если взять готовый текст запроса и в консоле (пять барабанов по 10 состояний (от 0 до 9)) и его выполнить, то в результате получите 100 000 записей и время выполнения 0:00:00. Редко секунда. Т.е. выполнение сколько-то времени занимает, но это менее секунды.     | |||
| 131
    
        Ластик 21.03.19✎ 12:55 | 
        я в запрос тз кидаю, у меня получается 1 - 1.5 сек с учетом что сервак на другой тачке развернут т.е. с накладными генерация тз + запрос + резалт, в тз диапазон чисел барабана     | |||
| 132
    
        Said_We 21.03.19✎ 12:57 | 
        (131) Что в ТЗ?     | |||
| 133
    
        Ластик 21.03.19✎ 12:58 | 
        числа одного барабана     | |||
| 134
    
        Said_We 21.03.19✎ 12:59 | 
        (131) "в тз диапазон чисел барабана" - Проще не кидать в ТЗ. Порождающий запрос тебе все сам создаст. Передай параметры 0 и 9.     | |||
| 135
    
        Ластик 21.03.19✎ 13:14 | 
        (134) ну да, забавно с порождающим, только кода много, через тз там в пять строчек все вместе с текстом запроса     | |||
| 136
    
        fisher 21.03.19✎ 13:15 | 
        (129) Ну а у меня твой вариант (с отключенным "сообщить" на 100000) в продакшн-инфраструктуре с MSSQL на выделенном сервере выполняется порядка 7 секунд, в то время как вариант (122) - менее одной.
 Ты можешь, конечно, сказать, что у меня проблема в инфраструктуре, настройках серверов и т.п. включая кривые руки. Только вот прелесть в том, что (122) вообще от этого не зависит и может выполняться хоть на клиенте. | |||
| 137
    
        Said_We 21.03.19✎ 13:16 | 
        (128) Вариант из (100) много секунд. Сообщить убрал.
 Вариант не может быть оптимальным, так как в нем присутствуют не простые арифметические операции деления. Сложение - несколько тактов процессора, умножение и деление несколько десятков тактов процессора. Нашел такую таблицу, но в умножении по моему ошибка. По микрокомандам если умножение разложить, то получится чуть в несколько раз быстрее чем деление, но не как как сложение. Но это на x86. Сейчас процессоры могут быть другие. запись байта в память - 2 такта запись 2 байтов - 4 такта запись 4 байтов - 8 тактов цикл int (long) - 6 тактов int ADD, SUB, MUL - 6-7 тактов int DIV - 235-245 тактов | |||
| 138
    
        DrWatson 21.03.19✎ 13:17 | 
        (130) Да, второй запрос вместе с Выбрать() из (118) действительно выполняется за 0,92 сек. но весь алгоритм за 14,86. Самое долгое
 Текст = ""+ ВыборкаЗапроса.Позиция1; Текст = Текст + Символы.Таб + ВыборкаЗапроса["Позиция"+А]; только они дают 9,28 сек. и 62,4%. | |||
| 139
    
        Said_We 21.03.19✎ 13:19 | 
        (138) 1С всегда со строками работало медленно. + преобразование типов из числа в строку при выводе.     | |||
| 140
    
        fisher 21.03.19✎ 13:19 | 
        (137) Самым простым и быстрым я назвал вариант (122). А варианту (100) приз за интересность.     | |||
| 141
    
        Said_We 21.03.19✎ 13:21 | 
        (140) Если не подготавливать данные к выводу в сообщить, а результат в ТЗ и показать, то какой результат будет быстрее? :-)     | |||
| 142
    
        fisher 21.03.19✎ 13:23 | 
        (141) Не твой. Этап подготовки к выводу присутствует во всех вариантах.     | |||
| 143
    
        Said_We 21.03.19✎ 13:26 | 
        (142) В (138) "0,92 сек". В консоле показывает результат моментально. Это на порядок быстрее чем 10 секунд и более.     | |||
| 144
    
        Said_We 21.03.19✎ 13:29 | 
        Запустил у себя алгоритм из 100. Получил около 5 секунд без вывода результата. Это без формирования результата в ТЗ.     | |||
| 145
    
        DrWatson 21.03.19✎ 13:33 | 
        В SQL нужно ещё кэш чистить, иначе неправильный результат получишь.     | |||
| 146
    
        Said_We 21.03.19✎ 13:35 | 
        (145) Перед каждым выполнением параметры меняю. Если не менять, то секунду не получу - всегда 0:00:00 получается.     | |||
| 147
    
        Said_We 21.03.19✎ 13:37 | 
        К (146) А если меняю, то иногда получаю 0:00:01. Но менее 50%.     | |||
| 148
    
        fisher 21.03.19✎ 13:37 | 
        (144) Еще раз. Самый быстрый - вариант в (122) а не в (100).
 Но да - если отключить в твоем варианте вообще любую обработку результата (оставить только обход выборки), то получается чуть быстрее чем (122). А если заменить обход выгрузкой в ТЗ, то чуть медленнее. (146) А ты прекрати с консолью сравнивать. Еще небось и на файловой. | |||
| 149
    
        Garykom гуру 21.03.19✎ 13:40 | 
        А когда сравниваете результаты учитываете универсальность алгоритма?
 Например если на барабанах (каждом в отдельности) числа от 1 до 999999999999999 что будет? | |||
| 150
    
        Mikeware 21.03.19✎ 13:42 | 
        имхо, оптимально тут через рекурсию. 
 через систему счисления - будет частный вариант для единого множества цифр на каждом "барабане" из [0...N] Через циклы - переписывать под измненнение количества "барабанов" рекурсией - можно для произвольного множества на каждом шаге, и произвольной глубины... зы "мы у федоровой бани в барабаны барабаним. выбегают мужики - барабанят в тазики!"© | |||
| 151
    
        Said_We 21.03.19✎ 13:46 | 
        (149) Я описал данное ограничение. Но можно и порождающий запрос тоже написать динамическим. На миллион записей тоже не долго генерируется результат.
 (148) Нет SQL. На файловой думаю не будет быстрее. | |||
| 152
    
        DrWatson 21.03.19✎ 13:55 | 
        А ТС между тем пропал. :)
 Закончился его экзамен? | |||
| 153
    
        Said_We 21.03.19✎ 13:57 | 
        (151) У меня порождающий запрос генерирует 1 000 000 за 20 секунд. Теперь этот 1 000 000 вариантов на барабаны можно умножить и получить какой-то результат. В алгоритме боюсь я устану ждать, поэтому даже запускать не буду.
 Если результат надо в ТЗ запихивать, то объем требуемой памяти будет примерно одинаковый. А время выполнения очень разное. | |||
| 154
    
        Said_We 21.03.19✎ 13:58 | 
        (152) А куда он хоть его сдавал? Внутренний?     | |||
| 155
    
        Mikeware 21.03.19✎ 14:00 | 
        (154) в поликлинику...     | |||
| 156
    
        fisher 21.03.19✎ 14:01 | 
        (151) Ну, фиг его знает.
 У меня (122) вместе с подготовкой результата выполняется 1300мс - 1400мс Твое решение с подготовкой результата - 6800мс - 7500мс Твое решение без подготовки вообще с голым обходом выборки 400мс - 800мс Твое решение без подготовки с выгрузкой в ТЗ 700мс - 900мс Это на 100000 комбинаций Соглашусь, что если нужна именно ТЗ в таком виде, то в чудесном мире 1С твой вариант будет быстрее. | |||
| 157
    
        fisher 21.03.19✎ 14:14 | 
        Но быстрее чисто за счет того, что пакетное "запихивание" результата запроса в ТЗ - готовая библиотечная функция.
 Если убрать из (122) строковые операции, то выполнение порядка 600мс, что то же самое, что и с обходом твоей выборки. Т.е. при "ручном" заполнении коллекции время было бы одинаковым. | |||
| 158
    
        fisher 21.03.19✎ 14:15 | 
        Хотя лукавлю. В (122) потребовалось бы несколько больше операций.     | |||
| 159
    
        Said_We 21.03.19✎ 14:53 | 
        (158) Взгляните на задачу по другому. Я специально выше привел пример с количеством тактов на выполнение той или иной операции.
 В конечном варианте выполняет всё конечная железка, поэтому зависит какое ПО какие алгоритмы использует и собственно какое мы ПО используем. Если алгоритм из 122 или 100 написать на С++ и вызвать только функцию, то можно и быстрее чем SQL, так как SQL по сути тоже скорее всего написан на С++, но он универсальный, а не под конкретную задачу. Вывод: важно какой алгоритм использует SQL для генерации и работы со множеством в рамках конкретной задачи и на сколько он оптимальный. И что можно предложить более оптимальное под конкретную задачу. Если не чего, то и гадать не чего. В алгоритме (100) я вижу операции деления в цикле. Возведение в степень - правда один раз. Это не быстрые операции на ассемблере и можно обойтись без них. Алгоритм может и красивый, но не оптимальный по скорости 100%. | |||
| 160
    
        Вафель 21.03.19✎ 14:55 | 
        (159) там по факту перевод числа из одной разрядности в другую. Массв-счетчик - будет гораздо проще | |||
| 161
    
        Garykom гуру 21.03.19✎ 15:03 | 
        (159) (160) Угу я стремился избавиться от лишних массивов и переменных, сократить использование памяти.
 Можно тоже самое реализовать на одном массиве где будет по разрядам числа менять как нуна, прибавляя по 1 в требуемой системе счисления. | |||
| 162
    
        Garykom гуру 21.03.19✎ 15:05 | 
        (161)+ Алгоритм довольно простой для реализации (двоичная для N-ичной все тоже самое):
 000 0+1= 001 1+1=0 и 1 в старший разряд 010 0+1= 011 ... | |||
| 163
    
        Mikeware 21.03.19✎ 15:21 | 
        (161) так а если это не "система счисления"? т.е. разрядность каждого разряда-своя? (с заполнением каждого разряда просто - там таблица соответсвий для каждого)     | |||
| 164
    
        fisher 21.03.19✎ 15:24 | 
        (160) Да что ж такое-то. Четвертый раз повторяю что да - алгоритм в (100) неоптимальный. Но интересный. Оптимальный - в (122).
 На любом компилируемом языке он отработает заведомо быстрее, чем с обращением к СУБД. | |||
| 165
    
        fisher 21.03.19✎ 15:24 | 
        Упс. (164) было к (159)     | |||
| 166
    
        Вафель 21.03.19✎ 15:25 | 
        (164) алгоритм с рекурсией ты называешь оптимальным?     | |||
| 167
    
        Fish гуру 21.03.19✎ 15:26 | 
        (166) А чем тебе не нравится рекурсия? Имхо, для таких задач она оптимальна.     | |||
| 168
    
        Salimbek 21.03.19✎ 15:27 | 
        (0) Фигня какая.
 //Начальные значения Разбег = МаксимальноеЗначение - МинимальноеЗначение +1; Добавка = МинимальноеЗначение; ВерхняяГраница=1; Для Сч=1 По КоличествоБарабанов Цикл ВерхняяГраница=ВерхняяГраница*Разбег; КонецЦикла; //Сам цикл Для Сч=1 По ВерхняяГраница Цикл Стрк=""; ТекЗначение=Сч; Для Сч2=1 По КоличествоБарабанов Цикл Цифра=ТекЗначение%Разбег; Стрк=Симв(48+Цифра+Добавка)+Стрк; ТекЗначение = ТекЗначение/Разбег; КонецЦикла; Сообщить(Стрк); КонецЦикла; | |||
| 169
    
        Mikeware 21.03.19✎ 15:27 | 
        (166) смотря по какому критерию.
 но на мой взгляд, она оптимальна тут и для написания, и для выполнения... | |||
| 170
    
        fisher 21.03.19✎ 15:30 | 
        (166) Да. Там контролируемое и небольшое использование стека (вложенность по количеству барабанов). Если тебе это претит по религиозным соображениям, можно переписать на циклы и явное использование стека.     | |||
| 171
    
        Garykom гуру 21.03.19✎ 15:32 | 
        (168) По сути ты повторил мой (100)     | |||
| 172
    
        Garykom гуру 21.03.19✎ 15:33 | 
        (163) В задаче ТС разрядность барабанов одинакова, если же разная то просто придется еще пару массивов хранить для каждого барабана мин и макс, суть та же     | |||
| 173
    
        kyvv 21.03.19✎ 15:34 | 
        первый барабан цифры: min1...max1
 ... n-ный барабан: minn...maxn min_number:min1min2...minn max_number: max1max2...maxn принимаем шаг=1, тогда for(i = min_number; i<= max_number; i++) printf(i) | |||
| 174
    
        Salimbek 21.03.19✎ 15:35 | 
        (171) Угуг, все 150 сообщений перечитывать из-за такой мелочной задачи было скучно...     | |||
| 175
    
        Garykom гуру 21.03.19✎ 15:36 | 
        (171)+ Но более грамотно, хотя и менее красиво, у меня изначально была отдельная функция перевода из десятичной системы в любую по нужному основанию.     | |||
| 176
    
        Said_We 21.03.19✎ 15:37 | 
        (168) Суть таже, что и в (100).     | |||
| 177
    
        Said_We 21.03.19✎ 15:39 | 
        (174) мы это поняли... :-)     | |||
| 178
    
        Mikeware 21.03.19✎ 15:42 | 
        (172) один массив для каждого барабана. но приведением к системе счисления уже не получится. остаются либо циклы, либо рекурсия     | |||
| 179
    
        Mikeware 21.03.19✎ 15:44 | 
        (178) хотя вру, можно прореживать результат для "системы счисления". но все равно, алгорим будет не факт, что быстрее (прореживание сожрет часть времени) - зато менее читаемый.     | |||
| 180
    
        Eiffil123 21.03.19✎ 16:51 | 
        А через запрос слабо ?))     | |||
| 181
    
        Garykom гуру 21.03.19✎ 17:01 | 
        (180) легко http://oracleplsql.ru/mysql-function-conv.html     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |