Имя: Пароль:
1C
 
Инверсия строки
0 Slon747
 
25.11.08
09:51
Неужели в восьмерке нет нормального способа инвертирования строки?
Я написал свою ф-цию, но может есть что-то красивее?

Функция ИнверсияСтроки(Стр)
   
   Длина = СтрДлина(Стр);
   ИнверсСтрока = "";

   Для Сч = 1 По Длина Цикл
       ИнверсСтрока = ИнверсСтрока + Сред(Стр, Длина-Сч+1, 1);
   КонецЦикла;
   
   Возврат ИнверсСтрока;
   
КонецФункции
1 Sadovnikov
 
25.11.08
09:52
(0) А зачем?
2 Slon747
 
25.11.08
09:52
Надо :)
3 Sadovnikov
 
25.11.08
09:53
(2) Сильный ответ...
4 чувак
 
25.11.08
09:53
А что это - инверция?
5 zak555
 
25.11.08
09:55
(0)
а не проще так:

Функция ИнверсияСтроки(Стр)
   
   Длина = СтрДлина(Стр);
   ИнверсСтрока = "";

   Для Сч = 1 По Длина Цикл
       ИнверсСтрока = Сред(Стр, Сч, 1) + ИнверсСтрока;
   КонецЦикла;
   
   Возврат ИнверсСтрока;
   
КонецФункции


?
6 Slon747
 
25.11.08
09:57
(4) Строка <-> акортС

(3) Просто долго не мог решить проблему с разработкой ПО для терминала сбора данных. И наконец придумал решение проблемы. Но оно такое "необычное", что будете смеяться :)
7 Sadovnikov
 
25.11.08
09:58
(6) Да уж чуствуется, что необычное :)
8 zak555
 
25.11.08
09:58
+5 даже лучше так:

Функция ИнверсияСтроки(Стр)
   
   Длина = СтрДлина(Стр);
   Если СтрДлина(СокрЛП(Стр)) <> Длина Тогда
       Возврат Стр;
   КонецЕсли;

   ИнверсСтрока = "";
   Для Сч = 1 По Длина Цикл
       ИнверсСтрока = Сред(Стр, Сч, 1) + ИнверсСтрока;
   КонецЦикла;
   
   Возврат ИнверсСтрока;
   
КонецФункции
9 Slon747
 
25.11.08
10:00
(5) Действительно, проще
10 Sadovnikov
 
25.11.08
10:00
(8) А поясни:
   Если СтрДлина(СокрЛП(Стр)) <> Длина Тогда
       Возврат Стр;
?
11 skunk
 
25.11.08
10:01
а если строку собирать из двух кусков... быстрее не будет?
12 zak555
 
25.11.08
10:03
(10) ну передам я строку длиной, например в 100 пробелов или 0 символов:
чтоб не далать инверсию строки - сразу вернуть!

Кстати, забыл условие

Функция ИнверсияСтроки(Стр)
   
   Длина = СтрДлина(Стр);
   Если (СтрДлина(СокрЛП(Стр)) <> Длина) или (Длина=0) Тогда
       Возврат Стр;
   КонецЕсли;

   ИнверсСтрока = "";
   Для Сч = 1 По Длина Цикл
       ИнверсСтрока = Сред(Стр, Сч, 1) + ИнверсСтрока;
   КонецЦикла;
   
   Возврат ИнверсСтрока;
   
КонецФункции
13 Mitriy
 
25.11.08
10:04
(12)бред...
14 Mitriy
 
25.11.08
10:05
(11) можешь мысль развить дальше?
15 Sadovnikov
 
25.11.08
10:05
(12) "ну передам я строку длиной, например в 100 пробелов или 0 символов"
Тогда уж вот так:
Если СтрДлина(СокрЛП(Стр) = 0 Тогда
 Возврат "";
16 zak555
 
25.11.08
10:05
(13)
и что у тебя будет делать цикл с таким условием:
Для Сч = 1 По Длина Цикл, где длина = 0
?
Ошибка будет!
17 zak555
 
25.11.08
10:06
(15) да, это проще условие!
18 Mitriy
 
25.11.08
10:06
(15) ПустаяСтрока в таком случае еще проще...
19 Sadovnikov
 
25.11.08
10:06
(16) С какого перепуга это будет ошибка??
20 Sadovnikov
 
25.11.08
10:07
(17) Оно не проще - оно правильнее. Проще (и еще более правильнее) - в (18).
21 zak555
 
25.11.08
10:10
(20) - согласен: ПустаяСтрока() делает проверку на значащие символы!
22 zak555
 
25.11.08
10:11
(19) а что не будет?
23 Sadovnikov
 
25.11.08
10:11
(21) А твое условие
СтрДлина(СокрЛП(Стр)) <> Длина
очень весело "проинвертирует" строку вида: "  фыва ".
24 Sadovnikov
 
25.11.08
10:12
(22) А с чего она должна быть-то? Напиши 3 строки кода - проверь.
25 skunk
 
25.11.08
10:17
//*******************************************
функция стИнверсировать(стрТемп)
   чисДлина = стрдлина(стрТемп);
   если чисДлина = 0 тогда
       возврат "";
   конецесли;
   чисРотаций = цел(чисДлина / 2);
   стрСтаршая = "";
   стрМладшая = "";
   стрБайт = "";
   для х = 1 по чисРотаций цикл
       стрСтаршая = стрСтаршая + сред(стрТемп, чисДлина - х + 1, 1);
       стрМладшая = сред(стрТемп, х, 1) + стрМладшая;
   конеццикла;
   если чисДлина % 2 = 1 тогда
       стрБайт = сред(стрТемп, х, 1);
   конецесли;
   возврат стрСтаршая + стрБайт + стрМладшая
конецфункции;


сообщить(стИнверсировать("мама мыла раму"));
сообщить(стИнверсировать("мама мыла раму!"));
сообщить(стИнверсировать("мама мыла раму!!!!"));
26 zak555
 
25.11.08
10:17
(23) в (8) и в (12) поторопился - окончательное условие в (18) => получается:

Функция ИнверсияСтроки(Стр)
   Если ПустаяСтрока(Стр)=1 Тогда
       Возврат Стр;
   КонецЕсли;
   Длина = СтрДлина(Стр);
   ИнверсСтрока = "";
   Для Сч = 1 По Длина Цикл
       ИнверсСтрока = Сред(Стр, Сч, 1) + ИнверсСтрока;
   КонецЦикла;    
   Возврат ИнверсСтрока;    
КонецФункции
27 zak555
 
25.11.08
10:19
(24) - я не значю, как в 8 (только что заметил), но в 7 - будут проблемы!
28 Sadovnikov
 
25.11.08
10:19
(27) Опять ты очень неудачно пошутил...
29 Serg_1960
 
25.11.08
10:20
Делать Вам нечего - отвлекаете от работы меня :) И незачем блох ловить, -тьфу, милисекунды...

Функция Инверсия(Строка, Знач Поз = 0)
  Поз = Поз + 1;
  Возврат ?(Поз > СтрДлина(Строка), "", Инверсия(Строка, Поз) + Сред(Строка,Поз,1));
КонецФункции

Строка = "А роза упала на лапу Азора";
Сообщить(Инверсия(Строка));
30 Sadovnikov
 
25.11.08
10:21
+(28) Код:

   Для Н = 1 По 0 Цикл
       Сообщить(Н);
   КонецЦикла;

ни в семерке, ни в восьмерке ошибки не выдаст. Я вообще сомневаюсь, что ты сможешь найти такой язык, где данный код выдаст ошибку.
31 zak555
 
25.11.08
10:21
(25) у тебя функция Сред() выполняется Длина или Длина+1 раз в зависимости от чётности! => почему ж быстре будет, чем в (26) ?
32 Sadovnikov
 
25.11.08
10:21
(29) Ты лучше другую строчку проинверсируй: "Улыбок тебе дед Макар".
33 Sadovnikov
 
25.11.08
10:22
В (32) смайлик ":)" забыл поставить.
34 zak555
 
25.11.08
10:33
(24) беру свои слова обратно!
но всё равно (26) будет быстрее работать, чем (5) ?
35 Живой Ископаемый
 
25.11.08
10:37
кстати мне тоже как-то понадобилась... не вспомню зачем, правда... это все недостатки того что в в8 строка - не массив...
36 skunk
 
25.11.08
10:46
(31)


//*******************************************
функция стИнверсировать(стрТемп)
   чисДлина = стрдлина(стрТемп);
   если чисДлина = 0 тогда
       возврат "";
   конецесли;
   чисРотаций = цел(чисДлина / 2);
   стрСтаршая = "";
   стрМладшая = "";
   стрБайт = "";
   для х = 1 по чисРотаций цикл
       стрСтаршая = стрСтаршая + сред(стрТемп, чисДлина - х + 1, 1);
       стрМладшая = сред(стрТемп, х, 1) + стрМладшая;
   конеццикла;
   если чисДлина % 2 = 1 тогда
       стрБайт = сред(стрТемп, х, 1);
   конецесли;
   возврат стрСтаршая + стрБайт + стрМладшая
конецфункции

//*******************************************
функция ИнверсияСтроки(Стр)
   Длина = СтрДлина(Стр);
   ИнверсСтрока = "";
   Для Сч = 1 По Длина Цикл
       ИнверсСтрока = ИнверсСтрока + Сред(Стр, Длина-Сч+1, 1);
   КонецЦикла;
   Возврат ИнверсСтрока;
конецфункции

//*******************************************
процедура Сформировать()
   чисСтарт = _getperformancecounter();
   для х = 1 по 1000 цикл
       стрТемп = стИнверсировать("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
   конеццикла;
   чисФиниш = _getperformancecounter();
   сообщить("вариант 1: " + (чисФиниш - чисСтарт));
   чисСтарт = _getperformancecounter();
   для х = 1 по 1000 цикл
       стрТемп = ИнверсияСтроки("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
   конеццикла;
   чисФиниш = _getperformancecounter();
   сообщить("вариант 2: " + (чисФиниш - чисСтарт));
конецпроцедуры


результат выполнения:

вариант 1: 362
вариант 2: 442
вариант 1: 359
вариант 2: 444
вариант 1: 359
вариант 2: 441
вариант 1: 359
вариант 2: 441
37 Serg_1960
 
25.11.08
10:52
(36) И не жалко было "своего" времени? Нет? Проверь и покажи (29), - плиз :)
38 skunk
 
25.11.08
10:56
вариант 1: 361
вариант 2: 447
вариант 3: 991
вариант 1: 360
вариант 2: 444
вариант 3: 987
вариант 1: 361
вариант 2: 445
вариант 3: 988

(29) это вариант 3
39 Serg_1960
 
25.11.08
11:12
(38) Я в шоке от несовершенства окружающего мира...
Такой красивый код, - а так работает :(( Но мы в лидерах :))
40 Живой Ископаемый
 
25.11.08
11:16
Стойте... а инвертировать  одномерный массив в в8 тоже сложно? нету метода?
41 zak555
 
25.11.08
11:18
==============================================================================
ИнверсияСтроки1() = 978
ИнверсияСтроки2() = 976
ИнверсияСтроки3() = 859
Инверсия() = 14638
стИнверсировать() = 736
==============================================================================
ИнверсияСтроки1() = 995
ИнверсияСтроки2() = 981
ИнверсияСтроки3() = 1039
Инверсия() = 1790
стИнверсировать() = 787
==============================================================================
ИнверсияСтроки1() = 1038
ИнверсияСтроки2() = 943
ИнверсияСтроки3() = 934
Инверсия() = 1925
стИнверсировать() = 1561

где
ИнверсияСтроки1() - это (5)
ИнверсияСтроки2() - это (26)
ИнверсияСтроки3() - это (0)
Инверсия()        - это (29)
стИнверсировать() - это (25)
42 skunk
 
25.11.08
11:32
(41)чет не понятно, почему в третий раз стрИнверсировать более чем в два раза тупила
43 asady
 
25.11.08
11:34
А такая?


Функция ИнверсияСтроки(Стр)
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="vbscript";
   Возврат Скрипт.Eval("StrReverse("""+Стр+""")");
КонецФункции
44 skunk
 
25.11.08
11:38
(43)у меня получилось дольше чем третий вариант ... но если сделать так ...


перем Скрипт;

Функция ИнверсияСтроки(Стр)
   Скрипт.language="vbscript";
   Возврат Скрипт.Eval("StrReverse("""+Стр+""")");
КонецФункции


Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");


то одназначно рулит
45 asady
 
25.11.08
11:40
(44) можешь взять пирожок с полочки :)))
46 Serg_1960
 
25.11.08
11:51
(44) Нечестно!!! Это не по теме!!! Автор просил "в восьмерке"!!!
Всё, я обидился... и не предлагаю вам .ddl-ку на Си++
47 Slon747
 
25.11.08
12:36
Всем спасибо.
Очень познавательно!
48 zak555
 
25.11.08
13:40
+ (41) вот ещё резутаты: теперь для строки длинной 2500
==============================================================================
ИнверсияСтроки1() = 5552
ИнверсияСтроки2() = 5753
ИнверсияСтроки3() = 4920
Инверсия() = 200423
стИнверсировать() = 73505

возникает вопрос: почему ИнверсияСтроки1() дольше, чем ИнверсияСтроки3() ???
описания их в (41)

т.е. получается, что контактенация слева быстрее (хотя в функции Сред() идёт вычисление выражения), чем справа?
Благодарю за ответы!
49 skunk
 
25.11.08
14:07
(48)код покажите как тестили... а то вот у меня совсем други результаты получаются...

3200
вариант 1: 20397
вариант 2: 25343
вариант 3: 24551
3200
вариант 1: 20409
вариант 2: 25478
вариант 3: 24829

вариант 1 (мой) из (25)
вариант 2 (ваш) из (5)
вариант 3 (0)

3200 - количество символов в строке
50 zak555
 
25.11.08
14:29
(49)

       нач = _GetPerformanceCounter();
   й = ИнверсияСтроки1(Стр);
   Сообщить("ИнверсияСтроки1() = "+Число(_GetPerformanceCounter() - нач));


где стр - строка длины = 25000
51 skunk
 
25.11.08
14:39
ну вот 25600

25600
вариант 1: 7366
вариант 2: 10338
вариант 3: 8660
25600
вариант 1: 8370
вариант 2: 10567
вариант 3: 8615
25600
вариант 1: 7551
вариант 2: 10243
вариант 3: 8559

да еще и в цикле ... правда здесь число ротаций уменшил до 10...
52 zak555
 
25.11.08
14:41
(51)
а распиши какой вариант, какой пост - может я запутался?! ;-)
53 skunk
 
25.11.08
14:43
(52)смотри в (49)
54 zak555
 
25.11.08
22:16
новые результаты на серваке!!! СтрДлина(Стр) = 200000 !!!
всё-такие получается, что х = х + а работает быстрее, чем х = а + х!!!

ПОЧЕМУ?
P.s. кстати, а почему так результаты разняться? У меня понятно - хард очень старый => тормозит!

ИнверсияСтроки1() - это (5)
ИнверсияСтроки2() - это (26)
ИнверсияСтроки3() - это (0)
Инверсия()        - это (29) - снята с тестирования, т.к. платформа выдала ошибку: Out of memory!
стИнверсировать() - это (25)


//я нашёл самую быструю функцию:
Функция ИнверсияСтроки0(Стр)    
   Длина = СтрДлина(Стр);
   ИнверсСтрока = "";
   Для Сч = -Длина По -1 Цикл
       ИнверсСтрока = ИнверсСтрока + Сред(Стр, -Сч, 1);
   КонецЦикла;    
   Возврат ИнверсСтрока;    
КонецФункции


==============================================================================
Результат № 1
ИнверсияСтроки0() = 105913
ИнверсияСтроки1() = 144093
ИнверсияСтроки2() = 146785
ИнверсияСтроки3() = 113240
стИнверсировать() = 109914
55 skunk
 
26.11.08
06:05
опять не сходиться... да и не самый быстрый это способ... самый быстрый это модификация способа (44) предложенного в (44)...


204800
ИнверсияСтроки0: 56185
ИнверсияСтроки1: 68325
ИнверсияСтроки2: 69028
ИнверсияСтроки3: 62241
стрИнверсировать: 51761
ИнверсияСтроки: 10
204800
ИнверсияСтроки0: 61862
ИнверсияСтроки1: 70021
ИнверсияСтроки2: 81742
ИнверсияСтроки3: 55191
стрИнверсировать: 45848
ИнверсияСтроки: 8
204800
ИнверсияСтроки0: 74635
ИнверсияСтроки1: 71760
ИнверсияСтроки2: 78170
ИнверсияСтроки3: 55355
стрИнверсировать: 47718
ИнверсияСтроки: 9
56 zak555
 
26.11.08
07:10
(55) - ладно согласен, твой метод (25) быстрее...
Тестировалось опять на длине = 200000...

Кстати, я его модифицировал и он стал быстрее работать:
И опять вопрос: ПОЧЕМУ получается, что х = х + а работает быстрее, чем х = а + х???

функция стИнверсировать0(стрТемп)
   чисДлина = стрдлина(стрТемп);    
   чисРотаций = цел(чисДлина / 2);
   стрСтаршая = "";
   стрМладшая = "";
   стрБайт = "";
   для х = 1 по чисРотаций цикл
       стрСтаршая = стрСтаршая + сред(стрТемп, чисДлина   - х + 1, 1);
       стрМладшая = стрМладшая + сред(стрТемп, чисРотаций - х + 1, 1);
   конеццикла;    
   возврат стрСтаршая + ?(чисДлина % 2 = 1, сред(стрТемп, х, 1), "") + стрМладшая
конецфункции

==============================================================================
Результат № 1
ИнверсияСтроки0()  = 116413
стИнверсировать()  = 103972
стИнверсировать0() =  93900
==============================================================================
Результат № 2
ИнверсияСтроки0()  = 113928
стИнверсировать()  = 104426
стИнверсировать0() =  93667
==============================================================================
Результат № 3
ИнверсияСтроки0()  = 105769
стИнверсировать()  = 104242
стИнверсировать0() =  93083
57 zak555
 
26.11.08
07:12
(55) метод в (44) можно назвать "нетиповым"! Изначальна задача ставилась решить задачу средствами 1С!!!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший