Autor Tema: Desafío Algoritmico  (Leído 14240 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Desafío Algoritmico
« en: Junio 24, 2015, 11:05:06 pm »
Esto mensaje lo expuso un amigo y lo republico aqui a ver quien la hace, dice:


Les voy a proponer un desafío algoritmico no tan dificil, pero quizás tengan que pensar un poco.

Tenemos un número, por ejemplo 49 y además dos símbolos: A y B.
A significa "multiplica por uno" y B significa "multiplica por dos".

Si escribo una cadena de símbolos A y B, por el orden en que se escriban "el peso" va a ir aumentando como en los números binarios, es decir el primero va a valer 2^0 el segundo 2^1 el tercero 2^2 y así sucesivamente.

Para escribir el 49 debemos escribir:

A B A A B

Según los pesos, los números serían:

A B A A B
1  2 4 8 16 (sólo pesos)

Pero como B es el símbolo que siempre multiplica por 2, tenemos:

A B A A B
1  4 4  8 32

Donde  1+4+4+8+32 = 49 que es correcto.

El reto es crear un algoritmo que sirva para cualquier numero, encontrar su representación en símbolos A y B.
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Desafío Algoritmico
« Respuesta #1 en: Junio 26, 2015, 01:54:44 am »
nadie?
Me encuentras en YAcosta.com

79137913

  • Megabyte
  • ***
  • Mensajes: 185
  • Reputación: +21/-4
  • 4 Esquinas
    • Ver Perfil
    • Eco.Resumen Resumenes Cs. Economicas
Re:Desafío Algoritmico
« Respuesta #2 en: Junio 26, 2015, 03:12:06 pm »
HOLA!!!

No le veo la dificultad, ya que con un bin2dec y todas A el problema estaria resuelto.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*                                                          Resumenes Cs.Economicas

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Desafío Algoritmico
« Respuesta #3 en: Junio 27, 2015, 03:30:13 pm »
HOLA!!!

No le veo la dificultad, ya que con un bin2dec y todas A el problema estaria resuelto.

GRACIAS POR LEER!!!

Respuesta Incorrecta papa
Me encuentras en YAcosta.com

amaldonado

  • Bit
  • Mensajes: 5
  • Reputación: +1/-0
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #4 en: Junio 27, 2015, 04:00:41 pm »
HOLA!!!

No le veo la dificultad, ya que con un bin2dec y todas A el problema estaria resuelto.

GRACIAS POR LEER!!!

No, el problema no dice que codifiques en binario y luego reemplaces unos por A y ceros por B.
Esta es una codificación totalmente diferente a la codificación binaria (por ello es un desafío algorítmico)

Para ilustrártelo mejor, verifica el ejemplo que te proporcionaron:

El número 49 está codificado como ABAAB (longitud 5)
El número 49 en binario es: 110001 (longitud 6)

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #5 en: Junio 27, 2015, 09:06:44 pm »
interesante para pensar un rato después me pongo haber si me sale,
para que se entienda dejo esta tabla hasta el numero 15

A   1
B   2
AA   3
BA   4
AB   5
BB   6
AAA   7
BAA   8
ABA   9
BBA   10
AAB   11
BAB   12
ABB   13
BBB   14
AAAA   15

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #6 en: Junio 27, 2015, 11:21:08 pm »
Con el numero que queres, haces esto en un bucle:
Si el numero es par, restarle 2. Si es impar, restarle 1. (esto indica la LETRA de este digito, A si es impar, B si es par).
Al resultado, dividirlo por 2.
Y volver hasta arriba, hasta que el resultado de la division resulte 1 o 0 (si es 1 la primer letra es A, y si es 0 indica que es B).

Tener en cuenta que los digitos que devuelve el bucle son LIFO (el que primero entra, es el ultimo en salir)
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #7 en: Junio 28, 2015, 12:44:43 am »
Como seria eso coco?? me perdi  :-\

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #8 en: Junio 28, 2015, 12:54:43 am »
Código: (vb) [Seleccionar]
Private Function ChangeBaseBizarra(ByVal lNumero As Long) As String
    Do
        '// es impar?
        If lNumero And 1 Then
            '// si, es impar, agregar una A
            ChangeBaseBizarra = ChangeBaseBizarra & "A"
            '// decrementar en 1 al numero (volver a un numero par y de paso bajar el orden)
            lNumero = lNumero - 1
        Else
            '// no, es par, agregar una B
            ChangeBaseBizarra = ChangeBaseBizarra & "B"
            '// decrementar 2 unidades (bajar el orden)
            lNumero = lNumero - 2
        End If
       
        lNumero = lNumero / 2
    Loop While Not (lNumero <= 0)
End Function

Resulta que esta idea me salió pensando que el primer "digito" sale de saber si es par o impar nada mas... Asi que simplemente viendo si el numero es impar o par, restando 1 o 2 (depende si es par o impar) y dividiendo por 2, puedo repetir el proceso, ya que "le bajo el orden" (seria el exponente de 2^n, donde n es el exponente). y resulta que funciona asi!
« última modificación: Junio 28, 2015, 12:57:04 am por coco »
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #9 en: Junio 28, 2015, 01:08:40 am »
Buena Coco entonces  Argentina = 1 chile = 0  :D

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Desafío Algoritmico
« Respuesta #10 en: Junio 28, 2015, 01:29:18 am »
Buena Coco entonces  Argentina = 1 chile = 0  :D

Y el lunes Chile también quedara en CERO!!!  ...espero  :-)
Me encuentras en YAcosta.com

amaldonado

  • Bit
  • Mensajes: 5
  • Reputación: +1/-0
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #11 en: Junio 28, 2015, 01:47:09 am »
Coco estaba tibio con la respuesta, pero parte de la respuesta es explicar de una manera concreta como solucionarlo y como estaba muy cerca, les regalo la solución:

La clave para resolver este problema es "recursión", veamos porque:

Vamos a generar una tabla de números para observar el patrón de generación:

1   A
2   B
3   AA
4   BA
5   AB
6   BB
7   AAA
8   BAA
9   ABA
10   BBA
11   AAB
12   BAB
13   ABB
14   BBB
15   AAAA
16   BAAA
17   ABAA
18   BBAA
19   AABA
.
.
.

Ok, lo primero que notamos es que hay un patrón y está clarísimo.
Lo primero más obvio es notar que cuando un número es par, empieza en B, y cuando es impar empieza en A.
Lo que quizás tome un poco más de tiempo descubrir es que un patrón viejo se repite agregándole una A o una B segun sea par o impar, observemos el patrón generado por ejemplo por el número 4 = BA, ahora miremos el patrón del número 9 = ABA y ahora el del número 19 = AABA.

Si queremos resolver el patrón para el 19 (AABA), primero ponemos una "A" (porque es impar) y luego ponemos a continuación el patrón del 9 (ABA), para resolver el patrón del 9 (ABA) ponemos una "A" (porque es impar) y ponemos a continuación el patrón del 4 (BA). Para resolver el patrón del 4 (BA) ponemos una "B" (porque es par) y luego ponemos el patrón del 1 (A). Y ya sabemos resolver el patrón del 1 a ojos cerrados.

Es decir, para el patrón de cualquier número, primero debemos resolver patrones de números anteriores, y luego concatenarlos hasta llegar al caso base. Para este algoritmo el caso base (a ojos cerrados) es cuando es 1 = A y 2 = B.

Por lo tanto necesitamos una función que se llame a sí misma (recursiva) para que calcule los valores pasados, hasta que sea tan obvio de calcular que tire la respuesta inmediata (caso base).

Pero como saber que numero le corresponde calcular previamente para resolver por ejemplo 19?

Aqui otra vez pensamos si hay alguna relación:

En el ejemplo anterior:

Para calcular el 19, necesitamos el 9.      (19=AABA y 9=ABA)
Para calcular el 9, necesitamos el 4.      (9=ABA y 4=BA)
Y por ejemplo para calcular el 17 necesitamos el 8.   (17=ABAA y 8=BAA)

Entonces la relación es (n-1)/2
Nótese que esto funciona para los números impares... y para los pares? veamos la tabla y observamos que:

Para calcular el 8, necesitamos el 3.      (8=BAA y 3=AA)
Para calcular el 10, necesitamos el 4.      (10=BBA y 4=BA)
Para calcular el 16, necesitamos el 7.      (16=BAAA y 7=AAA)

Entonces la relación es (n-2)/2

Ok entonces ya tenemos un algoritmo, pero como hacemos la función recursiva? De la siguiente manera:

A tener en cuenta:
* El caso base: cuando n =1 o n =2 vale A y B respectivamente
* Si n es impar, calcula primero el valor de (n-1)/2 y luego concaténalo con "A".
* Si n es par, calcula primero el valor de (n-2)/2 y luego concaténalo con "B".

El pseudocódigo:
Funcion calcula(entero n)
inicio_funcion
   si (n = 1) retorna "A"
   si (n = 2) retorna "B"
   si (n>=3)
      si (n es impar)
         retorna "A" concatenado con calcula((n-1)/2)
      si (n es par)
         retorna "B" concatenado con calcula((n-2)/2)
   
fin_funcion

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #12 en: Junio 28, 2015, 02:31:43 am »
Hola "amaldonado". Sin ningun tipo de bronca ni ofensas, mi explicación resulta mas valida que la que expones vos "usando patrones". Lo digo en base a que dijiste que  la mia era "una explicacion tibia", cuando en realidad la matematica respalda la misma.

Te adjunto un .pdf que me tomé la molestia de hacer tan solo explicando que matematica resulta estar atras de todo esto.
Explicacion.pdf

Recomiendo que lo lean los interesados.
Saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

amaldonado

  • Bit
  • Mensajes: 5
  • Reputación: +1/-0
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #13 en: Junio 28, 2015, 02:57:04 am »
Hola "coco"

Un poco tarde tu explicación no crees?, claro después de haberlo explicado yo eficientemente.
Bueno, suerte en el próximo desafío :)

Por cierto, te contradices un poquito cuando dices "mi respuesta es más válida" para luego decir "la matemática es la misma", como evalúas algo más valido que otro?
« última modificación: Junio 28, 2015, 03:08:52 am por amaldonado »

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Desafío Algoritmico
« Respuesta #14 en: Junio 28, 2015, 03:02:18 am »
Hola, no quise subir un pdf antes porque me parecia que la idea era simplemente buscar un algoritmo (leer post original por las dudas que no quede claro lo que pedia el desafio!), a pesar que la matematica ya la tenia hecha (Yvan lo sabe, lo discuti con el por whatsapp).

Vos no lo explicaste eficientemente desgraciadamente. Simplemente propusiste una explicacion trivial.

La proxima que desafies a alguien con un problema matematico tené en cuenta que una explicacion trivial con"patrones" no tiene el mismo sustento que las ecuaciones genericas (como las que usé yo). (excepto claro está, que tus patrones cumplan con las leyes de induccion matematica, y puedas demostrarlo).

Saludos!

'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion