Una soluzione in assembly per accensione

La sfida è aperta: è possibile scrivere una soluzione più efficiente di questa per accensione? :slight_smile:

void Accendi(int N, int acceso[], int pulsante[]) {
	__asm__(
		"mov %0, %%ecx;"
		"loop1:"
			"cmpl $0, %%ecx;"
			"jle exit1;"
			"lea (%1, %%rcx, 4), %%rax;"
			"movl (%%rax), %%eax;"
			"xor $0x01, %%eax;"
			"mov %%rcx, %%rdx;"
			"loop2:"
				"add %%rcx, %%rdx;"
				"cmpl %%edx, %0;"
				"jl exit2;"
				"lea (%2, %%rdx, 4), %%rbx;"
				"movl (%%rbx), %%ebx;"
				"xorl %%ebx, %%eax;"
				"jmp loop2;"
			"exit2:"
			"lea (%2, %%rcx, 4), %%rbx;"
			"movl %%eax, (%%rbx);"
			"dec %%ecx;"
			"jmp loop1;"
		"exit1:"

		:: "r"(N), "r"(acceso), "r"(pulsante)
		: "rax", "rbx", "rcx", "rdx"
	);
}

Per ora è la più veloce, qui sul correttore (che è notoriamente una lumaca perchè sta in una vm) ci mette 0.640s.

Prima di vendere l’anima a Turing posso sapere se è possibile fare quei tempi in C++? Perché sotto lo 0.67 non scendo

Ottimizzandolo per bene si può… :wink: 0.637

Ahah ottimo, aspetta che devo andare a rimuovere il tuo utente dal database di cms… 3:)

Ottimizzandolo per bene si può... ;) 0.637

morassutto

Forse intendi 0.631? :P

Comunque Gabriele, ormai siamo almeno in 3 che ti abbiamo battuto, forse l'assembly non conviene così tanto... ;)

Sarà. Intanto sono di nuovo primo :stuck_out_tongue:


Io e William ci siamo messi di impegno e abbiamo trovato un modo per migliorare ancora il tempo (di poco, ma quanto basta per battervi), vediamo cosa riuscite a fare voi… :smiley: