Вход | Регистрация
 

A, B, C,,, Z, AA, AB, ,,, AX, AY, AZ, BA, BB, ,,,, BX, BY, BZ, CA, CB, ,,,, Что это?

A, B, C,,, Z, AA, AB, ,,, AX, AY, AZ, BA, BB, ,,,, BX, BY, BZ, CA, CB, ,,,, Что это?
Я
   Гений 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 Тогда Прервать; КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции


Что это за последовательность, каким мат. аппаратом она правильно строится?
   RomanYS
 
1 - 30.05.20 - 12:24
(0) У тебя с прибавлением каждой новой цифры - начинается нумерация с 0 ("A"). А дальше всё просто:
26 чисел - однозначных,
26^2 двухзначных,
...

Внутри каждой группы - обычный перевод в систему счисления, с ведущими нулями. "AAA" - трёхзначный нуль.

Ну и алгоритм предельно прост - первым шагом определяем количество цифр N, дальше цикл до N
   Гений 1С
 
2 - 30.05.20 - 12:25
(1) хз, я где-то полчаса отлаживал функцию, чтобы начала выдавать правильную последовательность, вот и подумал, что у меня что-то не то с мат.аппарамтом, не прокачан он.
   Гений 1С
 
3 - 30.05.20 - 12:26
(1) не согласен, 27 - это не двухзначный нуль, это АА?
   RomanYS
 
4 - 30.05.20 - 12:27
(0) Ну и
Если Значение = 0 Тогда Прервать; КонецЕсли; 

в данных циклах рассмешило от человека, который код десятилетиями пишет
   RomanYS
 
5 - 30.05.20 - 12:29
(3) тебе сдвиг на 1 надо сделать
0 - "A"
25 - "Z"
26 - "AA"
   trad
 
6 - 30.05.20 - 12:32
Имена колонок екселя
   МихаилМ
 
7 - 30.05.20 - 12:35
(4) перевод из систем счисления в 9 классе по информатике проходят.
   BeerHelpsMeWin
 
8 - 30.05.20 - 12:37
   RomanYS
 
9 - 30.05.20 - 12:42
(7) Это не совсем СС, тут он правильно написал. Хотя основы комбинаторики где-то там же проходят. В общем сам вопрос норм.

А (4) в конце цикла "Пока Значение > 0 Цикл" это прикол
   Salimbek
 
10 - 30.05.20 - 12:53
(9) Почему нет? 26-ричная система счисления на алфавите ABCD..
   NorthWind
 
11 - 30.05.20 - 12:54
(0) Это 26-ричная система счисления с буквенным алфавитом, где цифра от 1 до 26 представляется как буква от А до Z.
   NorthWind
 
12 - 30.05.20 - 12:54
Сорри, от 0 до 25, конечно
   МихаилМ
 
13 - 30.05.20 - 12:54
сайт avb  досих пор жив. http://avb1c.narod.ru/
   RomanYS
 
14 - 30.05.20 - 12:58
(10) Потому что в обычной СС ноль , 00, 000 - это всё одно число. А в (0) "A" < "AA" < "AAA" ...
   RomanYS
 
15 - 30.05.20 - 12:59
+(1) без сдвига на единицу ("A" = 0):
Функция Перестановка(Знач Ч, Модуль = 26, Нач = "A")
    
    НачКод = КодСимвола(Нач);
    
    Цифр = 1;
    Пока Ч >= Pow(Модуль, Цифр) Цикл
        Ч = Ч - Pow(Модуль, Цифр); 
        Цифр = Цифр + 1;
    КонецЦикла;
    
    Рез = "";
    Для инд = 1  По Цифр Цикл
        Рез = Символ(НачКод + Ч % Модуль) + Рез;
        Ч = Цел(Ч/Модуль);
    КонецЦикла;
    
    Возврат Рез;
    
КонецФункции// ()
   МихаилМ
 
16 - 30.05.20 - 13:02
(15) для этого в 1с есть функция логарифма
   NorthWind
 
17 - 30.05.20 - 13:03
(14) можно делать правильно с точки зрения СС, т.е. "отказаться" от значения АА, а использовать BA после Z. Т.е. X,Y,Z,BA,BB,BC...ZZ,BAA,BAB... Префиксам-то какая разница? Главное уникальность.
   RomanYS
 
18 - 30.05.20 - 13:03
(16) Да первый цикл можно убрать, но Гений может не понять :)
   NorthWind
 
19 - 30.05.20 - 13:03
чтобы был аналог 10, 100 и т.д.
   Гений 1С
 
20 - 30.05.20 - 13:04
(17) не, не стоит прогибаться под 1С, мнение заказчика важнее. Не элегантно.
   RomanYS
 
21 - 30.05.20 - 13:04
(17) Вопрос в (0) именно про математику, а не про префиксы :)
   RomanYS
 
22 - 30.05.20 - 13:07
(16) а нет, (18) отменяется. Логарифм не прокатим по крайней мере напрямую. Там же сумма(N^i), а не просто (N^i)
   Гений 1С
 
23 - 30.05.20 - 13:07
(21) но если возник вопрос про префиксы, то я такое решение сразу отверг. В принципе, можно было бы и в СС переводить готовой функцией, но некрасиво.
   Shandor777
 
24 - 30.05.20 - 13:14
Что-то мне подсказывает, что в (0) приведена последовательность натуральных чисел. Нуля, как числа в ней нет.
   RomanYS
 
25 - 30.05.20 - 13:16
(24) Если там нет нуля, то там нет и всех чисел с нулём в записи: 10, 100, 101, 110, 1000, 1001...
   Сияющий в темноте
 
26 - 30.05.20 - 13:18
это система счисления со смещением.
первая цифра идет в другой системе,где нет нуля-остальные в обычной.
   BeerHelpsMeWin
 
27 - 30.05.20 - 13:33
О, логарифмы пошли.
Вам код из (8) в 1с перевести?
   Dmitry77
 
28 - 30.05.20 - 13:34
нумкрация столюцов в excel
   Сияющий в темноте
 
29 - 30.05.20 - 13:40
(27) там обычный перевод в систему счисления с основанием 26,просто,старшая цифра может быть в 27 вариантах и входное число смещено на единицу.
   RomanYS
 
30 - 30.05.20 - 13:52
(29) Это тоже самое, что и (24). И не работает. Или в итоге после всех костылей сведётся к (8) или (15)
 
 Рекламное место пустует
   NorthWind
 
31 - 30.05.20 - 13:55
скорее всего, считать нужно по основанию 26, но перед получением буквы из массива делать какие-то простые преобразования для части цифр. Например, уменьшать на единицу.
   NorthWind
 
32 - 30.05.20 - 13:57
можно просто взять бумажку и расписать. Преобразование в СС делается довольно просто: делим на основание, остаток является очередной цифр, а частное - если оно больше основания, то нужно все повторить еще раз, если меньше, то это и будет последняя цифра и алгоритм завершен. Если расписать пару-тройку чиселок, то будет понятно, как правильно корежить получающиеся остатки чтобы вышло то что надо
   Гений 1С
 
33 - 30.05.20 - 14:20
(32) ну вот я так и делал, ковырял, пока не получилось в контрольных точках нужное значение. Но это было не сразу. Без математики пришлось итерационно отлаживать алгоритм.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.