En la UNJU los profesores de la materia “Programación Orientada a Sujetos” ha desarrollado un nuevo lenguaje de programación, los tres creadores se llaman Verdadero, Falso y Aleatorio. Desconocemos la identidad de cada uno, es decir no se cual nombre corresponde a cada uno, solo sabemos que verdadero siempre responde la verdad, falso siempre miente, y aleatorio tiene una conducta impredecible, puede tanto decir mentiras como verdades.

El lenguaje nuevo, llamado C– usa las palabra “do” y “go” para los valores lógicos True y False, pero también desconocemos cual corresponde a cada uno. Los programadores siempre responde a las preguntas con estas palabras, no usan el si o el no, solo “do” y “go“.

Haciendo solo tres preguntas cada una a uno solo de los programadores usted debe descubrir cual es la identidad de cada uno de los programadores a los que llamaremos A, B y C.

Notas:

 

  • Es posible formularle a un mismo programador más de una pregunta (y por lo tanto puede ocurrir que a algún programador no se le haga ninguna pregunta).
  • Cuál es la segunda pregunta, y a qué programador se le realiza, puede depender de la respuesta que se reciba a la primera pregunta. (Y en forma similar para la tercera pregunta.)
  • La decisión sobre si Aleatorio responderá con la verdad o la falsedad puede ser pensado como que depende de arrojar una moneda si la moneda cae cara él hablará con la verdad; si cae cruz, hablará falsamente.
  • Aleatorio responderá ‘do’ o ‘go‘ toda vez que se le realice una pregunta Si-No.

 

Leyendo un libro “El prodigio de los números” que me regalo un dilecto amigo, el administrador de “Cacería de spammers“, me encontré con los números repfigit (REPetitive FIbonacci-like diGIT) o numero de Keith.

Un repfigit o número de Keith es un número entero, superior a 9, tal que sus dígitos, al comenzar una secuencia de Fibonacci, alcanzan posteriormente el referido número. Un ejemplo es 47, porque la secuencia de Fibonacci que comienza con 4 y 7 (4, 7, 11, 18, 29, 47) alcanza lo 47. Otro ejemplo es 197: 1+9+7= 17, 9+7+17= 33, 7+17+33= 57, 17+33+57= 107, 33+57+107= 197.

Un repfigit puede ser una secuencia de Tribonacci que tiene tres dígitos en el número, y de Tetranacci si el número tiene cuatro dígitos, etc.

Podemos encontrar esta secuencia en la bases de datos de secuencias “The On-Line Encyclopedia of Integer Sequences®” con el identificador “A007629“.

Este desafio consiste en escribir un programa que encuentre todos los números de Keith menores a 100000000. ¿Se animan?

La siguiente es la primera entrega de un breve tutorial que desarrolle sobre el editor VIM, la idea es mostrar las caracteristicas propias del editor y las provistas por plugins que lo potencia para tener un excelente editor que asiste a un desarroladore en su tarea.

Espero que les guste.

Desafio SQL

Posted by RetroMan | Desafios

El siguiente problema surgió de una necesidad de una amigo de estudiar discontinuidades en un campo autoincremental en mysql, que carece de secuenciadores, o de un pseudomotor numerador.

La siguiente consulta devuelve una secuencia continua del 1 al 1000:

Se pide modificarla para que genere números del 1000 al 10000 inclusive, se recomienda evitar el uso de LIMITAdicionalmente, si es posible reducirla para optimizar su ejecución.

 

 

Sea s(m) el menor numero n tal que m divide a n!
Así tenemos por ejemplo que el menor numero “n” tal que m=10 sea divisor de n! es n=5.
5! = 120 y 120 es el menor factorial divisible por 10. Así  s(10)=5
Escribir un programa que calcule cual es el menor numero cuyo factorial sea divisible por 25.

Todo indica que es el momento de comenzar a jugar con Django y las cosas que nos tiene preparado, dijimos que vamos a comenzar a trabajar en un entorno de tipo LAMP donde luego vamos a mostrar como desplegar una app completa de Django. Por el momento vamos por el principio.

Así comienza una serie de artículos de El Codigo K, recomendable.

Makefiles son una forma sencilla de organizar la compilación de código. Este tutorial es un muy simple ejemplo de lo que se puede hacer con “make”, pero pretende ser una guía de principiantes para que pueda crear rápida y fácilmente sus propios archivos make para pequeños proyectos.

Vamos a tomar el código de ejemplo del articulo anterior. Lo que representaría un típico programa principal, algo de código funcional en un archivo separado, y un archivo de inclusión, respectivamente.

 

 

Normalmente, se compilará esta colección de código ejecutando el siguiente comando:

Este comando compila los dos códigos fuente involucrados en la creación del binario ejecutable “main” el parámetro -I. le dice al compilador que los archivos de inclusión .hpp los tiene que buscar en el directorio actual “.”

Por desgracia, este enfoque de la compilación tiene dos problemas. En primer lugar, si se pierde el comando de compilación o se cambia de computadora tiene que volver a escribir desde cero el comando. En segundo lugar, si sólo está haciendo cambios a un archivo .cpp, recompilar todos los archivos de código fuente cada vez que necesita recompilar demanda mucho tiempo y es poco eficiente. Ambos problemas se puede solucionar mediante el uso de un archivo “Makefile” con las instrucciones necesarias para la generación del ejecutable.

El makefile más simple que se podría crear sería algo como:

 

Si pones estas regla en un fichero llamado Makefile o makefile  y ejecutas “make” en la línea de comandos se ejecutará el comando de compilación como esta escrito en el makefile.

Se pone luego del nombre del ejecutable que se generara el símbolo : seguido de los archivos de codigo fuente que son necesarios para su creación y en la linea siguiente el comando de compilación necesario. Es importante destacar que antes de la llamada al compilador en la segunda linea hay un “Tab

Con el fin de ser un poco más eficiente, vamos crear un nuevo archivos Makefile:

 

Ahora hemos definido algunas constantes CC y CFLAGS. Resulta que estos son constantes especiales que se usan para decirle a make como queremos compilar. En particular  CC es el macro que especifica el compilador que vamos a usar usar, y CFLAGS es la lista de las banderas a pasar al comando de compilación. Al poner los archivos de objetos – main.o y suma.o – en la lista de dependencias y en la regla, make sabe que debe compilar primero las versiones .cpp individualmente, y luego construir el ejecutable.

El uso de esta forma de makefile es suficiente para la mayoría de proyectos de pequeña escala. Sin embargo, hay una cosa que falta: la dependencia de los archivos de inclusión. Si se va a realizar un cambio en suma.hpp, por ejemplo, que make no vuelva a compilar los archivos .cpp. Con el fin de solucionar este problema, tenemos que decirle make que todos los archivos .cpp dependen de ciertos archivos .hpp. Podemos hacer esto escribiendo una regla simple y agregarlo al archivo MAKE.

 

Esta adición creamo primero la macro DEPS, que es el conjunto de archivos .hpp de los que  los archivos .cpp dependen. Entonces definimos una regla que se aplica a todos los archivos que terminan en el sufijo .o. La regla dice que el archivo .o depende de la versión .cpp del archivo y los archivos .hpp incluidos en la macro DEPS. La regla luego dice que para generar el archivo .o, make necesita compilar el archivo .cpp usando el compilador definido en la macro CC. La bandera -c dice que genere el archivo de objeto, -o $@ dice para ponga la salida de la compilación en el archivo con el nombre en el lado izquierdo de los :,  $< es el primer elemento de la lista de dependencias, y  la macro CFLAGS se define como lo hicimos anteriormente.

Bueno este es un simple tutorial con ejemplos de como usar la herramienta Make. Aun así apenas nos asomamos a ver todo el potencial que nos ofrece.

 

En nuestro articulo anterior Cómo organizar tu código fuente en C++  definíamos algunas pautas para organizar nuestro código en varios archivos a fin de mejorar su tratamiento. En este articulo vamos a ver como hacer esto con un ejemplo simple, tomemos para ello el siguiente ejemplo que suma dos números a través de una función:

Vamos a retirar la función suma a un nuevo archivo, para ello necesitamos crear en realidad dos nuevos archivos y modificar el original. Por una parte tendremos la implementación de la función suma en un nuevo archivo llamado en este caso suma.cpp:

Que simplemente contiene la implementación de la función suma, para poder incorporar esta implementación en otros códigos fuentes es preciso que creemos un nuevo archivo con la definición de la función, para hacerlo, creamos ahora un archivo llamado suma.hpp donde podemos observar que la h hace referencia a header.

Acá tenemos unicamente la definición de la función y un par de directivas de preprocesador, veamos de que se trata.

La primera parte se llama un guardia de cabecera o header guard en ingles, estas lineas impiden que un archivo de cabecera sea cargado mas de una vez mediante #include. Sirve para proyectos de software muy extensos especialmente.

La segunda parte es el contenido real del archivo .hpp, que debe ser las declaraciones de todas las funciones que queremos otros archivos puedan ver. Todos nuestros archivos de cabecera deben tener una extensión .hpp.

Finalmente el archivo principal main.cpp queda de la siguiente manera:

Observe que la segunda linea incluye las funciones definidas en suma.hpp que se implementan en suma.cpp. Ahora ya las podemos usar libremente y a discreción a lo largo de este código fuente.