Ajuda a reduzir o peso de processamento de engine

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Ajuda a reduzir o peso de processamento de engine

Mensagem por bootzin em Ter 02 Abr 2013, 21:22

Aí galera.. Eu estou no terceiro ano e com pouco tempo para me dedicar ao GM, mas gostaria de pedir uma ajuda de vocês nessa minha engine..
Não sei se você já ouviram falar na Conjectura de Collatz
Mas resumidamente é o seguinte:
Se você pegar um número qualquer natural 'a' e aplicar as seguintes regras sucessivamente
Se a = par >>> a = a/2
Se a = ímpar >>> a = 3a+1
O resultado final obrigatoriamente será 1
Exemplo:
a = 20
20/2 = 10
10/2 = 5
3*5 = 15 +1 = 16
16/2 = 8
8/2 = 4
4/2 = 2
2/2 = 1
Isso acontecerá independentemente do número que você coloque, desde que ele seja natural positivo.

A engine que eu criei faz exatamente esses cálculos, e imprime na tela os números ímpares.
No entanto, quando se aproxima de números com um número um pouco maior de casas (Cerca de 19) a engine trava por se sobrecarregar.
Então.. Indo ao pedido de ajuda.. Eu queria saber se vocês conseguem me ajudar a reduzir o uso de processamento dessa engine, alterando os códigos, reduzindo as variáveis ou algo do tipo.. Além disso, se desse pra vocês ajustarem o código draw de modo que todo valor ficasse permanentemente impresso na tela (E não fosse substituído, como é o que acontece), eu também aradeceria (:

Aqui está o download da minha engine (autoria própria):
CCC

Se vocês puderem me ajudar, ela é relativamente simples, com um único objeto e uma room. E ela funciona inserindo-se o valor desejado e então pressionando-se a tecla "enter" toda vez que um número for impresso na tela (Fiz isso pra eu poder analisar os valores encontrados). Se vocês quiserem apenas olhar os códigos que eu uso aqui estão:
Spoiler:

Create
Código:
a = get_integer("Enter 'x' value:","")
textx = object0.x
texty = object0.y
Step
Código:
if a/2 = ceil(a/2) and a != 1
{
a = a/2
}

else

if a/2 != ceil(a/2) and a != 1 and keyboard_check_pressed(vk_enter)

{
a = (3*a)+1
draw_text_color(textx,texty,a,c_white,c_white,c_white,c_white,1)
textx = textx
texty = texty+16
}
End Step
Código:
if texty >= room_height
{
texty = 0
textx = textx + room_width/3
}

if a = 1 and keyboard_check_pressed(vk_enter)
{room_restart()}
Draw
Código:
draw_text_color(textx,texty,a,c_white,c_white,c_white,c_white,1)

Agradeço desde já,
Bootzin

bootzin

Número de Mensagens : 136
Idade : 21
Data de inscrição : 28/01/2010
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Ajuda a reduzir o peso de processamento de engine

Mensagem por Kabeção em Qua 03 Abr 2013, 12:08

Variáveis tem limite de tamanho.
Se exceder esse limite naturalmente o programa trava.
Não há muito o que se fazer contra isso...

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Ajuda a reduzir o peso de processamento de engine

Mensagem por moisesBR em Qua 03 Abr 2013, 14:17

então por que não colocar uma "trava" antes de chegar a isso?
tipo:
Código:
if vaue => 9999999999999999999 then {vaue = 9999999999999999999}//19 caracteres\
(não me pergunte como)

moisesBR

Número de Mensagens : 873
Idade : 40
Data de inscrição : 24/10/2009
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://inprovise.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Ajuda a reduzir o peso de processamento de engine

Mensagem por PedroX em Qua 03 Abr 2013, 14:23

Um jeito fácil de testar é colocar no Room Creation Code:
Código:
var a, i;
a=1;
repeat(20)
{
a*=10;
i=string(a);
show_message(i+':'+string(string_length(i)-1));
}

Veja que quando passa de 18 zeros dá erro.

Você terá que usar um método que comprima o número.

Primeiramente, terá que usar get_string() pois este aceitará números maiores que 10^18.

Vamos pegar o número 1234567008900012340000000 como base.

Exemplo:

Código:
a = get_string("Enter 'x' value", "");
l = string_length(a);
if (l<20)
{
part1=real(a);
part2=0;
}
else
{
// 12345670089000120000000 / 2 =  6172835044500060000000
part1 = real(string_copy(a, 1, 10))/2; // 1234567008 /2 = 617283504
part2 = real(string_copy(a, 11, l-10))/2; // 9000120000000 /2 = 4500060000000
}
part1=string(part1);
if (part2==0) part2=string_repeat('0', l-10);

resultado = part1+part2;

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Ajuda a reduzir o peso de processamento de engine

Mensagem por bootzin em Qui 04 Abr 2013, 22:01

então por que não colocar uma "trava" antes de chegar a isso?
tipo:
CÓDIGO:
if vaue => 9999999999999999999 then {vaue = 9999999999999999999}//19 caracteres\

(não me pergunte como)
Eu não queria limitar a 19 caracteres.. Eu queria fazer com que não travasse com mais de 19 caracteres Razz (Até porque, o código multiplica um número ímpar por 3, então mesmo que o número não tenha 19 caracteres, o código pode travar..)

PedroX, eu tentei fazer como você falou, mas por algum motivo não estou conseguindo usar o "get_string" pra pegar um valor e dividí-lo por dois.. Fala que o número de argumentos é errado.. Por isso eu troquei pro get_integer.. Mas aí ele limita a 19 caracteres.. Então.... O que eu faço?

----------------EDIT------------------

Mudei o código no CREATE para:
Código:
astr = get_string("Enter 'x' value", "");
a = real(string_digits(astr))
l = string_length(a);
if (l<20)
{
part1=real(a);
part2=0;
}
else
{
// 12345670089000120000000 / 2 =  6172835044500060000000
part1 = real(string_copy(a, 1, 10))/2; // 1234567008 /2 = 617283504
part2 = real(string_copy(a, 11, l-10))/2; // 9000120000000 /2 = 4500060000000
}
part1=string(part1);
if (part2==0) part2=string_repeat('0', l-10);

resultado = part1+part2;
textx = object0.x
texty = object0.y
Mudei o "a = get_string()" pra "astr = get_string("Enter 'x' value", ""); a = real(string_digits(astr))"
Com isso eu converti o get_string em um número real, o único problema é que fazendo isso eu continuo limitando os cálculos que o programa pode fazer.. Vocês tem alguma ideia do que eu poderia fazer?
Ou o valor máximo de caracteres pra uma variável é 19 mesmo e não dá pra mudar?

bootzin

Número de Mensagens : 136
Idade : 21
Data de inscrição : 28/01/2010
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Ajuda a reduzir o peso de processamento de engine

Mensagem por PedroX em Qui 04 Abr 2013, 23:10

Adiciona um script com o código:
Código:
var a, b, c;
a=argument1;
b=argument2;

if (argument0==0)
{
c = string_length(a);
if (c<20)
{
part1=real(a);
part2=0;
}
else
{
part1 = real(string_copy(a, 1, 10))/b;
part2 = real(string_copy(a, 11, c-10))/b;
}
part1=string(part1);
if (part2==0) part2=string_repeat('0', c-10);

resultado = part1+part2;
}
else
if (argument0==1)
{

}

Para fazer uma conta que divide por 2:

Código:
script(0, get_string('',''), 2)

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Ajuda a reduzir o peso de processamento de engine

Mensagem por Conteúdo patrocinado Hoje à(s) 21:10


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum