Выбрать числа одного цифрового состава | |
---|---|
sphinx Автор Сообщений: 31184 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Есть список 8-значных чисел. Нужно придумать алгоритм (желательно проще/эффективнее), чтобы выбрать все числа, имеющие одинаковый состав цифр (например, числа 12345, 54321, 13245, 13254, 32451 - относятся к одной группе, так как состав цифр, пусть и на разных позициях - одинаков).
Выводить предлагаю таким образом - если для числа еще не создана новая цифровая группа - число заносится в первый столбец, если встретилось 2-й, 3-й... N-й раз - помещается во 2-й, 3-й,... N-й столбец. Столбцы называю условно, пусть собирается группа через запятую - каждая группа в своей строке. P.S. В архиве CSV-файл с набором 8-значных чисел, сделать из него таблицу/курсор, полагаю, труда не составит. ------------------ "Veni, vidi, vici!"(с) Исправлено 1 раз(а). Последнее : sphinx, 05.07.16 17:18 |
Re: Выбрать числа одного цифрового состава | |
---|---|
PaulWist Сообщений: 14621 Дата регистрации: 01.04.2004 |
1+2+3+4+5 = 5+4+3+2+1 = 1+3+2+4+5 = 1+3+2+5+4 = 3+2+4+5+1
Не то, ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) Исправлено 1 раз(а). Последнее : PaulWist, 05.07.16 17:23 |
Re: Выбрать числа одного цифрового состава | |
---|---|
sphinx Автор Сообщений: 31184 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Разумеется. На примере двузначных чисел: 13 и 22 - РАЗНЫЕ группы чисел, хотя сумма цифр у них одинаковая. ------------------ "Veni, vidi, vici!"(с) |
Re: Выбрать числа одного цифрового состава | |
---|---|
SoccerStudio Сообщений: 5055 Откуда: Подмосковье Дата регистрации: 28.11.2006 |
Подозреваю, без сортировки символов в числовом выражении обойтись будет сложно. Условно говоря, 13254 должно преобразоваться в 12345 (или наоборот), тогда сравниваем как строки.
------------------ "Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов |
Re: Выбрать числа одного цифрового состава | |
---|---|
sphinx Автор Сообщений: 31184 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Да, это одно из решений. Но сортировка ВСЕХ чисел - относительно не быстрая операция, хотя на 1000/10000 чисел должна пролететь без серьезных временных затрат. Но если мы отсортируем сами числа - в группе будут только одинаковые. ;) ------------------ "Veni, vidi, vici!"(с) |
Re: Выбрать числа одного цифрового состава | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Как идея. Доказывать, что это всегда даст правильный результат не буду.
|
Re: Выбрать числа одного цифрового состава | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
А оно и не даст всегда правильный результат ? hash("11124458") = hash("11222477") Если быть чуть точнее, то на всём массиве "сочетаний с повторениями" из 10-ти по 8 эта функция даёт 24% коллизий. 5816 из общих 24310 таких сочетаний имеют дубликаты (и даже "трипликаты и квадропликаты") этого хэша. Да и вообще в данной задаче "хэш" не применим - нужно гарантировано уникально идентифицировать каждую из перестановок одного и того же сочетания. Тупо в лоб для 9 и менее разрядных чисел (в т.ч. 8-разрядных по условию задачи) подойдёт такая функция:
------------------ WBR, Igor |
Re: Выбрать числа одного цифрового состава | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Как я понимаю, можно эту функцию взять за основу и для числа с N числом цифр. Тогда вопрос к IK - как будет выглядеть такая функция, если в качестве второго параметра передавать количество цифр в числе?
Можно сформулировать задачу еще более широко, если добавить в качестве третьего параметра основание системы счисления - десятичная, 16-ричная, 33-ричная и т.п. |
Re: Выбрать числа одного цифрового состава | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Игорь, я когда называл фукцию hash, просто придумал неудачное название, я как раз и имел в виду, что она должна выдавать разные значания для разных наборов цифр. Проверять как-то не было времени, поэтому и написал: "Как идея". Твоя функция вполне вместо нее подойдет. Можно еще загнать все цифры в массив, применить функцию ASORT, а потом загнать их обратно в строку.
|
Re: Выбрать числа одного цифрового состава | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Из условия не понятно, должны ли считаться числа 12000000 и 12222210 одинаковыми? Состоят ведь из одинаковых цифр. Вышеприведенные алгоритмы их различают.
Вот еще вариант решения "в лоб" для случая, если числа должны считаться одинаковыми (легко допилить и для другого случая, но по скорости вряд ли это самый оптимальный вариант):
|
Re: Выбрать числа одного цифрового состава | |
---|---|
sphinx Автор Сообщений: 31184 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Эти числа неодинаковые, у них разный состав - т.е. количество "1", "2", "0". Ну и пример приводил:
Подобную функцию сортировки я писал, по сравнению с весовыми коэффициентами Игоря Королева - отработала в 5-6 раз медленнее. Полагаю, что и приседания типа "строка-массив-ASORT()-строка" не отработает быстрее. ------------------ "Veni, vidi, vici!"(с) Исправлено 1 раз(а). Последнее : sphinx, 06.07.16 12:27 |
Re: Выбрать числа одного цифрового состава | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
От "разрядности" будет зависеть множитель. Если уж "упаковывать" по полной программе, то надо каждый OCCURS умножать на (K+1)^i где K число элементов ("цифр") в сочетании а i это индекс соответствующей "цифры" (от 0 до N-1) Комбинаторика манипулирует элементами и множествами - там без разницы "цифры" в наборе или буквы или, скажем, разные виды домашних животных Для простоты, конечно, часто заменяют реальные сущности на числа (не цифры, а именно числа - от 0 до N-1 где N это общее число различных элементов). ------------------ WBR, Igor |
Re: Выбрать числа одного цифрового состава | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если важна скорость, и речь про фокс, то нужно прямо в запрос инлайнить эту здоровенную формулу. Хоть часть расходов (на вызов UDF) удастся сократить.
------------------ WBR, Igor |
Re: Выбрать числа одного цифрового состава | |
---|---|
sphinx Автор Сообщений: 31184 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Такая задача была на собеседовании, я ее вынужден был решать в Excel'е на VBA. Тогда написал в лоб, через сортировку, подозревал, что через весовые коэффициенты должна отработать быстрее, а это на больших объемах сказывается.
------------------ "Veni, vidi, vici!"(с) |
Re: Выбрать числа одного цифрового состава | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Чета у вас там в КУ совсем озверели, если на собеседовании дают такие задачи. Какой-то дебильный подход. Я лишь однажды проходил нечто похожее на собеседование. Когда мне сказали, что берут "с испытательным сроком", я сказал тет-а-тет будущему непосредственному шефу, что испытательный срок взаимный. Главному боссу, канешна, я этого не говорил. В дальнейшем обе стороны прошли испытательный срок. Вот ежели б я проводил собеседование... Что бы меня интересовало прежде всего? Много чего. Но главное - соотношение лояльности и компетентности у кандидата. Если баланс окажется неприемлемым, то никакие успешно пройденные тесты меня не переубедят. Общую же сообразительность надо проверять на достаточно нейтральных задачах. Если кандидат забыл/не знает некоторые команды/функции, то какое это может иметь значение? Да и нафига наизусть все помнить? Вопчем, занимаются всякой херней работодатели. Кстати. Если б работодатель у меня спросил бы: по какой причине я ушел с последнего места работы, я бы предложил "откровенность за откровенность" и попросил бы ответить на такой вопрос: А почему освободилось это место? Вопрос, кстати, абсолютно симметричный. |
Re: Выбрать числа одного цифрового состава | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
offtop mode on
Лично я не вижу никакого "криминала" в подобном тестовом вопросе. Конечно, если дадут условия приемлемые для решения - и инструментальные средства и тот же доступ в интернет (я не обязан помнить все формулы из комбинаторики, да и "для дела" куда как полезнее "лентяй" за 5 минут находящий готовое решение проблемы в интернете, нежели "трудоголик" изобретающий каждый раз новый велосипед, ещё и с квадратными колёсами). Задача вполне себе "нейтральная" - просто на общий уровень знаний (ну да, верхнее образование или самообразование тут нужно по любому - в школе этого не преподают ещё). Это не всучить тебе мега-проект на миллион строк исходника и попросить "предложить решения для ускорения вот этого бизнес-процесса" И не тупое и безумно скушное "какие операторы цикла вы знаете" да "что такое SOLID" где умеющий складно бла-бла-бла и обладающий хорошей памятью но нулевым скиллом кодинга индивид влёгкую обходит реально понимающего в ремесле программирования чела Впрочем, в экселе такого рода задачку решать - это уже нечто из разряда извращения offtop mode off ------------------ WBR, Igor |
Re: Выбрать числа одного цифрового состава | |
---|---|
sphinx Автор Сообщений: 31184 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Это в Екб, в КУ работу надо искать по блату, по крайней мере я давно плюнул на это - будет что-то случайное - рассмотрим.
Заданий было 5 штук - на все дали два дня дома. Тема на регулярные выражения - тоже была из той пачки, но я оставил свое свое решение, хотя и привел в описании решения код, который привел Игорь. Да, задачи были такие, что за 5 минут я не знал, как их решать. Но.. интернет есть, время позволяет. Может и не сильно правильно/оптимально, но как сказал Игорь - проблема удачно решается. ------------------ "Veni, vidi, vici!"(с) |
Re: Выбрать числа одного цифрового состава | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Можно сравнивать суммы обратных чисел, а вместо 0 прибавлять 10. Т.е 12345670 = 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 10. Возможно здесь и будут коллизии, но сходу контрпример мне придумать не удалось. |
Re: Выбрать числа одного цифрового состава | |
---|---|
pasha_usue Сообщений: 3650 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Как различить 2/6 и 1/3? |
Re: Выбрать числа одного цифрового состава | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
2/6 = 1/6 + 1/6. А какие другие две дроби с натуральным знаменателем не больше 9 дадут в сумме 1/3?
Т.е. может быть 1/9 + 1/9 + 1/9 = 1/3. Но тогда и к сумме 1/6 + 1/6 мы должны прибавить третью дробь. Исправлено 3 раз(а). Последнее : spinz, 12.07.16 07:57 |
© 2000-2024 Fox Club  |