|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ЕвгенийВhVostt, В акуматике еще в условии запрет на использование регэкспов. Решение без регекспов выше привёл. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:03 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TМой еще проще: сложение столбиком проходил в школе? Это оно и есть, +1 столбиком. Подробный алгоритм в учебнике по математике за 2 класс :) И ты запутался в задачке для 2-го класса... Эх ты :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:03 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Pallarisну и a9999 не прожует. Вариант Хвоста надежнее Это зависит от ТЗ, к сожалению ТС этот момент не озвучил. Поэтому каждый может обрабатывать пограничные состояния по своему усмотрению. Я считаю что a9999 должно вызвать исключение, т.к. это переполнение. Все подобные кодировки, что мне попадались, всегда имели фиксированную ширину, поэтому добавление лишнего символа я считаю неправильным. Если правильно добавлять символ, то в моем коде просто заменить throw на вставку '1'. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:12 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVostt Строки в .NET не изменяемые, ты не можешь работать со строкой, как с массивом, а ты работаешь. Наигрубейшая ошибка надо сказать. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:13 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttDima TЗаинтриговал, договаривай, а то может ты просто сам запутался в моем примере, есть повод так думать Строки в .NET не изменяемые, ты не можешь работать со строкой, как с массивом, а ты работаешь. Наигрубейшая ошибка надо сказать. Даже если предположить, что строки стали работать как массивы, твой "алгоритм" вообще какую-то ерунду делает, не относящуюся к задаче ТС. Не решает задачу короче. Я думаю на самом деле ты хотел изобразить что-то типа этого: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Сорри, может туплю, но где увеличивается цифра вижу, а вот случай, когда увеличенная цифра становиться больше 9 вижу только превращение ее в 0, но переноса единицы в следующий разряд не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:19 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ЕвгенийВ, У нас живёт в офисе код, который надрессирован за такие вещи больно царапаться и больно кусаться ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:19 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ColtСорри, может туплю, но где увеличивается цифра вижу, а вот случай, когда увеличенная цифра становиться больше 9 вижу только превращение ее в 0, но переноса единицы в следующий разряд не вижу. Перенос единицы по сути -- продолжение цикла. Если нет переноса, то break. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:20 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Хотя такие вещи возможны, например, при работе с алгоритмами шифрования и интеропом, но это исключение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:21 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ColtСорри, может туплю, но где увеличивается цифра вижу, а вот случай, когда увеличенная цифра становиться больше 9 вижу только превращение ее в 0, но переноса единицы в следующий разряд не вижу. А может должно быть так: SCA009 -> SCA0010 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:30 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Самое крутое, что скорее всего ТС больше здесь не появится :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:32 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttЯ думаю на самом деле ты хотел изобразить что-то типа этого Я типа этого и изобразил, только с исключением при переполнении. Как я уже понял надо было не тупо копировать строчку с исключением из твоего кода, а оформить понятнее. С исключением там косяк небольшой, на строке без букв его не будет, например "999" Чуть поправил выдачу исключений, можешь потестить, этот запускается Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:34 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttСтроки в .NET не изменяемые, ты не можешь работать со строкой, как с массивом, а ты работаешь. В С/С++ меняются, тут нет, напутал немного. hVosttНаигрубейшая ошибка надо сказать. ХЗ что тут такого страшного, оно не компилируется. При всем желании не накосячишь. Суть была понятна, а это ляп кому надо сам поправит. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:45 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TЯ считаю что a9999 должно вызвать исключение, поддерживаю ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 13:11 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TЧуть поправил выдачу исключений, можешь потестить, этот запускается У тебя префиксы не поддерживаются, а у ТС есть примеры с префиксами. Для поддержки последний OverflowException надо убрать. И всё же, чтобы у тебя код был понятней, надо разделить блок где ты работаешь с цифрами и где работаешь с другими символами. Вот это: if(s[i] >= '0' && s[i] < '9') } else if(s[i] == '9') { Это жесть! Надо внимательно вчитываться во все условия, чтобы 100% убедиться, что обрабатываются только цифры. В моём решении в цикл вход натурально возможен только если char.IsDecimal(s[i]) -- никаких двусмысленностей, 100% только числа внутри, это очевидно сразу при первом взгляде. Я настоятельно не рекомендую писать код, который трудно читать. Иногда достаточно совсем небольших усилий, чтобы код стал понятным и прозрачным. Сложные вычурные условия вообще редко когда дают профит в производительности, скорее даже почти никогда не дают. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 13:23 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttУ тебя префиксы не поддерживаются, а у ТС есть примеры с префиксами. Для поддержки последний OverflowException надо убрать. Затести, я же написал что код запускается. Код: c# 1. 2. 3. 4. 5.
Результат Код: plaintext 1. 2. 3. 4. 5.
hVosttНадо внимательно вчитываться во все условия, чтобы 100% убедиться, что обрабатываются только цифры. В моём решении в цикл вход натурально возможен только если char.IsDecimal(s[i]) -- никаких двусмысленностей, 100% только числа внутри, это очевидно сразу при первом взгляде. Туда вообще смотреть не надо, надо просто описание к функции написать. hVosttСложные вычурные условия вообще редко когда дают профит в производительности, скорее даже почти никогда не дают. ХЗ что тяжелее: две элементарных проверки значения или вызов функции. Обычно второе. Потом пройдись пошагово отладчиком по своему и моему коду и просто посчитай сколько действий у тебя и у меня. Правда тут в первую очередь надо избавляться от перегонки из строки в массив и обратно, а потом уже прочий тюнинг. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 13:56 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
сложение столбиком освоили? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 13:57 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TПравда тут в первую очередь надо избавляться от перегонки из строки в массив и обратно открой для себя StringBuilder ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 14:04 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ИзопропилDima TПравда тут в первую очередь надо избавляться от перегонки из строки в массив и обратно открой для себя StringBuilder Что он поменяет если на входе и выходе строка нужна? У него тоже массив внутри. StringBuilder.cs Код: c# 1.
ИМХУ Тут указатели открывать надо 20055906 . ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 14:16 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TХЗ что тяжелее: две элементарных проверки значения или вызов функции. Обычно второе. Потом пройдись пошагово отладчиком по своему и моему коду и просто посчитай сколько действий у тебя и у меня. Если это и есть вся твоя программа, то ок. Но в реальных проектах экономия на спичках, приводящая к коду, который невозможно без пол бутылки прочитать, и как следствие, невозможно сопровождать, считается не просто дурным тоном. Это недопустимо. Хотя может тебя просто прикалывают алгоритмические задачки и конечные автоматы, но в реале ты так не пишешь, а то я тут распинаюсь ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 15:48 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TПравда тут в первую очередь надо избавляться от перегонки из строки в массив и обратно, а потом уже прочий тюнинг. Зачем? А если буквально через некоторое время задача усложнится, и надо будет прибавлять не 1, а 10? Или в зависимости от префикса? Твой код придётся полностью переписывать, в коде с регекспами я просто сделаю крошечное изменение: 1 заменю на 10! А если надо будет вот такие строки обрабатывать: AK0001R-P AK0002R-P И при достижении 9999 должна меняться буква? Опять закатывать рукава и писать новый автомат? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 15:56 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttDima TХЗ что тяжелее: две элементарных проверки значения или вызов функции. Обычно второе. Потом пройдись пошагово отладчиком по своему и моему коду и просто посчитай сколько действий у тебя и у меня. Если это и есть вся твоя программа, то ок. Но в реальных проектах экономия на спичках, приводящая к коду, который невозможно без пол бутылки прочитать, и как следствие, невозможно сопровождать, считается не просто дурным тоном. Это недопустимо. Хотя может тебя просто прикалывают алгоритмические задачки и конечные автоматы, но в реале ты так не пишешь, а то я тут распинаюсь Иногда пишу, но очень редко. Проекты разные бывают. Если простую функцию надо 100500 раз подряд вызвать, то есть смысл над ней поработать. Например парсинг файлов. У меня случай нестандартный, другим мою писанину точно сопровождать не придется, поэтому если и потребуется пол-бутылки, то для меня же, если в этот код полезу пару лет спустя. PS Кусочек заточенного реального кодаНаписал свою обертку для чтения DBF напрямую из файла. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Как видишь тут еще жестче. Зато ни одного new. эту строчку узнаешь? Код: c# 1.
Тот самый Char.IsDigit(), именно так Byte проверяется быстрее даже чем Код: c# 1.
Если был бы метод Int32.Parse(Byte[], Length, Оffset), то весь этот код можно было бы выкинуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 16:53 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima T Код: c# 1.
Dima TТот самый Char.IsDigit(), именно так Byte проверяется быстрее даже чем IsDigit работает очень и очень быстро, зря ты так К слову, строка содержит символы, а не байты. Некоторый юникод, попавший в твою функцию может порвать её в клочья, а IsDigit легко выдержит удар. Разницы по скорости между b >= 48 && b <= 57 и c >= '0' && c <= '9' Нет. Только во втором варианте хотя бы понятно, что имеется в виду. В первом увы, какие-то магические числа. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 17:01 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttК слову, строка содержит символы, а не байты. Некоторый юникод, попавший в твою функцию может порвать её в клочья, а IsDigit легко выдержит удар. В DBF юникода не бывает, там ASCII кодировки. Тип numeric хранится как число записанное строкой. Как понимаю при сравнении byte и char сначала идет неявное приведение типов к общему знаменателю, а при указании числом нет. Может еще что-то влияет. Когда писал изначально было if(b >= '0' && b < '9'), при тестах на скорость попробовал поменять на числа, стало быстрее. Было бы это мелочью, я бы не заметил из-за погрешности измерений, тестил разбором большого файла. Char.IsDigit() не догадался затестить, но думаю что все-таки медленнее, т.к. "IsDigit легко выдержит удар" не может быть за бесплатно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 17:26 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TКак понимаю при сравнении byte и char сначала идет неявное приведение типов к общему знаменателю, а при указании числом нет. Занимательно, что ты даже не хочешь глянуть в IL код, чтобы убедиться, что это не так :) Абсолютно параллельно с чем ты там сравниваешь byte или char, потому что они кладутся на стек как Int32 значения. b <= '9' b <= 57 Генерируют абсолютно идентичный код. Один в один. Вот из-за кучи мелких заблуждений, из-за недоверия к компилятору, который отлично умеет оптимизировать код, вырастают твои никому не нужные костыли. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 17:59 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima T"IsDigit легко выдержит удар" не может быть за бесплатно. Ты на чтении DBF теряешь времени больше, чем может отработать миллион вызовов IsDigit. Гораздо логичнее выглядит выражение "пустыню пылесосить", чем замена IsDigit на сравнения с числами. Но это уже у кого какие тараканы в голове ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 18:03 |
|
|
start [/forum/topic.php?fid=20&msg=39376823&tid=1400119]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 279ms |
total: | 435ms |
0 / 0 |