![]() |
![]() |
![]() |
|
Инверсия строки | ☑ | ||
---|---|---|---|---|
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)
результат выполнения:
|
|||
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)у меня получилось дольше чем третий вариант ... но если сделать так ...
то одназначно рулит |
|||
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)...
|
|||
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С!!!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |