elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  duda ejercicio combinatoria
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda ejercicio combinatoria  (Leído 4,878 veces)
ruperz

Desconectado Desconectado

Mensajes: 2


Ver Perfil
duda ejercicio combinatoria
« en: 16 Abril 2015, 13:16 pm »

Muy buenas,

necesito ayuda con un ejercicio en Python por el que no se ni por donde empezar. es sobre unas escaleras, puedo subir de 1, 2 o 3 escalones de vez, y al programa le entra n, que sera el numero de escalones, de tal manera que:

si n=1 -> 1
devuelve 1 (1 forma distinta de subir 1 escalon)

si n=2 -> 1, 1; 2
devuelve 2 (2 formas distintas de subir 2 escalones)

si n=3 -> 1, 1, 1; 2, 1; 1, 2; 3
devuelve 4 (4 formas distintas de subir 3 escalones)
....

Me tiene que devolver el nº de posibilidades del n que le meto, como puedo hacerlo? llevo dandole vueltas al tema y no se me ocurre nada de nada

muchas gracias!


« Última modificación: 16 Abril 2015, 15:58 pm por ruperz » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #1 en: 16 Abril 2015, 15:23 pm »

lectura obligatoria

10 pasos para plantear una duda informática
FAQ : Como hacer preguntas "inteligentes"

no somos adivinos...

lenguaje, como está el ejercicio, detalles, que problemas tienes, habla sobre todo eso si quieres ayuda


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #2 en: 16 Abril 2015, 15:29 pm »

1)¿números de posibilidades de qué? por ejemplo: de combnaciones de 2 números, posibilidades 2 , que alguien adivine tu planteo posibilidades 0
2)¿cómo puedes hacerlo? relativamente fácil, con un planteo correcto
3)posibilidades de lenguajes de programación para resolverlo, me mataste! ni idea cuantos querés usar.
4)por lo tanto posibilidades de adivinos en el foro = 0
En línea

ruperz

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #3 en: 16 Abril 2015, 15:59 pm »

lectura obligatoria

10 pasos para plantear una duda informática
FAQ : Como hacer preguntas "inteligentes"

no somos adivinos...

lenguaje, como está el ejercicio, detalles, que problemas tienes, habla sobre todo eso si quieres ayuda

Perdon, ya esta modificado, lo he copiado y pegado y se a puesto mal

un saludo

Perdon, ya esta modificado, lo he copiado y pegado y se ha puesto mal

un saludo
En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #4 en: 16 Abril 2015, 19:16 pm »

soy muy perro para las mátematicas, sobre todo en combinatorias y probabilidades, pero lo plantearía así:
para 1 2 y 3 escalones ya lo tenés pero si fuesen más?

la máxima posibilidad de combinaciones son 4 porque lo máximo que subis son 3 escalones
que se obtiene de 3! - 2!

entonces m!/4 debería dar

o sea 5 escalones sería 5.4.3.2.1 / 4 = 30 para 5 escalones 30 posibilidades
para 4 escalones sería 4.3.2.1 / 4 = 6

seguramente le erré de acá la luna, pero creo te puede orientar.

Edito: recién me doy cuenta que  hay que tener cuidado en cuanto a combinaciones que incluyan permutaciones, me explico una posibilidad de subir seria 1 + 1+ 2 y otra sería 2+ 1+ 1 y en este caso la combinación es la misma, pero la permutación no.
« Última modificación: 16 Abril 2015, 21:02 pm por tincopasan » En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #5 en: 17 Abril 2015, 08:48 am »

la verdad que me fui a trabajar y cuando volví me puse a mirar este problema y llegué a dos conclusiones:
1) lo que puse antes no sirve para nada!
2) la única forma que se me ocurre para resolverlo es por recursividad, igual que fibonacci, salvo que son tres valores.

paso a explicar  a1=1 a2=2 a3=4 ¿an+1?
an+1= an1+an-1+an-2
el valor siguiente seria
4 escalones = 4(an1) + 2(an-1) + 1(an-2) = 7 para 4 escalones 7 combinaciones
5 escalones = 7(an1) + 4(an-1) + 2(an-2) = 13 para 5 escalones
6 escalones = 13(an1) + 7(an-1) + 4(an-2) = 24 para 6 escalones

y así sucesivamente hasta el escalón buscado.

ahora depende de vos en que lenguaje lo programes.
Cualquier cosa veo si más tarde lo hago en python porque ahora hay tormenta eléctrica y apago todo.
Perdón por la respuesta anterior que la vi muy superficial y como dije la matemática no es mi fuerte.(bah nada es mi fuerte)

Edito:
código en python
Código
  1. def escalon_posible(n):
  2.  
  3. if n == 1:
  4. return 1
  5. if n == 2:
  6. return 2
  7. if n == 3:
  8. return 4
  9. else:
  10. return (escalon_posible(n-1) + escalon_posible(n-2)+ escalon_posible(n-3))
  11.  
  12. print("Ingrese un número mayor que 0")
  13. Escalon_final=int(input("Ingrese el escalón final: "))
  14. print (escalon_posible(Escalon_final))
  15.  
« Última modificación: 17 Abril 2015, 11:10 am por tincopasan » En línea

explorer

Desconectado Desconectado

Mensajes: 102


Analista/Programador Perl


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #6 en: 18 Abril 2015, 17:53 pm »

Perdón, pero para subir 4 escalones a mi me salen 8 combinaciones:

Código:
4
3,1
2,2
2,1,1
1,3
1,2,1
1,1,2
1,1,1,1

Muestro aquí mi solución, usando el motor de expresiones regulares de Perl, realizando una búsqueda exhaustiva por todas las combinaciones, al provocar un fallo premeditado que obliga a que el motor haga "backtracking" y busque una nueva solución.

Como no sé mucho de Python, lo dejo en Perl, pero es fácil pasarlo a Python (creo). Primero, la versión que se puede ejecutar desde la línea de comandos:
Código
  1. $ perl -E '$n = shift; $rx = ("(1*?)" x ($n-1)) . "(1+)"; $rx = qr/^$rx$/; $x = "1" x $n; $x =~ m/$rx(?{$visto{ join "," => grep { $_ > 0 } map { $+[$_] - $-[$_] } 1..$n }++ })(*FAIL)/; say join "; " => sort keys %visto' 4
  2. 1,1,1,1; 1,1,2; 1,2,1; 1,3; 2,1,1; 2,2; 3,1; 4
Y ahora la versión más normal:
Código
  1. #!/usr/bin/env perl
  2. use feature 'say';
  3.  
  4. my %visto; # memoria de combinaciones ya vistas (evitar repeticiones)
  5.  
  6. my $escalones = shift; # leemos los escalones
  7.  
  8. my $rx = ("(1*?)" x ($escalones-1)) . "(1+)"; # creamos el patrón de búsqueda. Es de la forma (1*?)(1*?)...(1+)
  9. $rx = qr/^$rx$/;
  10.  
  11. my $x = "1" x $escalones; # esta var. contiene tantos '1' como indiquen los $escalones
  12.  
  13. $x =~ m/
  14. $rx # buscamos una combinación
  15. (?{
  16.    $visto{ # la decodificamos
  17. join "," => grep { $_ > 0 } map { $+[$_] - $-[$_] } 1..$escalones
  18.    }++
  19. })
  20. (*FAIL) # provocamos un fallo de 'backtraking'
  21.      /x;
  22.  
  23. say join "; " => sort keys %visto; # resultado, formateado

Ejemplo:
Código:
$ descompon.pl 5
1,1,1,1,1; 1,1,1,2; 1,1,2,1; 1,1,3; 1,2,1,1; 1,2,2; 1,3,1; 1,4; 2,1,1,1; 2,1,2; 2,2,1; 2,3; 3,1,1; 3,2; 4,1; 5
« Última modificación: 18 Abril 2015, 18:49 pm por explorer » En línea

explorer

Desconectado Desconectado

Mensajes: 102


Analista/Programador Perl


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #7 en: 18 Abril 2015, 19:52 pm »

Ya se me ha quejado alguno diciendo que mi solución es muy complicada  :xD

Aquí pongo la solución usando recursión.
Código
  1. #!/usr/bin/env perl
  2. my $escalones = 0 + shift; # leemos el número de escalones
  3.  
  4. if ($escalones > 0) { # si es un número positivo
  5.    my @combinaciones = descompon($escalones); # sacamos todas las @combinaciones
  6.    print "Hay ", scalar(@combinaciones), " combinaciones:\n"; # informamos del número de @combinaciones
  7.    print join('; ' => @combinaciones), "\n"; # y las propias combinaciones
  8. }
  9.  
  10. sub descompon() { # devuelve una lista de combinaciones
  11.    my $escalones = shift; # para un determinado número de $escalones
  12.  
  13.    my @combinaciones; # aquí guardaremos las @combinaciones encontradas
  14.  
  15.    for my $salto (1 .. $escalones) { # damos un $salto cada vez mayor
  16. my $resto = $escalones - $salto; # después del $salto, nos queda un $resto de $escalones
  17.  
  18. if (not $resto) { # si hemos llegado arriba
  19.    push @combinaciones, $salto; # guardamos ese $salto como nueva combinación
  20. }
  21. else { # si aún no hemos llegado
  22.    for my $combina_resto (descompon($resto)) { # vemos todas las combinaciones que quedan para subir
  23. # y las guardamos
  24. push @combinaciones, join "," => $salto, $combina_resto;
  25.    }
  26. }
  27.    }
  28.  
  29.    return @combinaciones; # devolvemos las @combinaciones encontradas
  30. }
Ejemplo:
Código:
$ ./descompon2.pl 6
Hay 32 combinaciones:
1,1,1,1,1,1; 1,1,1,1,2; 1,1,1,2,1; 1,1,1,3; 1,1,2,1,1; 1,1,2,2; 1,1,3,1; 1,1,4; 1,2,1,1,1; 1,2,1,2; 1,2,2,1; 1,2,3;
 1,3,1,1; 1,3,2; 1,4,1; 1,5; 2,1,1,1,1; 2,1,1,2; 2,1,2,1; 2,1,3; 2,2,1,1; 2,2,2; 2,3,1; 2,4; 3,1,1,1; 3,1,2; 3,2,1;
 3,3; 4,1,1; 4,2; 5,1; 6

Naturalmente, existen más soluciones... :silbar:
En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #8 en: 18 Abril 2015, 20:15 pm »

explorer:
              no veo las 8 combinaciones para subir 4 escalones! salvo que para vos el 4 sea una opción, pero no es posible porque el planteo es claro, el tipo puede subir hasta un máximo de 3 escalones por vez! el 4 no existe.
En línea

explorer

Desconectado Desconectado

Mensajes: 102


Analista/Programador Perl


Ver Perfil
Re: duda ejercicio combinatoria
« Respuesta #9 en: 19 Abril 2015, 21:45 pm »

¡Ah!, entiendo: hay una limitación en el número de escalones que se pueden subir, de hasta 3.

Claro... muy poca gente podría dar un salto de muchos escalones para subir  :laugh:

Entonces, mis soluciones no sirven.

Pero... con dos pequeños cambios, ya vuelve a funcionar   ;D
Código
  1. #!/usr/bin/perl
  2. my $escalones = 0 + shift;                                      # leemos el número de escalones
  3.  
  4. if ($escalones > 0) {                                           # si es un número positivo
  5.    my @combinaciones = descompon($escalones);                  # sacamos todas las @combinaciones
  6.    print "Hay ", scalar(@combinaciones), " combinaciones:\n";  # informamos del número de @combinaciones
  7.    print join('; ' => @combinaciones), "\n";                   # y las propias combinaciones
  8. }
  9.  
  10. sub descompon {                                                 # devuelve una lista de combinaciones
  11.    my $escalones = shift;                                      # para un determinado número de $escalones
  12.  
  13.    my @combinaciones;                                          # aquí guardaremos las @combinaciones encontradas
  14.  
  15.    for my $salto ( 1 .. 3 ) {                                  # damos un $salto cada vez mayor
  16.        next if $salto > $escalones;
  17.        my $resto = $escalones - $salto;                        # después del $salto, nos queda un $resto de $escalones
  18.  
  19.        if ( not $resto ) {                                     # si hemos llegado arriba
  20.            push @combinaciones, $salto;                        # guardamos ese $salto como nueva combinación
  21.        }
  22.        else {                                                  # si aún no hemos llegado
  23.            my @resto_combinaciones = descompon($resto);        # vemos todas las combinaciones que quedan para subir
  24.  
  25.            for my $combina_resto ( @resto_combinaciones ) {    
  26.                                                                # y las guardamos
  27.                push @combinaciones, join "," => $salto, $combina_resto;
  28.            }
  29.        }
  30.    }
  31.  
  32.    return @combinaciones;                                      # devolvemos las @combinaciones encontradas
  33. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Urgente problema Arbole binario de busqueda y combinatoria
Programación C/C++
ricardoacosta86 2 3,277 Último mensaje 12 Agosto 2010, 05:06 am
por Beakman
Duda en ejercicio++
Ejercicios
Lamarkus 1 3,462 Último mensaje 1 Diciembre 2010, 17:31 pm
por [L]ord [R]NA
duda con un ejercicio..
Programación C/C++
fer_fer_73 8 4,324 Último mensaje 4 Febrero 2011, 01:24 am
por negux
Duda ejercicio C
Programación C/C++
cortex123 1 2,173 Último mensaje 13 Junio 2011, 21:09 pm
por El_Java
Algoritmo combinatoria string
Programación C/C++
Swimpiii 8 3,753 Último mensaje 7 Diciembre 2014, 20:16 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines