|
A, B, C,,, Z, AA, AB, ,,, AX, AY, AZ, BA, BB, ,,,, BX, BY, BZ, CA, CB, ,,,, Что это? | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
30.05.20
✎
12:03
|
Что это за последоваетельность.
Мне при переносе пришлось нумеровать одинаковые инвойсы, добавляя им в конец суффиксы, чтобы они были уникальными. 26 не хватило, некоторые каждый месяц в течении нескольких лет имеют один номер. Пришлось писать функцию. Перевод из системы счисления не катит, пришлось свою ваять, причем я делал это довольно интерактивно, подгоняя под результат, без всякого мат-аппарата: Функция НомерДляМаркировки(Знач Значение=0, Нотация=26, СтрокаСистемы="ABCDEFGHIJKLMNOPQRSTUVWXYZ") Экспорт //1 - A //26 - Z //27 - AA Результат = ""; Пока Значение > 0 Цикл Результат = Сред(СтрокаСистемы, (Значение - 1) % Нотация + 1, 1)+Результат; Если Значение <= Нотация Тогда Прервать; КонецЕсли; Значение = Цел((Значение - 1)/Нотация); Если Значение = 0 Тогда Прервать; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции _math.ПереводЧислаВСистемуСчисления(0, 10) "0" _math.НомерДляМаркировки(1, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "A" _math.НомерДляМаркировки(25, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "Y" _math.НомерДляМаркировки(26, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "Z" _math.НомерДляМаркировки(27, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "AA" _math.НомерДляМаркировки(51, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "AY" _math.НомерДляМаркировки(52, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "AZ" _math.НомерДляМаркировки(53, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "BA" _math.НомерДляМаркировки(76, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "BX" _math.НомерДляМаркировки(77, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "BY" _math.НомерДляМаркировки(78, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "BZ" _math.НомерДляМаркировки(79, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "CA" _math.НомерДляМаркировки(80, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "CB" А с системой счисления вот что: _math.ПереводЧислаВСистемуСчисления(1, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "B" _math.ПереводЧислаВСистемуСчисления(25, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "Z" _math.ПереводЧислаВСистемуСчисления(26, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "BA" _math.ПереводЧислаВСистемуСчисления(27, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "BB" _math.ПереводЧислаВСистемуСчисления(51, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "BZ" _math.ПереводЧислаВСистемуСчисления(52, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "CA" _math.ПереводЧислаВСистемуСчисления(53, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "CB" _math.ПереводЧислаВСистемуСчисления(76, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "CY" _math.ПереводЧислаВСистемуСчисления(77, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "CZ" _math.ПереводЧислаВСистемуСчисления(78, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "DA" _math.ПереводЧислаВСистемуСчисления(79, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "DB" _math.ПереводЧислаВСистемуСчисления(80, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") "DC" Функция ПереводЧислаВСистемуСчисления(Знач Значение=0, Нотация=36, СтрокаСистемы="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") Экспорт //Назначение: Переводит число Значение в строку в заданной системе счисления (Нотация) используя строку знаков этой системы СтрокаСистемы //ДатаСоздания: 20071127 //Автор: AVB //Редактор: Fixin //Тестирована: Да //Описание: // За основу взят алгоритм avb Если Нотация<=0 Тогда Возврат "" КонецЕсли; Если Значение < 0 Тогда Возврат "-" + ПереводЧислаВСистемуСчисления(Значение, Нотация, СтрокаСистемы); КонецЕсли; Значение=Цел(Значение); Результат=""; Пока Значение>=0 Цикл Результат=Сред(СтрокаСистемы,Значение%Нотация+1,1)+Результат; Значение=Цел(Значение/Нотация) ; Если Значение = 0 Тогда Прервать; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции Что это за последовательность, каким мат. аппаратом она правильно строится? |
|||
1
RomanYS
30.05.20
✎
12:24
|
(0) У тебя с прибавлением каждой новой цифры - начинается нумерация с 0 ("A"). А дальше всё просто:
26 чисел - однозначных, 26^2 двухзначных, ... Внутри каждой группы - обычный перевод в систему счисления, с ведущими нулями. "AAA" - трёхзначный нуль. Ну и алгоритм предельно прост - первым шагом определяем количество цифр N, дальше цикл до N |
|||
2
Гений 1С
гуру
30.05.20
✎
12:25
|
(1) хз, я где-то полчаса отлаживал функцию, чтобы начала выдавать правильную последовательность, вот и подумал, что у меня что-то не то с мат.аппарамтом, не прокачан он.
|
|||
3
Гений 1С
гуру
30.05.20
✎
12:26
|
(1) не согласен, 27 - это не двухзначный нуль, это АА?
|
|||
4
RomanYS
30.05.20
✎
12:27
|
(0) Ну и
Если Значение = 0 Тогда Прервать; КонецЕсли; в данных циклах рассмешило от человека, который код десятилетиями пишет |
|||
5
RomanYS
30.05.20
✎
12:29
|
(3) тебе сдвиг на 1 надо сделать
0 - "A" 25 - "Z" 26 - "AA" |
|||
6
trad
30.05.20
✎
12:32
|
Имена колонок екселя
|
|||
7
МихаилМ
30.05.20
✎
12:35
|
(4) перевод из систем счисления в 9 классе по информатике проходят.
|
|||
8
BeerHelpsMeWin
30.05.20
✎
12:37
|
||||
9
RomanYS
30.05.20
✎
12:42
|
(7) Это не совсем СС, тут он правильно написал. Хотя основы комбинаторики где-то там же проходят. В общем сам вопрос норм.
А (4) в конце цикла "Пока Значение > 0 Цикл" это прикол |
|||
10
Salimbek
30.05.20
✎
12:53
|
(9) Почему нет? 26-ричная система счисления на алфавите ABCD..
|
|||
11
NorthWind
30.05.20
✎
12:54
|
(0) Это 26-ричная система счисления с буквенным алфавитом, где цифра от 1 до 26 представляется как буква от А до Z.
|
|||
12
NorthWind
30.05.20
✎
12:54
|
Сорри, от 0 до 25, конечно
|
|||
13
МихаилМ
30.05.20
✎
12:54
|
сайт avb досих пор жив. http://avb1c.narod.ru/
|
|||
14
RomanYS
30.05.20
✎
12:58
|
(10) Потому что в обычной СС ноль , 00, 000 - это всё одно число. А в (0) "A" < "AA" < "AAA" ...
|
|||
15
RomanYS
30.05.20
✎
12:59
|
+(1) без сдвига на единицу ("A" = 0):
Функция Перестановка(Знач Ч, Модуль = 26, Нач = "A") НачКод = КодСимвола(Нач); Цифр = 1; Пока Ч >= Pow(Модуль, Цифр) Цикл Ч = Ч - Pow(Модуль, Цифр); Цифр = Цифр + 1; КонецЦикла; Рез = ""; Для инд = 1 По Цифр Цикл Рез = Символ(НачКод + Ч % Модуль) + Рез; Ч = Цел(Ч/Модуль); КонецЦикла; Возврат Рез; КонецФункции // () |
|||
16
МихаилМ
30.05.20
✎
13:02
|
(15) для этого в 1с есть функция логарифма
|
|||
17
NorthWind
30.05.20
✎
13:03
|
(14) можно делать правильно с точки зрения СС, т.е. "отказаться" от значения АА, а использовать BA после Z. Т.е. X,Y,Z,BA,BB,BC...ZZ,BAA,BAB... Префиксам-то какая разница? Главное уникальность.
|
|||
18
RomanYS
30.05.20
✎
13:03
|
(16) Да первый цикл можно убрать, но Гений может не понять :)
|
|||
19
NorthWind
30.05.20
✎
13:03
|
чтобы был аналог 10, 100 и т.д.
|
|||
20
Гений 1С
гуру
30.05.20
✎
13:04
|
(17) не, не стоит прогибаться под 1С, мнение заказчика важнее. Не элегантно.
|
|||
21
RomanYS
30.05.20
✎
13:04
|
(17) Вопрос в (0) именно про математику, а не про префиксы :)
|
|||
22
RomanYS
30.05.20
✎
13:07
|
(16) а нет, (18) отменяется. Логарифм не прокатим по крайней мере напрямую. Там же сумма(N^i), а не просто (N^i)
|
|||
23
Гений 1С
гуру
30.05.20
✎
13:07
|
(21) но если возник вопрос про префиксы, то я такое решение сразу отверг. В принципе, можно было бы и в СС переводить готовой функцией, но некрасиво.
|
|||
24
Shandor777
30.05.20
✎
13:14
|
Что-то мне подсказывает, что в (0) приведена последовательность натуральных чисел. Нуля, как числа в ней нет.
|
|||
25
RomanYS
30.05.20
✎
13:16
|
(24) Если там нет нуля, то там нет и всех чисел с нулём в записи: 10, 100, 101, 110, 1000, 1001...
|
|||
26
Сияющий в темноте
30.05.20
✎
13:18
|
это система счисления со смещением.
первая цифра идет в другой системе,где нет нуля-остальные в обычной. |
|||
27
BeerHelpsMeWin
30.05.20
✎
13:33
|
О, логарифмы пошли.
Вам код из (8) в 1с перевести? |
|||
28
Dmitry77
30.05.20
✎
13:34
|
нумкрация столюцов в excel
|
|||
29
Сияющий в темноте
30.05.20
✎
13:40
|
(27) там обычный перевод в систему счисления с основанием 26,просто,старшая цифра может быть в 27 вариантах и входное число смещено на единицу.
|
|||
30
RomanYS
30.05.20
✎
13:52
|
(29) Это тоже самое, что и (24). И не работает. Или в итоге после всех костылей сведётся к (8) или (15)
|
|||
31
NorthWind
30.05.20
✎
13:55
|
скорее всего, считать нужно по основанию 26, но перед получением буквы из массива делать какие-то простые преобразования для части цифр. Например, уменьшать на единицу.
|
|||
32
NorthWind
30.05.20
✎
13:57
|
можно просто взять бумажку и расписать. Преобразование в СС делается довольно просто: делим на основание, остаток является очередной цифр, а частное - если оно больше основания, то нужно все повторить еще раз, если меньше, то это и будет последняя цифра и алгоритм завершен. Если расписать пару-тройку чиселок, то будет понятно, как правильно корежить получающиеся остатки чтобы вышло то что надо
|
|||
33
Гений 1С
гуру
30.05.20
✎
14:20
|
(32) ну вот я так и делал, ковырял, пока не получилось в контрольных точках нужное значение. Но это было не сразу. Без математики пришлось итерационно отлаживать алгоритм.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |