Informática Reto 1 de programación: Generar los primeros x números primos, animate y pon tú solución

function esPrimo($num){
$x = 0;
for ($i=1; $i <= $num; $i++) {
if ($num % $i==0) $x = $x + 1;
} if ($x==2)
return true;
return false;
}

$primos = array();

for ($i=1; $i<=$tope;$i++) {
if (esPrimo($i) {
array_push($primos,$i);
}
}

print "Primos desde el 1 hasta el {$tope}:";

print_r($primos);




// lo siento shurs pero estoy en el movil
 
no sabía tal cosa
crees que se puede reducir el tiempo aún más?
tienes alguna idea loca?
Como donde más tiempo se pierde es en la impresión, tal vez se podría tratar de paralelizar aprovechando los 4 u 8 cores del procesador y así dividir la lista en 4 u 8 trozos y mandarlos imprimirlos a la vez. Lo malo es que no se van a imprimir en orden, pero seguiría cumpliendo el requisito de imprimir los primos entre 0 y 10 millones.
 
Como donde más tiempo se pierde es en la impresión, tal vez se podría tratar de paralelizar aprovechando los 4 u 8 cores del procesador y así dividir la lista en 4 u 8 trozos y mandarlos imprimirlos a la vez. Lo malo es que no se van a imprimir en orden, pero seguiría cumpliendo el requisito de imprimir los primos entre 0 y 10 millones.

Stdout o como quieras llamarlo no es concurrente

En todos los SO tiene un lock() que precisamente hace eso, que solo un hilo tenga acceso. Lo que se podría hacer es meter en el buffer de impresión una parte de los datos y si tiene un doble buffer como suele ser normal mientras imprime ir escribiendo en el otro para que cuando haga el cambio ya tenga los datos listos pero la complejidad es muy alta y lo que se va a ganar es poco, un procesador no tarda nada en cargar 512 Bytes que suele ser el tamaño de este tipo de cosas

Para hacer algo así tendrías que usar tantas terminales/consolas como hilos vayas a tener ya que cada terminal tiene su lock() propio pero bueno, no es algo práctico en la vida real asi que pues no se hace
 
no sabía tal cosa
crees que se puede reducir el tiempo aún más?
tienes alguna idea loca?

Es lo que te comenté, cuando haces el print y se acaba tienes que hacer el flush() porque de otra forma puede que se imprima o no. Es una operación costosa y por lo tanto tarda bastante

Se puede mejorar, si miras mi código verás que hay algo que puedes hacer que yo hago, lo puedo decir sin más pero entonces no se aprende

Vamos a centrarnos en el caso concreto del 4 que es 2*2, llega el momento de comprobar si es compuesto, en este caso en la primera iteración sale que lo es (se divide por 2) y no pasa nada. Si subimos al 6 que es 3*2 para lo mismo pero si cojemos el 7387 que es 83*89 vamos a probar si es divisible por 2, por 3 (hasta aquí bien) y luego por 4 (hacemos trabajo en balde), 5 bien, 6 (a evitar) y pues eso, vamos probando con números que no son interesantes y nunca van a aportar nada más que retrasar el tiempo sin hacer nada útil

Como pistilla creo que podría ser interesante solo ir probando si divide a números primos, los compuestos ya estan implicitos probando los primos
 
Una pista más, todos los primos excepto el 2 y el 3 tienen la forma 6*k+1 o 6*k-1, ahí podeis ganar algo de tiempo.
 
Bueno, pues vamos con la versión 2 de mi rutina BASIC. En esta ocasión he cuidado un pelín más el aspecto en pantalla, aligerado un poco el código, e implementado dos nuevos procesos de ahorro de tiempo de comprobación de números. Además, el programa ahora muestra la hora de inicio y final de procesamiento para saber el tiempo invertido total.

Los cuatro truquitos implementados hasta el momento se basan en que:

1. No existen números primos pares mayores de 2.
2. No existen números primos terminados en 5 mayores que 5. Si terminan en 5, no son primos.
3. La suma de los dígitos de cada número a prueba mayor que 3 no puede ser divisible entre 3. Si lo es, no es primo.
4. No es necesario comprobar todos los divisores entre 2 y el número a prueba, sino sólo entre 2 y la parte entera de la raíz cuadrada del número.

[El truco del OP de los factoriales no lo he entendido, y por tanto, no lo he aplicado]

10 KEY OFF:CLS
20 PRINT "CALCULADORA DE NUMEROS PRIMOS v2.0"
30 PRINT "(c) 2024 by WEKurtz":PRINT
40 PRINT "Calcula los numeros primos entre 1 y el numero introducido"
50 PRINT"y muestra el tiempo invertido en calcularlos.":PRINT
60 INPUT "Introduzca numero: ",N
70 PRINT:PRINT 2,
80 TI$=TIME$
90 FOR A=3 TO N STEP 2
100 A$=STR$(A)
110 X$=RIGHT$(A$,1)
120 IF A>5 AND X$="5" THEN 190
130 P=0:FOR D=2 TO LEN(A$):P=P+VAL(MID$(A$,D,1)):NEXT
140 IF P>3 AND P/3=INT(P/3) THEN 190
150 FOR F=2 TO INT(SQR(A))
160 IF A/F=INT(A/F) THEN 190
170 NEXT F
180 PRINT A,
190 NEXT A
200 TF$=TIME$
210 PRINT:PRINT CHR$(13)"Inicio: "TI$:PRINT"Fin: "TF$

Lo siguiente que voy a hacer es aligerar más introduciendo los primos encontrados en memoria en lugar de ir poniéndolos en pantalla, pues esto, unido al scroll, consume demasiado tiempo. Se tomará como tiempo de proceso el momento en que termine de alojar los números, y sólo después los presentará en pantalla.

NOTA: Quien quiera probar, que copie el código, abra un bloc de notas, lo pegue allí, lo grabe como "primos.bas", instale el intérprete PCBASIC para Windows AQUÍ, lo ejecute, introduzca load"primos.bas" y luego ejecute el programa con run.

¡Qué pasada, mamá! ¡He vuelto a programar en BASIC! :zplatano2 ¡Qué bonito es, coño...!
 
Última edición:
Una pista más, todos los primos excepto el 2 y el 3 tienen la forma 6*k+1 o 6*k-1, ahí podeis ganar algo de tiempo.

Si pero ojito porque es una pista y no una propiedad garantizada

Por ejemplo con k = 4 => 6*k + 1 => 6*4 + 1 = 25

25 es 5*5 con lo que no es primo

:mola:
 
Bueno, pues vamos con la versión 2 de mi rutina BASIC. En esta ocasión he cuidado un pelín más el aspecto en pantalla, aligerado un poco el código, e implementado dos nuevos procesos de ahorro de tiempo de comprobación de números. Además, el programa ahora muestra la hora de inicio y final de procesamiento para saber el tiempo invertido total.

Los cuatro truquitos implementados hasta el momento se basan en que:

1. No existen números primos pares mayores de 2.
2. No existen números primos terminados en 5 mayores que 5. Si terminan en 5, no son primos.
3. La suma de los dígitos de cada número a prueba mayor que 3 no puede ser divisible entre 3. Si lo es, no es primo.
4. No es necesario comprobar todos los divisores entre 2 y el número a prueba, sino sólo entre 2 y la parte entera de la raíz cuadrada del número.

[El truco del OP de los factoriales no lo he entendido, y por tanto, no lo he aplicado]

10 KEY OFF:CLS
20 PRINT "CALCULADORA DE NUMEROS PRIMOS v2.0"
30 PRINT "(c) 2024 by WEKurtz":PRINT
40 PRINT "Calcula los numeros primos entre 1 y el numero introducido"
50 PRINT"y muestra el tiempo invertido en calcularlos.":PRINT
60 INPUT "Introduzca numero: ",N
70 PRINT:PRINT 2,
80 TI$=TIME$
90 FOR A=3 TO N STEP 2
100 A$=STR$(A)
110 X$=RIGHT$(A$,1)
120 IF A>5 AND X$="5" THEN 190
130 P=0:FOR D=2 TO LEN(A$):P=P+VAL(MID$(A$,D,1)):NEXT
140 IF P>3 AND P/3=INT(P/3) THEN 190
150 FOR F=2 TO INT(SQR(A))
160 IF A/F=INT(A/F) THEN 190
170 NEXT F
180 PRINT A,
190 NEXT A
200 TF$=TIME$
210 PRINT:PRINT CHR$(13)"Inicio: "TI$:PRINT"Fin: "TF$

Lo siguiente que voy a hacer es aligerar más introduciendo los primos encontrados en memoria en lugar de ir poniéndolos en pantalla, pues esto, unido al scroll, consume demasiado tiempo. Se tomará como tiempo de proceso el momento en que termine de alojar los números, y sólo después los presentará en pantalla.

NOTA: Quien quiera probar, que copie el código, abra un bloc de notas, lo pegue allí, lo grabe como "primos.bas", instale el intérprete PCBASIC para Windows AQUÍ, lo ejecute, introduzca load"primos.bas" y luego ejecute el programa con run.

¡Qué pasada, mamá! ¡He vuelto a programar en BASIC! :zplatano2 ¡Qué bonito es, coño...!

En la máquina virtual con Windows lo he vuelto a probar y sale el mismo fallo, yo lo llamo a.bas porque soy un flojo, menos que teclear :qmeparto::qmeparto:

Untitled00.webp


Probaré el que has puesto ahora a ver que tal, es por curiosidad claro, no porque haga falta, el código BASIC se lee fácil

Se lo he dicho a jorge antes pero como no se bien si BASIC podría o no te queda un 5º truco, probar a dividir solo entre los que son primos, la cosa es que no se si hay listas o arrays dinámicos en el que poder hacer algo así, entiendo que si pero como no lo he usado en mi vida pues .... yo cuando nací los 32 bits ya eran la norma y por supuesto nunca tuve nada de 8 bits
 
El programa en acción:


 
En la máquina virtual con Windows lo he vuelto a probar y sale el mismo fallo, yo lo llamo a.bas porque soy un flojo, menos que teclear :qmeparto::qmeparto:

Untitled00.webp


Probaré el que has puesto ahora a ver que tal, es por curiosidad claro, no porque haga falta, el código BASIC se lee fácil

Se lo he dicho a jorge antes pero como no se bien si BASIC podría o no te queda un 5º truco, probar a dividir solo entre los que son primos, la cosa es que no se si hay listas o arrays dinámicos en el que poder hacer algo así, entiendo que si pero como no lo he usado en mi vida pues .... yo cuando nací los 32 bits ya eran la norma y por supuesto nunca tuve nada de 8 bits
A ver, hay muchas versiones de BASIC, y no son compatibles entre sí. No sabía ni que existía VINTBAS, pero fijo que no es compatible con PCBASIC. Éste está basado en GWBASIC, que fue mi fuerte en los 80, por eso lo elegí entre todos los que hay ahora por ahí...

Lo del 5 truco, voy a masticarlo... xDD

Cago en todo, cuando dejé BASIC allá a principios de los 90, era una puta máquina. Ahora tengo que andar consultando manuales de referencia... Snif!
 
A ver, hay muchas versiones de BASIC, y no son compatibles entre sí. No sabía ni que existía VINTBAS, pero fijo que no es compatible con PCBASIC. Éste está basado en GWBASIC, que fue mi fuerte en los 80, por eso lo elegí entre todos los que hay ahora por ahí...

Lo del 5 truco, voy a masticarlo... xDD

Entiendo, es como TurboC++ que es un C++ que no es el estándar y que no compila con otra cosa que no sea TurboC++

Muy típico de la época, curioso como ha avanzado el mundo
 
Entiendo, es como TurboC++ que es un C++ que no es el estándar y que no compila con otra cosa que no sea TurboC++

Muy típico de la época, curioso como ha avanzado el mundo
E x a c t o .

Oye, ¿sabes qué es más chulo aún que los primos? El NÚMERO PI...
 
Es lo que te comenté, cuando haces el print y se acaba tienes que hacer el flush() porque de otra forma puede que se imprima o no. Es una operación costosa y por lo tanto tarda bastante

Se puede mejorar, si miras mi código verás que hay algo que puedes hacer que yo hago, lo puedo decir sin más pero entonces no se aprende

Vamos a centrarnos en el caso concreto del 4 que es 2*2, llega el momento de comprobar si es compuesto, en este caso en la primera iteración sale que lo es (se divide por 2) y no pasa nada. Si subimos al 6 que es 3*2 para lo mismo pero si cojemos el 7387 que es 83*89 vamos a probar si es divisible por 2, por 3 (hasta aquí bien) y luego por 4 (hacemos trabajo en balde), 5 bien, 6 (a evitar) y pues eso, vamos probando con números que no son interesantes y nunca van a aportar nada más que retrasar el tiempo sin hacer nada útil

Como pistilla creo que podría ser interesante solo ir probando si divide a números primos, los compuestos ya estan implicitos probando los primos
Tu programa no da resultado de cuántos números primos encuentra
Tampoco cuenta el tiempo que tarda en encontrarlos
Solo imprime muchos números y calcula cuanto tiempo ha tardado en imprimir esos números

No conozco tu lenguaje de programación y no podría sacar nada en claro revisándolo

Te agradezco los apuntes matemáticos que haces al respecto y me encantaría aplicarlos

Como te lo has tomado tan en serio (a tu manera)
si quieres en el próximo reto hacemos algo más difícil que un ejercicio tan simple
 
Podría ser el siguiente reto, al fin y al cabo tiene infinitos decimales :mola:
En su día hice el programa (aunque no recuerdo en qué se basaba). Era alucinante dejar el ordenata encendido día y noche y esperar al siguiente dígito encontrado. Cuando salía, sonaba una alarma como de premio en una tragaperras... xDD

Joder, tiempos aquellos...
 
Tu programa no da resultado de cuántos números primos encuentra
Tampoco cuenta el tiempo que tarda en encontrarlos
Solo imprime muchos números y calcula cuanto tiempo ha tardado en imprimir esos números

No conozco tu lenguaje de programación y no podría sacar nada en claro revisándolo

Te agradezco los apuntes matemáticos que haces al respecto y me encantaría aplicarlos

Como te lo has tomado tan en serio (a tu manera)
si quieres en el próximo reto hacemos algo más difícil que un ejercicio tan simple

Lo da pero no lo imprime, los almaceno en el vector "primos" (en la solución en tiempo real y en la otra) con lo que solo tienes que hacer "primos.len" y te dirá la cantidad pero vamos, que lo he comprobado, son los que tienen que ser

Cuenta lo que tarda en encontrarlos en la solución real, en el bucle for entre los dos cronos imprime lo que devuelve "get_primos()" que es el vector con todos los primos con lo que ese tiempo si que cuenta, de todas formas en el otro puse el dato de que tarda algo menos de 7 segundos en compilar el código, es decir sobre 3 o 4 segundos en construir la lista de primos y meterlas en el .txt que "leer" en el ejecutable, te podría decir el tiempo exacto si es que quieres saberlo

Por eso quería hacerlo en la nube, porque asi tienes una web en la que puedes cambiar las cosas al vuelo e ir viendo que pasa y que no pero en la nube no tengo build.rs y aunque hubiera podido crear la de tiempo real como pasó a ser una obligación pues solo quise quitarmelo rápido de encima, arrancas el IDE y a correr, en menos de media hora has terminado con ambas opciones y te quitas una cosa de encima

Yo te he ido diciendo cosas pero es que mi experiencia es que si en vez de darte la pista te digo "en la línea 14 pon esto "xyz" y de en la 20 quita ijk" no aprendes, si revisas un poco lo que te dije de porque tardabas tanto en imprimir es más o menos lo que te han dicho, yo te dí la pista del flush() para que lo pudieses buscar y verlo a tu manera

Me tendría que pensar lo de participar en otro más complejo, lo primero es que el nivel es entre bajo y moderado asi que tampoco quiero poner algo complicado que no se sepa resolver y luego porque me gusta hacer las cosas a mi ritmo y tienes poca paciencia, a mi me gusta disfrutar la experiencia, tengo ejercicios muy complicados pero es que no me gusta hacerlos con prisas, en el trabajo voy con prisas, esto no es trabajo y me gusta hacerlo a mi aire. No ha acabado este y ya te puede el ansia :qmeparto: :qmeparto: hay gente que lo sigue intentando y para ellos es una experiencia distinta, ellos no lo hacen por competir, participar es suficiente y es igual de válida que tú objetivo de competir por ganar
 
En su día hice el programa (aunque no recuerdo en qué se basaba). Era alucinante dejar el ordenata encendido día y noche y esperar al siguiente dígito encontrado. Cuando salía, sonaba una alarma como de premio en una tragaperras... xDD

Joder, tiempos aquellos...

Yo así sin mirar mucho te diría que usando la regla de Newton que es precisamente para casos como esto

Con una raíz es más fácil, la raíz de 2 es 1.41... pero queremos saberlo con 100 dígitos

Pues tomas un valor inicial, 1 por ejemplo y haces la sucesión de Newton que no es ni más ni menos que ir viendo, multiplicas el valor por 1 entre 2 elevado a la iteración y ves si sumas o restas

Es decir, sería 1 +- 1/2 que da

- 0.5
- 1.5

0.5*0.5 = 0.25
1.5*1.5 = 2.25

Con lo que + 1/2 se acerca más al valor real, lo mismo para 1/2 elevado a 2 (por ser la iteración segunda)

1 + 0.5 +-1/4

- 1.5 - 0.25
- 1.5 + 0.25

Y ves cual se acerca más, a veces es suma y a veces resta, como 1/2 elevado es cada vez más pequeño te vas acercando bastante rápido a la solución final, en la tercera iteración como tenemos 1.25 y le vamos a sumar 0.125 (1/8) nos da 1.375 que es bastante cercano al resultado real de 1.41, nada mal para ser solo tres iteraciones

Repitiendo esto se consigue tanta precisión como quieras, seguramente fuese algo muy parecido a esto
 
Lo da pero no lo imprime, los almaceno en el vector "primos" (en la solución en tiempo real y en la otra) con lo que solo tienes que hacer "primos.len" y te dirá la cantidad pero vamos, que lo he comprobado, son los que tienen que ser

Cuenta lo que tarda en encontrarlos en la solución real, en el bucle for entre los dos cronos imprime lo que devuelve "get_primos()" que es el vector con todos los primos con lo que ese tiempo si que cuenta, de todas formas en el otro puse el dato de que tarda algo menos de 7 segundos en compilar el código, es decir sobre 3 o 4 segundos en construir la lista de primos y meterlas en el .txt que "leer" en el ejecutable, te podría decir el tiempo exacto si es que quieres saberlo

Por eso quería hacerlo en la nube, porque asi tienes una web en la que puedes cambiar las cosas al vuelo e ir viendo que pasa y que no pero en la nube no tengo build.rs y aunque hubiera podido crear la de tiempo real como pasó a ser una obligación pues solo quise quitarmelo rápido de encima, arrancas el IDE y a correr, en menos de media hora has terminado con ambas opciones y te quitas una cosa de encima

Yo te he ido diciendo cosas pero es que mi experiencia es que si en vez de darte la pista te digo "en la línea 14 pon esto "xyz" y de en la 20 quita ijk" no aprendes, si revisas un poco lo que te dije de porque tardabas tanto en imprimir es más o menos lo que te han dicho, yo te dí la pista del flush() para que lo pudieses buscar y verlo a tu manera

Me tendría que pensar lo de participar en otro más complejo, lo primero es que el nivel es entre bajo y moderado asi que tampoco quiero poner algo complicado que no se sepa resolver y luego porque me gusta hacer las cosas a mi ritmo y tienes poca paciencia, a mi me gusta disfrutar la experiencia, tengo ejercicios muy complicados pero es que no me gusta hacerlos con prisas, en el trabajo voy con prisas, esto no es trabajo y me gusta hacerlo a mi aire. No ha acabado este y ya te puede el ansia :qmeparto: :qmeparto: hay gente que lo sigue intentando y para ellos es una experiencia distinta, ellos no lo hacen por competir, participar es suficiente y es igual de válida que tú objetivo de competir por ganar
No sé shur
Sigue sin quedarme claro cuanto tarda tu programa en encontrar los primos y cuanto tarda en imprimir

Podemos hacer algo más complicado y con más calma
Sucede que cuando mencionaste el duelo, o el reto, como quieras llamarlo
me lo tomé como tal

Yo he participado en varias competiciones de hacking y el desafío siempre ha sido el tiempo
La dificultad venía implícita
Entonces lo hice deprisa y solo me preocupé porque fuera lo más eficiente que pudiera hacer en Python con el conocimiento que tengo

Uso Python porque me permite desarrollar todo tipo de herramientas para mí trabajo
Es un lenguaje polivalente

Sé que hay muchos otros lenguajes que pueden hacer las cosas a más velocidad, como C o C++
Ahora sé que Rust también supera a Python en velocidad

No me verás fardando de lo rápido que va Python pero si de todo lo que puedo hacer con él
Si me pongo, podría sacarte la talla de calzoncillos
Creeme

Competir por ganar?
De qué van las competiciones entonces?
Quién retó a quién? ☝️
Tú querías demostrarme algo
Tú me querías ganar a mí
Y yo desde el primer momento fui humilde y sabía que cualquier persona puede hacer un programa mejor que el mío

Lo único que hice fue meterte caña porque sabía que te ibas a poner nervioso con la presión 🤪 y así fue
 
Le he pedido a una IA que me explique como va eso del Rust. Parece interesante.

Estaba viendo lo del vector ese del principio, y parece como si al crearlo llamase a un método, pero la IA me dice que eso es como un struct de c, que tiene funciones además. Le he preguntado si tiene herencia, sobrecarga de operadores, polimorfismo, mensajes y eso, y me dice que tiene traits, que me suena he visto en algún otro lenguaje.

El chisme me explica, si lo he entendido correctamente, que los & y * son para desreferenciar/como punteros como en C, pero que son seguros, y no se comen lo que tengas en memoria. Me pregunto si eso tendrá un precio a la hora de ejecución.
 
No sé shur
Sigue sin quedarme claro cuanto tarda tu programa en encontrar los primos y cuanto tarda en imprimir

Podemos hacer algo más complicado y con más calma
Sucede que cuando mencionaste el duelo, o el reto, como quieras llamarlo
me lo tomé como tal

Yo he participado en varias competiciones de hacking y el desafío siempre ha sido el tiempo
La dificultad venía implícita
Entonces lo hice deprisa y solo me preocupé porque fuera lo más eficiente que pudiera hacer en Python con el conocimiento que tengo

Uso Python porque me permite desarrollar todo tipo de herramientas para mí trabajo
Es un lenguaje polivalente

Sé que hay muchos otros lenguajes que pueden hacer las cosas a más velocidad, como C o C++
Ahora sé que Rust también supera a Python en velocidad

No me verás fardando de lo rápido que va Python pero si de todo lo que puedo hacer con él
Si me pongo, podría sacarte la talla de calzoncillos
Creeme

Competir por ganar?
De qué van las competiciones entonces?
Quién retó a quién? ☝️
Tú querías demostrarme algo
Tú me querías ganar a mí
Y yo desde el primer momento fui humilde y sabía que cualquier persona puede hacer un programa mejor que el mío

Lo único que hice fue meterte caña porque sabía que te ibas a poner nervioso con la presión 🤪 y así fue

En el de tiempo real los 1.7 segundos incluyen el tiempo de encontrarlos e imprimirlos

En el precalculado son 216ms de impresión que es lo único que hace el programa y seguramente entre 3 o 4 segundos en calcular la lista de primos y meterla en un fichero de texto que se inserte en el binario

En una competición clásica claro, en mi caso solían ser 3 horas el evento pero esto no es un evento presencial, yo ya te dije que ni estaba en casa cuando acepté y cuando llego tras 13 o 14 horas de trabajo pues no me voy a poner corriendo a hacer nada, llego, me ducho tranquilo, ceno y todo eso. Y el viernes que si que salgo antes pero lo mismo, quiero ir a mi aire, sin prisas, sin obligaciones. Es que no habían pasado ni 24 horas y ni siquiera era fin de semana

Como profesional del sector que lleva en esto un tiempo, Python no vale un duro y si de verdad aspiras a ser un buen programador te será un lastre y bien gordo, lo que tú crees que haces con Python es mentira, TensorFlow por ejemplo está programado en C++ y es lo que Python llama, estas ejecutando código C++ y como Python es la basura que es pues hay que hacer malabares porque en C, C++ o Rust un entero de 32 bits es un entero de 32 bits, en Python como cambia cada vez que quiere pues donde tienes que controlarlo es en la librería, es decir, en C/C++/Rust o lo que sea

Y esa flexibilidad que te da lo único que hace es que no sepas que hacer cuando no la tengas, yo no puedo ir haciendo cambios bruscos de cosas, tengo que pensar que es lo que quiero y como lo voy a usar, si algún día lo intentas verás que no es tan sencillo a aparente, si nunca te pones no podrás ser bueno en ello, crear una base de datos es algo bastante parecido, como no la crees bien desde el principio la cosa ya empieza torcida
 
Le he pedido a una IA que me explique como va eso del Rust. Parece interesante.

Estaba viendo lo del vector ese del principio, y parece como si al crearlo llamase a un método, pero la IA me dice que eso es como un struct de c, que tiene funciones además. Le he preguntado si tiene herencia, sobrecarga de operadores, polimorfismo, mensajes y eso, y me dice que tiene traits, que me suena he visto en algún otro lenguaje.

El chisme me explica, si lo he entendido correctamente, que los & y * son para desreferenciar/como punteros como en C, pero que son seguros, y no se comen lo que tengas en memoria. Me pregunto si eso tendrá un precio a la hora de ejecución.

No te compliques mucho

Rust es si tienes C++, le quitas la basura y morralla y entonces te sale Rust, es un C++ 2.0 pero por otra gente que no es de los creadores de C++

De las IAs no te fies porque no sirven para nada, mienten más que hablan, yo no he usado ningún struct en ningún sitio porque no hace falta, es un cálculo simple sin más. Me puedes decir fichero y línea por el que tengas curiosidad y yo te digo 100% que es lo que pasa

Tiene herencia en forma de composición asi que para mi la tiene, lo de los traits es como "características" técnicas, es decir, creo una función suma

funcion suma(a: T, b: T) <Traits aquí de T>

Y entonces yo ahora diría, T tiene que ser número, y positivo, y de tipo tal o cual y ..... Con lo que es a la hora de compilar cuando se crea el código, si no cumples el requisito falla y tienes la certeza de que no va a funcionar pero son eso, propiedades o atributos que tiene que tener, no sirven para otra cosa. Si por ejemplo piensas poner a + b dentro tal cual pues necesitas que T tenga el trait de suma, de otra forma no podrá hacerla. Es para eso, para ir acotando donde y con que se puede usar. No es nada que exista en otro lenguaje, no al menos a este nivel porque las propiedades se van sumando por si solas, a mi no me termina de convencer pero es lo que hay y te jodes

Las referencias son seguras, normalmente pero el acceso al puntero (*) no siempre, hay pocos casos que si, necesitas decirle a Rust "se que me voy a meter la mano en el fuego, confia en mi" que es lo que se llama un bloque unsafe de código en el que el compilador se relaja un poco pero sigue estando, no se puede hacer de todo

Es gratis, es más, como el compilador puede tener la certeza de muchas cosas rinde más que código C++, ese más es 5% como mucho pero es algo mejor. Todas estas cosas suceden en compilación, Rust tiene muy pocas cosas en ejecución y en modo de binario final casi ninguna. Es decir, en modo de desarollo Rust va a ir mirando que no te salgas del array pero cuando compiles como bueno todo no va a mirar nada. No hay precio a pagar, tampoco es que compile más lento que C++, antes si pero hoy es incluso más rápido

El libro es gratis y aunque es un poco básico te permitirá hacerte una idea https://book.rustlang-es.org/
 
No te compliques mucho

Rust es si tienes C++, le quitas la basura y morralla y entonces te sale Rust, es un C++ 2.0 pero por otra gente que no es de los creadores de C++

De las IAs no te fies porque no sirven para nada, mienten más que hablan, yo no he usado ningún struct en ningún sitio porque no hace falta, es un cálculo simple sin más. Me puedes decir fichero y línea por el que tengas curiosidad y yo te digo 100% que es lo que pasa

Tiene herencia en forma de composición asi que para mi la tiene, lo de los traits es como "características" técnicas, es decir, creo una función suma

funcion suma(a: T, b: T) <Traits aquí de T>

Y entonces yo ahora diría, T tiene que ser número, y positivo, y de tipo tal o cual y ..... Con lo que es a la hora de compilar cuando se crea el código, si no cumples el requisito falla y tienes la certeza de que no va a funcionar pero son eso, propiedades o atributos que tiene que tener, no sirven para otra cosa. Si por ejemplo piensas poner a + b dentro tal cual pues necesitas que T tenga el trait de suma, de otra forma no podrá hacerla. Es para eso, para ir acotando donde y con que se puede usar. No es nada que exista en otro lenguaje, no al menos a este nivel porque las propiedades se van sumando por si solas, a mi no me termina de convencer pero es lo que hay y te jodes

Las referencias son seguras, normalmente pero el acceso al puntero (*) no siempre, hay pocos casos que si, necesitas decirle a Rust "se que me voy a meter la mano en el fuego, confia en mi" que es lo que se llama un bloque unsafe de código en el que el compilador se relaja un poco pero sigue estando, no se puede hacer de todo

Es gratis, es más, como el compilador puede tener la certeza de muchas cosas rinde más que código C++, ese más es 5% como mucho pero es algo mejor. Todas estas cosas suceden en compilación, Rust tiene muy pocas cosas en ejecución y en modo de binario final casi ninguna. Es decir, en modo de desarollo Rust va a ir mirando que no te salgas del array pero cuando compiles como bueno todo no va a mirar nada. No hay precio a pagar, tampoco es que compile más lento que C++, antes si pero hoy es incluso más rápido

El libro es gratis y aunque es un poco básico te permitirá hacerte una idea https://book.rustlang-es.org/
Gracias! Había leído algo de que iban a usar Rust para el kernel de Linux, y me preguntaba si es por la seguridad, o porque es una cosa más moderna. Tb instalé unas utilidades para Windows que son muchas de las de la GNU pero hechas en Rust, y me llamaba la atención.
 
Gracias! Había leído algo de que iban a usar Rust para el kernel de Linux, y me preguntaba si es por la seguridad, o porque es una cosa más moderna. Tb instalé unas utilidades para Windows que son muchas de las de la GNU pero hechas en Rust, y me llamaba la atención.

Rust ya se usa en Linux, muchos no lo han visto con buenos ojos pero como siempre, los cambios generan rechazo al principio

Para mi es todo un poco, los niños de hoy día con el deficit de atención tan brutal que tienen no van a poder aprender C++ y C lo medio podrían intentar pero en muchos casos va a ser que no, En pocos años cuando todos los expertos de C se jubilen (C++ no se admite en el kernel) pues hay un problema, quien va a seguir programandolo, C y C++ son lenguajes en horas bajas y peor se va poner, el kernel moriría porque no quedaría nadie que lo programase, Rust es algo moderno mucho más fácil de usar que C/C++ con lo que das esa opción, algunos lo aprenderán y se podrá sustituir el talento humano con sangre nueva y fresca

La seguridad también es otro punto, cuando se creó C y C++ lo normal es que no hubiese internet y la seguridad era algo sin importancia, la realidad que vivimos hoy es muy distinta, ayer mismo uno de los ingenieros de Chrome decía que ellos usaban raw pointers en C++ por rendimiento porque en C++ si que hay una penalización si usas los smart pointers que es algo que poca gente sabe pero que no merece la pena, estan cambiando a su propio puntero "smart" porque la seguridad es más importante que el rendimiento puro y duro. Un SO es lo mismo, necesitas que las cosas sean estables y Rust es un buen candidato

Ya digo que Rust es un C++ bien hecho, un gran paso adelante. C++, porque estoy entre los usuarios duros del mismo y se bien lo que veo, esta abocado al fracaso, no entienden que C/C++ se ha usado porque era lo único que había antes, es como Telefónica, te jodes que es lo que hay, en cuanto se abrió el mercado todos sus abusos le pasaron un alto precio, si no llega a ser por los políticos Movistar no existiría. C++ es lo mismo, ha tratado como la mierda a sus usuarios y es normal que ahora que se puede tener el mismo rendimiento usando otra cosa muchos migren, yo incluido

Yo ya les avisé hace 5 años lo que se venía y no me he equivocado mucho, C++ tiene los días contados, van a tratar de achicar el agua pero desde dentro te aseguro que es en vano, no entienden el problema de base del lenguaje, se creen que es por tecnicismos por lo que la gente deja de usarlo y van a tratar de suplirlo haciendo el lenguaje aún má complicado y difícil de usar, pero vamos, Rust es la primera de muchas cosas que vendrán, C++ puede que mantenga el tipo contra el pero no contra cada vez productos mejores y más avanzados, sobretodo porque C++ no avanza, el gap es cada vez más grande y el progreso es asi, lo mejor se impone a soluciones peores, tarda un tiempo pero acaba ocurriendo
 
La programación de sistemas es interesante. Hace muchos años, cuando sacaron los Macs primeros, el lenguaje de sistema era un pascal orientado al objeto que se ve Apple pidió a Wirth que hiciera. Tenía punteros como los de C, y una cosa que se llamaba handles. En algún momento pasaron a C, que estaba más de moda. Incluso antes, hubo un SO que estaba escrito en lisp.

Los sistemas operativos modernos son unos monstruos. Me pregunto si en algún momento alguien sacará algo escrito en un lenguaje de más alto nivel y más seguro, a cambio de pérdida de rendimiento, para hacer cosas más complejas.
 
En el de tiempo real los 1.7 segundos incluyen el tiempo de encontrarlos e imprimirlos

En el precalculado son 216ms de impresión que es lo único que hace el programa y seguramente entre 3 o 4 segundos en calcular la lista de primos y meterla en un fichero de texto que se inserte en el binario

En una competición clásica claro, en mi caso solían ser 3 horas el evento pero esto no es un evento presencial, yo ya te dije que ni estaba en casa cuando acepté y cuando llego tras 13 o 14 horas de trabajo pues no me voy a poner corriendo a hacer nada, llego, me ducho tranquilo, ceno y todo eso. Y el viernes que si que salgo antes pero lo mismo, quiero ir a mi aire, sin prisas, sin obligaciones. Es que no habían pasado ni 24 horas y ni siquiera era fin de semana

Como profesional del sector que lleva en esto un tiempo, Python no vale un duro y si de verdad aspiras a ser un buen programador te será un lastre y bien gordo, lo que tú crees que haces con Python es mentira, TensorFlow por ejemplo está programado en C++ y es lo que Python llama, estas ejecutando código C++ y como Python es la basura que es pues hay que hacer malabares porque en C, C++ o Rust un entero de 32 bits es un entero de 32 bits, en Python como cambia cada vez que quiere pues donde tienes que controlarlo es en la librería, es decir, en C/C++/Rust o lo que sea

Y esa flexibilidad que te da lo único que hace es que no sepas que hacer cuando no la tengas, yo no puedo ir haciendo cambios bruscos de cosas, tengo que pensar que es lo que quiero y como lo voy a usar, si algún día lo intentas verás que no es tan sencillo a aparente, si nunca te pones no podrás ser bueno en ello, crear una base de datos es algo bastante parecido, como no la crees bien desde el principio la cosa ya empieza torcida
me parece estupendo que quieras dar tu opinión sobre Python
a mi no me afectan todas las tonterías que has dicho en este hilo y en el otro
no solo soy programador, me dedico a la ciberseguridad y todas las herramientas que uso están hechas con Python
se llevan desarrollando herramientas de hacking con Python desde hace años, unos cuantos años
las IA's que conozco están hechas con Python
el mundo IT se está enfocando a Python
Python es lo que me da de comer
no pretendo hacerme rico tampoco

como te dije anteriormente en otro comentario
tu estrés y frustración es problema tuyo
a mi me puedes decir lo que quieras porque me resbala
sinceramente, no eres alguien que haya mostrado respeto desde el principio
y a gente con ese tipo de actitud, pues no la respeto

tu actitud es tan deplorable que incluso en este hilo has simpeado a @saurikmana
no puedes contenerte shur, eres así de penoso

por lo que al recibir palabras de una persona como tú entiende que no me vas a dañar con las tonterías que digas
es que me dan igual
puedes seguir diciendo gilipolleces que lo único que haces es quedar mal y darle una imagen asquerosa a la gente del sector que está en el foro
a mí nunca se me ocurriría ponerme a tu nivel porque me ganarías por experiencia
eso de decir que un lenguaje de programación es basura... 🤣 para intentar dañarme a mí
criticar el trabajo de los demás o cómo lleven su vida profesional
es que no lo vas a conseguir, shur
es que estás quedando fatal

pero lo que es más triste, y esto debo decirlo ya de hombre a hombre
es que te afecte tanto lo que pueda decirte alguien que es más joven que tú y con menos experiencia en programación
en cuanto he notado que ibas de "subidito" pues he tenido que meterte caña
ha sido estupendo darme cuenta que bajo presión te vuelve más borrico aún y puedes decirme más tonterías
te invito a que sigas soltando lindezas porque desde ayer me llevo riéndo de ti una barbaridad
y lo mejor de todo es que queda guardadito en el foro
por mí podemos parar cuando quieras, yo te daré respuesta siempre que me cites
me está gustando esto de entrar al foro y encontrame una noti tuya soltando tu verborrea

humildad, sosiego y jajas
lo que sea por los jajas
 
La programación de sistemas es interesante. Hace muchos años, cuando sacaron los Macs primeros, el lenguaje de sistema era un pascal orientado al objeto que se ve Apple pidió a Wirth que hiciera. Tenía punteros como los de C, y una cosa que se llamaba handles. En algún momento pasaron a C, que estaba más de moda. Incluso antes, hubo un SO que estaba escrito en lisp.

Los sistemas operativos modernos son unos monstruos. Me pregunto si en algún momento alguien sacará algo escrito en un lenguaje de más alto nivel y más seguro, a cambio de pérdida de rendimiento, para hacer cosas más complejas.

La respuesta a eso es sencilla y es no, se puede sacrificar algo de rendimiento por seguridad pero no mucho, Windows esta haciendo eso que dices y es por lo que rinde considerablemente menos que Linux y por lo que hace 10 años en la lista top 500 había algunos Windows Server y hoy no queda ninguno, el efecto es que por ejemplo los juegos rinden más en Linux, no va a acabar bien, la diferencia puede ser tener una 2080 en Linux y una 2060 en Windows, tú mismo sabes cual es la respuesta, querrás más calidad visual o una experiencia más fluida con el hardware que ya tienes dado que es gratis y siempre se querrá más por menos

Por no olvidar de que por muy seguro y de alto nivel que sea el lenguaje vas a tener que lidiar con cosas del bajo nivel, NaN por ejemplo no es algo que salga del lenguaje, es un bit del procesador de la unidad FPU, si divides 0.0/0.0 se activará el bit y tendrás que ir a mirarlo o de otra forma el lenguaje no podrá decirte NaN, hay entre 8 y 10 bits dependendiendo del procesador solo para la FPU. En una tarjeta de red ocurre lo mismo y en cualquier parte del hardware
 
Señores os he preparado un "terreno de juego" neutral para medir las poll... ejem digo los tiempos de ejecución, cuando se proponga un reto, el que sea, que cada uno escriba su código en su celda, al ejecutarla saldrá el resultado y el tiempo empleado. Así no hay ni trampa ni cartón, la cosa estaría más o menos así:

1729377092145.png


Aquí tenéis el enlace: https://colab.research.google.com/drive/1E-fpbQBi5AK3cOyMe3ZVNjwXSGE80xWt?usp=sharing

Edito: He creado celdas para Jorge, JC Denton, Ottiatio y un servidor. Si alguien más quiere que le cree otra que me lo diga :)
 
Última edición:
Señores os he preparado un "terreno de juego" neutral para medir las poll... ejem digo los tiempos de ejecución, cuando se proponga un reto, el que sea, que cada uno escriba su código en su celda, al ejecutarla saldrá el resultado y el tiempo empleado. Así no hay ni trampa ni cartón, la cosa estaría más o menos así:

1729377092145.webp


Aquí tenéis el enlace: https://colab.research.google.com/drive/1E-fpbQBi5AK3cOyMe3ZVNjwXSGE80xWt?usp=sharing

Edito: He creado celdas para Jorge, JC Denton, Ottiatio y un servidor. Si alguien más quiere que le cree otra que me lo diga :)

Un detalle

Pero mi código no es Python o compatible (como podría ser SageMath) y no lo va a ser

Te agradezco el esfuerzo pero me da que la solución iría más por usar https://godbolt.org/ que permite muchos lenguajes, si es que se diese el caso
 
Un detalle

Pero mi código no es Python o compatible (como podría ser SageMath) y no lo va a ser

Te agradezco el esfuerzo pero me da que la solución iría más por usar https://godbolt.org/ que permite muchos lenguajes, si es que se diese el caso
Bueno pero python lo puedes aprender en dos patás. Además no hace falta ni que lo aprendas, programas lo que quieras en local en C++ por ejemplo, y después abres la IA y le dices que te pase ese código a python, lo pones en tu celda entre la toma de tiempos y listo. Mayormente es para medir los tiempos en una misma máquina.
 
Bueno pero python lo puedes aprender en dos patás. Además no hace falta ni que lo aprendas, programas lo que quieras en local en C++ por ejemplo, y después abres la IA y le dices que te pase ese código a python, lo pones en tu celda entre la toma de tiempos y listo.

Yo por desgracia se programar en Python, el problema no es ese, es sencillamente que no quiero por razones tanto personal como profesional

De la misma forma que se programar en R o en muchos otros lenguajes y no lo haría bajo ningún concepto porque es una tecnología que no me puede interesar menos
 
Volver
Arriba