|
41
|
Programación / Programación C/C++ / PoC, más rapido if-else o switch?
|
en: 7 Diciembre 2014, 23:35 pm
|
Los que me conocen por aquí, saben que me gusta discutir por tonterias como estas(y que me gusta hacer posts largos)... hace poco estaba hablando sobre un tema con mDrinky y discutíamos si el código compilado de if else es el mismo que switch o si switch era más rápido... aquí mi prueba de concepto... switch es más rápido... muy ligeramente más rápido leo un archivo (pi2.txt) y repito 100 veces con 1.000.000 de valores leidos, calculo promedio y repito por el otro metodo #include <iostream> #include <fstream> #include <ctime> using namespace std; int ifelse_op(int largo, char memoria[]); int switch_op(int largo, char memoria[]); int main(){ int a = 0;//control de ciclos int ciclos = 100;//cantidad de muestras /*tiempos*/ float promedio = 0; float max = 0; float min = (unsigned int)-1;//maximo u_int float buff = 0; /*********/ /*pasamos el archivo a ram, cuidado con archios grandes*/ ifstream archivo ("pi2.txt",ios::ate);//abrimos con apuntador al final int largo =(int) archivo.tellg();//calculamos el largo por el apuntador archivo.seekg (0, ios::beg);//colocamos apuntador en el inicio char memoria[largo];//char-s tan largo como archivo archivo.read (memoria, largo);//botamos archivo completo a memoria archivo.close();//listo con el archivo /*primer metodo if-else*/ for(a=0;a<ciclos;a++){ buff = ifelse_op(largo,memoria); promedio += buff;//suma para promedio max = max>buff?max:buff;//si maximo es menor que buff max=buff min = min<buff?min:buff;//si minimo es mayor que buff min=buff } promedio/=ciclos;//promedia cout << "promedio if-else: " << promedio/CLOCKS_PER_SEC << "s" << endl; cout << "min if-else:" << min/CLOCKS_PER_SEC << "s - "; cout << "max if-else:" << max/CLOCKS_PER_SEC << "s" <<endl; /*se reinician las variables*/ promedio = 0; max = 0; min = (unsigned int)-1; /****************************/ /*segundo metodo switch*/ for(a=0;a<ciclos;a++){ buff = switch_op(largo,memoria); promedio += buff; max = max>buff?max:buff; min = min<buff?min:buff; } promedio/=ciclos; cout << "promedio if-else: " << promedio/CLOCKS_PER_SEC << "s" << endl; cout << "min if-else:" << min/CLOCKS_PER_SEC << "s - "; cout << "max if-else:" << max/CLOCKS_PER_SEC << "s" <<endl; return 0; } /*****************************************/ int ifelse_op(int largo, char memoria[]){ clock_t inicio_reloj = clock();//tiempo inicial int control;//variable para control int i;//control de ciclos for(i=0;i<largo;i++){ //char valor = memoria[i];//trampa a mi favor mwahaha!! if(memoria[i]=='1') control = 1; else if(memoria[i]=='2')control = 2; else if(memoria[i]=='3')control = 3; else if(memoria[i]=='4')control = 4; else if(memoria[i]=='5')control = 5; else if(memoria[i]=='6')control = 6; else if(memoria[i]=='7')control = 7; else if(memoria[i]=='8')control = 8; else if(memoria[i]=='9')control = 9; else if(memoria[i]=='0')control = 0; else control = 0; } return clock() - inicio_reloj;//retorna tiempo } int switch_op(int largo, char memoria[]){ clock_t inicio_reloj = clock();//tiempo inicial int control;//variable para control int i;//control de ciclos for(i=0;i<largo;i++){ //char valor = memoria[i]; switch (memoria[i]){ case '1':control = 1; case '2':control = 2; case '3':control = 3; case '4':control = 4; case '5':control = 5; case '6':control = 6; case '7':control = 7; case '8':control = 8; case '9':control = 9; case '0':control = 0; default: control = 0; } } return clock() - inicio_reloj;//retorna tiempo }
con mi perolita los resultados son promedio if-else: 0.0238996s min if-else:0.023581s - max if-else:0.024229s promedio if-else: 0.0180653s min if-else:0.018014s - max if-else:0.018394s
con ligeras variaciones menores a +-0.0007 dando como resultado un switch 8% más rápido que el if si alguien cree que mi metodología o código esta mal o me equivoqué avisen el archivo pi2.txt es un archivo que tengo por ahí tiempo y lo uso para probar cosas, es una generacion de pi a 1.000.000 de decimales, sin cabeceras, ni texto y medio mocho... son casi 1.1mb, si lo quieren, aqui está https://mega.co.nz/#!6xAmGIaA!FtCMe4bM5NVm-gcO2zW-myUWlBdLI3TqlweAhKaQ-0IPD: codigo corregido...
|
|
|
42
|
Programación / Scripting / [Aporte] Código para generar tableros validos de sudoku
|
en: 23 Noviembre 2014, 21:08 pm
|
Estaba buscando como resolver unos problemas y aprendiendo python (ya que puedo programar en android con QPython) asi que decidi hacer un metodo para generar tableros validos de sudoku, se genera un tablero original y con desplazamientos se lleva a la posición generada segun la semilla... la semilla genera (teoricamente) 60466175 tableros unicos Si cualquier duda avisen import pprint #crea array bidimensiona def create_matrix(m, n): return [[0]*n for _ in xrange(m)] #gira la matriz ccw def rotar_matrix(matrix): matrix_auxiliar = create_matrix(9,9) for x in range(9): for y in range(9): matrix_auxiliar[y][x] = matrix[x][y] return matrix_auxiliar def generar_tablero(semilla): #se genera un sudoku base sobre el que aplicar transformaciones basesudoku = create_matrix(9,9) for y in range(9): for x in range(9): basesudoku[y][x]= (x+(y%3)*3+(y/3))%9+1 #declaracion e inicializacion de variables #variables de transformacion #desplazamiento del 0 al 8 desplazamiento = 0 #rotacion del 0 al 3 rotacion = 0 #combinacion cada elemento del 0 al 5 combinacion = [0,0,0,0,0,0,0,0] #numero generatriz de 0 60466175 desplazamiento = semilla%9 semilla /=9 rotacion = semilla%4 semilla /=4 for i in range(8): combinacion[i] = semilla%6 semilla /= 6 #sudoku final sudoku = create_matrix(9,9) #auxiliar para copiar elementos auxiliar = create_matrix(3,9) #posibles combinaciones de 3 elementos combinatorias = create_matrix(6,3) combinatorias = [[0,1,2],[1,2,0],[2,0,1],[1,0,2],[0,2,1],[2,1,0]] #combinacion para cada elemento segun combinacion escogida combinador = create_matrix (8,3) for i in range(8):combinador[i] = combinatorias[combinacion[i]] #modificacion de matriz por desplazamiento lateral con desp for y in range(9): for x in range(9): sudoku[y][x] = basesudoku[y][(x+desplazamiento)%9] #mecla lineas de 3 en 3 segun combinacion for z in range(3): for copia in range(3): auxiliar[copia] = sudoku[z*3+copia] for y in range(3): sudoku[z*3+y] = auxiliar[combinador[z][y]] #se copia sudoku en auxiliar auxiliar = sudoku[:] #se mezclan los 3 renglones mayores for z in range(3): for y in range(3): sudoku[z*3+y] = auxiliar[combinador[3][z]*3+y] #se rota la matriz para aplicar conversiones en otro eje sudoku = rotar_matrix(sudoku) #se repite el proceso for z in range(3): for copia in range(3): auxiliar[copia] = sudoku[z*3+copia] for y in range(3): sudoku[z*3+y] = auxiliar[combinador[z+4][y]] auxiliar = sudoku[:] for z in range(3): for y in range(3): sudoku[z*3+y] = auxiliar[combinador[7][z]*3+y] #se endereza la matriz a su orientacion original for i in range(3): sudoku = rotar_matrix(sudoku) #se le da la orientacion indicada en rot for i in range(rotacion): sudoku = rotar_matrix(sudoku) return sudoku pprint.pprint( generar_tablero(0) )
[Elektro]: Título corregido, ponía "odigo"
|
|
|
43
|
Foros Generales / Sugerencias y dudas sobre el Foro / Reglas del foro, sub-foro y razon por lo que temas podrán ser eliminados
|
en: 17 Noviembre 2014, 07:01 am
|
renovando este tema, aclaro aquí las razones por lo que los temas serán modificados, bloqueados, movidos o eliminados Aquí las reglas del foro en caso de dudas 1- Temas con Asuntos (Títulos) en mayúsculas podrán ser borrados ( I.A.1.a.) 2- Temas con Asuntos que sean no descriptivos (como "ayuda", "urgente", etc) podrán ser borrados o modificados ( I.A.1.a.) 3- Ortografía y redacción muy malas podrán ser borrados (sin remordimiento) ( I.A.1.a.) 4- Los links deben ser principalmente de carácter informativo, cualquiera que se considere spam, será modificado y bloqueado, o según el fin, eliminados directamente (modificación de la regla I.B.2.b.) 5- Prohibido publicar Email, el tema será modificado ( II.A.1.c.) 6- Posts con textos en mayúsculas serán modificados o borrados depende de la gravedad ( III.C.1.) 7- Temas que pertenezcan a otros sub-foros serán movidos ( I.A.1.c.) 8- Publicar el mismo tema 2 o más veces en este u otro sub-foro será razón de eliminación ( I.A.1.c.) 9- Múltiples respuestas seguidas al mismo tema desde el mismo usuario serán modificadas o eliminadas 10- Las respuestas deben mantener la coherencia dentro del tema, de no hacerlo podrán ser eliminados ( I.A.2.a.) 11- Respuestas que revivan temas de más de 60 días sin actividad más que temas que realmente lo ameriten ( I.A.2.a.) 12- Ataques o insultos a otros usuarios no serán tolerados, el tema puede ser bloqueado, el mensaje modificado o borrado, el asunto puede contraer penas mayores ( III.C.3.) 13- El foro no promueve contenido no ético o ilegal, cualquier tema con relación está prohibido ( I.A.1.a.) De indicarse la violación, el usuario debe corregirla antes de su próxima respuesta, si no, acciones serán tomadas, de otra manera si no se ha hecho correción en los 2 días continuos podrán ser tomadas acciones No se deben olvidar estos 2 temas 10 pasos para plantear una duda informáticaFAQ : Como hacer preguntas "inteligentes"En caso de desconocer el motivo del borrado de un mensaje, queda terminantemente prohibido volver a publicar el mismo mensaje, la forma de proceder será mandando un Mensaje Personal al moderador de ese subforo, en caso de no tenerlo, a cualquier Moderador Global, Coadmin o Admin. (III.C.1.a. segundo parrafo)
|
|
|
45
|
Foros Generales / Noticias / Un fallo de CSRF en Twitter para robarte la cuenta
|
en: 25 Septiembre 2014, 23:53 pm
|
Los ataques de CSRF (Cross-Site Request Forgery) son conocidos hace bastante tiempo. La idea de ellos es bastante sencilla, y el objetivo es conseguir que una víctima, que tiene una sesión con su cuenta en un sitio web, haga acciones involuntarias en esa sesión al abrir un enlace o cargar un contenido externo. A día de hoy es una de las técnicas de hacking más utilizadas, y en el proyecto OWASP TOP TEN, que recoge los diez ataques más utilizadas en ataques a aplicaciones web y donde siguen reinando las técnicas de SQL Injection y el resto de inyecciones de código, ocupa el octavo lugar. Leer Mas: http://www.elladodelmal.com/2014/09/un-fallo-de-csrf-en-twitter-para.html
|
|
|
46
|
Sistemas Operativos / GNU/Linux / problema resolucion pantalla linux mint...
|
en: 15 Septiembre 2014, 03:39 am
|
hola! por fin me pase a linux mint 17 me va bien... los primeros dias excelente, el asunto es que yo estoy en una laptop y cuando llego a mi casa conecto a mi monitor y lo uso como principal... ahora me veo en un problema... mi monitor principal es un 1440x900, la laptop 1366x768 cuando los instalé agarro el 1440x900 perfecto, varios dias, apagando y prediendo la pc, ciendo pelis, jugando, etc., me fui unos dias solo con la laptop, todo funcionó perfecto... ahorita vuelvo y conecto a mi monitor, vuelve a la configuración que tuvo la primera vez que conecté, 1024x768 pantallas espejadas, al pasar mi monitor principal a 1440x900, el monitor me lanza un error "resolución mayor de la soportada", me paso a windows y funciona perfecto la 1440x900 (así que descarto que sea error del monitor) lo que hice es que tengo la pantalla en 1152x864 por experimentar, y pasa algo curioso... mi pantalla dice que la resolucion es 1152x870... y me doy cuenta que el linux está enviando una resolucion mayor a la real (aparentemente) conseguí en internet una solucion a alguien similar primero cvt 1440 900 y me responde 1440x900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz Modeline "1440x900_60.00" 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync
segundo xrandr --newmode "1440x900_60.00" 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync como indican... revisé la lista de dispositivos y mi pantalla parece ser VGA-0 (por la lista de resoluciones) asi que tercero xrandr --addmode VGA-0 "1440x900_60.00" por ultimo para probar xrandr --output VGA-0 --mode "1440x900_60.00" ellos indican que esto es solo para probar, hay que hacer algo para hacerlo permanente, el comando corre, pero sucede algo malo... mi pantalla parece comprimida (con una legibilidad terrible), entonces me voy a la configuración de la pantalla y dice que la resolucion está en 1152x900 realmente ya no se más que hacer y no consigo nada referente... así que... ayuda!? :s -----------------------------------------------modificado------------------------------------------ agrego info, al reiniciar el logo de mint está fuera del centro, queda hacia arriba unos 400px de mas
|
|
|
47
|
Sistemas Operativos / GNU/Linux / Problemas con Debian
|
en: 9 Septiembre 2014, 13:00 pm
|
Lo estoy intentando sinceramente... quiero pasarme a linux, ubuntu más allá del aspecto, no me gusta, así que decidi montar debian... el aspecto inicial es terrible, es como ver un windows 3.1 XD si, soy superficial con los sistemas operativos (aún cuando el w7 nunca lo toqué, ni el mac osx) instale el infinity para letras, se ve bien... (aunque la tipografia de este foro se ve de terror) y los iconos arriba no me gustan... busqué varios themes que se veían bien, descargo veo que son .theme, intenté doble click pero no! no podia ser así de simple! herramientas del sistema->configuracion avanzada y donde según el tutorial debo escogerlo... sopresa -.- en gris con un signo amarillo de admiracion en un triangulo y simplemente no puedo y listo alguien me ayuda a resolver eso o a un workaround... a demás usaré este post para publicar mis miles de proximos problemas -.- - por otro lado... no me deja instalar chrome -.- simplemente me da errores con una librería que no existe para debian... por synaptic, simplemente me dice que no, y por gestor de paquetes me ignora
|
|
|
49
|
Foros Generales / Foro Libre / Francotirador y efecto coreolis
|
en: 8 Septiembre 2014, 07:35 am
|
Anoche vi un tema que me pegó un poco... afirmaba que los francotiradores ajustaban su tiro porque la rotacion de la tierra afectaba su trayectoria... entonces decidí echar lapiz al papel y calcular este efecto para ver que tanto puede afectar... Bases teoricas:Efecto coreolis: pueden buscar en wiki, pero lo describiré a mi forma... es la diferencia de velocidad dedivada por la rotacion de una figura, donde la parte interna gira a menor velocidad que la externa (imaginar un disco LP girando el centro se mueve a velocidad 0 y el borde a la velocidad de rotacion (giros/s) multiplicado por la circunsferencia... en una esfera aplica igual... Disparo de francotirador: usando datos como que el tiro más lejano son unos 2.400m y que la velocidad de una bala .50 es ~1km/s La tierra:radio: 40.020km (en promedio, asumiré perfecta esfericidad y no me vengan que no, porque el diferencial está por debajo del 0.5%) velocidad de rotacion: el efecto coreolis mismo nos dice que depende de la posicion así que la más alta es el ecuador, sabiendo que el radio es ese y que la tierra tarda 24horas en dar la vuelta... 1668km/h (redondeado) o 463m/s ahora, sabemos que la velocidad depende del paralelo donde estés parado (no importa N o S), en la relacion v=cos(paralelo) (esta explicación la obviaré, si la quieren, comentenlo) ¿Cuantos km es 1º de la tierra? 40.020km/360º = 111,16km/º y la pregunta contraria, ¿cuantos grados representa 1km? 360º/40.020km = 0,01º/km (muy redondeado) Calculos:sabemos entonces que en el polo la velocidad de la tierra es cos(90º)*463m/s=0m/s y esta relacion conserva la "velocidad de cambio" de coseno es decir, cerca de los 0º la diferencia de velocidad entre un punto y otro es muy alta, pero cerca de los 90º la diferencia tiende a 0 desmuestro numericamente entre os grados 0 y 1 la diferencia fue de 0,1m/s, mientras que entre 89 y 90 fue de 8,1m/s entonces, donde más podríamos ver esto es en el polo... Caso 1:un francotirador dispara su .50 acostado en el asta misma del polo norte a su objetivo a 2km exactamente al sur (no importa donde mire, será el sur XD) sabiendo que el está en los 90º de latitud y su objetivo en los 89,98º de latitud su objetivo que está quieto pero el conoce coreolis y sabe uqe se mueve 0,16m/s a la izquierda más rapdio que el y que su bala tardará 2 segundos en alcanzarlo, entonces tendrá que apuntar a 0,32m (32m) a la izquierda si no quiere fallar... Caso 2:un francotirador dispara su .50 en bagdag (~33ºN) exactamente al sur sabiendo que el está en los 33º de latitud y su objetivo en los 32,98º de latitud, su objetivo se mueve a 0,088m/s más rapido que el, a 2 segundos su objetivo estará a 0.176m a su izquierda, debe ajustar 17,6cm para no fallar... Conclusión:si, el efecto coreolis afecta de una manera más o menos importante... este efecto es completamente anulado entre más al este/oeste se apunta (dah, si apunta al este está apuntando a la misma latitud) aunque aclaremos algo, a 2km, incluso con una mira según lo que consigo militar, son 32mm a 10x es decir equivalente a un lente 320mm no es mucha la diferencia, más bien me sorprende que puedan ver a alguien... aquí pego un codigo para que vean como sería el zoom con una mira... tiene una imagen de muestra montada... si ven al hombre de naranja (en el centro de los rieles, muy lejos) no debe estar a mas de 500m y a 320mm ya la linea casi lo tapa completamente, a demás el sniper dudo que pueda predecir todas las corrientes de viento cruzantes en 2km... pero dejo mi envidia y el codigo (solo es copy/paste en un .html y listo, tiene defectos, no los pienso arreglar ya que es solo para demostrar este punto)
|
|
|
|
|
|
|