Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Grivus74 on June 04, 2020, 09:23:11 PM

Title: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Grivus74 on June 04, 2020, 09:23:11 PM
Здравствуйте! Можно ли вывести в лог однозначное число в виде двухзначного, с нулём впереди, 2 как 02? Переменная от 1 до 20. Несколько в ряд, нарушается рядность по вертикали, т.к. длина цифр не всегда 2 знака. Может быть тут есть возможность сетки в логе. Спасибо за ответ.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 05, 2020, 08:12:34 AM
Привет!
Возможности "сетки в логе" я что-то не припомню в Clickermann'е. Но это реализуемо в самом коде.
Можно напридумывать своих форматов вывода в лог.

Пара примеров:
Code: (clickermann) [Select]
$var = 2

IF($var < 10) // Если цифра меньше 10,
   $var = STRCONCAT("0", $var) // дописываем перед ней 0
END_IF

LOGWRITE ($var)

HALT

Можно оформить в виде подпрограммы.
Code: (clickermann) [Select]
SUB(Формат_1) // вывести в лог строку из однозначных чисел в виде двузначных
   STRSEPARATE($str, " ", $arr)
   $str = ""
   FOR($n = 0, $n < ARRSIZE($arr))
      IF(STRLEN($arr[$n]) < 2)
         $arr[$n] = STRCONCAT("0", $arr[$n])
      END_IF
      $str = STRCONCAT($str, " ", $arr[$n])
   END_CYC
   LOGWRITE (STRREPLACE($str, " ", ""))
END_SUB
//--------------------------------
$str = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20" // Строка для вывода в лог

Формат_1() // Вывод в лог строки "$str" в формате "Формат_1"

HALT

Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 05, 2020, 01:18:54 PM
Вот для любого количества разрядов. Здесь "2" - количество разрядов
Code: (clickermann) [Select]
WHILE(STRLEN($t) < 2)
    $t = STRCONCAT("0", $t)
END_CYC
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 05, 2020, 04:26:43 PM
Подобная конструкция с циклом WHILE и STRREPLACE хорошо работает если из строки нужно удалить несколько вхождений подстроки. А здесь непонятно зачем цикл. Он выполнится только один раз. В данном примере - только, если в переменной $t всего один символ. Да и конкатенация будет стремиться завершить цикл.
Если планировалось в цикле перебирать строку по разделителям, находить в ней нужные цифры и добивать их разрядность нулями, то чего-то в скрипте сильно не хватает.
Или я чего-то тупо не понимаю.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 05, 2020, 05:09:02 PM
Изначально он был на 6 разрядов. Конструкция просто универсальная. Дана как пример.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 05, 2020, 05:52:56 PM
Всё, врубился, оценил преимущество.) Конструкция на 6 разрядов добьет нулями до 6 символов любую переменную $t, содержащую изначально менее 6 символов.
Меня сначала смутило, что по длинной строке с разделителями, эту конструкцию саму тащить надо циклом.)) Но это не планировалось.
Спасибо)
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 07, 2020, 02:36:21 PM
Появился еще один вопрос по алгоритмике и синтаксису...

Вот для любого количества разрядов. Здесь "2" - количество разрядов
Code: (clickermann) [Select]
WHILE(STRLEN($t) < 2)
    $t = STRCONCAT("0", $t)
END_CYC

Верно ли, что подобную универсальную конструкцию можно записать в одну строку так, что при этом она будет работать примерно в 6 раз быстрее, но делать то же самое? Если верно, то как?

UPD: Выражение "примерно в 6 раз быстрее", наверно стоит заменить на "не менее, чем в 5 раз быстрее".
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 08, 2020, 08:42:04 PM
Появился еще один вопрос по алгоритмике и синтаксису...

Верно ли, что подобную универсальную конструкцию можно записать в одну строку так, что при этом она будет работать примерно в 6 раз быстрее, но делать то же самое? Если верно, то как?

UPD: Выражение "примерно в 6 раз быстрее", наверно стоит заменить на "не менее, чем в 5 раз быстрее".

Можно, наверное. Если задаться целью. Нет предела совершенству.
Вот до 10 разрядов без изменения строки. Так же 6 - дополнение до 6 символов.

Code: (clickermann) [Select]
print(STRCONCAT(STRCUT("0000000000", 1, 6-STRLEN($x)), $x))
В одну строку. По скорости должно быть быстрее за счёт отсутствия цикла, не в 6 раз конечно.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 08, 2020, 09:41:37 PM
Великолепно! Просто кайф, правда? :D
Вроде мелочь и всего одна строка, а сколько удовольствия.)) Такие небольшие задачки удобно таскать голове и иногда может родиться красивое решение.)

У меня получилось точно так же. Эта конструкция работает уверенно в 5 раз быстрее. Но все равно остается чувство, что можно написать по другому, лучше. Есть же всякие математические фокусы, чтобы добавить к числу несколько нулей. Но я этих формул не знаю. :-\

Вот мой "тестовый стенд" для сравнения скорости этих конструкций.
Code: (clickermann) [Select]
LOGCLEAR

$t = 12345

$time_1 = $_ms

FOR($n = 0, $n < 1000)
   WHILE(STRLEN($t) < 10)
      $t = STRCONCAT("0", $t)
   END_CYC
   UNDEFINE($t)
END_CYC

$x1 = $_ms - $time_1

WAITMS(100)

//--------------------------------

$var = 12345

$time_2 = $_ms

FOR($n = 0, $n < 1000)
   $var = STRCONCAT(STRCUT("0000000000", 1, 10 - STRLEN($var)), $var)
   UNDEFINE($var)
END_CYC

$x2 = $_ms - $time_2

//--------------------------------

LOGWRITE (STRCONCAT($x1, " / ", $x2, " = ", $x1 / $x2))

HALT

В логе:
Code: [Select]
1454 / 260 = 5.59230769231
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 08, 2020, 09:54:19 PM
Тут ещё какая хрень. Когда часто отвечаешь на форуме, где уровень у всех разный и особенно, если отвечаешь новичку, начинаешь учитывать это в ответе. Можно написать легковесное, понятное решение в котором легко разобраться, как в примере с циклом. Оно и структурировано и вложенность низкая и символов мало. А можно решение на 1-2 мс быстрее, но с 3 вложенными функциями, которые их только отпугнут.
Да и не такой это нагруженный участок, чтоб его оптимизировать.
А число не может храниться с незначащими нулями если это именно тип числовой.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 08, 2020, 10:24:41 PM
На питоне, я бы использовал форматирование строк
если var = 23 так
Code: (javascript) [Select]
print(f'{var:0>6}')
или в старом c-стиле
Code: (javascript) [Select]
print('%06d' % var)
или можно так же, как на кликермэне
Code: (javascript) [Select]
print('0'*(6-len(str(var)))+str(var))
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 09, 2020, 12:31:09 AM
Да я прекрасно понимаю как строятся ответы на вопросы на форуме. И согласен с тем, что нет смысла выкатывать продвинутый код в качестве ответа новичкам, в большинстве случаев. Тем более, что в вопросах обычно не хватает элементарных входных данных. Все шифруются. Темы многократно дублируются...
Но есть же люди, которые ищут красивые решения, пусть даже в синтетических задачах, как на Codewars. Они ради этого и посещают форум, именно для прокачки скилла. По этому, думаю, что надо подталкивать людей к достижению совершенства в коде. Например, можно заинтриговать аудиторию вопросом, на который знаешь новый/нестандартный ответ. Как это попытался сделать я.)) Ответ можно скрыть, например в спойлере (если бы он работал; давно не проверял). И это не совсем "синтетика", а реальная задача, пусть даже редко встречающаяся. Но для этого форума вроде как новая. Или я ошибаюсь.
Сейчас же получается, что интерес с к теме пропадает сразу, как только предложен более менее рабочий код.

Теперь по теме:
Не всё так однозначно со скоростью конструкций. В моем тестовом скрипте ошибка, в двух местах. Но все равно обе конструкции тестируются в равных условиях.
Величина выигрыша в скорости не постоянна. Цикл не любит накручивать много нулей, а однострочной конструкции это кажется "по барабану" (это еще одно её достоинство).

Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 09, 2020, 06:37:50 AM
Такой вопрос был минимум 4 раза на форуме и минимум 6 в группе ВК. Можно поискать по частям фразы 'пароль [перебор] от 0000 до 9999 и нажать T'.

Без цикла, конечно, лучше, т.к. сложность константа O(1)
С циклом сложность линейная O(n)
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 09, 2020, 09:05:41 AM
Такой вопрос был минимум 4 раза на форуме и минимум 6 в группе ВК. Можно поискать по частям фразы 'пароль [перебор] от 0000 до 9999 и нажать T'.

Без цикла, конечно, лучше, т.к. сложность константа O(1)
С циклом сложность линейная O(n)

Действительно, тема не нова, что не удивляет почему-то. И точно такой код был предложен, еще 2012 году, вот в этом сообщении - http://crapware.aidf.org/forum/index.php?topic=9.msg340#msg340
Других подобных тем я не просматривал.
Значит можно было и в этой теме выложить старый проверенный код.
Радует то, что я сам допер до этого решения. Увидел возможность и сделал. И как оказалось - угадал. Было интересно. :)

По поводу оценки сложности алгоритма, я не в курсе. По моему всё просто - более простой алгоритм, для сложной задачи составить труднее, но он будет лучше сложного. А менее производительный код - по определению хуже. Чем меньше разных действий и вычислений в алгоритме, тем он проще. Выше скилл программиста - проще алгоритм и производительней код. А что сверх того, то от лукавого.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 09, 2020, 10:33:36 AM
Я тоже тот пост не видел.
Про аналогичные случаи я говорил про эти:
http://crapware.aidf.org/forum/index.php?topic=2178.msg13035#msg13035
http://crapware.aidf.org/forum/index.php?topic=1922.msg11467#msg11467
http://crapware.aidf.org/forum/index.php?topic=2745.msg17522#msg17522
http://crapware.aidf.org/forum/index.php?topic=3997.msg30219#msg30219
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 09, 2020, 10:38:49 AM
По поводу оценки сложности алгоритма, я не в курсе. По моему всё просто - более простой алгоритм, для сложной задачи составить труднее, но он будет лучше сложного. А менее производительный код - по определению хуже. Чем меньше разных действий и вычислений в алгоритме, тем он проще. Выше скилл программиста - проще алгоритм и производительней код. А что сверх того, то от лукавого.

Это не про ту сложность, не про сложность написания. Это про вычислительную сложность
https://tproger.ru/articles/computational-complexity-explained/
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 09, 2020, 12:04:25 PM
Спасибо за ссылки. Надо будет вникнуть в эту тему. С наскока ничего не понятно.)) И пока не понятно чем это может помочь в написании скриптов. Но для расширения кругозора точно будет полезно.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Atas on June 10, 2020, 09:20:41 AM
Всем привет! :)

Я с интересом наблюдал за развитием этой темы и сочинил такую же конструкцию-строку с нулями. Но Виталий меня опередил. И раз уж совершенству (как и маразму) ;D нет предела, то мне оставалось только "тряхнуть стариной" и придумать что-то другое...

Придумал я вот это - https://yadi.sk/d/771Yn1Y99rNmnw
Не берусь утверждать, что раньше так никто не делал. В конечном итоге, мы в своих скриптах всего лишь меняем местами одни и те же неизменные команды, которые однажды дал нам СОЗДАТЕЛЬ. :)
Скачайте и сохраните архив у себя. А пароль к архиву я выложу как будет найдено такое же решение кем то еще. Тогда сможем сравнить результаты.
Заметьте, не я это придумал. Я лишь поддерживаю идею дать людям возможность находить решения самостоятельно и получать от этого удовольствие. :)

Сохраняя интригу, могу только сказать, что в архиве тоже конструкция в 1 строку (в двух вариантах). Она намного короче в написании (предложенной выше конструкции-строки) и работает быстрее последней в 1,4 раза. А так же, не содержит функций STRLEN и STRCONCAT. И еще, она быстрей, чем громоздкая, но быстрая конструкция со свитчем. В этой задаче, конструкция со свитчем быстрее конструкции с циклом.

Но есть в моей конструкции минусы и ограничения. Пока выявлены только вот эти.
1. Максимальная разрядность на выходе, не более 12 - для первого варианта, и не более 11 - для второго.
2. Второй вариант выдаст не верные данные, если количество разрядов на входе больше, чем ожидается на выходе.

В остальном конструкция вроде работает нормально. От количества добавляемых разрядов, скорость её выполнения не зависит, как например в случаях с циклом и свитчем.

Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 10, 2020, 06:40:03 PM
Привет Atas!)
У меня только один вопрос. В твоем коде формула или какой-то математический прикол?
Спрашиваю потому, что вывести свою математическую формулу - это ж убиться проще.)) Занимательная математика меня как то не прикалывает.
Я не сдаюсь, просто хочется знать - возможно ли решение задачи без обучения в каком нибудь Гарварде, в какой-то там Америке?
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: m0rv1n on June 10, 2020, 07:12:40 PM
Похоже заходить нужно где-то через год-полтора, посмотреть не выложил ли он пароль к архиву, если, конечно, этот вопрос еще будет интересен.
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Atas on June 10, 2020, 08:27:30 PM
... В твоем коде формула или какой-то математический прикол? ...

Нет там никаких заумных формул. Всё для нормальных людей. В Clickermann'е всё что надо уже есть. Две функции в строке. В справке они есть. Их надо только вставить в скрипт и заполнить цифрами.
Из 3 функций получается 2 варианта этой конструкции. Одна из функций обязательна в обоих вариантах, и две другие на выбор.
Всё до смешного просто. Вот увидишь. :)

Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 10, 2020, 08:44:15 PM
Хорошо, я тут кое что уже придумал.)
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 10, 2020, 09:13:37 PM
Вот, сделал.) Очень похоже на твоё описание. Три функции в двух вариантах. Прирост скорости в 1.4 раза с копейками, и выглядит очень просто.)) Смотрел и раньше на эту функцию, но отбросил её. всё дело было в знаке!
Щас братва подтянется и "вскроемся" вместе... ;)
https://yadi.sk/d/bcNah-O_ivT6vw
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Vint on June 11, 2020, 11:38:05 AM
Решение перешло в олимпиадную плоскость. Самое короткое, самое быстрое и, обычно, слабо применимое в реальном коде  :)

Я не смог выйти за рамки шаблонов. Всё что смог придумать при существующих ограничениях:
Правда там одна функция (в двух вариантах) и один оператор и скорость по тестам быстрее всего в 1.2 раза в среднем, чем
Code: (clickermann) [Select]
STRCONCAT(STRCUT("000000", 1, 6-STRLEN($x)), $x)
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: 4.У.В.@.К on June 12, 2020, 07:45:47 AM
Отвечаю :)
https://yadi.sk/d/2nLvO_PoI8eF8g

- одна функция,
- один оператор,
- 12 разрядов,
- скорость относительно кода STRCONCAT(STRCUT("000000", 1, 6-STRLEN($x)), $x) выше, в среднем в 1.45 - 1.5 раз. Тестировал на увеличении разрядов от 3 до 12.

Повторюсь, что в моем тестовом коде ошибка - http://crapware.aidf.org/forum/index.php?topic=5367.msg35251#msg35251 в строках 11 и 26. Там надо присваивать правильное значение переменным, а не удалять их через UNDEFINE, по этому результат теста получается не верный.

Так и не получилось у меня сделать строку более 12 разрядов. Какое то ограничение похоже в кликере. Будем думать...))
Первый архив остается на месте, мне не стыдно за тот код, просто тогда он мне казался лучшим. Вот.)
Title: Re: Можно ли вывести в лог однозначное число в виде двухзначного (2 как 02)?
Post by: Atas on June 12, 2020, 09:45:11 AM
У меня получилось нечто похожее :) - 1 функция, 1 оператор, скорость примерно в полтора раза выше и от количества разрядов как бы не зависит.
Разрядов можно накидать сколько угодно. В моем примере их 25. Но с таким функционалом получается только один вариант скрипта (больше не искал, да вроде и не нужно).
От своего первого кода так-же не отказываюсь, он мне нравится. :)
https://yadi.sk/d/HjDCt7UFEkq6Sw