Versión Completa : Foro Oficial de Algoritmia
®-Diegoي
agosto 2, 2006, 11:40
Foro para que posteen preguntas o problemas sobre el tema.
yo tengo un libro de algoritmos, es muy bueno, cualquiero consulta tambien puedo ayudar
®-Diegoي
agosto 3, 2006, 01:26
...........
Sí... ese es un buen libro
®-Diegoي
agosto 3, 2006, 11:37
....................
Pues la verdad apenas estoy empezando en esto...
Una página recomendadísima es Topcoder (http://www.topcoder.com/tc), para mí es la mejor!!
otras páginas relacionadas:
http://www.ciic.org.ar/ // Competencia Iberoamericana por correspondencia
http://www.codecup.nl/intro.php //Codecup
http://www.spoj.pl/ //Sphere Online Judge
http://oldweb.uwp.edu/academic/mathematics/usaco/ //USACO
http://acm.uva.es/p/ es Excelente, pero molesta mucho con las soluciones en Java (Lenguaje que yo uso)
®-Diegoي
agosto 3, 2006, 04:41
..............
Libros Recomendados:
Addison-Wesley - Algorithms- Robert Sedgewick
Programming challenges -Steven S. Kiena & Miguel A. Revilla
Wrox Beginning Algorithms- Simon Harris, James Ross
Art of Programming Contest -Ahmed Shamsul ACM Solver
The Algorithm Design Manual -Steven S. Kiena
Introduction to Algorithms 2nd Ed.- MIT press
Dara Structures & Algorithms in Java -Michael Waitr
Algorithms- S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani
Algorithms for Programmers- Jorg Arndt
Algoritmica- Desconocido
Libro Algoritmos - Desconocido
No estan en orden
®-Diegoي
agosto 5, 2006, 01:00
............
Lastima...esperemos a ver si alguien más se mete al tema... Una pregunta.. en su universidad tambien tienen capitulo de ACM??? como entrenan para las maratones???
®-Diegoي
agosto 5, 2006, 03:25
.............
No c muy bien... aca tambien hacen reuniones a comienzo de semestre para formar grupos y planear entrenamientos, y aveces hacen maratones internas para seleccionar a los mejores que van a concursar afuera...
®-Diegoي
agosto 7, 2006, 02:48
................
KERBEROS
agosto 8, 2006, 08:00
Oiga que pena no he podido enviarle el libro porque tengo un problema con mi conexión...(Los archivos me suben a una velocidad ridicula).
De todas maneras voy a tratar de subir los libros a una página para que el que quiera los pueda bajar.
Aquí la lista de libros de algoritmos que poseo (En formato PDF) :
Addison-Wesley - Algorithms- Robert Sedgewick 4.57 MB
Programming challenges -Steven S. Kiena & Miguel A. Revilla 4.40MB
Wrox Beginning Algorithms- Simon Harris, James Ross 9.22 MB
Art of Programming Contest -Ahmed Shamsul ACM Solver 1.8MB
The Algorithm Design Manual -Steven S. Kiena 4.84MB
Introduction to Algorithms 2nd Ed.- MIT press 12.4MB
Dara Structures & Algorithms in Java -Michael Waitr 3.04MB
Algorithms- S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani 1.93MB
Algorithms for Programmers- Jorg Arndt 3.8MB
Algoritmica- Desconocido 1.13MB
Libro Algoritmos - Desconocido 1.7MB
De todas formas la mayoría de estos libros los conseguí aquí (http://www.4shared.com/). Revisen si ahí está el que necesitan, sino me avisan
Porque no creas una cuenta de GMAIL... subes los archivos allí y nos dad en usuario y contraseña para que los descarguemos!
®-Diegoي
agosto 8, 2006, 05:00
.................
KERBEROS
agosto 9, 2006, 10:22
Confío en su seriedad:
archivosalgoritmos@gmail.com (archivosalgoritmos@gmail.com)
pass: laneros
Archivos subidos hasta el momento:
+ Programming Challenges
+ The Algorithm Design Manual
+The Art of Programming Contests
Ya estoy descargando los tres!
Gracias!
®-Diegoي
agosto 9, 2006, 10:23
................
menekos
agosto 9, 2006, 11:09
Si ustedes quieren les puedo ayudar, la verdad se de estos algoritmos en un programa super viejo pero es bueno para practicar, es el pascal 7.0, lo único que no se hacer son las gráficas y el archivo y registro porque no lo entendi muy bien, si alguien quiere deje el mensaje y le adjunto este programador, que además es sobretodo para genarar calculadoras y cosas funcionales.
Uno
agosto 10, 2006, 09:17
PD: menekos (http://www.laneros.com/member.php?u=69928) : cómo es el cuento de pascal 7.0, es un entrenador basado en pascal???
Uno
agosto 11, 2006, 09:27
mmm habla de turbo pascal 7.0, Gracias... prefiero Java y en su defecto C...
®-Diegoي
agosto 11, 2006, 10:29
..................
Uno
agosto 12, 2006, 01:42
Lástima que en la ingeniería de Sistemas al tema de algoritmos no c le la importancia que se le da en "Ciencias Computacionales"...Ni modo.. esa carrera no existe en colombia
!!•°• N€T-Wi-Fi •°•!!
agosto 14, 2006, 12:05
Ahum... !!!.. motando libros??.. eso es ilegal y va contra las reglas.. por favor cualquier cosa que traten de hacer tratenlo por MP... y despues aca solo un resumen.. pero nada de estar en publico.!! les pido por favor editen sus post anteriores ... si no los editare yo mismo!!
please..
®-Diegoي
agosto 14, 2006, 05:06
..................
!!•°• N€T-Wi-Fi •°•!!
agosto 16, 2006, 08:28
gracias por su comprension... de antemano... ahi les mando un estimulo!
skymaster
agosto 17, 2006, 11:16
Hola a todos....me gustaria aprender mas sobre el tema, estudio ingenieria de sistemas, pero mi fuerte no son los algoritmos, pero de verdad desearia que ese fuese mi fuerte......me gustaria el programita pascal 7.0 y ojala me digan donde puedo conseguir el c++ en su ultima version y un programa bueno para java para descargarlos....... si pueden enviar los link o algun software a mi correo pues bien....mi correo es ivan.esquivel.esquivel@gmail.com.... seguire visitando el foro.. gracias de ate mano........y permitames felicitarlos.....
®-Diegoي
agosto 17, 2006, 11:35
...............
Tr0nAd0r
agosto 17, 2006, 10:31
Alguien me da alguna pagina donde encuentre retos y problemas, es decir como TopCoder pero en español :P :P :P
®-Diegoي
agosto 18, 2006, 08:35
.............
Uno
agosto 18, 2006, 10:56
mmm pero si tiene aspiraciones a competir alguna vez en una maratón o algo por el estilo, es mejor que vaya practicando con algun lenguaje de los que permiten en las competencias..ACM, Topcoder. etc....
En ese caso practicar en pascal no sería lo más recomendable... me parece...
C/ C++ y Java ,en su orden, son los más usados ...Pascal ya no tanto... Por ahí lei que la única parte donde seguia siendo el más popular, era en las escuelas y en algunas universidades de Europa central....por eso seguía vivo en algunos concursos internacionales
®-Diegoي
agosto 19, 2006, 11:42
.............
®-Diegoي
agosto 21, 2006, 03:55
.................
menekos
noviembre 13, 2006, 07:56
Bueno, Uno tiene toda la razón, para programar mejor C, C++, java, Dev-pascal u otros, pues el turbo pascal no tiene librerias y eso lo obliga a uno a realizar casi todos los procesos lógicos necesarios, por eso lo propongo como un programador inicial para aprender algoritmos, aparte que en este me enseñaron en la U.
pero igual si alguien puede postear un java, java movil y tutoriales de cada uno seria magnifico.
huracancorp
noviembre 13, 2006, 09:06
ok, aqui esta, reto!!!!
Hagan un algoritmo 100% recursivo que genere los numeros primos.
RogerJose
noviembre 13, 2006, 09:08
Excelente idea crear este super tema ®-Diegoي.
huracancorp
noviembre 13, 2006, 09:12
aja diego te le vas a medir?
huracancorp
noviembre 13, 2006, 09:13
perdon quice decir roger padilla (http://www.laneros.com/member.php?u=21464) te le vas a medir?
RogerJose
noviembre 13, 2006, 09:18
perdon quice decir roger padilla (http://www.laneros.com/member.php?u=21464) te le vas a medir?
Ahorita estoy demasiado ocupado, mañana intento sacar el tiempesito.
Gracias por la invitacion. :)
huracancorp
noviembre 13, 2006, 09:28
ok, esperare, y cuando lo resulevas pones un reto tu, juguemos a eso, retos de algoritmia y el que resuelve pone reto.
huracancorp
noviembre 13, 2006, 09:31
que les parece mi idea?
RogerJose
noviembre 13, 2006, 09:35
ok, esperare, y cuando lo resulevas pones un reto tu, juguemos a eso, retos de algoritmia y el que resuelve pone reto.
Excelente, me parece perfecto!!
Voy a ver como hago con el tiempo, la tesis me tiene triste.
QUIEN LO RESUELVA PRIMERO, SE GANA EL DERECHO A PONER UN NUEVO RETO PARA TODOS, VA JUGANDO.
javc
noviembre 13, 2006, 10:08
Que Buen Foro Hace Rato No Me Encarretaba Leyendo Algo En Laneros.
Espero Aprender Y Aportar Cosas Para Enriquecer El Conocimiento Personal Y Grupal.
huracancorp
noviembre 13, 2006, 10:14
javc (http://www.laneros.com/member.php?u=14172) hasle, oigan pero hagamos algo mas para que esto no se estanque. Vamos a dar un plazo maximo para resolver el problema, cuando no se resulva el que lo puso debe colocar la solución, poner un nuevo problema y nuevo plazo.
Para el problema actual hay un plazo de dos días. corriendo desde la hora actual del sistema.
jomunoz
noviembre 13, 2006, 11:39
Aqui va la mia, a la funcion primos se le pasa como primer parametro el numero hasta donde se van a buscar los primos, en la implementacion es el 53 e imprime los primeros 17 numeros primos antes de que empiece a fallar por la limitaciones de la primitiva double en g++.
#include <iostream>
#include <cmath>
void primos(double num, double *entero){
if (num < 1)
return;
double div = pow(2, num );
div = div-2;
div = div/num;
if ( modf(div,entero) == 0)
std::cout << num << "\n";
primos(num-1, entero);
}
int main(){
double *entero;
primos(53, entero);
}
En este
RogerJose
noviembre 14, 2006, 01:43
Y aqui la mia, 100% recursiva:
public class NumerosPrimos{
private StringBuffer listadoPrimos = new StringBuffer();
public void listarPrimos(int num){
if(num<1){
return;
}
double factNum = factorial(num-1);
int residuo = (int) ( (factNum + 1) % num );
if(residuo == 0){
listadoPrimos.append(" "+num+"\n");
}
listarPrimos(num-1);
}
public double factorial(int n){
if(n==0){
return 1;
}
return n * factorial(n-1);
}
public String getListadoPrimos(){
return listadoPrimos.toString();
}
public static void main(String[] args){
NumerosPrimos np = new NumerosPrimos();
// Maximo antes de fallo en el calculo
int lim = 19;
np.listarPrimos(lim);
System.out.print ("\n Los Numeros Primos son: "+"\n\n");
System.out.print (np.getListadoPrimos()+"\n ");
}
}
huracancorp
noviembre 14, 2006, 11:49
Aja propongan el nuevo reto.
Elgo
noviembre 14, 2006, 02:12
Ineficiente pero pequeño y confuso
//Creado por Elgo 14/11/2006
public class Sieveton {
private static java.util.Set<Integer> pri = new java.util.TreeSet<Integer>();
public static void main(String[] args) {
sieveton(2,1000);
System.out.println(pri);
}
private static void sieveton(int val, int hasta) {
if (val<=hasta) {
boolean es = true;
for (int p:pri)
if (p!=1 && p!=val && val%p==0)
es = false;
pri.add(es?val:1);
sieveton(++val,hasta);
}
}
}
huracancorp
noviembre 14, 2006, 03:00
jomunoz (http://www.laneros.com/member.php?u=6264) has ganado! debes colocar el proximo reto.
RogerJose
noviembre 14, 2006, 04:59
Ineficiente pero pequeño y confuso
//Creado por Elgo 14/11/2006
public class Sieveton {
private static java.util.Set<Integer> pri = new java.util.TreeSet<Integer>();
public static void main(String[] args) {
sieveton(2,1000);
System.out.println(pri);
}
private static void sieveton(int val, int hasta) {
if (val<=hasta) {
boolean es = true;
for (int p:pri)
if (p!=1 && p!=val && val%p==0)
es = false;
pri.add(es?val:1);
sieveton(++val,hasta);
}
}
}
OJO!, la regla era que el algoritmo fuera 100% recursivo, y este no lo es, pues tiene un ciclo for() dentro de la funcion.
jomunoz
noviembre 14, 2006, 05:04
jomunoz (http://www.laneros.com/member.php?u=6264) has ganado! debes colocar el proximo reto.
El proximo reto es hacer un objeto que represente una matriz cuadrada (NxN), y tener una funcion miembro a la cual se le pase como parametro otra matriz del mismo tamaño. las multiplique y devuelva la matriz resultante.
RogerJose
noviembre 14, 2006, 06:19
OK, aqui va la mia:
import java.io.*;
public class Matrices{
static BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
private int[][] matrizA;
public Matrices(int[][] matrizA){
this.matrizA = matrizA;
}
public int[][] multiplicar (int [][] matrizB) {
int[][] matrizAporB = new int [matrizA.length][matrizA.length];
for (int i = 0; i < matrizA.length; i++){
for (int j = 0; j < matrizB [0].length; j++){
for(int k = 0; k < matrizA [0].length; k++){
matrizAporB [i][j] += matrizA [i][k] * matrizB [k][j];
}
}
}
return matrizAporB;
}
public static int[][] leerMatrizCuadrada(int n) throws IOException{
int[][] matrizAux = new int[n][n];
for (int i = 0; i<n; i++) {
for (int j = 0; j<n; j++) {
System.out.print (" ["+i+"]["+j+"] = ");
matrizAux[i][j] = Integer.valueOf(br.readLine());
}
}
return matrizAux;
}
public static void imprimirMatriz(int[][] m){
for (int i = 0; i<m.length; i++) {
System.out.print ("\n\n");
for (int j = 0; j<m[0].length; j++) {
System.out.print ("\t"+m[i][j]);
}
}
}
public static void main(String[] args) {
try {
System.out.print ("\n Digite N: ");
int n = Integer.valueOf(br.readLine());
System.out.print ("\n Datos Matriz A\n");
int[][] matrizA = Matrices.leerMatrizCuadrada(n);
Matrices m = new Matrices(matrizA);
System.out.print ("\n Datos Matriz B\n");
int[][] matrizB = Matrices.leerMatrizCuadrada(n);
int[][] matrizAporB = m.multiplicar(matrizB);
System.out.print ("\n Matriz A");
Matrices.imprimirMatriz(matrizA);
System.out.print ("\n\n\n Matriz B");
Matrices.imprimirMatriz(matrizB);
System.out.print ("\n\n\n Matriz A * B");
Matrices.imprimirMatriz(matrizAporB);
System.out.print ("\n\n ");
}
catch (Exception ex) {
System.out.print ("\n NO aprueba de tontos \n\n ");
}
}
}
huracancorp
noviembre 14, 2006, 07:21
jajajaja, sali de la U, llegue a mi casa y ya habia un nuevo reto y ya estaba solucionado, esto esta super bueno.... me encanta. Hey roger padilla (http://www.laneros.com/member.php?u=21464) te toca.
RogerJose
noviembre 14, 2006, 08:11
El reto es el siguiente:
Un programa que permita rotar los elementos de un arreglo el número de posiciones dadas (arreglo circular) y visualice el nuevo arreglo.
Ej:
arreglo = {1,2,3,4,5}
Posiciones = -2
quedaria: {3,4,5,1,2}
Posiciones = 3
quedaria: {3,4,5,1,2}
Posiciones = 15
quedaria: {1,2,3,4,5}
.
Oesoto
noviembre 14, 2006, 09:26
Probé con esos arreglos de ejemplo y me funcionó
//by Oesoto - LANeros.com
/*
*El reto es el siguiente:
Un programa que permita rotar los elementos de un arreglo el número de posiciones dadas (arreglo circular) y visualice el nuevo arreglo.
Ej:
arreglo = {1,2,3,4,5}
Posiciones = -2
quedaria: {3,4,5,1,2}
Posiciones = 3
quedaria: {3,4,5,1,2}
Posiciones = 15
quedaria: {1,2,3,4,5}
*/
public class ring {
/*
* Se declara un lector de teclado, un arreglo original, uno de respuesta y unos enteros
* que siempre permaneceran constantes.
*/
lector reader;
int []array;
int []arrayaux;
int lenght;
int rotacion;
//El constructor de la clase de obtener algunos datos y llenar el arreglo
public ring(){
reader = new lector();
System.out.print("Escriba la cantidad de desplazamientos: ");
rotacion = reader.leer();
System.out.print("Escriba el tamano del arreglo: ");
lenght = reader.leer();
array = new int[lenght];
arrayaux = new int[lenght];
int current = 0;
for(int i=0;i<lenght;i++){
System.out.print("Ingrese el elemento " + i + " del arreglo: ");
current = reader.leer();
array[i] = current;
}
}
/*
* Calculo de las posiciones finales luego de la rotación y copia de los elementos
* a esas posiciones.
*/
public void rotar(int rot){
int c;
int posfinal;
if (rotacion>=0){
for(c=0;c<lenght;c++){
posfinal = c;
posfinal = posfinal + rot;
while (posfinal>=lenght){
posfinal = posfinal - lenght;
}
arrayaux[posfinal] = array[c];
}
}
else{
for(c=0;c<lenght;c++){
posfinal = c;
posfinal = posfinal + rot;
while (posfinal<0){
posfinal = posfinal + lenght;
}
arrayaux[posfinal] = array[c];
}
}
}
/*
* Rotación y posterior impresión en pantalla del arreglo
*/
public void procesar(){
rotar(rotacion);
print(lenght);
}
//Recorre el arreglo e imprime elemento por elemento
public void print(int size) {
int j = 0;
System.out.println("\n" + "Contenido del arreglo:" + "\n");
while (j<size) {
System.out.println("Posicion " + (j) + ": " + arrayaux[j]);
j++;
}
}
public static void main(String args[]){
ring r = new ring();
r.procesar();
}
}
//By Oesoto - LANeros.com
import java.io.*;
class lector{
public int leer (){
int valor=0;
String dato="";
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(isr);
try{
dato=teclado.readLine();
valor= new Integer (dato).intValue();
}catch (IOException ioe){}
catch(NumberFormatException e){System.out.print("Dato no válido");
}
return valor;
}
public String leerString(){
String dato="";
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(isr);
try{
dato=teclado.readLine();
}catch (IOException ioe){}
return dato;
}
}
RogerJose
noviembre 15, 2006, 12:18
Bien, Oesoto, tu codigo es 100% funcional.
Es tu turno, coloca el nuevo reto.
RogerJose
noviembre 15, 2006, 12:21
Se me ocurrio que podria ser de gran utilidad, que despues que se de solucion a cada reto, busquemos una solucion mas eficiente para el mismo.
A continuacion una solucion que segun YO es mas eficiente.
El algoritmo de rotacion esta en el metodo rotarArreglo(...)
import java.io.*;
public class MoverArreglo{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static int[] leerArreglo(int tamanio) throws IOException{
int[] arrAux = new int[tamanio];
for (int i = 0; i<tamanio; i++) {
System.out.print (" ["+i+"] = ");
arrAux[i] = Integer.valueOf(br.readLine());
}
return arrAux;
}
public static int[] clonarArreglo(int[] arregloOriginal){
int[] arrClon = new int[arregloOriginal.length];
for (int i = 0; i<arregloOriginal.length; i++) {
arrClon[i] = arregloOriginal[i];
}
return arrClon;
}
public static void imprimirArreglo(int[] arreglo){
for (int i = 0; i<arreglo.length; i++) {
System.out.print (" "+arreglo[i]);
}
}
/**
* Retorna un arreglo que representa el arreglo original, pero cuyos elementos
* han sido movidos las casillas indicadas por el parametro posiciones.
*
* @param posiciones indica el numero de casillas que seran movidos los elemetos.
* @param arrOriginal el arreglo en su estado original.
* @return el arreglo resultante de la rotacion de los elementos
*/
public static int[] rotarArreglo(int[] arrOriginal, int posiciones){
int tamanio = arrOriginal.length;
int[] arrAux = MoverArreglo.clonarArreglo(arrOriginal);
// Quitamos movimientos innecesarios, si los hay.
// Ej: siendo el tamaño del arreglo 5, y el numero
// de posiciones a rotar 20500, en realidad es
// lo mismo que mover cada elemento 0 veces
posiciones = posiciones % tamanio;
if(posiciones != 0){
if( posiciones < 0 ){
// Ej: Si el tamaño del arreglo es 5, y posiciones=-3,
// es equivalente a posiciones=2
posiciones = tamanio + posiciones;
}
for(int i=0;i<tamanio;i++){
int posDestino = (i+posiciones) % tamanio;
arrAux[posDestino] = arrOriginal[i];
}
}
return arrAux;
}
public static void main(String arg[])throws IOException{
int resp;
do{
System.out.print("\n Digite el tamanio del arreglo: ");
int tamanio = Integer.parseInt(br.readLine());
int[] arrOriginal = MoverArreglo.leerArreglo(tamanio);
System.out.print("\n Digite el numero de posiciones a rotar: ");
int posiciones = Integer.parseInt(br.readLine());
int[] arrMovido = MoverArreglo.rotarArreglo(arrOriginal, posiciones);
System.out.print ("\n Arreglo Original: ");
MoverArreglo.imprimirArreglo(arrOriginal);
System.out.print ("\n Arreglo Movido : ");
MoverArreglo.imprimirArreglo(arrMovido);
System.out.print("\n\n 1 = Nuevo\t 2 = Salir\n\n Resp = ");
resp = Integer.parseInt(br.readLine());
}
while(resp == 1);
}
}
Oesoto
noviembre 15, 2006, 08:27
Que alguien mas ponga el reto, la verdad no se me ocurre que poner :p
PD: Bacana la solución usando modulo, yo estuve pensando un rato como calcular la posición final facilmente y no se me pasó por la cabeza eso.
RogerJose
noviembre 15, 2006, 10:54
Que alguien mas ponga el reto, la verdad no se me ocurre que poner :p
PD: Bacana la solución usando modulo, yo estuve pensando un rato como calcular la posición final facilmente y no se me pasó por la cabeza eso.
Saludos,
Pero como asi que no se le ocurre, vamos no rompa el juego, piense en algo, usted puede.
.
PABLOR32
noviembre 15, 2006, 11:02
SALU2
NECESITO ALGUIEN QUE ME AYUDE O QUE ALGUIEN ME PUEDA CONTACTAR PARA HACER UN PROYECTO EN C++ ES SOBRE UNA MATRIZ ESPIRAL TRABAJO DE MI UNIVERSIDAD, NO IMPORTA EL COSTO SI ALGUIEN SABE POR FAVOR pablorodiguez_n@yahoo.com
3125877849
gracias**** urgente por favor***
huracancorp
noviembre 15, 2006, 11:18
oiga vamos, el proximo reto
Oesoto
noviembre 15, 2006, 11:24
Voy a ver si esta tarde les traigo uno sacado de un libro de algoritmia ;) Esos problemas son siempre interesantes.
RogerJose
noviembre 15, 2006, 11:33
oiga vamos, el proximo reto
Te parece bien la idea de optimizar los algoritmos ?
huracancorp
noviembre 15, 2006, 11:54
Me parece perfecto, pero la cosa seria como no dejar dormir esto (como esta ahora) es decir que siempre se este haciendo algo. En mi opinion la idea es que problema solucionado problema muerto. Pero no se que opinen los demas.
RogerJose
noviembre 15, 2006, 12:06
Me parece perfecto, pero la cosa seria como no dejar dormir esto (como esta ahora) es decir que siempre se este haciendo algo. En mi opinion la idea es que problema solucionado problema muerto. Pero no se que opinen los demas.
Yo opino que tendria mas sentido si despues de dar solucion a un problema, buscamos una solucion optima para el mismo, ahi es donde realmente se veria la Algoritmia, de lo contrario seria solo un consurso de programacion.
.
UAC-King Night
noviembre 15, 2006, 01:38
Ke Buen Foro Muchachos...
Ahi le sako el tiempo para participar y aprender, ke en estos momentos es lo ke mas me interesa... Salu2...
Uno
noviembre 15, 2006, 04:35
Qué más... Hace rato que no veía actividad en este tema...Que bueno!!!:D
# Programa que rota las posicones un arreglo circular un numero determinado de veces
# Código en ruby por Uno 2006-11-15
puts "Escriba los elementos del arreglo separados por una coma: "
a = gets.chop!.split(",")
puts "Numero de posiciones a rotar: "
i = gets.chop!.to_i
if i >= 0
i.times{ b = a.pop; a.insert( 0, b ) }
else
i.abs.times{ b = a.shift; a.push( b ) }
end
puts a.join(", ")
sleep( 8 ) # Esperar 8 segundos...En ruby sale corto... jeje ojalá sigan posteando más ejercicios
huracancorp
noviembre 15, 2006, 05:20
parece que se ha perdido la escencia del foro, en donde esta el nuevo reto? no veo ningun reto propuesto. Sera que propongo uno yo?
Oesoto
noviembre 15, 2006, 05:22
Por favor, es que no he podido encontrar uno bueno.
RogerJose
noviembre 15, 2006, 05:39
parece que se ha perdido la escencia del foro, en donde esta el nuevo reto? no veo ningun reto propuesto. Sera que propongo uno yo?
Claro, tomese ese honor.
huracancorp
noviembre 15, 2006, 07:57
ok:P aqui les tengo un reto superbueno, doy dos días para que den con la solución.
Enunciado:
Un Robot puede dar pasos de 1,2 o 3 metros. Haga un algoritmo que calcule el numero de maneras que el robot puede caminar m metros.
Ejemplo:
m=4
resultado=7
Porque? las maneras en que el robot puede caminar los 4 metros son las siguientes:
1,1,1,1
1,1,2
1,2,1
2,1,1
1,3
3,1
2,2
PD: El programa solo debe mostrar el numero de maneras, no debe mostrar cuales son esas maneras.
este esta super bueno :bandido:.
Haganle!!!
fram7
noviembre 15, 2006, 11:29
Listo papito si es ya es ya.
fram7
noviembre 15, 2006, 11:31
Clase Nodo
public class Nodo {
int valor;
int suma;
Nodo hijo1;
Nodo hijo2;
Nodo hijo3;
public Nodo(int valor) {
this.valor = valor;
suma = valor;
}
public Nodo(int valor, int sumaa) {
this.valor = valor;
suma = valor + sumaa;
}
}
Clase Arbol
public class Arbol {
Nodo raiz;
int movi = 0;
public void crearArbol(int pasos) {
raiz = new Nodo(0);
nodo(raiz, pasos);
}
// metodo recursivo que crea el arbol recursivo
public void nodo(Nodo nodo, int pasos) {
if (1 + nodo.suma <= pasos) {
nodo.hijo1 = new Nodo(1, nodo.suma);
nodo(nodo.hijo1, pasos);
} else {
return;
}
if (2 + nodo.suma <= pasos) {
nodo.hijo2 = new Nodo(2, nodo.suma);
nodo(nodo.hijo2, pasos);
} else {
return;
}
if (3 + nodo.suma <= pasos) {
nodo.hijo3 = new Nodo(3, nodo.suma);
nodo(nodo.hijo3, pasos);
} else {
return;
}
}
//lo recore pa contar
public void recorer(Nodo nodo) {
if (nodo == null) {
return;
} else {
if (nodo.hijo1 ==null && nodo.hijo2 ==null&& nodo.hijo3 == null) {
movi++;
return;
}
recorer(nodo.hijo1);
recorer(nodo.hijo2);
recorer(nodo.hijo3);
}
}
Ejecutable
public static void main(String[] args) {
Arbol nuevo = new Arbol();
nuevo.crearArbol(10);
nuevo.recorer(nuevo.raiz);
System.out.println("Pasos " + nuevo.movi);
}
La verdad, me encanto el reto, y aunque se veia un poco dificil, me salio en media hora y es enserio, esta super machetiado con cosas feas pero el caso era hacerlo rapido y que funcione lo hice aputna de arbol como se daran cuenta y pues aparte de calcular el numero perfectamente muestra las rutas, asi que bien huracancorp bkano pero mijo no nos subestime que nivel de programacion es lo que hay, ojala y tenga tiempo pa optimizarlo.
de nuevo gracias que ricura de foro!
huracancorp
noviembre 16, 2006, 07:53
ok, personalmente me parece muy ineficiente tu solución, pero lo felicito porque la idea es hallar una solución, no la mejor!!!
puedo postear mi solucion?
UAC-King Night
noviembre 16, 2006, 09:12
ok, personalmente me parece muy ineficiente tu solución, pero lo felicito porque la idea es hallar una solución, no la mejor!!!
puedo postear mi solucion?
Buenos Días...
Klaro Kompañero, postule su solución, la idea es optimizar y para eso hay ke hallar varias rutas...
huracancorp
noviembre 16, 2006, 10:19
#include <iostream.h>
#include <math.h>
int pasos(int n)
{ if(n>3) return pasos(n-1)+pasos(n-2)+pasos(n-3);
else return pow(2,n-1);
}
main()
{ cout<<pasos(10);
getchar();
}
Esta es mi solución realizada en c++, pueden comparar las respuestas con la otra solución, realmente ambas funcionan.
RogerJose
noviembre 16, 2006, 01:41
ok, personalmente me parece muy ineficiente tu solución, pero lo felicito porque la idea es hallar una solución, no la mejor!!!
puedo postear mi solucion?
Por que te parece muy ineficiente la solucion de fram7 ? :confused:
La de fram7 muestra las posibles formas en que el robot podria caminar; la tuya no.
Seria bueno que dieras otra solucion mas eficiente que la de fram7, y que muestre las formas en que el robot pueda caminar.
PD: Ese ejercicio esta muy interesante y merece varias soluciones :)
.
huracancorp
noviembre 16, 2006, 02:01
Por que te parece muy ineficiente la solucion de fram7 ? :confused:
La de fram7 muestra las posibles formas en que el robot podria caminar; la tuya no.
Seria bueno que dieras otra solucion mas eficiente que la de fram7, y que muestre las formas en que el robot pueda caminar.
PD: Ese ejercicio esta muy interesante y merece varias soluciones :)
.
Si te das cuenta en el enunciado coloque que no fuera necesario mostrar las posibilidades, esto con el fin de que no fuera necesario generar estas posibildiades e ir contandolas sino con una formula estrictamente matematica se diera la solución. hermano las matematicas lo dicen todo, la forma de fram7 muestra las posibilidades porque el las necesita para mostrar el resultado, pero el fin no era mostrar las posibilidades sino dar el resultado. Es mas la formas de caminar es un problema de estadistica, felicitaciones a farm7 por el algoritmo pero la idea y en el enunciado lo decia era mostrar solo las soluciones
Un Robot puede dar pasos de 1,2 o 3 metros. Haga un algoritmo que calcule el numero de maneras que el robot puede caminar m metros.
Ejemplo:
m=4
resultado=7
Porque? las maneras en que el robot puede caminar los 4 metros son las siguientes:
1,1,1,1
1,1,2
1,2,1
2,1,1
1,3
3,1
2,2
PD: El programa solo debe mostrar el numero de maneras, no debe mostrar cuales son esas maneras.
.
Es mas roger padilla, hable contigo por messenger sobre este tema de mostrar las soluciones.
RogerJose
noviembre 16, 2006, 02:58
Creatividad y Originalidad es lo que hay en la solucion de fram7.
Yo quiero ver otras soluciones que muestren las posibles formas de caminar del robot, ojala y no recursivas.
.
fram7
noviembre 16, 2006, 06:44
bueno la verdad verdad, cuando lo hice pense en hacerlo rapido por aquello de los dos dias, y se me ocurrio que un arbol era la mejor forma para contar las posibles soluciones y asi mismo lo hice, la ventaja es que se muestran los caminos que aunque no se pedia, salio como valor agregado del algoritmo. igual creo q la complejidad de tu solucion y crear el arbol es la misma, lo que gasta mas tiempo es recorrerlo para contar las hojas y creo q ese conteo se puede hacer mientras se crea, igual tu solucion esta muy bkana, ojala tenga tiempo de optimizar y vemos.
por el lado de los caminos, no se si se pueda de una manera no recursiva, (sin usar pilas y esas cosas), seria una muiy buena solucion, espero mas retos por mi parte pensare uno, pues apesar de todo me gane ese derecho creo yo...
Creatividad y Originalidad es lo que hay en la solucion de fram7.
Yo quiero ver otras soluciones que muestren las posibles formas de caminar del robot, ojala y no recursivas.
.
que palabras ome, gracias!
huracancorp
noviembre 16, 2006, 08:09
no esta mal y lo felicite y le dije que pusiera el proximo reto porque lo hizo!!! cumplio con el objetivo, yo solo hice un comentario y ya!!! DEJEMOS DE HABLAR TANTA PAJA, pongase su reto pa' seguir pensando :)
huracancorp
noviembre 16, 2006, 08:38
fram7 pon el reto, segun lo que hemos planteado tienes hasta mañana en la noche para poner el reto.
RogerJose
noviembre 16, 2006, 08:43
Hablando con huracancorp hemos llegado a la sig. conclusion:
para no perder la dinamica del juego es mejor poner tiempo limite de un dia
para que la persona que resuelva el reto, publique el nuevo desafio.
Esperamos esten todos de acuerdo, con esta norma.
.
fram7
noviembre 16, 2006, 09:51
Dada una lista de 5 enteros (entre 1 y 100) encontrar la forma de conseguir cada entero (si es posible) entre 1 y 1000, utilizando las operaciones de suma, resta, producto y división entera, entre 1 o 2 numeros de la lista, sin repetir numero. ejemplo:
Lista: { 5 , 2, 7, 10 , 1}
1=1, 1/1, 5/5, 2/2, 7/7, 10/10
2= 2, 7-5, 2*1,10/5.
3= 10-7, 7/2
...
y asi hasta 1000, es dificil, pero interesante...no se q tal les paresca???
Cada número de la lista sólo se puede usar una vez.
huracancorp
noviembre 16, 2006, 10:13
#include <iostream.h>
void Operaciones(int V[100],int tam,int elem)
{ for(int i=0;i<tam;i++)
{ for(int j=0;j<tam;j++)
{ if(elem == V[i]/V[j]) cout<<V[i]<<"/"<<V[j]<<", ";
if(elem == V[i]*V[j]) cout<<V[i]<<"*"<<V[j]<<", ";
if(elem == V[i]+V[j]) cout<<V[i]<<"+"<<V[j]<<", ";
if(elem == V[i]-V[j]) cout<<V[i]<<"-"<<V[j]<<", ";
}
}
}
void Generar(int V[100],int &tam,int &cant)
{ cout<<"Digite el tamaño: ";
cin>>tam;
cout<<"Digite hasta donde quiere llega entre 1 y 1000: ";
cin>>cant;
for(int i=0;i<tam;i++)
{ cout<<"Digite V["<<i<<"]=";
cin>>V[i];
}
}
void Buscar(int V[100],int tam,int cant)
{ for(int i=1;i<=cant;i++)
{ cout<<"\n"<<i<<"= ";
Operaciones(V,tam,i);
}
}
main()
{ int V[100],tam,cant;
Generar(V,tam,cant);
Buscar(V,tam,cant);
getchar();
} ok aqui coloco mi solución al problema.
Tr0nAd0r
noviembre 16, 2006, 10:20
Excelente la solucion :) :)
huracancorp
noviembre 16, 2006, 10:38
ok, como fui el ganador aqui esta mi reto.
Dato un numero decimal hallar su respectivo quebrado pero no cualquier quebrado sino el quebrado expresado con numeros mas pequeños.
Ejemplo:
valor de entrada: 0.125
Los posibles resultados son: 1/8, 10/80, 100/800, etc. Pero el menor es 1/8 y ese es el que el algoritmo debe dar.
Tr0nAd0r
noviembre 16, 2006, 11:04
Un intento :P
#include <iostream.h>
void dec2frac (float n)
{
float temp;
int i=1;
bool sw=false;
while(!sw)
{
temp=i*n;
if((temp-int(temp))==0)
{
cout<<i*n<<"/"<<i;
sw=true;
}
else i++;
}
}
main()
{
float numero;
cout<<"Digite el numero decimal: ";
cin>>numero;
dec2frac(numero);
getchar();
}
RogerJose
noviembre 16, 2006, 11:49
Bien, te toca UAC-Tr0nAd0r.
huracancorp
noviembre 17, 2006, 07:02
Un intento :P
#include <iostream.h>
void dec2frac (float n)
{
float temp;
int i=1;
bool sw=false;
while(!sw)
{
temp=i*n;
if(temp/int(temp)==1)
{
cout<<i*n<<"/"<<i;
sw=true;
}
else i++;
}
}
main()
{
float numero;
cout<<"Digite el numero decimal: ";
cin>>numero;
dec2frac(numero);
getchar();
}
HEY TRONADOR.... el programa no sirve, meto 0.125 y se cae!
huracancorp
noviembre 17, 2006, 09:02
tu codigo se cae cuando el decimal esta entre -1 y 1, debido a que tienes
temp/int(temp)
y int(0.125) es 0 y división por 0 da error.
Tr0nAd0r
noviembre 17, 2006, 09:49
Tan raro porque en todos los casos de prueba lo hice con puros decimales iniciados por cero,,,, el primero que probe fue ese 0.125 y me arrojo como respuesta 1/8, incluso tengo un ejecutable (roger padilla favor postealo que ahora estoy en la U :P )
Tienes razon algoritmicamente es incorrecto, lo que no entiendo entonces con un error tan grave como es la division entre cero como es posible que funcione el programa que compile :| :|
P.D: Use el Dev-C++ y el Code::Blocks para compilarlo :)
Saludos =)
Tr0nAd0r
noviembre 17, 2006, 12:33
la correcion es pequeña:
cambiar el condicional:
if(temp/int(temp)==1)
por la siguiente:
if((temp-int(temp))==0)
RogerJose
noviembre 17, 2006, 12:41
tu codigo se cae cuando el decimal esta entre -1 y 1, debido a que tienes
temp/int(temp)
y int(0.125) es 0 y división por 0 da error.
El Programa no se cae, funciona bien, yo mismo lo probe anoche.
Me di cuenta de ese bug en la logica, por eso le dije a UAC-Tr0nAd0r que me mandara el ejecutable, lo probe y pude constatar que el programa si funcionaba. La division por cero si se hace, lo que no se, es porque no da excepcion.
Adjunto el Ejecutable del Programa [B]echo por UAC-Tr0nAd0r y una version del mismo codigo de UAC-Tr0nAd0r pero en Java.
swoko
noviembre 17, 2006, 02:50
#include <iostream.h>
#include <math.h>
int pasos(int n)
{ if(n>3) return pasos(n-1)+pasos(n-2)+pasos(n-3);
else return pow(2,n-1);
}
main()
{ cout<<pasos(10);
getchar();
}
Esta es mi solución realizada en c++, pueden comparar las respuestas con la otra solución, realmente ambas funcionan.
Terriblemente ineficiente, ese es un caso donde el uso de la recursión en ese estilo hace que sea ineficiente para cualquier N mayor digamos que 10
huracancorp
noviembre 17, 2006, 03:08
Terriblemente ineficiente, ese es un caso donde el uso de la recursión en ese estilo hace que sea ineficiente para cualquier N mayor digamos que 10
ok swoko quiero ver tu solución al problema, facil criticar;) dificil pensar:) quiero ver tu mejor solución, y no es una propuesta, es un reto.
Tr0nAd0r
noviembre 17, 2006, 04:56
Reto:
Dada una cadena de n caracteres, mostrar todas las permutaciones posibles de sus caracteres.
Ejemplo:
sean ABCD
se pueden combinar de 24 ( 4! ) formas incluyendo ABCD asi
ABCD
ABDC
BADC
ACBD
ACDB
CABD... etc...
Saludos
Aladdin
noviembre 17, 2006, 05:45
Buenas a todos quisiera ver si alguno me pudiera ayudar a encontrar información sobre Algoritmos de Triangulación de Polígonos (en especial de Delauray)
jomunoz
noviembre 17, 2006, 06:19
Buenas a todos quisiera ver si alguno me pudiera ayudar a encontrar información sobre Algoritmos de Triangulación de Polígonos (en especial de Delauray)
Aqui esta un ejemplo que hace eso, con fuentes y todo:
http://www.codeproject.com/Purgatory/polygon_tesselation.asp?df=100&forumid=3250&exp=0&select=112960
Manre
noviembre 17, 2006, 06:42
>_> tronador!!!!!!! >___< yo iba aescribir eso ¬_¬....el pto internet se cayo y no lo pude poner, lol....toy tratando d hacerlo xD
Tr0nAd0r
noviembre 17, 2006, 06:43
Actualmente hay 3 usuario(s) viendo este tema (3 miembros y 0 invitados): UAC-Tr0nAd0r (http://www.laneros.com/member.php?u=5370)*, Manre (http://www.laneros.com/member.php?u=30104), huracancorp (http://www.laneros.com/member.php?u=86033)
Resuelva el reto Nobmann :) o ud Vega :)
>_> tronador!!!!!!! >___< yo iba aescribir eso ¬_¬....el pto internet se cayo y no lo pude poner, lol....toy tratando d hacerlo xD
Lo que pasa es que yo fui el que gano el anterior por eso me tocaba proponer :)
Manre
noviembre 17, 2006, 06:48
eso trato xD
RogerJose
noviembre 17, 2006, 08:58
Como lo importante es que funcione, ahi esta mi solucion (bien desordenada)
import java.util.ArrayList;
public class Permutaciones{
static ArrayList arreglo = new ArrayList();
public static void hallar(String[] cars){
arreglo.add(cars);
double fact = factorial(cars.length);
for (int i = 1; i<fact/2; i++) {
arreglo.add( mover(cars,i) );
}
}
public static String[] mover(String[] arrOriginal, int posiciones){
int tamanio = arrOriginal.length;
String[] arrAux = clonarArreglo(arrOriginal);
for(int i=0;i<tamanio;i++){
int posDestino = (i+posiciones) % tamanio;
arrAux[posDestino] = arrOriginal[i];
}
return arrAux;
}
public static double factorial(int n){
if(n==0){
return 1;
}
return n * factorial(n-1);
}
public static String[] clonarArreglo(String[] arregloOriginal){
String[] arrClon = new String[arregloOriginal.length];
for (int i = 0; i<arregloOriginal.length; i++) {
arrClon[i] = arregloOriginal[i];
}
return arrClon;
}
public static void mostrar(){
for (int i = 0; i<arreglo.size(); i++) {
String[] v = (String[]) arreglo.get(i);
for (int j = 0; j<v.length; j++) {
System.out.print (" "+v[j]);
}
System.out.print ("\n");
for (int h = v.length-1; h>=0; h--) {
System.out.print (" "+v[h]);
}
System.out.print ("\n");
}
}
public static void main(String arg[]){
int resp;
do{
System.out.print("\n Digite numero de caracteres: ");
int numCars = Teclado.getInt();
String[] cars = new String[numCars];
for (int i = 0; i<numCars; i++) {
System.out.print ("\n Caracter "+(i+1)+": ");
cars[i] = Teclado.getString();
}
hallar(cars);
mostrar();
System.out.print("\n\n 1 = Nuevo\t 2 = Salir\n\n Resp = ");
resp = Teclado.getInt();
}
while(resp == 1);
}
}
RogerJose
noviembre 17, 2006, 10:24
Ok, es mi turno, el nuevo reto consiste en darle formato a una cantidad numerica, marcando las unidades de millon con un ' y las de mil con un .
ejemplos:
entrada: 1234567
salida : 1'234.567
entrada: -98765
salida : -98.765
.
fram7
noviembre 17, 2006, 10:37
Ok, es mi turno, el nuevo reto consiste en darle formato a una cantidad numerica, marcando las unidades de millon con un ' y las de mil con un .
ejemplos:
entrada: 1234567
salida : 1'234.567
entrada: -98765
salida : -98.765
.
este reto es facil, asi que propongo que lo hagamos de la manera mas eficiente y el que de menos tiempo pues gana...
por cierto andaba buscando ese algoritmo
RogerJose
noviembre 17, 2006, 10:43
Si quieren le pueden agregar decimales.
Lo puse porque me parece bueno proponer algoritmos que nos sirvan en un futuro.
fram7
noviembre 17, 2006, 10:52
Mi Solucion, Complejidad N... espero algo un poco mas rapido :).
public static String numero(String numero) {
char numeros[] = numero.toCharArray();
String nueva = "";
int ii = 0, tope = 0;
if (numero.charAt(0) == '-') {
tope = 1;
}
for (int i = numero.length() - 1; i >= tope; i--) {
if (ii % 6 == 0 && ii != 0) {
nueva = "'" + nueva;
} else if (ii % 3 == 0 && ii != 0) {
nueva = "." + nueva;
}
ii++;
nueva = numeros[i] + nueva;
}
if (tope == 1) {
nueva = "-" + nueva;
}
return "$" + nueva;
} public static void main(String[] args) {
System.out.println(numero("1234567"));
}
y pues el reto es bueno, porque es un algoritmo muy util y pues entre mas efectivo y optimo mejor.
jomunoz
noviembre 17, 2006, 11:21
Ok, es mi turno, el nuevo reto consiste en darle formato a una cantidad numerica, marcando las unidades de millon con un ' y las de mil con un .
ejemplos:
entrada: 1234567
salida : 1'234.567
entrada: -98765
salida : -98.765
.
En java existe el objeto Locale que hace eso, seria bueno que hiceran lo mismo para C++.
huracancorp
noviembre 18, 2006, 09:53
public static String convertir(String numero) {
String signo="";
if(numero.substring(0,1).equals("-"))
{ signo="-";
numero=numero.substring(1,numero.length());
}
if(numero.length()>3) numero=numero.substring(0,numero.length()-3)+"."+numero.substring(numero.length()-3,numero.length());
if(numero.length()>7) numero=numero.substring(0,numero.length()-7)+"'"+numero.substring(numero.length()-7,numero.length());
return signo+numero;
}
public static void main(String[] args) {
System.out.println(convertir("1234567"));
}
Aqui pongo el mio siempre con complejidad O(2).
huracancorp
noviembre 18, 2006, 10:00
fram7 tu fuiste el ganador por haberlo hecho primero, tienes el honor de poner el siguiente reto
fram7
noviembre 18, 2006, 10:24
public static String convertir(String numero) {
String signo="";
if(numero.substring(0,1).equals("-"))
{ signo="-";
numero=numero.substring(1,numero.length());
}
if(numero.length()>3) numero=numero.substring(0,numero.length()-3)+"."+numero.substring(numero.length()-3,numero.length());
if(numero.length()>7) numero=numero.substring(0,numero.length()-7)+"'"+numero.substring(numero.length()-7,numero.length());
return signo+numero;
}
public static void main(String[] args) {
System.out.println(convertir("1234567"));
}
Aqui pongo el mio siempre con complejidad O(2).
Hola, tu codigo tiene un error y es que para numeros como 1`234.567`891.011 se queda corto pues no marca los miles siguientes, yo se que es un error de interpretacion del problema, pero segun entiendo yo sin inportar el tamaño del numero dbee marcar los . y los `.
por otro lado la complejidad no estoy seguro sea O(2), pues el subString, debe recorer de alguna manejra la cadena, habria que probar bien la solucion.
el reto...mas tarde...
RogerJose
noviembre 18, 2006, 10:55
Es cierto, el numero puede ser variable, incluso podria ser uno grande como 1.234'567.890, y ahi no funciona la solucion de huracancorp.
PD: me parece que el algoritmo de fram7 es mas eficiente, habria que estudiarlo.
huracancorp
noviembre 18, 2006, 10:59
Hola, tu codigo tiene un error y es que para numeros como 1`234.567`891.011 se queda corto pues no marca los miles siguientes, yo se que es un error de interpretacion del problema, pero segun entiendo yo sin inportar el tamaño del numero dbee marcar los . y los `.
por otro lado la complejidad no estoy seguro sea O(2), pues el subString, debe recorer de alguna manejra la cadena, habria que probar bien la solucion.
el reto...mas tarde...
Tienes razón, es que en el ejemplo solo vi un mil y un millon, pense que solo eran el primer mil y el primer millo.
huracancorp
noviembre 18, 2006, 11:13
public static String convertir(String numero) {
String signo="",val=".";
int iter=(numero.length()+1)/3;
if(numero.substring(0,1).equals("-"))
{ signo="-";
numero=numero.substring(1,numero.length());
}
if(iter==1) numero=numero.substring(0,numero.length()-3)+"."+numero.substring(numero.length()-3,numero.length());
for(int i=0;i<iter-1;i++)
{ numero=numero.substring(0,numero.length()-(((i+1)*3)+i))+val+numero.substring(numero.length( )-(((i+1)*3)+i),numero.length());
if(val.equals(".")) val="'";
else val=".";
}
return signo+numero;
}
public static void main(String[] args) {
System.out.println(convertir("-4444444444444444444444446666"));
}
Ok, ahora si publico mi solución cuya complejidad es de O(numero_de_digitos/3 -1)
huracancorp
noviembre 18, 2006, 11:17
Algo que no me habia dado cuenta es que el algoritmo de farm7 se totea con este numero por ejemplo -412456465465465498731321567
RogerJose
noviembre 18, 2006, 11:42
Algo que no me habia dado cuenta es que el algoritmo de farm7 se totea con este numero por ejemplo -412456465465465498731321567
Si el algoritmo de fram7 se totea, con una cifra como esa.
Como el mismo fram7 lo planteo gana el que haga el algoritmo mas eficiente, y la solucion de huracancorp lo es mas. Entonces segun eso gana huracancorp.
Tu turno huracancorp, pon el nuevo reto.
huracancorp
noviembre 18, 2006, 11:43
ok voy a ponerlo
RogerJose
noviembre 18, 2006, 12:02
Viejo huracancorp su algoritmo tambien falla con una cifra como: 3346888
Parece que la parte donde tomas el signo y despues lo antepones al resultado esta de mas, revisalo.
Aun no hay ganador, vamos a ver.
Aunque la solucion de fram7 hasta ahora lleva ventaja, pues funciona con numeros mas "realistas".
.
huracancorp
noviembre 18, 2006, 01:16
Si disculpa, fue que al momento corregir el primer error cambie un valor pero ya esta modificado otra vez
public static String convertir(String numero) {
String signo="",val=".";
int iter=(numero.length()+2)/3;
if(numero.substring(0,1).equals("-"))
{ signo="-";
numero=numero.substring(1,numero.length());
}
if(iter==1) numero=numero.substring(0,numero.length()-3)+"."+numero.substring(numero.length()-3,numero.length());
for(int i=0;i<iter-1;i++)
{ numero=numero.substring(0,numero.length()-(((i+1)*3)+i))+val+numero.substring(numero.length( )-(((i+1)*3)+i),numero.length());
if(val.equals(".")) val="'";
else val=".";
}
return signo+numero;
}
public static void main(String[] args) {
System.out.println(convertir("3346888"));
}
huracancorp
noviembre 18, 2006, 01:17
Aqui esta mi nuevo reto.
En una población de bacterias una bacteria se reproduce diariamente generando dos nuevas bacterias, si se toma una bacteria de muestra y se coloca en un recipiente aislado de la población cuantas nuevas bacterias nacerían el n-esimo día de estar la bacteria en el recipiente.
Ejemplos:
Día 1 – 2 bacterias
Día 4 – 54 bacterias
Gana el que de la solución mas rápida sin importar su complejidad
RogerJose
noviembre 18, 2006, 01:36
Si disculpa, fue que al momento corregir el primer error cambie un valor pero ya esta modificado otra vez
public static String convertir(String numero) {
String signo="",val=".";
int iter=(numero.length()+2)/3;
if(numero.substring(0,1).equals("-"))
{ signo="-";
numero=numero.substring(1,numero.length());
}
if(iter==1) numero=numero.substring(0,numero.length()-3)+"."+numero.substring(numero.length()-3,numero.length());
for(int i=0;i<iter-1;i++)
{ numero=numero.substring(0,numero.length()-(((i+1)*3)+i))+val+numero.substring(numero.length( )-(((i+1)*3)+i),numero.length());
if(val.equals(".")) val="'";
else val=".";
}
return signo+numero;
}
public static void main(String[] args) {
System.out.println(convertir("3346888"));
}
Viejo man, ahora se daña con cifras como estas,
ej:
-141244
-141245646546546549873132156
.
.
RogerJose
noviembre 18, 2006, 01:37
Uy viejo huracancorp para no andar con mas vueltas, aqui esta la correccion de su algoritmo.
public static String convertir2(String numero) {
String signo="",val=".";
if(numero.charAt(0) == '-'){
signo="-";
numero=numero.substring(1,numero.length());
}
int iter=(numero.length()-1)/3;
for(int i=0;i<iter;i++){
numero=numero.substring(0,numero.length()-(((i+1)*3)+i))+val+numero.substring(numero.length( )-(((i+1)*3)+i),numero.length());
val = val.equals(".") ? "'" : ".";
}
return signo+numero;
}
fram7
noviembre 18, 2006, 02:45
bueno ya corregi el mio, pero igual el codigo de hyracancorp es mas eficiente asi que tiene todo el honor de poner el problema!.
Tr0nAd0r
noviembre 18, 2006, 02:55
#include <iostream.h>
int bacterias(int dia)
{
if(dia==0) return 0;
if(dia==1) return 2;
if(dia>=2) return 3*bacterias(dia-1);
}
main()
{
int dia;
cout<<"Digite dia: ";
cin>>dia;
int bacteriadia=bacterias(dia);
cout<<"El dia "<<dia<<" habran: "<<bacteriadia<<" bacterias"<<endl;
cout<<"Nacieron: "<<bacteriadia-bacterias(dia-1)<<" este dia"<<endl;
getchar();
}
Lo acabo de modificar para que diga exactamente cuantas bacterias en total hay el n-simo dia ademas de decir cuantas nacieron ese dia exacto.
huracancorp
noviembre 18, 2006, 03:49
Tu algoritmo esta un toque desfasado, mia que cuando metes dia 1 salr que nacieron 2 y esta bien pero tambien dice que hay dos y esta mal porque en realidad hay tres la madre y las dos hijas.
Este error lleva a uno mas grande en cuanto a la respuesta debido a que es recursivo, para el dia 4 tu programa dice que nacieron 36 bacterias cuando en realidad son 54.
Tu solución va en buen camino pero teines un pequeñisimo error.
#include <iostream.h>
int bacterias(int dia)
{
if(dia==0) return 0;
if(dia==1) return 2;
if(dia>=2) return 3*bacterias(dia-1);
}
main()
{
int dia;
cout<<"Digite dia: ";
cin>>dia;
int bacteriadia=bacterias(dia);
cout<<"El dia "<<dia<<" habran: "<<bacteriadia<<" bacterias"<<endl;
cout<<"Nacieron: "<<bacteriadia-bacterias(dia-1)<<" este dia"<<endl;
getchar();
}
Lo acabo de modificar para que diga exactamente cuantas bacterias en total hay el n-simo dia ademas de decir cuantas nacieron ese dia exacto.
Tr0nAd0r
noviembre 18, 2006, 03:53
o sea cuando dices que
Día 1 – 2 bacterias
Día 4 – 54 bacterias
te refieres es a numeros de nacimientos?? y no a cantidad total?
siendo asi la funcion queda
int bacterias(int dia)
{
if(dia==-1) return 0; //por si a alguien se le ocurre preguntar cuantas nacieron el dia 0
if(dia==0) return 1;
if(dia>=1) return 3*bacterias(dia-1);
}
huracancorp
noviembre 18, 2006, 04:59
Ahora si esta bien, es tu turno de colocar un nuevo reto.
Manre
noviembre 18, 2006, 06:30
guille pon algun algoritmo aver si lo hago xDD, la gente aca responde muy rapido ¬_¬ xD
criales
noviembre 18, 2006, 07:14
Aca dejo un link con unos buenos ejercicios
http://agamenon.uniandes.edu.co/~maraton/resultados/enunciados.pdf
Tr0nAd0r
noviembre 19, 2006, 12:07
Reto facil :reir: :reir:
Realizar una funcion recursiva que halle el valor minimo de un vector, usando solo el vector y su tamaño
Ejemplo
entrada: {2,9,3,5,6}
salida: 2
huracancorp
noviembre 19, 2006, 12:21
ok, aqui esta mi solución
#include <iostream.h>
int Menor(int V[100],int tam,int i)
{ if(i<tam)
{ if(V[i]<Menor(V,tam,i+1)) return V[i];
else return Menor(V,tam,i+1);
}
else return V[i-1];
}
main()
{ int n,V[100];
cout<<"Digite el tamaño de vector: ";
cin>>n;
for (int i=0;i<n;i++)
{ cout<<"Digite V["<<i+1<<"]=";
cin>>V[i];
}
cout<<Menor(V,n,0);
getchar();
}
Mañana coloc mi reto porque ahora tengo ************ de borrachera.chcoa
Tr0nAd0r
noviembre 19, 2006, 12:26
La solucion es correcta :reir: :reir:
Esperamos el proximo reto, ojala de mayor dificultad que los ultimos
la solucion que pense :
int Menor(int V[100],int tam)
{ if(tam==0) return V[0];
else
{
if( V[tam] >= Menor(V,tam-1) ) return Menor(V,tam-1);
else return V[tam];
}
}
main()
{ int n,V[100];
cout<<"Digite el tamaño de vector: ";
cin>>n;
for (int i=0;i<n;i++)
{ cout<<"Digite V["<<i+1<<"]=";
cin>>V[i];
}
cout<<Menor(V,n);
getchar();
}
huracancorp
noviembre 19, 2006, 10:20
Sea M una matriz de n x n, haga un algoritmo recursivo que rote dada matriz en sentido de las manecillas de reloj.
Ejemplo:
Matriz Inicial
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
Matriz Final
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
Recuerden que el algoritmo debe ser recursivo.
RogerJose
noviembre 19, 2006, 01:15
/**
*
* @author Roger José
*/
public class Matriz {
public static int[][] moverMatriz(int[][] matriz, int i, int j){
int n = matriz.length-1;
int aux = matriz[i][j];
matriz[i][j] = matriz[n-j][n-i];
matriz[n-j][n-i] = aux;
if(j>0){
return moverMatriz(matriz, i, j-1);
}
else if(i<n){
return moverMatriz(matriz, i+1, n-(i+1));
}
else{
return matriz;
}
}
public static void imprimirMatriz(int[][] matriz){
for(int i=0; i<matriz.length; i++){
for(int j=0; j<matriz[i].length; j++){
System.out.print("\t "+matriz[i][j]);
}
System.out.print("\n\n");
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int[][] matriz = new int[][] {{1,1,1,1,1},{2,2,2,2,2},{3,3,3,3,3},{4,4,4,4,4},{ 5,5,5,5,5}};
int[][] matrizNew = moverMatriz(matriz, 0, matriz.length-2);
System.out.print("\n CAMBIADA\n\n");
imprimirMatriz(matrizNew);
}
}
Tr0nAd0r
noviembre 19, 2006, 02:59
Tu solucion es correcta Roger, es tu turno de colocar reto
RogerJose
noviembre 19, 2006, 03:18
Aqui va el nuevo reto.
Primero se debe leer una lista de palabras del teclado, por ej: {viva,foro,software,open,source,laneros}, luego se debe leer una una nueva palabra por ej. "reto" y decir de cuales palabras de la lista (el minimo posible) se pueden tomar caracteres para formar esa palabra.
ej:
Lista de palabras:
viva,foro,software,open,source,laneros.
Palabra:
reto
Resultado:
1 palabras = software
Como ven de la palabra "software" puedo tomar las letras "o,t,r,e" y formar la palabra "reto".
Otro ejemplo, con la misma lista de palabras:
Palabra:
nuevo
Resultado:
3 palabras = viva,source,laneros.
OJO!, las letras no deben aparecer subrayadas, solo deben indicarse de cuales palabras (minimo) se pueden tomar letras para formar la palabra indicada.
Se me ocurrio ese, espero les guste y se deje entender mi explicacion.
.
RogerJose
noviembre 19, 2006, 07:14
offtopic
Si quieres Unirte al Desarrollo de un Software Open Source,visita: http://www.laneros.com/showthread.php?t=81852 (http://www.laneros.com/showthread.php?t=81852)
Aladdin
noviembre 20, 2006, 03:49
Si te das cuenta en el enunciado coloque que no fuera necesario mostrar las posibilidades, esto con el fin de que no fuera necesario generar estas posibildiades e ir contandolas sino con una formula estrictamente matematica se diera la solución. hermano las matematicas lo dicen todo, la forma de fram7 muestra las posibilidades porque el las necesita para mostrar el resultado, pero el fin no era mostrar las posibilidades sino dar el resultado. Es mas la formas de caminar es un problema de estadistica, felicitaciones a farm7 por el algoritmo pero la idea y en el enunciado lo decia era mostrar solo las soluciones
Es mas roger padilla, hable contigo por messenger sobre este tema de mostrar las soluciones.
Me disculpo por enviar una respuesta después del plazo que distes para la resolución del problema pero por desgracia sólo puedo tener acceso a Internet a veces cuando estoy en la Universidad. Primero concuerdo contigo en que la solución planteada por fram7 es extremadamente trabajosa e ineficiente y si estamos en un FORUM DE ALGORITMIA un requisito fundamental debe ser las soluciones EFICIENTES de los problemas que se plantean. Además estoy muy de acuerdo en que la idea del problema es contar las soluciones no generarlas. No obstante considero que tu solución no se aleja mucho de la de fram7 en cuanto a la eficiencia y para m = 30 es prácticamente impracticable la solución. Además que con una pequeñita modificación de tu código pudiera también mostrar las soluciones.
La idea para resolver el problema es apoyado en una serie famosa, la de Fibonacci en la cual se pueden calcular el término n-ésimo mediante la fórmula recursiva:
F(n) = F(n-1) + F(n-2)
De esta forma de aprovecha el cálculo de los términos anteriores para calcular el actual. Si empleamos un razonamiento análogo vemos que para m = 4 el problema se resuelve calculando la cantidad de formas para m = 3, m = 2 y m = 1 luego se puede expresar el término n-ésimo fácilmente mediante la fórmula recursiva:
F(n) = F(n-1) + F(n-2) + F(n-3)
Luego como m(1) = 1, m(2) = 2 y m(3) = 4 es fácil a calcular a partir de estos valores el resto. Esto resulta extremadamente eficiente pues se realiza de forma iterativa sin cálculos redundantes y además en un orden lineal O(N).
Existe una forma de plantear una fórmula cerrada para este problema e incluso para todos los problemas que tengan una fórmula recursiva con determinadas características. Por ejemplo en el problema de las Torres de Hanoi su ecuación recursiva es
T(N) = 2T(N-1) + 1
A partir de esta se puede calcular que la cantidad mínima de movimientos para pasar N discos de una torre a la otra es 2^n – 1. A esto se le conoce como forma cerrada de las ecuaciones recursivas y lo puedes encontrar en casi todos los libros de Matemática Discreta si más no recuerdo en los capítulos de Ecuaciones de Recurrencia. A continuación muestro el código iterativo.
#include <stdio.h>
#include <stdlib.h>
#if _MSC_VER > 1200
#pragma warning (disable : 4996)
#endif
int iter(int m)
{
int tmp;
int numbers[3] = { 1, 2, 4 };
if (m > 3)
{
for (int i = 4; i <= m; i++)
{
tmp = numbers[0] + numbers[1] + numbers[2];
numbers[0] = numbers[1];
numbers[1] = numbers[2];
numbers[2] = tmp;
}
}else
tmp = numbers[m - 1];
return tmp;
}
int main(int argc, wchar_t *argv[])
{
int m;
printf("Entrar cantidad de metros: "); scanf("%d", &m);
printf("Cantidad de combinaciones posibles: %d \n", iter(m));
printf("Fin del Test \n"); system("PAUSE");
return 0;
}
Aladdin
noviembre 20, 2006, 04:13
Aqui esta un ejemplo que hace eso, con fuentes y todo:
http://www.codeproject.com/Purgatory/polygon_tesselation.asp?df=100&forumid=3250&exp=0&select=112960
Muchas gracias aunque la idea era encontrar información del algoritmo (orden de ejecución, fundamento matemático, etc). Es para un seminario.
RogerJose
noviembre 20, 2006, 06:59
Muchachos que pasa?, pongan la solucion pronto, para que no muera el foro.
.
FoxM
noviembre 20, 2006, 09:32
Muchachos que pasa?, pongan la solucion pronto, para que no muera el foro.
.
Espere... espere que no todos somos tan pilos pa' esta vaina... porque a fuerza bruta sale, pero espere :P
fram7
noviembre 20, 2006, 10:07
Me disculpo por enviar una respuesta después del plazo que distes para la resolución del problema pero por desgracia sólo puedo tener acceso a Internet a veces cuando estoy en la Universidad. Primero concuerdo contigo en que la solución planteada por fram7 es extremadamente trabajosa e ineficiente y si estamos en un FORUM DE ALGORITMIA un requisito fundamental debe ser las soluciones EFICIENTES de los problemas que se plantean. Además estoy muy de acuerdo en que la idea del problema es contar las soluciones no generarlas. No obstante considero que tu solución no se aleja mucho de la de fram7 en cuanto a la eficiencia y para m = 30 es prácticamente impracticable la solución. Además que con una pequeñita modificación de tu código pudiera también mostrar las soluciones.
La idea para resolver el problema es apoyado en una serie famosa, la de Fibonacci en la cual se pueden calcular el término n-ésimo mediante la fórmula recursiva:
F(n) = F(n-1) + F(n-2)
De esta forma de aprovecha el cálculo de los términos anteriores para calcular el actual. Si empleamos un razonamiento análogo vemos que para m = 4 el problema se resuelve calculando la cantidad de formas para m = 3, m = 2 y m = 1 luego se puede expresar el término n-ésimo fácilmente mediante la fórmula recursiva:
F(n) = F(n-1) + F(n-2) + F(n-3)
Luego como m(1) = 1, m(2) = 2 y m(3) = 4 es fácil a calcular a partir de estos valores el resto. Esto resulta extremadamente eficiente pues se realiza de forma iterativa sin cálculos redundantes y además en un orden lineal O(N).
Existe una forma de plantear una fórmula cerrada para este problema e incluso para todos los problemas que tengan una fórmula recursiva con determinadas características. Por ejemplo en el problema de las Torres de Hanoi su ecuación recursiva es
T(N) = 2T(N-1) + 1
A partir de esta se puede calcular que la cantidad mínima de movimientos para pasar N discos de una torre a la otra es 2^n – 1. A esto se le conoce como forma cerrada de las ecuaciones recursivas y lo puedes encontrar en casi todos los libros de Matemática Discreta si más no recuerdo en los capítulos de Ecuaciones de Recurrencia. A continuación muestro el código iterativo.
#include <stdio.h>
#include <stdlib.h>
#if _MSC_VER > 1200
#pragma warning (disable : 4996)
#endif
int iter(int m)
{
int tmp;
int numbers[3] = { 1, 2, 4 };
if (m > 3)
{
for (int i = 4; i <= m; i++)
{
tmp = numbers[0] + numbers[1] + numbers[2];
numbers[0] = numbers[1];
numbers[1] = numbers[2];
numbers[2] = tmp;
}
}else
tmp = numbers[m - 1];
return tmp;
}
int main(int argc, wchar_t *argv[])
{
int m;
printf("Entrar cantidad de metros: "); scanf("%d", &m);
printf("Cantidad de combinaciones posibles: %d \n", iter(m));
printf("Fin del Test \n"); system("PAUSE");
return 0;
}
sin haber probado tu forma, me parece que es muy bkana, pues si funciona, es muy eficiente y simple.
menekos
noviembre 20, 2006, 10:22
Compañeros, alguien podria ayudarme con un tutorial para programación en java......y si se puede el soft para ´programar????????
de antemano gracias......
RogerJose
noviembre 20, 2006, 10:51
Compañeros, alguien podria ayudarme con un tutorial para programación en java......y si se puede el soft para ´programar????????
de antemano gracias......
Con gusto te ayudaremos en el foro oficial de java:
http://www.laneros.com/showthread.php?t=32504
.
Tr0nAd0r
noviembre 20, 2006, 11:29
Reto:
Dada una cadena de n caracteres, mostrar todas las permutaciones posibles de sus caracteres.
Ejemplo:
sean ABCD
se pueden combinar de 24 ( 4! ) formas incluyendo ABCD asi
ABCD
ABDC
BADC
ACBD
ACDB
CABD... etc...
Saludos
aqui esta mi solucion :)
#include <iostream>
using namespace std;
char cpalabra[10]; //COPIA DE SEGURIDAD DE LA PALABRA
int k=1;
void permutaciones(char cad[], int j, int numper, int i);
void intercambio(char *cad1, char *cad2);
int factorial(int numero);
main()
{
char palabra[10];
cout<<"Escriba la palabra: ";
cin>>palabra;
strcpy(cpalabra,palabra);
permutaciones(palabra,1,0,1);
}
void permutaciones(char cad[], int j, int numper, int i)
{
if(k<=factorial(strlen(cad)))
{
if(numper<( factorial(strlen(cad)) / strlen(cad) ))
{
if(j<strlen(cad)-1)
{
intercambio(&cad[j],&cad[j+1]);
cout<<k<<"= "<<cad<<endl;k++;
permutaciones(cad,j+1,numper+1,i);
}
else
permutaciones(cad,1,numper,i);
}
else
{
cad=cpalabra;
intercambio(&cad[0],&cad[i]);
permutaciones(cad,1,0,i+1);
}
}
else
system("PAUSE"); //Fin del proceso
}
void intercambio(char *cad1, char *cad2)
{
char aux;
aux=*cad1;
*cad1=*cad2;
*cad2=aux;
}
int factorial(int numero)
{
if(numero<1) return 1;
else return numero*factorial(numero-1);
}
oN|x
noviembre 21, 2006, 12:19
Alguien me podria colaborar con el algoritmo de maximum flow..o alguna info adicional.
Gracias,
PD: yo que google existe, pero quiero consultar con uds.
altair_797
noviembre 25, 2006, 09:09
hola!!
al fin consiguio el libro Programming Challenges [PC]
by Steven S. Skiena and Miguel Revilla, tengo una version en pdf, no se si sea la ultima, me avisa cualquier cosa.
Tr0nAd0r
noviembre 26, 2006, 12:48
Tan de buenas que ese de las Permutaciones me salio en el examen final de Programacion II y de una 5,0 :P :P :P :P =)
Que paso con el ultimo reto nadie lo quiso hacer :P
Yo no lo hago prque ando embolatado con los finales :rolleyes: :rolleyes: :|
fram7
noviembre 26, 2006, 11:44
yo tambien, asi que ha esperar...ahorita en vacaciones me desato
FoxM
noviembre 26, 2006, 12:40
Yo lo tengo de un pelo (a lo maldita sea y todo hahahaha), pero no he podido trabajarle como desde el jueves. Tengo un pequeño problema al hacer un caso de prueba como:
viva foro sofware open source laneros
foros
La salida me sale como 1 y debería ser 2. Tal vez le trabaje un poco hoy o mañana.
locoporelrojo
noviembre 27, 2006, 04:11
Aqui va el nuevo reto.
Primero se debe leer una lista de palabras del teclado, por ej: {viva,foro,software,open,source,laneros}, luego se debe leer una una nueva palabra por ej. "reto" y decir de cuales palabras de la lista (el minimo posible) se pueden tomar caracteres para formar esa palabra.
ej:
Lista de palabras:
viva,foro,software,open,source,laneros.
Palabra:
reto
Resultado:
1 palabras = software
Como ven de la palabra "software" puedo tomar las letras "o,t,r,e" y formar la palabra "reto".
Otro ejemplo, con la misma lista de palabras:
Palabra:
nuevo
Resultado:
3 palabras = viva,source,laneros.
OJO!, las letras no deben aparecer subrayadas, solo deben indicarse de cuales palabras (minimo) se pueden tomar letras para formar la palabra indicada.
Se me ocurrio ese, espero les guste y se deje entender mi explicacion.
.
Saludos laneros. Soy nuevo en este foro y, quisiera saber, ¿que paso con este reto?
RogerJose
noviembre 27, 2006, 04:30
No han publicado una solucion para ese reto. Esta invitado a hacerla.
AlexanderMG
noviembre 28, 2006, 03:49
Yo también quiero participar, pero necesito algo de tiempo
RogerJose
diciembre 2, 2006, 11:10
Aqui va el nuevo reto.
Primero se debe leer una lista de palabras del teclado, por ej: {viva,foro,software,open,source,laneros}, luego se debe leer una una nueva palabra por ej. "reto" y decir de cuales palabras de la lista (el minimo posible) se pueden tomar caracteres para formar esa palabra.
ej:
Lista de palabras:
viva,foro,software,open,source,laneros.
Palabra:
reto
Resultado:
1 palabras = software
Como ven de la palabra "software" puedo tomar las letras "o,t,r,e" y formar la palabra "reto".
Otro ejemplo, con la misma lista de palabras:
Palabra:
nuevo
Resultado:
3 palabras = viva,source,laneros.
OJO!, las letras no deben aparecer subrayadas, solo deben indicarse de cuales palabras (minimo) se pueden tomar letras para formar la palabra indicada.
Se me ocurrio ese, espero les guste y se deje entender mi explicacion.
.
QUE PASO CON ESTE RETO??? 8| :'( :\ :s
.
UAC-King Night
diciembre 11, 2006, 09:32
Hola Kompañeros Komo Vamos de Kosas...?¿ por aky reportàndome despues de unos dìas de ausencia por motivos laborales, bueno aky estoy presto a kolaborar en lo ke se pueda... saludos a todos...
T#3_#@RD3R
diciembre 11, 2006, 10:08
....uhhhh el foro esta muy elegante, primera vez q lo veo y visito.....pero me da como tristesa y hasta ganas de llorar por q todo es una carrera contra el tiempo y habemos LANeros q no podemos abandonar nuestras responsabilidades (cualesquiera q sean) para unirnos y participar en el foro.....sin embargo, estaré lo q más pendiente posible del foro pa´ ver si ahora en vagaciones me les meto a la competencia.....
RogerJose
diciembre 15, 2006, 04:25
Bueno amigos, ya que el derecho a colocar el reto es mio, aqui va...
Hacer un programa que dadas dos fechas (fechaInicial y fechaFinal) el programa calcule y arroje la diferencia en años entre las mismas.
Ej:
fechaInicial: 1990-02-01
fechaFinal: 2006-12-15
Resultado: 16 años.
Gana el algoritmo mas eficiente.
.
fram7
diciembre 15, 2006, 10:26
otro retico, es hacer, dado un numero cualquiera digamos 1.280.050, diga Millon Docientos Ochenta Mil Cincuenta Pesos. algo asi.
fram7
diciembre 15, 2006, 10:28
Bueno amigos, ya que el derecho a colocar el reto es mio, aqui va...
Hacer un programa que dadas dos fechas (fechaInicial y fechaFinal) el programa calcule y arroje la diferencia en años entre las mismas.
Ej:
fechaInicial: 1990-02-01
fechaFinal: 2006-12-15
Resultado: 16 años.
Gana el algoritmo mas eficiente.
.
no es? return añoNuevo - añoViejo...pues los meses y dias no importan segun lo que veo.
RogerJose
diciembre 15, 2006, 10:29
otro retico, es hacer, dado un numero cualquiera digamos 1.280.050, diga Millon Docientos Ochenta Mil Cincuenta Pesos. algo asi.
Bro la mecanica de este juego dice que el que resuelva el reto anterior se gana el derecho exclusivo a colocar el nuevo reto, y yo tengo ese derecho. Resuelva mi reto y luego si se gana el derecho a poner el uno nuevo.
.
RogerJose
diciembre 15, 2006, 10:34
no es? return añoNuevo - añoViejo...pues los meses y dias no importan segun lo que veo.
Claro que si importan,
si usted tiene un caso como este:
fechaInicial: 24/12/2005
fechaFinal: 15/12/2006
AñoViejo - AñoNuevo le da 1, seria ese el resultado correcto?
.
fram7
diciembre 15, 2006, 10:56
public static void main(String[] args) {
System.out.println(años("15-12-2005", "24-12-2006"));
}
public static int años(String añoViejo, String añoNuevo) {
String viejo[] = añoViejo.split("-");
String nuevo[] = añoNuevo.split("-");
int viAño, viMes, viDia, nuAño, nuMes, nuDia;
viDia = Integer.parseInt(viejo[0]);
viMes = Integer.parseInt(viejo[1]);
viAño = Integer.parseInt(viejo[2]);
nuDia = Integer.parseInt(nuevo[0]);
nuMes = Integer.parseInt(nuevo[1]);
nuAño = Integer.parseInt(nuevo[2]);
int dif = nuAño - viAño;
// 12-10-2005 - 14-8-2006
if (dif != 0) {
if (viMes > nuMes) {
return dif - 1;
} else if (viMes == nuMes) {
if (viDia > nuDia) {
return dif - 1;
}
}
}
return dif;
}
RogerJose
diciembre 15, 2006, 11:07
Listo agilicemos esto, fram7 us se ganó el derecho, es su turno ahora.
.
fram7
diciembre 15, 2006, 11:32
repito mi retico,
hacer, dado un numero cualquiera digamos 1.280.050, su equivalente en palabras Millon Docientos Ochenta Mil Cincuenta Pesos. algo asi.
incluye negativos, y hasta 1 billon.
RogerJose
diciembre 18, 2006, 12:04
repito mi retico,
hacer, dado un numero cualquiera digamos 1.280.050, su equivalente en palabras Millon Docientos Ochenta Mil Cincuenta Pesos. algo asi.
incluye negativos, y hasta 1 billon.
Bro le recomiendo que cambie ese reto por uno mas corto. No le vaya a pasar como a mi, que tuve que modificar el reto y poner el de las fechas para no dejar morir esto. Lo que pasa es que la gente no tiene tiempo para ejercicios "largos", y ademas ese algoritmo esta retrillado en la web, no lo tome a mal.
.
fram7
diciembre 18, 2006, 12:17
bueno roger no lo tomo a mal, es q lo necesito pa un progama que estoy haciendo y ni lo he buscado, me parecio un buen reto, y echandole mente no me parecia tan largo, entodo caso, si hay un mejor reto que lo pongan, o pensare en uno.
RogerJose
diciembre 19, 2006, 11:31
bueno roger no lo tomo a mal, es q lo necesito pa un progama que estoy haciendo y ni lo he buscado, me parecio un buen reto, y echandole mente no me parecia tan largo, entodo caso, si hay un mejor reto que lo pongan, o pensare en uno.
NO la hice yo, la encontre tal cual en javahispano.org, el autor es Ruben D. Mori.
"Esta curiosa clase nos permite transformar una cantidad al lenguaje natural, por ejemplo al pasarle 999999999999999.999999999 nos devuelve:
NOVECIENTOS NOVENTA Y NUEVE BILLONES NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE MILLONES NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE CON 999999999 MILMILLONESIMOS.
Tiene una gran cantidad de opciones de configuración."
/**
* Clase estatica para convertir cantidades a letras
* Permite especificar la cantidad de renglones que se desee con un largo especifico para cada uno
* separando en silabas las palabras que no caben en el renglon
* Permite incluir hasta 9 decimales traducirlos a letras siempre que sean hasta tres decimales
* Permite expresar el valor 1 de las unidades enteras como "UNO" , "UNA" o "UN"
* segun se fije el parametro genero_unidad en 0,1 o 2
* Retorna un array de String igual a la cantidad de renglones especificados
* permite agregar texto : a) al principio ( prefijo_inicio )
* b) despues de la parte entera ( sufijo_enteros )
* c) antes de la parte decimal ( prefijo_decimal )
* d) despues de la parte decimal ( sufijo_decimal )
* e) al final ( sufijo_final )
* ( dentro de cada uno de estos textos , el caracter '|' se usa para separar en silabas)
* ( si el texto comienza con un caracter '|' indica que no se debe dejar espacio entre la
* palabra anterior y este texto . Por ejemplo para agregar "/100.-" a continuacion de los
* decimales expresados en numeros ( 50/100.- , 950/1000 , 567899/1000000 , etc. )
* El valor maximo a traducir : usando el metodo getTexto(String cantidad) = 999999999999999.999999999
* usando el metodo getTexto(double cantidad) = 9999999999999999.899999 ( este metodo puede variar la
* cantidad de decimales si el valor es grande , no asi el metodo anterior.
* Tiene metodos set... para cada uno de los parametros
*
* Fecha de creaci¢n: (20/05/2003 18:30:15)
*
*
* @author: Ruben D. Mori
*
*/
public class RMCantidadEnLetras {
public RMCantidadEnLetras() {
}
private static String[] xDos = new String[]{"U|NO","UN","DOS","TRES","CUA|TRO","CIN|CO",
"SEIS","SIE|TE","O|CHO","NUE|VE","DIEZ","ON|CE","DO|CE","TRE|CE",
"CA|TOR|CE","QUIN|CE","DIE|CI|SEIS","DIE|CI|SIE|TE","DIE|CI|O|CHO",
"DIE|CI|NUE|VE","VEIN|TE","VEIN|TI|UN","VEIN|TI|DOS","VEIN|TI|TRES",
"VEIIN|TI|CUA|TRO","VEIN|TI|CIN|CO","VEIN|TI|SEIS","VEINTI|SIE|TE",
"VEIN|TI|O|CHO","VEIN|TI|NUE|VE"};
private static String[] xUno = new String[]{"CIEN","CIEN|TO","DOS|CIEN|TOS","TRES|CIEN|TOS",
"CUA|TRO|CIEN|TOS","QUI|NIEN|TOS","SEIS|CIEN|TOS","SE|TE|CIEN|TOS",
"O|CHO|CIEN|TOS","NO|VE|CIEN|TOS"};
private static String[] xDiez = new String[]{"VEIN|TI|U|NO","","","TREIN|TA","CUA|REN|TA","CIN|CUEN|TA",
"SE|SEN|TA","SE|TEN|TA","O|CHEN|TA","NO|VEN|TA" };
private static String[] xEsp = new String[]{"Y","MIL","MI|LLON","MI|LLO|NES","BI|LLON","BI|LLO|NES"};
private static String prefijo_inicio = "(", sufijo_enteros = "PE|SOS",
prefijo_decimales = "CON", sufijo_decimales = "|/100.-",
sufijo_final = ")", palabra_cero = "CE|RO";
private static char caracter_proteccion = 42;
private static int[] renglones = new int[] { 300 };
private static char[][] datos;
private static double importe , divisor , xtres, cantidad;
private static int tres, dos , uno, paso, decena, unidad, haymillones,cant_decimales = 2,
genero_unidad = 0 , renglon , ajuste , posicion, posicion_corte,
silaba , decimales ;
private static boolean traduce_decimales = false;
public static void setRenglones(int[] xrenglones ) {
renglones = xrenglones;
}
public static void setGenero_unidad(int xgenero_unidad ) {
genero_unidad = xgenero_unidad;
}
public static void setCantidad_decimales(int xcant_decimales) {
cant_decimales = xcant_decimales;
}
public static void setPrefijo_inicio(String xprefijo_inicio) {
prefijo_inicio = xprefijo_inicio;
}
public static void setSufijo_final(String xsufijo_final) {
sufijo_final = xsufijo_final;
}
public static void setSufijo_enteros(String xsufijo_enteros) {
sufijo_enteros = xsufijo_enteros;
}
public static void setPrefijo_decimales(String xprefijo_decimales) {
prefijo_decimales = xprefijo_decimales;
}
public static void setSufijo_decimales(String xsufijo_decimales) {
sufijo_decimales = xsufijo_decimales;
}
public static void setCaracter_proteccion(char xcaracter_proteccion) {
caracter_proteccion = xcaracter_proteccion;
}
public static void setTraduce_decimales(boolean xtraduce_decimales) {
traduce_decimales = xtraduce_decimales;
}
public static void setPalabra_cero(String xpalabra_cero) {
palabra_cero = xpalabra_cero;
}
private static String[] getTexto(double importe, int qdecimales) {
decimales = qdecimales;
divisor = 1.00E12;
haymillones = 0;
if ( cant_decimales > 3 ) traduce_decimales = false;
ajuste = 10;
for ( int i=1; i < cant_decimales; i++ ) {
ajuste = ajuste * 10;
}
if ( cant_decimales == 0 ) ajuste = 0;
datos = new char[renglones.length][renglones[0]];
for ( int x=0; x < renglones.length; x++ ) {
datos[x] = new char[renglones[x]];
for ( int y=0; y < renglones[x]; y++ ) {
datos[x][y] = caracter_proteccion;
}
}
xDos[0] = "U|NO";
xDiez[0] = "VEIN|TI|UNO";
if ( genero_unidad == 2 ) {
xDos[0] = "UN";
xDiez[0] = "VEIN|TI|UN";
}
if ( genero_unidad == 1 ) {
xDos[0] = "U|NA";
xDiez[0] = "VEIN|TI|U|NA";
}
renglon = posicion = 0;
for ( paso = 0; paso < 5; paso++ ) {
xtres = ( importe / divisor );
tres = (int) xtres;
importe = importe - (double)(tres * divisor);
divisor = divisor / 1000;
if ( tres > 0 ) traducir(tres);
}
if ( ( palabra_cero.length() > 0 ) && renglon == 0 && posicion == 0 ) {
if ( prefijo_inicio.length() > 0 ) pasarTexto(prefijo_inicio);
pasarTexto(palabra_cero);
}
if (( sufijo_enteros.length() > 0 ) && ( ( renglon > 0 ) || ( posicion > prefijo_inicio.length())))
pasarTexto(sufijo_enteros);
tres = (int) ( importe * ajuste );
if ( decimales > 0 ) tres = decimales;
if ( tres > 0 && ( prefijo_decimales.length() > 0 ) && ( renglon != 0 || posicion != 0))
pasarTexto(prefijo_decimales);
if ( tres > 0 && traduce_decimales ) {
paso = 5;
traducir(tres);
}
if ( tres > 0 && !traduce_decimales ) pasarTexto(("" + tres + ""));
if ( tres > 0 && ( sufijo_decimales.length() > 0 )) pasarTexto(sufijo_decimales);
if ( sufijo_final.length() > 0 ) pasarTexto(sufijo_final);
String[] texto = new String[datos.length];
for ( int i=0; i < datos.length; i++ ) {
texto[i] = new String(datos[i]);
}
return texto;
}
private static void iniciarSilaba() {
posicion_corte = posicion;
silaba = 0;
}
private static void paseCaracter(char caracter) {
datos[renglon][posicion] = caracter;
silaba++;
posicion++;
}
private static void sumeRenglon() {
renglon++;
posicion = 0;
iniciarSilaba();
}
private static void pasarTexto(String palabra) {
char[] desglose = palabra.toCharArray();
if (posicion > 0 && ( posicion < ( renglones[renglon] -1 )) &&
( desglose[0] != 124 )) {
datos[renglon][posicion] = 32;
posicion ++;
} else
if (posicion > 0 && ( posicion == ( renglones[renglon] -1 )) &&
( desglose[0] != 124 )) {
datos[renglon][posicion] = 32;
sumeRenglon();
}
iniciarSilaba();
for ( int i=0; i < desglose.length; i++ ) {
if ( desglose[i] == 124 && i > 0 && ( posicion == ( renglones[renglon] -1 ))) {
datos[renglon][posicion] = 45;
sumeRenglon();
} else
if ( desglose[i] == 124 && i > 0 && ( posicion < ( renglones[renglon] -1 ))) {
iniciarSilaba();
} else
if ( desglose[i] != 124 && ( posicion < ( renglones[renglon] -1 ))) {
paseCaracter(desglose[i]);
} else
if ( (desglose[i] != 124) && ( posicion == ( renglones[renglon] -1 ))
&& ( i == ( desglose.length - 1)) ) {
paseCaracter(desglose[i]);
sumeRenglon();
} else
if ( desglose[i] != 124 && ( posicion == ( renglones[renglon] -1 ))
&& ( i < ( desglose.length - 1))) {
posicion = posicion_corte;
datos[renglon][posicion] = 45;
posicion++;
if ( posicion < renglones[renglon] ) {
for ( posicion=posicion; posicion < renglones[renglon]; posicion++ ) {
datos[renglon][posicion] = 45;
}
}
int xsilaba = silaba;
sumeRenglon();
for ( int z = (i - xsilaba); z < ( i + 1 ); z++ ) {
datos[renglon][posicion] = desglose[z];
posicion++;
}
}
}
}
private static void traducir(int mil) {
if ( renglon == 0 && posicion == 0 && prefijo_inicio.length() > 0 )
pasarTexto(prefijo_inicio);
uno = mil / 100;
dos = mil - ( uno * 100 );
decena = dos / 10;
unidad = dos - ( decena * 10 );
if ( mil == 100 ) pasarTexto(xUno[0]);
else if ( uno > 0 ) pasarTexto(xUno[uno]);
if ( (dos > 1 && dos < 30 )