Здравствуйте, гость ( Вход | Регистрация )

3 страниц V < 1 2 3 >  
Ответить в эту темуОткрыть новую тему
> LOCAL
Narayan
сообщение 12.3.2019, 19:30
Сообщение #21


**********

Гарант UoKit
Сообщений: 2.847
Регистрация: 28.3.2007
Группа: Супермодераторы
Наличность: 15545
Пользователь №: 9.591



Не понятно о чем топик. То ли о затыке в скрипте, то ли о хейте сферы. Не нравится - не используй (IMG:style_emoticons/default/smile.gif)


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 12.3.2019, 22:59
Сообщение #22


******

Expert
Сообщений: 809
Регистрация: 2.2.2012
Группа: Пользователи
Наличность: 15408
Пользователь №: 14.566
Возраст: 30



ничего не понимаю в сфере и вообще в написанном, но свои 5 копеек вставлю. не нравится - не читай.




немножко о типах данных в сфере

local.a = // число 0
local.a = 1 // число
local.a = 2/2 // число 1 - однако!
local.a = 1a // число, ну это понятно 16ричное
local.a = 1z // строка
local.a = 1.1 // строка

я хочу сам решать, что у меня за тип данных!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 12.3.2019, 23:12
Сообщение #23


******

Expert
Сообщений: 809
Регистрация: 2.2.2012
Группа: Пользователи
Наличность: 15408
Пользователь №: 14.566
Возраст: 30



вот вам функция деления числа на разряды
f_math_cathegory 12345678
возвращает результат 12.345.678

немножко про этот долбанутый алгоритм.
я ж не могу сразу проверить открыт local.cat или нет, он же всегда возвращает 0, а у меня внутри может и 0 хранится.
поэтому я ввожу еще один дополнительный параметр local.h, чтобы просто приравнять его к 1.
еще мне к local.cat в конце приходится приписывать букву Z, чтобы сумасшедшяя сфера поняла что у меня string.
в конце я избавлюсь от этой буквы с помощью STRSUB.

Пользуйтесь...

Код

[FUNCTION f_math_cathegory]  //делит число на разряды
if strlen(<argn>) <= 3
    return <eval <argn>>
endif
local.cat_argn = <argn>
if (<local.cat_argn> < 0)
    local.cat_m = 1
    local.cat_argn = "<eval(<local.cat_argn> * -1)>"
endif
local.cat_lng = <eval strlen(<dlocal.cat_argn>)>
FOR m <local.cat_lng>
    local.cat_i = "<eval <local.cat_lng> - <local.m>>"
    local.cat_j = "<eval(0<local.cat_j> + 1)>"
    local.cat_chart = "<STRSUB <local.cat_i> 1 <eval(<dlocal.cat_argn>)>>"
    if !(0<local.h>)
        local.h = 1
        local.cat = "<dlocal.cat_chart>z"
    elseif (<local.cat_j> == <eval((<local.cat_j> / 3) * 3)>) && (<local.cat_i> != 0)
        local.cat = ".<dlocal.cat_chart><local.cat>"
    else
        local.cat = "<dlocal.cat_chart><local.cat>"
    endif
ENDFOR
local.cat_lng = <eval strlen(<local.cat>)>
local.cat = "<STRSUB 0 <eval <local.cat_lng> - 1> <local.cat>>"
if 0<local.cat_m>
    local.cat = "-<local.cat>"
endif
return <local.cat>
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Narayan
сообщение 13.3.2019, 0:00
Сообщение #24


**********

Гарант UoKit
Сообщений: 2.847
Регистрация: 28.3.2007
Группа: Супермодераторы
Наличность: 15545
Пользователь №: 9.591



Цитата(Sirocco @ 12.3.2019, 22:59) *

ничего не понимаю в сфере и вообще в написанном, но свои 5 копеек вставлю. не нравится - не читай.


Я исключительно о твоей подаче. У тебя есть задача, но ты зачем-то хейтишь тупость сферы и обращаешь на это внимание, хотя это никак не решает твою задачу


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 1:15
Сообщение #25


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Цитата(Sirocco @ 12.3.2019, 20:59) *

я хочу сам решать, что у меня за тип данных!


(IMG:style_emoticons/default/rofl.gif) Вызывайте врачей))))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 1:26
Сообщение #26


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



А вобще советую почитать мануал. В Сфере есть функции для каста типов данных.

Цитата(Sirocco @ 12.3.2019, 20:59) *

local.a = // число 0

И? А что тут по твоему должно быть? Учи матчасть. Если это инт, то не инициализированный инт всегда будет равен 0. Если это строка, то пустая, инициализированная, строка в С будет иметь знак-терминации '\0', который в ASCII равен 0. А если её не инициализировать, то сфера вылетит с нулл поинтером.

Цитата(Sirocco @ 12.3.2019, 20:59) *

local.a = 2/2 // число 1 - однако!

Не "однако!", - a все правильно, у тебя там оператор деления используется. Ты вобще хоть какой-нибудь код хоть раз в жизни писал? Всегда сперва операция, потом присвоение. Хочешь строку? Используй квоты.

Цитата(Sirocco @ 12.3.2019, 20:59) *

local.a = 1z // строка
local.a = 1.1 // строка


1z строка, да, а что ещё тут может быть?
1.1 тоже строка, потому что сфера если сфера будет пытаться конвертировать твой скрипт во все типы данных, пока не найдет нужный, там производительности вобще не останется.
Используй float, хотя он как-то очень уж криво работает.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 2:02
Сообщение #27


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Код

if (<local.cat_argn> < 0)
    local.cat_m = 1
    local.cat_argn = "<eval(<local.cat_argn> * -1)>"
endif


abs() ? не не слышал.

Алгоритм просто отвратительный. Все что нужно сделать, это, - с конца пройти по стринге в while цикле, c использованием обратного каунтера, значение которого было взято от длинны стринги и отщипывать субстрингом по 3 знака сзади + запоминать последнюю позицию отщипывания. Дальше добавляем спереди точку и приклеиваем новый стринг из 3х знаков и точки спереди возвратной стринги. Мега просто, читабельно и раза в 3 меньше кода.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 13.3.2019, 8:24
Сообщение #28


******

Expert
Сообщений: 809
Регистрация: 2.2.2012
Группа: Пользователи
Наличность: 15408
Пользователь №: 14.566
Возраст: 30



Ладно, я разобрался. Это какая-то кривая версия сферы была. На работе кривая, дома нормальная. Я чуть с ума не сошел.
Ей плевать было на скобки, она все время считала что у меня hex.

Код

[FUNCTION f_math_2cathegory] //делит число на разряды
if strlen(<argn>) <= 3
    return <eval <argn>>
endif
local.argn = <argn>
if (<local.argn> < 0)
    local.mod = 1
    local.argn = <eval(abs(<argn>))>
endif
local.lng = <eval(strlen(<dlocal.argn>))>
local.cut = 3
WHILE <local.lng> > 0
    local.lng -= 3
    if <local.lng> <= 0
        local.cut = 3 + <local.lng>
        local.lng = 0
    endif
    local.char = "<STRSUB <local.lng> <local.cut> <dlocal.argn>>"
    if <local.emp> == 0
        local.cat = "<local.char>"
        local.emp = 1
    else
        local.cat = "<local.char>.<local.cat>"
    endif
ENDFOR
if 0<local.mod>
    local.cat = "-<local.cat>"
endif
return <local.cat>



Как написать раза в 3 меньше кода?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Ozzy Osbourne
сообщение 13.3.2019, 11:58
Сообщение #29


*********

Grandmaster
Сообщений: 2.067
Регистрация: 5.8.2003
Группа: Пользователи
Наличность: 0
Пользователь №: 810
Возраст: 32



Нет под рукой сферы что бы проверить, но думаю идея понятна
Было бы интересно взять эти две функции да засунуть в цикл из тысячи итераций и посмотреть на скорость

Код
[FUNCTION f_math_2cathegory]
IF (<DB.Connected>==1)
    DB.Query "SELECT REPLACE(REPLACE(REPLACE(FORMAT('<eval <argn>>', 2), '.', '@'), ',', '.'), '@', ',') as x"
    IF (<DB.ROW.NumRows>>0)
        return <DB.ROW.0.x>
    ENDIF
ENDIF
return <eval <argn>>


===

Моё любопытство взяло верх, провел тесты

Код
FOR i 0 100000
mysql = 12905ms
Sirocco = 13068ms

FOR i 0 10000
mysql = 1495ms
Sirocco = 1320ms


Что говорит нам о том что лучше твой код сократить и использовать возможности mysql (IMG:style_emoticons/default/smile.gif)
Ибо на долгой дистанции она дает бонус в скорости, а на короткой - разница совершенно не заметна, зато нет кода со сложной логикой + есть валидация и возможности sql


--------------------
Forest Wars
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 14:23
Сообщение #30


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Цитата(Ozzy Osbourne @ 13.3.2019, 9:58) *

Нет под рукой сферы что бы проверить, но думаю идея понятна
Было бы интересно взять эти две функции да засунуть в цикл из тысячи итераций и посмотреть на скорость

Код
[FUNCTION f_math_2cathegory]
IF (<DB.Connected>==1)
    DB.Query "SELECT REPLACE(REPLACE(REPLACE(FORMAT('<eval <argn>>', 2), '.', '@'), ',', '.'), '@', ',') as x"
    IF (<DB.ROW.NumRows>>0)
        return <DB.ROW.0.x>
    ENDIF
ENDIF
return <eval <argn>>


===

Моё любопытство взяло верх, провел тесты

Код
FOR i 0 100000
12:12:(a.scp,30)[mysql]
12:12:(a.scp,33) 12905ms

12:12:(a.scp,49)[Sirocco]
12:12:(a.scp,52)13068ms

FOR i 0 10000
2:13:(a.scp,30)[mysql]
12:13:(a.scp,33)TOTAL = 1495ms

12:13:(a.scp,49)[Sirocco]
12:13:(a.scp,52)TOTAL = 1320ms


Что говорит нам о том что лучше твой код сократить и использовать возможности mysql (IMG:style_emoticons/default/smile.gif)
Ибо на долгой дистанции она дает бонус в скорости, а на короткой - разница совершенно не заметна, зато нет кода со сложной логикой + есть валидация и возможности sql


А тут уже зависит от того что ему нужно с этим скриптом делать. Если там одиночный запрос что-бы сделать красивую стрингу и показать её по клику на кучку гп, то тут нет смысла по 10к итераций крутить и тем более 100к.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Ozzy Osbourne
сообщение 13.3.2019, 14:26
Сообщение #31


*********

Grandmaster
Сообщений: 2.067
Регистрация: 5.8.2003
Группа: Пользователи
Наличность: 0
Пользователь №: 810
Возраст: 32



Ну смысла нет, это был чисто эксперемент не слишком ли медленно мускул отвечает в данном случае и выполняет эти преобразования по сравнению со сферовской работой по строке. Как оказалось - достаточно шустро, поэтому я и предлагаю ему переложить всю работу на него. Даже если редко выводить по клику на кучке гп - решенеи с мускулом имхо покрасивше и погибче.

Редко когда тебе понадобится 10000 раз делать такое преобразование сразу ) А заметить разницу на более мелких значениях я просто не мог ибо её почти нет. Так что это чисто эксперемент, стоит ли юзать мускул в данном случае )

Плюс он спрашивал как сократить его код в "раза три" (IMG:style_emoticons/default/smile.gif)


--------------------
Forest Wars
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 16:29
Сообщение #32


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Цитата(Ozzy Osbourne @ 13.3.2019, 12:26) *

Ну смысла нет, это был чисто эксперемент не слишком ли медленно мускул отвечает в данном случае и выполняет эти преобразования по сравнению со сферовской работой по строке. Как оказалось - достаточно шустро...

Это спорно, если тут речь о кликах по кучкам гп. Там разница будет ощутимой. А ещё он нюбский алгоритм написал в котором внутри главного цикла мега медленные сферовские if проверки стоят.

Цитата(Ozzy Osbourne @ 13.3.2019, 12:26) *

Плюс он спрашивал как сократить его код в "раза три" (IMG:style_emoticons/default/smile.gif)


Вот раза в 3 короче и заодно шустрее. Чем больше число, тем шустрее он будет работать в сравнении с его алгоритмом:
Код
[FUNCTION f_math_2cathegory]
local.lng = <eval strlen(<args>)>
while <local.lng> > 3
    local.lng -= 3
    local.res = ".<strsub <local.lng> 3 <args>><local.res>" //отрезаем по 3 и клеим спереди
endwhile
local.leftover = "<strsub 0 <local.lng> <args>>"//то что осталось спереди, может включать в себя '-'
if (!strcmp(-, <local.leftover>) && strlen(<local.leftover>) == 1)
    //если нашли только '-', отрезаем точку спереди и 0 в конце строки res
    local.res = "<local.leftover><strsub 1 <eval strlen(<local.res>)-2> <local.res>>"
else
    //если спереди осталось больше 1 знака, отрезаем только 0 в конце строки res
    local.res = "<local.leftover><strsub 0 <eval strlen(<local.res>)-1> <local.res>>"
endif
return <local.res>
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Ozzy Osbourne
сообщение 13.3.2019, 16:41
Сообщение #33


*********

Grandmaster
Сообщений: 2.067
Регистрация: 5.8.2003
Группа: Пользователи
Наличность: 0
Пользователь №: 810
Возраст: 32



Цитата
Это спорно, если тут речь о кликах по кучкам гп. Там разница будет ощутимой.

Код
[Mysql] 0,13919
[Sirocco] 0,13388
[Aimed] 0,07185

Так что разница НЕ "будет ощутимой", по сравнению с его кодом (IMG:style_emoticons/default/smile.gif)

Но согласен, твой код в два раза шустрее (IMG:style_emoticons/default/punk.gif)


--------------------
Forest Wars
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 17:01
Сообщение #34


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Цитата(Ozzy Osbourne @ 13.3.2019, 14:41) *

Код
[Mysql] 0,13919
[Sirocco] 0,13388
[Aimed] 0,07185

Так что разница НЕ "будет ощутимой", по сравнению с его кодом (IMG:style_emoticons/default/smile.gif)

Но согласен, твой код в два раза шустрее (IMG:style_emoticons/default/punk.gif)


Да не в два раза там. Говорю же что чем больше будет число, тем быстрее он будет работать относительно его алгоритма. Там и в 5 раз быстрее может быть. Это смотря как тестить.

Поправил свой код, кстати. Там баг был ) и комменты добавил
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 13.3.2019, 17:05
Сообщение #35


******

Expert
Сообщений: 809
Регистрация: 2.2.2012
Группа: Пользователи
Наличность: 15408
Пользователь №: 14.566
Возраст: 30



local.res = ".<strsub <local.lng> 3 <args>><local.res>"
а что делает эта строчка, когда local.res не объявлен... и следовательно равен 0?


.show f_math_2cathegory 1234 => return "12340"

что меня и бесит!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 17:13
Сообщение #36


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Цитата(Sirocco @ 13.3.2019, 15:05) *

local.res = ".<strsub <local.lng> 3 <args>><local.res>"
а что делает эта строчка, когда local.res не объявлен... и следовательно равен 0?


А он и так всегда равен 0, даже если сделать local.res = или local.res = "" как только ты используешь local переменную сфера её сразу же обьявляет под капотом.
Поэтому я этот 0 и отрезаю после цикла. И никакого адекватного способа нету в сферскрипте что б инициализировать пустую строку.
Этот сферскрипт это дичь полнейшая. Я пока писал о<вырезано анти-матом>л от количества неопределенного поведения. Как вы вобще на нем пишите, я не понимаю. Это, наверное, мой последний кусок сферскрипта что я написал (IMG:style_emoticons/default/biggrin.gif)

Цитата(Sirocco @ 13.3.2019, 15:05) *

.show f_math_2cathegory 1234 => return "12340"

что меня и бесит!


Скорее всего что у тебя старая, забагованная версия ) Cкопируй ещё раз, сейчас.

О, ещё один баг нашел. Если число имеет 3 или меньше знаков.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 13.3.2019, 17:20
Сообщение #37


******

Expert
Сообщений: 809
Регистрация: 2.2.2012
Группа: Пользователи
Наличность: 15408
Пользователь №: 14.566
Возраст: 30



Ну там есть ошибка, при 3х знаках и меньше знаках...

if strlen(<argn>) <= 3
return <argn>
endif

мне не приходила идея отрезать этот лишний ноль. я третий день вообще с этими сложностями борюсь.
мне все говорят иди на 56 сферу, иди на 56 сферу.... все уши прожужжали как это круто...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 18:15
Сообщение #38


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



С багфиксом и комментами

Код
[FUNCTION f_math_2cathegory]
local.lng = <eval strlen(<args>)>
while <local.lng> > 3
    local.lng -= 3
    local.res = ".<strsub <local.lng> 3 <args>><local.res>" //отрезаем по 3 знака с конца args и клеим в начало res вместе с '.'
endwhile

local.leftover = "<strsub 0 <local.lng> <args>>"//то что осталось спереди, может включать в себя '-'

if (!strcmp(0, <local.res>))
    //если число состоит из 3 знаков
    local.res = "<local.leftover>"
elseif (!strcmp(-, <local.leftover>) && (strlen(<local.leftover>) == 1))
    //если нашли только '-', отрезаем точку спереди и 0 в конце строки res
    local.res = "<local.leftover><strsub 1 <eval strlen(<local.res>)-2> <local.res>>"
else
    //если спереди осталось больше 1 знака, отрезаем только 0 в конце строки res
    local.res = "<local.leftover><strsub 0 <eval strlen(<local.res>)-1> <local.res>>"
endif
return <local.res>


Цитата(Sirocco @ 13.3.2019, 15:20) *

if strlen(<argn>) <= 3
return <argn>
endif



Если будет -350 то не поможет это и прийдется писать ту костыльную if логику в цикле как у тебя.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Llirik
сообщение 13.3.2019, 19:46
Сообщение #39


******

Expert
Сообщений: 681
Регистрация: 5.9.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.259



Я тоже хочу шоколад! (IMG:style_emoticons/default/smile.gif)

Да и вообще я не понимаю 0 там или не 0 в конце добавляет сфера или из 10 получилось 16, то всё равно сфера ведь нормально его обрабатывает! Учись читать код, как Нео из матрицы, тогда будет всё ОК!)

А сферу 56c не пробовали?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 13.3.2019, 19:58
Сообщение #40


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8846
Пользователь №: 15.607



Цитата(Llirik @ 13.3.2019, 17:46) *

А сферу 56c не пробовали?


Я свой скрипт на 56d nightly билде тестировал.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

3 страниц V < 1 2 3 >
Ответить в эту темуОткрыть новую тему
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 15:07
Designed by Nickostyle