Re: [2014-12-07] Mini Contest di programmazione
Inviato: 01/12/2014, 13:26
Ma si certo, però son sempre due righe in menoXxshark888xX ha scritto:Beh togliere gli spazi etc.. Non significa "accorciare" lo script
Programmazione e sviluppo videogiochi con GameMaker
http://gmitalia.altervista.org/forum/
http://gmitalia.altervista.org/forum/viewtopic.php?f=36&t=12385
Ma si certo, però son sempre due righe in menoXxshark888xX ha scritto:Beh togliere gli spazi etc.. Non significa "accorciare" lo script
Io ho creato lo script con gm8.1 e vedo che in gm8.1 la funzione "string_set_byte_at" non c'èXeryan ha scritto:Switch ? Pff dilettanti
Codice: Seleziona tutto
var String = "", pos, binary, number, dec = string(argument0); for (var i=1; i<=string_length(dec); i++) { number = real(string_char_at(dec, i)); binary = "0000"; pos = 0; while (number > 0) { binary = string_set_byte_at(binary, 4-pos, ord(string(number mod 2))); number = number div 2; pos++; } String += binary; } return String;
Eh infatti, qui la competizione si divide, chi lo ha fatto con versioni precedenti a Studio e chi con StudioXxshark888xX ha scritto:Io ho creato lo script con gm8.1 e vedo che in gm8.1 la funzione "string_set_byte_at" non c'èXeryan ha scritto:Switch ? Pff dilettanti
Codice: Seleziona tutto
var String = "", pos, binary, number, dec = string(argument0); for (var i=1; i<=string_length(dec); i++) { number = real(string_char_at(dec, i)); binary = "0000"; pos = 0; while (number > 0) { binary = string_set_byte_at(binary, 4-pos, ord(string(number mod 2))); number = number div 2; pos++; } String += binary; } return String;
Come verrà testata la velocità?Tizzio ha scritto:Settimanalmente vi proporrò un semplice problema e dovrete implementarlo in uno script e ne verrà testata la velocità
Il tuo è probabilmente il più lento di tutti...Xeryan ha scritto:Switch ? Pff dilettanti
Codice: Seleziona tutto
var N,s,n;
N=argument0;
s="";
while(N>0) {
n=N mod 10;
s=string(n div 8 mod 2)+string(n div 4 mod 2)+string(n div 2 mod 2)+string(n mod 2)+s;
N=N div 10;
}
return(s);
Qualcosa mi dice che guidox per ora è in testaguidox ha scritto:Un altro modoCodice: Seleziona tutto
var N,s,n; N=argument0; s=""; while(N>0) { n=N mod 10; s=string(n div 8 mod 2)+string(n div 4 mod 2)+string(n div 2 mod 2)+string(n mod 2)+s; N=N div 10; } return(s);
A a a a a se inserisco 0 non funzionaguidox ha scritto:Un altro modoCodice: Seleziona tutto
var N,s,n; N=argument0; s=""; while(N>0) { n=N mod 10; s=string(n div 8 mod 2)+string(n div 4 mod 2)+string(n div 2 mod 2)+string(n mod 2)+s; N=N div 10; } return(s);
Sono d'accordoaironenero ha scritto:Ah beh per me lo switch è il più veloce e comodo. (oltre che il più semplice da ideare), dato che la competizione è sulla velocità..
Potresti renderlo ancora più veloce usando chr invece di string e &/>> invece di div/mod (cioè chr(48 + ((n & (1 << cifra)) >> cifra), al posto di 1 << cifra si può mettere 1, 2, 4 come hai fatto nel codice, in quel caso 2, 4, 8).guidox ha scritto:Un altro modoCodice: Seleziona tutto
var N,s,n; N=argument0; s=""; while(N>0) { n=N mod 10; s=string(n div 8 mod 2)+string(n div 4 mod 2)+string(n div 2 mod 2)+string(n mod 2)+s; N=N div 10; } return(s);
Se questo sia più veloce o più lento di quello di doom dipende più da GM che dall'algoritmo in sè. Gli switch possono essere implementati in modo molto efficiente nei linguaggi compilati (per esempio con le jump tables), ma probabilmente in quel caso GM compara le stringhe 10 volte, e dunque potrebbe essere più lento di quello di guifus.Ah beh per me lo switch è il più veloce e comodo. (oltre che il più semplice da ideare), dato che la competizione è sulla velocità..
Codice: Seleziona tutto
var N,s,n;
N=argument0;
s="";
while(N>0) {
n=N mod 10;
s=string_replace_all(string_format(((n & 8) >> 3)*1000+((n & 4) >> 2)*100+((n & 2) >> 1)*10+(n & 1),4,0)," ","0")+s;
N=N div 10;
}
return(s);
doom13 ha scritto:A a a a a se inserisco 0 non funzionaguidox ha scritto:Un altro modoCodice: Seleziona tutto
var N,s,n; N=argument0; s=""; while(N>0) { n=N mod 10; s=string(n div 8 mod 2)+string(n div 4 mod 2)+string(n div 2 mod 2)+string(n mod 2)+s; N=N div 10; } return(s);
Codice: Seleziona tutto
var N,s,n;
N=argument0;
if (N=0)
s="0000"
else
{
s="";
while(N>0) {
n=N mod 10;
s=string(n div 8 mod 2)+string(n div 4 mod 2)+string(n div 2 mod 2)+string(n mod 2)+s;
N=N div 10;
}
}
return(s);
Ha, capito e bello ed utile .minuti = seconditot div 60;
secondi = seconditot mod 60;
Lascia a te capire a cosa serve div
umh, avevo dimenticato dell'esistenda del mod... (che poi dovrebbe stare per modulo)...guidox ha scritto:Molto intelligente Nix!
Oppure ancora... Ma credo che sia nettamente più lento...Comunque ragazzi suvvia! Questa "competizione" non serve per decretare un vincitore, ma per imparare qualcosa! Quindi cercate di assimilare nuove nozioni invece di fossilizzarvi sul vostro switch .Codice: Seleziona tutto
var N,s,n; N=argument0; s=""; while(N>0) { n=N mod 10; s=string_replace_all(string_format(((n & 8) >> 3)*1000+((n & 4) >> 2)*100+((n & 2) >> 1)*10+(n & 1),4,0)," ","0")+s; N=N div 10; } return(s);
@civic71: Allora impara subito che vuol dire: serve a restituire il resto della divisione per interi. Come quando facevi le divisioni alle elementari.
34 / 5 = 6 resto 4
5 / 3 = 1 resto 2
quindi...
34 mod 5 = 4
5 mod 3 = 2
Tutto qui, poi le applicazioni sono più interessanti
Per esempio è utile per creare un timer minuti:secondi.
Invece di creare due variabili "minuti" e "secondi", ne creo una sola "seconditot". Poi per ricavare le altre due mi basterà fare:
minuti = seconditot div 60;
secondi = seconditot mod 60;
Lascia a te capire a cosa serve div
È come floor(x / y), soltanto più efficiente.Bombertoman ha scritto:non sapevo esistesse una funzione che restituisce il risultato intero di una divisione senza il resto...