Emudesc en Facebook!RSS

Retroceder   Foros de Emudesc > Tecnología > Informática > Programación

 
 
Herramientas
  #1  
Antiguo 07-jul-2011, 06:42
Avatar de felomeno
bald Tod
 
Fecha de Ingreso: abril-2007
Mensajes: 7,500
felomeno es un usuario distinguidofelomeno es un usuario distinguidofelomeno es un usuario distinguido
Predeterminado Algoritmos || Pon a prueba tu ingenio

Pon a prueba tu ingenio. Reta a tu mente


Este es un tema en el que cualquier usuario puede participar.

Intentaré poner varios tipos de problemas para que sean resueltos. Como la mayor parte de la programación, los pondré en inglés, porque ese es su idioma original, pero si alguien no le entiende postea y le pongo que se tiene que hacer en español.


La mayoría de las personas dicen que por esto se tiene que empezar a programar y es en gran parte la realidad porque mejorará tus técnicas de programación. El problema es que no a todo mundo le gusta pensar, es más... es mayoría las que buscan todo más fácil.



Explicaré un poco antes de empezar:

Cita:
En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia.
Pondré varios tipos de algoritmos y cuando sean resueltos (y estén bien) iré poniendo otros del mismo tipo; si no se resuelven en 5 días yo pondré la solución explicando cada cosa. Por ahora pondré lo siguiente
  • Algoritmos sencillos para los que empiezan a programar
  • Algoritmos matemáticos para aquellos que les gusta pensar pero no les interesa saber programar
  • Algoritmos lógicos, que sería lo mismo que para el de arriba. (No prometo poner muchos ya que es difícil encontrarlos)
  • Algoritmos difíciles. Buscan un reto? Aquí lo encontrarán. No es necesario saber programar de manera perfecta, pero sí requiere que sepan lo básico que pueden hacer con un programa y que tengan muy buena lógica.

Para los que sepan programar, copien y peguen su código, no es necesario que digan paso por paso lo que hacen.
Para los que no saben programar, expliquen los pasos, es decir... si van a resolver uno matemático digan por ejemplo:

Cita:
Con la altura que nos da el problema la dividimos entre 3, la multiplicamos por la base y... blablabla así hasta llegar al resultado porque para comprobarlo tengo que pasarlo a código

Ahora explicaré cómo estarán los problemas (o la mayoría, porque recuerden, no son míos, están en páginas que tienen su propio "calificador")

Base de problemas:
Spoiler

Aquí dejo los primeros:

Fase 1:

Spoiler



Fase 2:
Spoiler



Extras:

Spoiler


Nota importante: Recuerden que los algoritmos se resuelven para cualquier caso no sólo el de prueba, es decir... en el programa viene por ejemplo que la suma de 2+3=5 pero ustedes deben hacer el programa para resolver cualquier caso (excepto en los que indiquen que es específico, cosa que normalmente pasa únicamente en los matemáticos).



Última edición por Llulian fecha: 31-jul-2012 a las 05:54.
  #2  
Antiguo 07-jul-2011, 06:43
Avatar de felomeno
bald Tod
 
Fecha de Ingreso: abril-2007
Mensajes: 7,500
felomeno es un usuario distinguidofelomeno es un usuario distinguidofelomeno es un usuario distinguido
Predeterminado Re: Algoritmos || Pon a prueba tu ingenio

Soluciones.

No necesariamente son las mejores soluciones, pero fueron aceptadas y son funcionales.

Fase 1 (No ver hasta no intentar, sólo son ejemplos por si no saben resolverlo)
[SPOILER]
Problema básico:
[SPOILER]
Código PHP:
//Solución exclusiva en java, pueden resolverlo en otros lenguajes pero obviamente la sintaxis es diferente
import java.util.Scanner;  //importar para poder recibir entrada
public class Main {  //Nombre de la clase
    
public static void main (String [] args){ //main
        
Scanner entrada = new Scanner (System.in); //también para la entrada (siempre es necesario, después lo explico)
        
int a entrada.nextInt(); //Lectura del primer entero
        
int b entrada.nextInt(); //Lectura del segundo entero
        
System.out.println(a+b); //Impresión del resultado
    
}

Como pueden ver el programa resuelve para cualquier caso, no importa si es 2+3 o 123123+123
mientras sea un entero (int) lo resolverá.
[/SPOILER]

Matemático
[SPOILER]
En este sólo pondré la solución "manual" es decir, no pondré el código. Sin embargo, no es la solución más óptima, pero como quiero ver si alguien ya entiendo cómo hacer las cosas, por ahora sólo pondré la que parece más sencilla.
Explicaré el problema: Te darán un número y lo que se tiene que hacer es la suma desde el 1 hasta el número que te den.
Por ejemplo, si te dan un 5 tienes que sumar 1+2+3+4+5 e imprimir la respuesta 15.

Así que la solución manual sería así de sencilla.

Con el número que te den sumas del 1 hasta ese número y te da el resultado.
[/SPOILER]

Difícil Por X GEu2 X
[SPOILER]
Código PHP:
#include <stdio.h>
main()
{
    
int x,y,m,n,a,b,tres=0,res=0,vres;          //declaro variables ke usare
    
int arr[101][101],resf[101];                    //declaro arreglos que usare
    
scanf("%d",&x);                                   //pido numero de casos de prueba
    
for(y=0;y<x;y++)                                      //de aki hasta.....
    
{
        
scanf("%d %d",&m,&n);
        for(
a=0;a<n;a++)
        {
            for(
b=0;b<m;b++) 
                
scanf("%d",&arr[a][b]);
        }  
        for(
b=0;b<m;b++)
        {
            for(
a=0;a<n;a++) 
                
tres=tres+arr[a][b];
            if(
tres>res)
            {
                
res=tres;
                
vres=b+1;    
            }
            
tres=0;
        }   
        
res=0;
        
resf[y]=vres;            
    }                                                   
//.........aca hago el proceso(me da weba explicarlo
    
for(y=0;y<x;y++)
        
printf("%d\n",resf[y]);                //imprimo los resultados de las votaciones

[/SPOILER]
[/SPOILER]

Última edición por felomeno fecha: 07-jul-2011 a las 08:21.
  #3  
Antiguo 07-jul-2011, 07:23
Jr. Member
 
Fecha de Ingreso: noviembre-2009
Mensajes: 295
betokscr se está dando a conocer
Icon10 Re: Algoritmos || Pon a prueba tu ingenio

Fase 1:
[SPOILER]
Básico:
[spoiler]
Código PHP:
#!usr/bin/env python

class Suma:
    
def __init__(selfnumeronumero2):
        
self.numero=numero
        self
.numero2=numero2
    def sumar
(self):
        print 
int(self.numero)+int(self.numero2)

def main():
    
op=Suma(12)
    
op.sumar()

if 
__name__=="__main__":
    
main() 
http://codepad.org/BbDnit2m[/spoiler]

Matemático:
[spoiler]
Código PHP:
#!usr/bin/env python

class Suma:
    
def __init__(selfnumero):
        
self.numero=numero
    def sumar
(self):
        
total=0
        
for x in range(int(self.numero)):
            
total+=x+1
        
print total

def main
():
    
op=Suma(5)
    
op.sumar()

if 
__name__=="__main__":
    
main() 
http://codepad.org/9P5JQzUm[/spoiler]

Dificil
[SPOILER]
Código PHP:
#!usr/bin/env python
class xD :
    
def Ganador self ):
        
self.votos1=[]
        
self.votos2=[]
        
self.resul=0
        self
.temp=0
        self
.total=0
        self
.regiones=raw_input()
        
self.candidatos=raw_input()
        for 
y in range(int(self.regiones)) :
            for 
z in range(int(self.candidatos)) :
                
self.votos1.append(raw_input())
                
self.temp=self.votos1[z]
                
self.votos2.append(self.temp)
                
self.temp=0

        
for z in range(int(self.candidatos)) :
            for 
y in range(int(self.regiones)) :
                
self.resul+=int(self.votos1[y])
                
self.resul+=int(self.votos2[z])
            if 
self.temp<self.resul:
                
self.temp+=self.resul
                self
.total=z+1
            self
.resul=0
        self
.temp=0
        
print int(self.total)

def main ( ):
    
casos=raw_input()
    
ob=xD()
    for 
x in range(int(casos)):
        
ob.Ganador()
    
if 
__name__=="__main__" :
    
main() 
[/SPOILER]
[/SPOILER]
Espero que asi sea, saludos!

PD:Estoy aprendiendo python y la programación orientada a objetos es nueva para mi, cualquier error les pido disculpas!

Última edición por betokscr fecha: 11-jul-2011 a las 22:16.
  #4  
Antiguo 07-jul-2011, 07:24
Avatar de X GEu2 X
Ace Member
 
Fecha de Ingreso: marzo-2008
Ubicación: Mexico
Mensajes: 2,308
X GEu2 X se está dando a conocer
Predeterminado Re: Algoritmos || Pon a prueba tu ingenio

fase 1
[SPOILER]
basico
[SPOILER]
Código PHP:
#include <stdio.h>      //inluye la libreria stdio
         
main()
          {
                   
int a,b;    //declara variables a & b
                   
scanf("%d %d",&a,&b);     //pide al usuario dar los valores de a y b separados por un espacio
                   
printf("%d",a+b);          //imprime el resultado de la suma a+b
           

[/SPOILER]
matematico
[SPOILER]
Código PHP:
                  #include <stdio.h>
main()
{
    
float x;              //declaro la unica variable que necesito
    
scanf("%f",&x);     //pido su valor
    
x=x*((x/2)+.5);        //hago operaciones
    
printf("%d",int(x));     //vuala tengo el resultado

[/SPOILER]
dificil
[SPOILER]
Código PHP:
#include <stdio.h>
main()
{
    
int x,y,m,n,a,b,tres=0,res=0,vres;          //declaro variables ke usare
    
int arr[101][101],resf[101];                    //declaro arreglos que usare
    
scanf("%d",&x);                                   //pido numero de casos de prueba
    
for(y=0;y<x;y++)                                      //de aki hasta.....
    
{
        
scanf("%d %d",&m,&n);
        for(
a=0;a<n;a++)
        {
            for(
b=0;b<m;b++) 
                
scanf("%d",&arr[a][b]);
        }  
        for(
b=0;b<m;b++)
        {
            for(
a=0;a<n;a++) 
                
tres=tres+arr[a][b];
            if(
tres>res)
            {
                
res=tres;
                
vres=b+1;    
            }
            
tres=0;
        }   
        
res=0;
        
resf[y]=vres;            
    }                                                   
//.........aca hago el proceso(me da weba explicarlo
    
for(y=0;y<x;y++)
        
printf("%d\n",resf[y]);                //imprimo los resultados de las votaciones

[/SPOILER]
[/SPOILER]

Última edición por X GEu2 X fecha: 13-sep-2011 a las 05:19.
  #5  
Antiguo 07-jul-2011, 07:33
Avatar de felomeno
bald Tod
 
Fecha de Ingreso: abril-2007
Mensajes: 7,500
felomeno es un usuario distinguidofelomeno es un usuario distinguidofelomeno es un usuario distinguido
Predeterminado Re: Algoritmos || Pon a prueba tu ingenio

Cita:
Empezado por betokscr Ver Mensaje
Matematico:
[spoiler]
Código PHP:
#!usr/bin/env python

class Suma:
    
def __init__(selfnumero):
        
self.numero=numero
    def sumar
(self):
        
total=0
        
try:
            for 
x in range(int(self.numero)):
                
total+=x+1
            
print total
        except ValueError
:
            print 
'Solo se permiten numeros'
            
main()

def main():
    
num=raw_input("Ingrese un numero -:>")
    
op=Suma(num)
    
op.sumar()

if 
__name__=="__main__":
    
main() 
[/spoiler]

Espero que asi sea, saludos!
Python.
No soy muy bueno, así que tendré que preguntar algo.
for x in range(int(self.numero)):
En esa línea, el valor asignado de x cuál sería? Al principio 0 y se iría sumando 1 hasta llegar a self.numero? o hasta dónde?

Otra cosa que sí puedo decirte desde ahorita, para los algoritmos no es necesario que imprimas: "Ingrese un número", eso el calificador te lo daría mal, simplemente si te dicen que te darán números, léelos sin imprimir nada.
Saludos y espero tu respuesta.

El básico está bien, aunque otra vez puedes omitir cuando imprimes pidiendo los números.
Cita:
Empezado por X GEu2 X Ver Mensaje
lol con el de A+B
[SPOILER]
Código PHP:
#Include <stdio.h>      //inluye la libreria stdio
         
main()
          {
                   
int a,b;    //declara variables a & b
                   
scanf("%d %d",&a,&b);     //pide al usuario dar los valores de a y b separados por un espacio
                   
printf("%d",a+b);          //imprime el resultado de la suma a+b
           

[/SPOILER]
matematico (el ke pide la suma de los anteriores)
[SPOILER]
Código PHP:
#Include <stdio.h>      //inluye la libreria stdio
         
main()
          {
                   
int a,x,res=0;    //declara variable a,x & res, esta ultima es igual a 0 para que no se le de un valor random
                   
scanf("%d",&a);     //pide al usuario dar el valor de a
                   
for(x=1;x<=a;x++)
                                  
res=res+x;    //crea un ciclo para hacer la suma de los numeros menores a "a"
                   
printf("%d",&res);      //imprime el valor de la suma en pantalla (variable "res")
           

[/SPOILER]

El include es con minúscula.
Saludos, lo demás está bien tanto el básico como el matemático.

Ahora piensa en esto. Aunque el matemático está bien, tu resultado es lineal, es decir tu programa hará tantas operaciones como el número que te den. Si te dan 100 harás 100 operaciones (un poco más contando el for, las sumas y eso). Pero hay una forma de hacerlo en 1 operación (en realidad 3 o 4 si cuentas todo, pero ya es mucho mejor). Se te ocurre cuál?

Última edición por felomeno fecha: 07-jul-2011 a las 07:39.
  #6  
Antiguo 07-jul-2011, 07:42
Jr. Member
 
Fecha de Ingreso: noviembre-2009
Mensajes: 295
betokscr se está dando a conocer
Predeterminado Re: Algoritmos || Pon a prueba tu ingenio

Cita:
Empezado por felomeno Ver Mensaje
Python.
No soy muy bueno, así que tendré que preguntar algo.
for x in range(int(self.numero)):
En esa línea, el valor asignado de x cuál sería? Al principio 0 y se iría sumando 1 hasta llegar a self.numero? o hasta dónde?

Otra cosa que sí puedo decirte desde ahorita, para los algoritmos no es necesario que imprimas: "Ingrese un número", eso el calificador te lo daría mal, simplemente si te dicen que te darán números, léelos sin imprimir nada.
Saludos y espero tu respuesta.

El include es con minúscula.
Mejor ponlo en spoiler para que no lo vean.
Saludos, lo demás está bien.
Eso es un ciclo for que itera x las veces indicadas en el rango que seria un entero(self.numero), entonces se iría sumando al total x+1 en cada iteración, ese +1 es porque como tu dices x empieza con 0 entonces por eso se lo agrego.

No sabia eso, las próximas respuestas lo pongo de una vez sin entrada de datos

Saludos

Última edición por betokscr fecha: 07-jul-2011 a las 07:45.
  #7  
Antiguo 07-jul-2011, 07:46
Avatar de felomeno
bald Tod
 
Fecha de Ingreso: abril-2007
Mensajes: 7,500
felomeno es un usuario distinguidofelomeno es un usuario distinguidofelomeno es un usuario distinguido
Predeterminado Re: Algoritmos || Pon a prueba tu ingenio

Cita:
Empezado por betokscr Ver Mensaje
Eso es un ciclo for que itera x las veces indicadas en el rango que seria un entero(self.numero), entonces se iría sumando al total x+1 en cada iteración, ese +1 es porque como tu dices x empieza con 0 entonces por eso se lo agrego.

No sabia eso, las próximas respuestas lo pongo de una vez sin entrada de datos

Saludos
Creía que python era tan intuitivo como me habían dicho que era, pero no xD
Entonces tu programa está bien. El juez lo pondría mal sólo por tus impresiones a la hora de pedir el número pero el proceso está bien.

La entrada de datos si debe de estar, es decir, tu programa sí debe recibir los números, pero no tienes que imprimir nada para pedirlos, sólo leelos y ya.
  #8  
Antiguo 07-jul-2011, 07:53
Jr. Member
 
Fecha de Ingreso: noviembre-2009
Mensajes: 295
betokscr se está dando a conocer
Icon10 Re: Algoritmos || Pon a prueba tu ingenio

Cita:
Empezado por felomeno Ver Mensaje
Creía que python era tan intuitivo como me habían dicho que era, pero no xD
Entonces tu programa está bien. El juez lo pondría mal sólo por tus impresiones a la hora de pedir el número pero el proceso está bien.

La entrada de datos si debe de estar, es decir, tu programa sí debe recibir los números, pero no tienes que imprimir nada para pedirlos, sólo leelos y ya.
Si a eso me refería, la entrada de datos de parte del usuario xD

Puedes traducir el ultimo ejercicio?, no entiendo nada :S

Saludos

EDIT: Ya mis códigos están corregidos, ahora no piden los números y agregue links para ver las salidas correspondientes.

Última edición por betokscr fecha: 07-jul-2011 a las 08:08.
  #9  
Antiguo 07-jul-2011, 08:08
Avatar de felomeno
bald Tod
 
Fecha de Ingreso: abril-2007
Mensajes: 7,500
felomeno es un usuario distinguidofelomeno es un usuario distinguidofelomeno es un usuario distinguido
Predeterminado Re: Algoritmos || Pon a prueba tu ingenio

Cita:
Empezado por betokscr Ver Mensaje
Si a eso me referia, la entrada de datos de parte del usuario xD

Aquí se puede ver la salida de mi código:
http://codepad.org/CN8P9ZNw

Puedes traducir el ultimo ejercicio?, no entiendo nada :S

Saludos
Aquí está, si tienes otra duda, puedes preguntarme

[SPOILER]General Election

Descripción
La elección general se ha terminado, ahora es tiempo de contar los votos. Hay n (2<=n<=5) candidatos y m (1<=m<=100) regiones.
Dado el número de votos de cada candidato por región, determina cuál candidato es el ganador (el que tenga más votos).

Especificaciones de entrada
La primera línea de la entrada tendrá un entero T que será el número de casos

Cada caso empieza con un entero n y n que inican el número de candidatos y el número de regiones. Las siguientes m líneas contendrán n números enteros V1, V2, ... Vn que es el número de votos por candidato i.

Output Specification
Para cada caso, imprime una línea con el número del candidato ganador.

Sample Input
2
3 3
159 213 450
512 890 993
215 420 397
2 5
40 64
35 12
102 58
43 15
79 41

Sample Output
3
1

Te explicaré la entrada. Primero pone un 2, es decir, que analizarás 2 casos diferentes (en esto tienes que tener cuidado de limpiar variables y esas cosas para volver hacer el proceso)
Después te dice que hay 3 candidatos y 3 regiones
La primer línea indica la región 1 y le da 159 votos al candidato uno 213 votos al candidato dos y 450 al candidato tres
las siguientes dos líneas son respectivamente la segunda y la tercera región. Hasta ahí termina el caso y debes de dar un resultado.

Para el segundo caso te dice que son 2 candidatos y 5 regiones
En la primera línea te dice que le da 40 votos al candidato uno y 64 al candidato dos y así sucesivamente. Al terminar las 5 líneas deberás imprimir el segundo resultado.

Si quieres imprimir todos los resultados al final (n resultados, es decir el número de casos que te pidió al principio) lo puedes hacer pero tendrías q[/SPOILER]ue guardarlos, por lo que lo más recomndable es imprimir el resultado en cuanto lo tengas y después analizar el siguiente caso
  #10  
Antiguo 07-jul-2011, 08:32
Avatar de X GEu2 X
Ace Member
 
Fecha de Ingreso: marzo-2008
Ubicación: Mexico
Mensajes: 2,308
X GEu2 X se está dando a conocer
Predeterminado Re: Algoritmos || Pon a prueba tu ingenio

Cita:
Empezado por felomeno Ver Mensaje
Ahora piensa en esto. Aunque el matemático está bien, tu resultado es lineal, es decir tu programa hará tantas operaciones como el número que te den. Si te dan 100 harás 100 operaciones (un poco más contando el for, las sumas y eso). Pero hay una forma de hacerlo en 1 operación (en realidad 3 o 4 si cuentas todo, pero ya es mucho mejor). Se te ocurre cuál?
ya lo hice mucho mas corto, checalo :B
 



Temas Similares para: Algoritmos || Pon a prueba tu ingenio
Tema Autor Foro Respuestas Último mensaje
Problemas de Ingenio tynch0s Juegos 25 16-ago-2010 22:24
adivinansas y preguntas de ingenio Juliogro Cafetería 3 24-may-2009 20:12
Juegos de ingenio ---> Club requiem Clubs 8 05-ago-2008 05:13
Preguntas de ingenio!!! @nGeItOs!!!! Cafetería 4 30-nov-2007 13:39
Juego de ingenio demeter Cafetería 2 13-ago-2007 22:18


La franja horaria es GMT +1. La hora actual es: 18:24.


Powered by vBulletin®


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93