domingo, 16 de noviembre de 2014

Las viguetas y armellas

Se me ocurrió hace unos meses una idea que podría usarse en la construcción de los techos aligerados. En una construcción actual la tendencia para cubrir el cielo raso es usar baldosas rectangulares o las cuadradas de aproximadamente 60 cm. de lado, sea cual fuere el caso es que si no lo tienes previsto, es un problema poder adosar o anclar los tirantes para poder sujetar las varillas principales para el armado del techo de baldosas. Algunos usan ladrillos de techo que sobrecarga el peso del techo-piso, últimamente se está usando bloques de tecnoport que reducen unas diez veces el peso. Otro de los aditamentos que usan es poner unos excesos de alambre para poder hacer instalaciones, pero no soportan el peso que podría haber. Entonces se me ocurrió usar armellas, sí esas piezas olvidadas como círculos con un extremo con rosca de tornillo o de perno, antes de hacer el vaciado de techo colocarlas amarradas o soldadas a los fierros (horizontales) de las viguetas, pero el círculo de la armella cubierta de papel (que se retiraría cuando seque el vaciado) para dejarle un espacio para manipular lo que se desee colgar, en mi opinión es una solución barata, efectiva y suficientemente sencilla para ser verdad. Conversé con un arquitecto joven de unos 25 años y me dijo que ya se colocan en algunas casas pero en forma incipiente. Lo que debería ser un estándar para aligerar el peso de las construcciones y mejora en presentación de su propia casa.

Repartiendo el cumpleaños

Hola todos, esta vez me encuentro con una idea que me ronda desde hace varios meses, ¿cómo dividir la cuenta entre los asistentes para agasajar a los cumplimentados?, tomando en cuenta que el cumplimentado no paga por su cumpleaños pero debe pagar por el cumpleaños del resto, es ligeramente sencillo. Veamos: Tenemos T = Total a pagar Asistentes (Cumplimentados + Los que pagan + los gorriones) = A Cumplimentados = C La fórmula que se me ocurrió es que los que pagan y los gorriones (que deberían pagar pero son conchudos) pagan un poco más que los cumplimentados. Los que pagan y son no cumplimentados deben pagar T/(A-1). Los cumplimentados deben pagar T/(A-1) * (C-1)/C La demostración es simple: Si la cuenta es T y hay C cumplimentados, es como si pagaramos C subcuentas es decir reducimos el total de la cuenta a S = T/C como si fuera un cumpleaños, por lo tanto todos menos un cumplimentado pagan ese subtotal por lo tanto cada uno debe pagar S/(A-1), es decir T/(A-1) * (1/C), el cumplimentado al final debe pagar (C-1) veces, porque una vez dejó de pagar entonces el cumplimentado debe pagar en total T/(A-1) * (1/C) * (C-1), simplificando T/(A-1) * (C-1)/C, y los asistentes que no cumplen años deben pagar C veces S/(A-1), reemplazando deben pagar T/(A-1). Cumplimentado = T/(A-1) * (C-1)/C No cumplimentado = T/(A-1). Un abrazo amigos y aprovechen en invitar a los cumplimentados mensual y quedan bien comidos y bebidos, varios mejor y la cuenta es muy equitativa.

viernes, 22 de febrero de 2013

Acelerando cualquier sort

Cuando un conjunto de elementos se desea ordenarlos, nada mejor que un "sort" o algoritmo de ordenamiento, pero cuando se desee ordenar por más de un campo o llave, el algoritmo se complica porque habría que crear un algoritmo adicional para cada llave subsiguiente cuando la comparación del campo anterior es una igualdad. Es decir habría que modificar el algoritmo principal para darle cabida a cada llave siguiente y eso complica la vida. Cuando tuve la oportunidad de dictar clases de Programación Básica apliqué una idea que la tenía desde hace 30 años. Esta idea consiste en que la ordenación de un campo en forma ascendente es la ordenación del complemento del campo en forma descendente. Parece un juego de palabras, pero veámoslo con un ejemplo: supongamos que tenemos ordenado un grupo de números del 1 al 9 (ascendente) y digamos que el complemento (arbitrariamente elegido sea) 10 menos el número, es decir los nuevos números son 10-1 -> 9, luego 10-2 -> 8, y así sucesivamente lo que estaríamos con los siguientes números 9 al 1, y son justo en orden descendente. Normalmente una ordenación de registros se compone por crear un nuevo registro en memoria compuesto por los datos del registro colocados al inicio y luego el registro completo, de manera que cuando se tenga ordenado todo, se cortan las llaves y se toma el resto del registro que en conjunto ya está en el orden deseado. Por lo tanto si se desea ordenar un grupo de registros por distintos campos y en diverso orden (mezcla de ascendente/descendente), lo más fácil es crear el campo de comparación con el conjunto de campos con los complementos de las llaves deseadas (todo lo que sea descendente). Lo que lograríamos aquí es que nuestro algoritmo de ordenamiento sea siempre en un sentido (ascendente) y si por ejemplo lo que deseamos es descendente, pues le aplicamos el complemento a la llave a ordenar de cada uno de los registros (que se antepondrían a todo el registro, una manera figurada de decirlo*) y al final tendríamos los registros ordenados en forma descendente. Normalmente lo que se ordena es por caracteres, por lo tanto el complemento binario que se debería usar es el binario de 255 para cada byte de la llave a ordenar en forma descendente, y para los de forma ascendente se les deja tal cual vienen del registro. *Para formar el registro de datos a ordenar, se debería formar con las llaves de los campos que se deseea ordenar según la prioridad requerida y luego, el número de registro de los datos originales o bien todo el registro original. Para terminar el sort, se toma la parte del número de registro original o la parte del registro original y se van grabando en una nueva tabla física los registros ordenados.

jueves, 29 de noviembre de 2012

Capicuas y primos, capicuas y cuadrados

Pues ahora trabajando con Excel que me da 14 cifras significativas, aunque con el formato "Decimal" me puede dar 28 cifras enteras, el programa no es tan rápido como uno quisiera porque interpreta cada instrucción, y tiene que buscar capicúas de cada número, lo que debo hacer es probar sólo los capicúas autogenerados para que vaya más rápido.

Estudio de Impacto Vial

Uno nunca puede decir ya terminé un programa, siempre encuentras que puedes mejorarlo, pero por lo menos puedes decir ya cumplí (con lo que pide el cliente), con esto puedo decir que he terminado un programa de ingreso de datos (manual) que es, perdón, era un dolor de cabeza para los ingenieros, se trata de un Estudio de Impacto Vial el cual necesita la estadística de todos los distintos vehículos que pasan en diferentes sentidos, esta tanda de datos se encontraba organizada en 192 hojas que contenían la información de hasta 22 tipos de vehículos (en la primera columna) y hasta cuatro sentidos de movimiento (en la primera fila), lo cual terminó en 5976 registros individuales netos que podían ser digitados por varias personas a la vez, cuya velocidad de digitación media podía estimarse hasta en unos 2 segundos por registro considerando revisión y correción, luego un programa adicional para trasladar la información a un cuadro que no demoraba más de 5 minutos. Anteriormente llevaba más de 15 segundos por registro digitarlo en el mismo cuadro final con posibilidades de error, y sólo podía ser digitado por una persona. Pues el meollo del asunto es que el programa trabaja sólo digitando la cantidad de vehículos por tipo y por sentido de movimiento, y el programa al recibir la cantidad lo graba y cambia automáticamente al siguiente sentido posible, luego cuando termina los sentidos pasa automáticamente al siguiente vehículo, luego cuando terminan los vehículos pasa automáticamente al siguiente horario disponible y cuando terminan pasa al siguiente acceso (otro dato de la estadística), y por último pasa a la siguiente intersección de estudio, todo trabajando como ruedas de un contador que cuando llega al límite se incrementa en una unidad el nivel siguiente.

viernes, 29 de octubre de 2010

Optimizacón del algoritmo de ordenamiento SHELL

Allá por inicios de 1980 encontré el método de ordenamiento de Donald Shell que usó para su doctorado y me gustó sobremanera el algoritmo, luego de pensarlo varios días, apliqué lo que me habían enseñado en la Universidad de Piura, las derivadas para encontrar el valor óptimo (mínimo en este caso) y además el uso de logaritmos del colegio, pero tuve que aplicar un razonamiento para encontrar una ecuación nueva que luego terminó en una fórmula para optimizar el algoritmo de Shell.
Una breve descripción del algoritmo es que la comparación de los elementos se realiza a una distancia L, y luego en cada pasada de principio a fin esa distancia L se toma la mitad entera cada vez. Pues mi optimización se planteó que en vez de dividir entre 2 debería ser entre un valor D que este valor D debería dividirse entre dos cada siguiente vez para lo cual resultó que el valor inicial de
D = 2^INT[sqrt(0.25+2*LOG(L)/LOG(2))-0.5]. Para el caso de 1000 elementos D resulta en 8, entonces la distancia L es 125 (=1000/8), luego D pasa a ser 4 (la mitad) entonces L será 31 (=125/4) y para las siguientes pasadas D vale 2 y L tomará los valores 15, 7, 3 y 1.
Ahora bien, es posible que encuentre otro valor óptimo que en vez de ser ese valor D que se divida entre dos, pueda ser encontrar una serie de valores que responda mejor a determinadas cantidades a ordenar, supongamos que en vez de dividir entre 2 como originalmente planteó Donald Shell, posiblemente 2 sirva para cuando la distancia sea menor a 32, y sea 3 para distancias desde 33 hasta 1024, etc...
Al revisar las comparaciones entre los elementos, se me ocurrió preguntarme ¿Porqué tengo que comparar la misma pareja de elementos dos veces?, entonces puse unas distancias de comparación de manera que la misma pareja trate de compararse la menor cantidad de veces posible y he llegado a una serie que si es más veloz que el original de Shell (12-nov-2010) La fórmula para la primera distancia de compración ( o salto) es: L = 2^INT[LOG(N)/LOG(2)]-1, luego para cada siguiente vez es la parte entera de la mitad como usualmente es el algoritmo de Shell. He revisado en internet que esta fórmula ya había sido planteada por Hibbard o por Papernov-Stasevich en 1965; Pratt en 1971, así que me plantearé otras ecuaciones, para ver adonde llegaré.

jueves, 3 de junio de 2010

Fórmula General para obtener Triángulos Rectos

Amigos, ya deduje la fórmula general para hallar cualquier triángulo recto a partir de un cateto "a" y un valor aleatorio "n". Siendo a, b, c los tres lados del triángulo recto, y siendo "a" el lado conocido, podemos hallar el resto de lados como sigue: lado "b" = (a^2)/(2*n) - (n/2).
Luego la hipotenusa se halla como c = b + n.

Ahora sí se puede ver completo en:
http://www.alipso.com/monografias4/Triangulo-Recto-de-Pitagoras/

Un fuerte abrazo para toda la comunidad internacional.