[ home ] [ a / jp / h / lain ] [ b / hum ] [ mu / tech / v / vis / x ] [ meta / nexo ]

/tech/ - Tecnología

No rompas las leyes de Isaac Asimov
Nombre
Email
Comentario
Archivo





[]
Clave (Para eliminar el post.)

  • Archivos soportados: [ jpg, jpeg, png, gif ] , [ ogg, mp3 ] , [ webm ] & [ pdf ].
  • Adjuntos soportados: [ youtube, vimeo, dailymotion, metacafe & vocaroo ].
  • Tamaño máximo total 20MB.



File: 1632273137789.png (479.79 KB, 822x720) ImgOpsiqdb

479.79 KB

No.3687

Me encontré este fizzbuzz y creo que funciona. El autor dice que es más rápido porqué solo usa sumas y restas. ¿Creen que se pueda mejorar?

Pic no related!


#include <stdio.h>

int three_multiple = 3;
int five_multiple = 5;
int string_index = 0;
char* string_out[] = {"%d\n", "%d\tFizz\n", "%d\tBuzz\n", "%d\tFizzBuzz\n"};

int main(void) {
for(int i = 1; i <= 100; ++i) {
string_index = 0;

if((i - three_multiple) == 0) {
string_index += 1;
three_multiple += 3;
}

if((i - five_multiple) == 0) {
string_index += 2;
five_multiple += 5;
}

printf(string_out[ string_index ], i);
} return 0;
}

>>

No.3688

File: B).png (58.93 KB, 1138x1080) ImgOpsiqdb

58.93 KB

#include <stdio.h>
char *fizzbuzz[] = {"%d\n", "Fizz\n", "Buzz\n", "Fizzbuzz\n"};
int
main()
{
for (int i = 1; i <= 100; i++)
printf(fizzbuzz[!(i % 3) + 2 * !(i % 5)], i);
return 0;
}

Ese código es mejor, más legible, conciso y ambos tardan .003 segundos en ejecutarse (aunque tu programa en ocasiones tarda .004, así que el mío sigue siendo mejor a pesar de la multiplicación)
>inb4 muh no fuentes
Ejecuta ambos programas con el comando "time" frente a ellos en tu terminal y verás cómo ambos se ejecutan en el mismo tiempo. Ejemplo:

time ./programa1
time ./programa2
>>

No.3689

>fizzbuzz

No tiene ninguna importancia hacer esos ejercicios la verdad
>>

No.3690

File: >:3.png (71.12 KB, 1600x900) ImgOpsiqdb

71.12 KB
>>3689
Así es, es solo autismo. Bienvenido al mundo de los IBs de tecnología.
>>

No.3691

>>3688
>así que el mío sigue siendo mejor
¿Y no influye que el tuyo imprima menos caracteres que el que yo mostré?
>>

No.3692

>>3691
No. Borré esos caracteres y el tuyo sigue tardando en promedio .0032 segundos, mientras que el mío .003 exactos (ejecuté cada programa 10 veces y calculé el promedio de tiempo de ejecución, el de tu post sigue tardando .004 algunas veces, el del mío no supera .003 nunca)
>>

No.3693

>>3688
Usar time no sirve de mucho con programas tan pequeños. Si usas

time (for x in $(seq 10000); do
./fizzbuzz.out >>/dev/null
done)

apenas notas una diferencia de milesimas de segundo entre ambos después de que los ejecutaste 10,000 veces
>>

No.3694

>>3693
Eso sigue probando que mi programa es más rápido. La ejecución del mío demora 13.19 segundos y el de OP 13.28
Hice una segunda ejecución y el de mi post tardó 13.35, el de OP 13.45
>>

No.3695

>>3694
Felicidades.
Igual si en vez de poner 100 como límite pones 100000, la diferencia es más notoria (recuerda reducir el seq 10000 por un seq 100, sino se va a tardar siglos jaja)
>>

No.3696

>>3691
Lo que influye es que el tuyo tiene dos if-statements (que son "lentos") y el otro ninguno. Te recomiendo ver esto (el canal está buenardo):
Branchless Programming: Why "If" is Sloowww… and what we can do about it!
https://www.youtube.com/watch?v=bVJ-mWWL7cE

PD: No recomiendo evites los if's porque vas a terminar con programas dificiles de leer y mantener (si estas usando un lenguaje que no sea C, habrá diferencia alguna xd)
>>

No.3698

>>3696
>programas difíciles de leer y mantener
¿De verdad esta es la capacidad analítica del waiyado promedio? Literalmente lo de mi código es solo una fórmula de esas que te enseñan en la educación básica.
Es !x + 2 * !y, donde x e y son valores que representan el resto de la división de i entre 3 y 5 respectivamente, lo cual determina si i es múltiplo o no.
Los "!" solo son una evaluación booleana "abreviada", en este caso, una forma más elegante de evaluar si una variable es igual a cero, como creo que ya sabemos todos, si algo es diferente de 0, !variable es falso, de lo contrario es cierto. Se podría escribir también como
(i % 3 == 0) + 2 * (i % 5 == 0)
Al final eso debería dar una posición del arreglo char * que es lo que se va a imprimir.
>>

No.3699

>>3698
>¿De verdad esta es la capacidad analítica del waiyado promedio?
Creo que se refiere a que puedes terminar con un FizzBuzz como este:


#include <stdio.h>
#include <stdbool.h>

char *string_out[] = {"%d\n", "Fizz\n", "Buzz\n", "Fizzbuzz\n"};

int string_index;
int test = 0;
int multiple_3 = 3;
int multiple_5 = 5;

int main(void) {

for(int i = 1; i <= 100; ++i) {
test = (bool) (i - multiple_3);
string_index = !test;
–test;
test &= 3;
multiple_3 += test;

test = (bool) (i - multiple_5);
string_index += !test + !test;
–test;
test &= 5;
multiple_5 += test;

printf(string_out[ string_index ], i);
}

return 0;
}
>>

No.3700

>>3698
Dude, me refería a reescribir programas con muchos if-else, que evaluan condiciones más complejas, como programas "branchless".

¿Cómo retorno un NULL si algo falla en mitad de la ejecución de una función, sin tener que reescribir una porción significantiva del código, complicandolo innecesariamente, dificultando el proceso de depuración del programa?
>>

No.3733

Tengo uno mejor en el mejor lenguaje del mundo B)

const fizzBuzz = n => {
return Array.from(
{length: n},
(_, idx) => [
[15, "fizzbuzz"], [5, "buzz"], [3, "fizz"]
].find(val => (idx + 1) % val[0] === 0) || idx + 1
).reduce((acc, e) => (acc += (e[1] || e) + "\n"), "");
};
console.log(fizzBuzz(100));


[Post a Reply]
[ ]
[ home ] [ a / jp / h / lain ] [ b / hum ] [ mu / tech / v / vis / x ] [ meta / nexo ]