Author Topic: Помогите решить задачку, нужен алгоритм  (Read 2690 times)

0 Members and 1 Guest are viewing this topic.

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
(Можно на кликере, думаю смогу перевести, математические операции ведь везде одинаковы).
Дано:
Переменная PSD (в начале может иметь любое значение)
Переменная BU (в начале цикла может принимать значения 0, 1 или 2)
Переменная BL (в начале цикла может принимать значения 0, 1 или 2)
Инструменты:
 стандартные операторы сравнения
 IncVal(PSD, X) - увеличивает PSD  на Х (если Х отрицательное, то уменьшает естественно).
 Можно добавлять другие переменные, и производить с ними любые математические операции, PSD менять можно только через IncVal(PSD, X)

Задача:
Если BU равно 2, ModVal(PSD, BUX), где BUX=15
Если BU равно 1, ModVal(PSD, BUX), где BUX=10
Если BU равно 0, ModVal(PSD, BUX) где BUX -10 или -15 ... вобщем отменить прибавку к PSD

Если BL равно 2, ModVal(PSD, BLX), где BLX=25
Если BL равно 1, ModVal(PSD, BLX), где BLX=20
Если BL равно 0, ModVal(PSD, BLX) где BLX -20 или -25 ... вобщем отменить прибавку к PSD

Например:
цикл 1
оригинальное PSD = 50
 BU = 2
 BL = 2
  ( PSD должно быть 90 -(50+15+25))
цикл 2
оригинальное PSD = 10 (с нашей прибавкой от пред цикла PSD =  50)
 BU = 0
 BL = 1
  ( PSD должно быть 20 -(10+10, прибавку от BU отменяем))
цикл 3
оригинальное PSD = 20 (с нашей прибавкой от пред цикла PSD =30)
 BU = 0
 BL = 0
  ( PSD должно быть 20 - отменяем все свои прибавки)

Сложность у меня в том, что PSD не должно меняться моей процедурой если BU/BL не менялись от предыдущего цикла, при этом PSD не статично, его может изменить другая процедура в начале цикла, и нужно работать с новым уже (устанавливать/отменять свои прибавки). По сути мы не знаем значения PSD в начале цикла, надо добавить/отнять прибавку для PSD в зависимости изменилась ли переменная BU или BL
« Last Edit: November 08, 2016, 11:51:58 PM by quant13 »

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #1 on: November 08, 2016, 09:56:31 PM »
Я вот по весне, в теме ОБЩИЕ ВОПРОСЫконоплю картошку посажу!
А что, прикручу счётчик семян картошин на кликере и прокатит! ВСЁ ПОЛЯНА ЗАНЯТА!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #2 on: November 09, 2016, 10:26:41 AM »
В задании ничего не напутал?

цикл 1 - здесь понятно.

цикл 2
 BU = 0
 BL = 1
 ( PSD должно быть 20 -(10+10, прибавку от BU отменяем))

Почему -10?    (почему не -15?)
Почему +10?   (здесь совсем непонятно... почему не +20)
В условиях вверху так не задано.


quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #3 on: November 09, 2016, 12:02:20 PM »
Может и напутал чуть, писал поздно вечером, но уже неважно, можно закрыть тему, я нашел решение (которого не хотел сначала),  оказалось без глобальной(внешней) переменной не обойтись, т.к BU/BL/PSD переменные получаются "извне" скрипта, то чтобы небыло накладок (чтоб скрипт не отнимал чего не положено и не добавлял лишнего), нужна переменная вне скрипта, хранить условия окончания предыдущего цикла работы

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #4 on: November 09, 2016, 05:08:46 PM »
Чет я поторопился, не сработала моя идея

Code: (Clickermann) [Select]
$GPSD = INIREAD("zzz.ini", "GPSD")
$GBU=RNDFROM(0,1,2)
$GBL=RNDFROM(0,1,2)
//Переменные, начинающиеся на $G внешние(глобальные), их изменения сохраняются постоянно, и их могут менять другие скрипты не зависимо работает этот скрипт или нет. В рамках языка кликера можно сказать что они находятся во внешнего файле. C GBU / GBL я не стал заморачиваться чтоб не писать руками в файл каждый раз новые данные, будем считать, что они получены из файла..
//zzz.ini
//[default]
//GPSD=50

//Проверки  $GBU/$GBL на содержимое выполняются разными операторами, потому в кликере это можно описать только как двойная проверка.
IF($GBU ! 0) //Если не 0, то что-то другое
  IF($GBU ! 1) //Если не 1, то 2 видимо
    $BUX=10         //если 2
  END_IF
  $BUX=(0-$BUX)         //если 1
ELSE
  $BUX=20   //если 0
END_IF

IF($GBL ! 0) //Если не 0, то что-то другое
  IF($GBL ! 1) //Если не 1, то 2 видимо
    $BLX=1         //если 2
  END_IF
  $BLX=(0-$BLX)         //если 1
ELSE
  $BLX=2   //если 0
END_IF
//$BLX/$BUX бонусы я поставил такие только для наглядности в логе чтоб удобней проверять. Числа не важны в примере, суть чтоб отличались при значениях 0 и 2, а при значении 1 бонус убирался

//ModVal PSD
$PSD=$PSD+$BUX
$PSD=$PSD+$BLX
$GPSD = $PSD
INIWRITE("zzz.ini", "GPSD", $PSD)
LogWrite ("$GBU= ",$GBU, " $GBL= ",$GBL)
LogWrite ("$GPSD= ",$GPSD, " $BLX= ",$BLX," $BUX= ",$BUX)

Wait(3)
//HALT

GPSD не должна наращиваться после каждого цикла, только изменятся на количество бонуса в зависимости от GBU / GBL
если GBU / GBL равно 0 или 2 добавляется бонус, если 1 - то отнимается ранее добавленный
Например если у нас постоянно GBU = 2, то в каждом цикле GPSD будет 60 (при начальном GPSD=50)
если GBU становится = 0, GPSD должно стать 70
если GBU становится = 2, GPSD должно стать 60
если GBU становится = 1, GPSD должно стать 50 (точнее минус 10, на случай если GPSD была изменена другим скриптом, т.к предыдущей прибавкой был 10)

В работе можно добавлять локальные и глобальные ($G - в рамках кликера должны записываться в файл) переменные
GBU / GBL  можно один раз принудительно сбросить в 0, для инициализации например.
« Last Edit: November 09, 2016, 05:23:43 PM by quant13 »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #5 on: November 09, 2016, 06:06:24 PM »
Утром делал так. По первоначальному условию из первого поста при 0 - отмена.
Code: (clickermann) [Select]
SUB(iter) //====================================================================
    IF($BU ! $BU_old)
        SWITCH($BU)
        CASE(0)
            $BUX = -(5 + $BU_old*5)
        CASE(1)
            $BUX = 10
        CASE(2)
            $BUX = 15
        END_SWITCH
        INC($PSD, $BUX)
        $BU_old = $BU
        LOGWRITE("$PSD = ", $PSD, "  $BUX = ", $BUX)
    END_IF
   
    IF($BL ! $BL_old)
        SWITCH($BL)
        CASE(0)
            $BLX = -(15 + $BL_old*5)
        CASE(1)
            $BLX = 20
        CASE(2)
            $BLX = 25
        END_SWITCH
        INC($PSD, $BLX)
        $BL_old = $BL
        LOGWRITE("$PSD = ", $PSD, "  $BLX = ", $BLX)
    END_IF
    LOGWRITE("-----$PSD = ", $PSD)
END_SUB
//==============================================================================


$BU_old = -1
$BL_old = -1

$PSD = 50  // оригинальное
$BU = 2
$BL = 2
iter()

$PSD = 10
$BU = 0
$BL = 1
iter()

$PSD = 20
$BU = 0
$BL = 0
iter()

HALT

Но до конца не понятно было. Наверно неправильно.
Думаю почти то же самое, только сначала отнимать старое значение восстанавливая "безбонусность" и зачислять заново. Не?

Code: (clickermann) [Select]
SUB(iter) //====================================================================
    IF($BU ! $BU_old)
        SWITCH($BU)
        CASE(0)
            $BUX = 0
        CASE(1)
            $BUX = 10
        CASE(2)
            $BUX = 15
        END_SWITCH
       
        IF($BU_old = -1)
            $BUR = 0
        ELSE
            $BUR = -(5 + $BU_old*5)
        END_IF
       
        $PSD = $PSD + $BUR + $BUX
        $BU_old = $BU
        LOGWRITE("$PSD = ", $PSD, "  $BUX = ", $BUX)
    END_IF
   
    IF($BL ! $BL_old)
        SWITCH($BL)
        CASE(0)
            $BLX = 0
        CASE(1)
            $BLX = 20
        CASE(2)
            $BLX = 25
        END_SWITCH
       
        IF($BL_old = -1)
            $BLR = 0
        ELSE
            $BLR = -(15 + $BL_old*5)
        END_IF
       
        $PSD = $PSD + $BLR + $BLX
        $BL_old = $BL
        LOGWRITE("$PSD = ", $PSD, "  $BLX = ", $BLX)
    END_IF
    LOGWRITE("-----$PSD = ", $PSD)
END_SUB
//==============================================================================


$BU_old = -1
$BL_old = -1

$PSD = 50  // оригинальное
$BU = 2
$BL = 0
iter()

$BU = 2
$BL = 0
iter()

$BU = 2
$BL = 0
iter()

HALT

Или совсем просто, хранить общую старую прибавку и учитывать её при прибавлении новой
Code: (clickermann) [Select]
SUB(iter) //====================================================================
    SWITCH($BU)
    CASE(0)
        $BUX = 0
    CASE(1)
        $BUX = 10
    CASE(2)
        $BUX = 15
    END_SWITCH
   
    SWITCH($BL)
    CASE(0)
        $BLX = 0
    CASE(1)
        $BLX = 20
    CASE(2)
        $BLX = 25
    END_SWITCH
   
    $BX = $BUX + $BLX
    $PSD = $PSD - $BX_old + $BX
    $BX_old = $BX
    LOGWRITE("$PSD = ", $PSD, "  $BX = +", $BX)
END_SUB
//==============================================================================


$BX_old = 0

$PSD = 50  // оригинальное
$BU = 2
$BL = 2
iter()

$PSD = 50 // оригинальное 10
$BU = 0
$BL = 1
iter()

// или
//$PSD = 50  // оригинальное
//$BU = 2
//$BL = 0
//iter()

//$BU = 2
//$BL = 0
//iter()

//$BU = 2
//$BL = 0
//iter()

HALT


quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #6 on: November 09, 2016, 06:23:39 PM »
SUB, SWITCH и прочее использовать нельзя. в том языке нет такого.
из кликера можно только арифметику и IF
RNDFROM и INIREAD/INIWRITE я тут использую только  для удобства работы с получением данных

из-а особенности получения содержимого GBU / GBL, просто описать все 9 вариантов бонуса еще и с проверками  изменялся/не изменялся сложно, код станет нереально большим
« Last Edit: November 09, 2016, 06:26:48 PM by quant13 »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #7 on: November 09, 2016, 06:34:58 PM »
Это всё тонкости. Ну замени подобный свитч
Code: (clickermann) [Select]
SWITCH($BU)
CASE(0)
    $BUX = 0
CASE(1)
    $BUX = 10
CASE(2)
    $BUX = 15
END_SWITCH

таким ифом
Code: (clickermann) [Select]
$BUX = 0
IF($BU > 0)
    $BUX = 5 + $BU*5
END_IF

А SUB так совсем легко избавится. Вставляй код напрямую.
В итоге
Code: (clickermann) [Select]
$PSD = 50  // оригинальное
$BU = 2
$BL = 2

// расчёт
$BUX = 0
IF($BU > 0)
    $BUX = 5 + $BU*5
END_IF

$BLX = 0
IF($BL > 0)
    $BLX = 15 + $BL*5
END_IF

$BX = $BUX + $BLX
$PSD = $PSD - $BX_old + $BX
$BX_old = $BX
LOGWRITE("$PSD = ", $PSD, "  $BX = +", $BX)



$PSD = 50 // оригинальное 10
$BU = 0
$BL = 1

// расчёт
$BUX = 0
IF($BU > 0)
    $BUX = 5 + $BU*5
END_IF

$BLX = 0
IF($BL > 0)
    $BLX = 15 + $BL*5
END_IF

$BX = $BUX + $BLX
$PSD = $PSD - $BX_old + $BX
$BX_old = $BX
LOGWRITE("$PSD = ", $PSD, "  $BX = +", $BX)


quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Re: Помогите решить задачку, нужен алгоритм
« Reply #8 on: November 09, 2016, 07:10:30 PM »
//
Code: (Clickermann) [Select]
$GPSD = INIREAD("zzz.ini", "GPSD")
$GBU=RNDFROM(0,1,2)
$GBL=RNDFROM(0,1,2)
//$GBU = INIREAD("zzz1.ini", "GBU")
//$GBL = INIREAD("zzz1.ini", "GBL")
$GBUX_OLD = INIREAD("zzz.ini", "GBUX_OLD")
$GBLX_OLD = INIREAD("zzz.ini", "GBLX_OLD")
$PSD = $GPSD

//Переменные, начинающиеся на $G внешние(глобальные), их изменения сохраняются постоянно, и их могут менять другие скрипты не зависимо работает этот скрипт или нет. В рамках языка кликера можно сказать что они находятся во внешнего файле. C GBU / GBL я не стал заморачиваться чтоб не писать руками в файл каждый раз новые данные, будем считать, что они получены из файла..
//zzz.ini
//[default]
//GPSD=50
//GBUX_OLD=0
//GBLX_OLD=0

//Проверки  $GBU/$GBL на содержимое выполняются разными операторами, потому в кликере это можно описать только как двойная проверка.
IF($GBU ! 0) //Если не 0, то что-то другое
  IF($GBU ! 1) //Если не 1, то 2 видимо
    $BUX=10         //если 2
  END_IF
  $BUX=0 //(0-$BUX)         //если 1
ELSE
  $BUX=20   //если 0
END_IF

IF($GBL ! 0) //Если не 0, то что-то другое
  IF($GBL ! 1) //Если не 1, то 2 видимо
    $BLX=1         //если 2
  END_IF
  $BLX=0  //(0-$BLX)         //если 1
ELSE
  $BLX=2   //если 0
END_IF
//$BLX/$BUX бонусы я поставил такие только для наглядности в логе чтоб удобней проверять. Числа не важны в примере, суть чтоб отличались при значениях 0 и 2, а при значении 1 бонус убирался

//ModVal PSD
$PSD=$PSD-$GBUX_OLD+$BUX
$PSD=$PSD-$GBLX_OLD+$BLX
$GPSD = $PSD
INIWRITE("zzz.ini", "GPSD", $PSD)
INIWRITE("zzz.ini", "GBUX_OLD", $BUX)
INIWRITE("zzz.ini", "GBLX_OLD", $BLX)
//LogWrite (" $GBU= ",$GBU, " $GBL= ",$GBL )
LogWrite ("$GPSD= ",$GPSD," $BLX= ",$BLX," $BUX= ",$BUX)

Wait(3)
//HALT

Разобрался, Так заработало
теперь даже если скрипт остановлен, при новом запуске все продолжается как должно - GPSD=50 без бонусов
« Last Edit: November 09, 2016, 07:14:40 PM by quant13 »