:: Visual Foxpro, Foxpro for DOS
Re: последовательность
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
[attachment 33260 malina.jpg]
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Это чо?


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: последовательность
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Награда!
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Страшная

Сразу вспомнилось:
из какого то анекдота
Хорошо, что коровы не летают


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.




Исправлено 1 раз(а). Последнее : Chemberzhy, 27.05.20 20:57
Ratings: 0 negative/0 positive
Re: последовательность
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Товарищ Ч. временами несколько диковат... Не узнал самую знаменитую в мире награду.
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Simple777
Товарищ Ч. временами несколько диковат... Не узнал самую знаменитую в мире награду.

Наверное, да
Понятия не имею, что за хрень такая


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Ага! Вот оно что такое!


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: последовательность
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Chemberzhy
Вроде работает и совсем стал миниатюрный. Люблю разумный минимализм!

Количество строк - дело не первое, и даже не второе.
Лучше все же максимально понятный алгоритм, плюс иногда и скорость.
Я уж не говорю про правильность работы (алгоритм lulgu неверен, впрочем, как и все остальные)

Я бы сначала вывел 2 правила:

1) Правило включения числа в выходную строку:
- это первое число, либо
- это последнее число, либо
- разность последующего и предыдущего чисел больше 2

2) Правило вывода символа перед выводимым числом:
- выводится "пусто", если это первое число;
- выводится ",", если включено предыдущее число;
- иначе выводится '-'

И тогда алгоритм станет достаточно прозрачным и простым.
Скорость работы, очевидно, можно даже не сравнивать.

LPARAMETERS s
ret = ''
FOR n=1 TO ALINES(arr,s,1,',')
IF INLIST(n,1,ALEN(arr)) OR (VAL(arr(n+1))-VAL(arr(n-1)))>2 && правило 1
ret = ret+ICASE(n=1,'',no_prev=(n-1),',','-')+arr(n) && в ICASE() правило 2
no_prev = n
ENDIF
ENDFOR
RETURN ret

И если в правилах я не ошибся, то, надеюсь, и функция будет работать правильно.



Исправлено 3 раз(а). Последнее : akvvohinc, 28.05.20 01:40
Ratings: 0 negative/0 positive
Re: последовательность
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
akvvohinc
И тогда алгоритм станет достаточно прозрачным и простым.

Конечно, это так:
PROCEDURE GetListStr
LPARAMETERS s
ret = LEFT(s,1)
no_prev = 1
FOR N=2 TO ALINES(arr,s,1,',')
IF N = ALEN(arr) OR VAL(arr(N+1))-VAL(arr(N-1))>2 && правило 1
ret = ret+IIF(no_prev=N-1,',','-')+arr(N) && в ICASE() правило 2
no_prev = N
ENDIF
ENDFOR
RETURN ret
Ratings: 0 negative/0 positive
Re: последовательность
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
lulgu
ret = LEFT(s,1)
А это как понимать?
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
А Хелпнуть... ;)


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: последовательность
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
akvvohinc
lulgu
ret = LEFT(s,1)
А это как понимать?

Ваше решение настолько простое, что его даже комментировать неприлично.
Ratings: 0 negative/0 positive
Re: последовательность
vnkor

Сообщений: 324
Дата регистрации: 04.10.2007
akvvohinc
lulgu
ret = LEFT(s,1)
А это как понимать?
А понимать это надо так, что если первое число содержит более одной цифры, то код работает не верно.
Ratings: 0 negative/1 positive
Re: последовательность
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
vnkor
А понимать это надо так, что если первое число содержит более одной цифры, то код работает не верно.
"Особая" обработка первого числа (даже если сделать ее нормально), чтобы не проверять на него в цикле, практически ничего не даст для повышения скорости работы, так как операции сравнения чисел - одни из самых быстрых операций.

Но если и делать это, то я бы сделал так:
k = ALINES(arr,s,1,',')
ret = arr(1)
no_prev = 1
FOR n=2 TO k
...
Ratings: 0 negative/0 positive
Re: последовательность
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Вот видите, как легко вы упростили свой простой код:

PROCEDURE GetListStr
LPARAMETERS s
k = ALINES(arr,s,1,',')
ret = arr[1]
no_prev = 1
FOR N=2 TO k
IF N = k OR VAL(arr(N+1))-VAL(arr(N-1))>2 && правило 1
ret = ret+IIF(no_prev=N-1,',','-')+arr(N) && в ICASE() правило 2
no_prev = N
ENDIF
ENDFOR
RETURN ret
Ratings: 0 negative/0 positive
Re: последовательность
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
lulgu
Вот видите, как легко вы упростили свой простой код:
Выделить "особо" можно и последнее число, но я бы не сказал, что код, а особенно его понимание, при этом упрощается, поскольку и Правило 1, и Правило 2 оказываются "размазанными" по нему.
Ratings: 0 negative/0 positive
Re: последовательность
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Упрощать рискиванно - вдруг запятую не там поставишь.
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Кому нужны правила и любовь к ним патологическая разработчика, если код скомпилируется и уйдет за края раз и навсегда?
Код должен прежде всего работать. Работать без ошибок. Работать максимально быстро. Радовать своим видом глаз разработчика, чтобы мотивировать делать красиво, а не как когда то кто то придумал по правилам.
Нафиг правила!
Даешь сексуальную революцию в разработке кодов!
Пусть те, кто в нем потом, взломав, захочет разобраться трахнет свой мозг!
Ура, товарищи!
Все на броневик!
Миру-мир!
Олимпиада завершена, главный судья (он же ТС) уже давно ушел, медалей больше не будет.
Малины тоже



------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/1 positive
Re: последовательность
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Жаль, что так и не удалось заслушать начальника транспортного цеха.
Ratings: 0 negative/0 positive
Re: последовательность
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Какие все трудные, демагоги и лентяи.
Скорость vs читабельность.

Делаем рыбу с минимальным набором функций, далее она тоже будет в тесте
Procedure s0(tcSrc) as String
Local la[1], i, lcRet
lcRet = ''
For i=1 to alines(la, m.tcSrc, 1, ',')
lcRet = m.lcRet + ',' + iif(val(la[m.i])=0, '0', la[m.i])
Endfor
Return m.lcRet
Endproc

Качаем 4 варианта отсюда, нормализуем, local m. ...
Для теста строка
1,3,4,5,7,21,22,23,9,10,11,12
Мильен итераций.
Имеем результат
37,47,49,61,61,46
Разница - семечки.
Первый это рыба, последний не отрабатывает группу 21-23.
Второй мой вчерашний, третий сегодняшний

Procedure s2(tcSrc) as String
Local la[1], i, lnBeg, lcRet
If getwordcount(m.tcSrc, ',') < 2
Return m.tcSrc
Endif
=alines(la, m.tcSrc, 1, ',')
LnBeg=1
LcRet=la[1]
For i=2 to alen(la)
Do case
Case val(la[m.i-1]) +1 # val(la[m.i])&& начало группы
lcRet = m.lcRet;
+ iif(m.lnBeg+1 < m.i, '-' + la[m.i-1], '');
+ ',' + la[m.i]
lnBeg=m.i
Case m.i = alen(la)
lcRet = m.lcRet + '-' + la[m.i]
Endcase
Endfor
Return m.lcRet
Endproc

Ежели соврал, тыкныте носом, поправлю. С мобилы пишу.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика