Avatar
Segadorfelix León

@segadorfelixleon

ejem={} ejem[" "]="0" ejem["s"]="7"*4 ejem["z"]="9"*4 abc="abcdefghijklmnopqrtuvwxy" for i in abc: ejem[i]=str(abc.index(i)//3+2)*(abc.index(i)%3+1) def codic(texto): codi="" for u in range(len(texto)): codi+=ejem[texto[u]] if not u==len(texto)-1: if ejem[texto[u]][0]==ejem[texto[u+1]][0]: codi+=" " return codi number=codic(input("Ponga un mensaje para T8: ")) print("\nEl número que debe presionar es: ", number)

Python es peculiarmente flexible para este tipo de ejercicios.

Avatar
Segadorfelix León

@segadorfelixleon

def tienda(cash, *elem): aux, n=0, 0 while not aux in elem: aux=cash-elem[n] n+=1 indcs=[elem.index(aux)+1, n] ; indcs.sort() print("Los elementos: ("+",".join(map(str,indcs))+") cumplen con los requisitos.")

La función recibe de argumento, el dinero disponible y el coste de los elementos directamente, porque no ví necesario usar el número de elementos en las cuentas. El proceso de búsqueda se basa en restarle el valor del elemento al dinero disponible, y luego buscar el resultado entre los valores de los elementos, con esto se tienen los indices de los dos elementos, y no se tiene que probar la suma de cada uno de ellos.

Avatar
Segadorfelix León

@segadorfelixleon

Primero que nada, un buen ejercicio en general. Sin embargo las cifras 9999994, en base:1694 son 3, 821, 312, ya que al final toca "ordenar" las cifras del número, eso tiende a ignorarse porque a fin de cuentas se va a evaluar el inverso, pero con cifras de más de una cifra particular, como es el caso, da resultado distinto.

El programa calcularía 312 821 3, lo juntaría 3128213, dando un palindromo, pero 312 821 3, no es 9999994, en esa base(1694). Es 3 821 312, la cual al juntarse es 3821312, la cual no es palindromo.

Así que hay una Fe de erratas, en el proceso de calculo original, de los números para jurados, por ignorar este aspecto (que antes de unir las cifras del número, debe invertirse la posición de las cifras)

Avatar
Segadorfelix León

@segadorfelixleon

Encontré varias formas de resolución, para los primeros valores de muestra hallan la respuesta, pero fallan con algunos de los número para jurados.

Aplique estos métodos:

*Une todas las cifras por ejemplo: en base 200, un número con cifras 2, 123, 40, quedaría: 212340, y luego verifica si es un palindromo. Es el método más veloz. Luego vi que fallaba con 9999994, el cual en base 1694 (la respuesta), es 3, 821, 312; 3821312 no es un palindromo; a menos que se "inviertan" las cifras, por ejemplo: 3, 128, 213, 3128213 si es palindromo.

*Antes de este método, ví un número de jurado con un comportamiento similar; así que compare los inversos de las cifras extremas y si la cifra central en caso de existir, también sea palindromica, al existir más comparaciones es algo más lento, pero no mucho más. Por ejemplo: 12, 44, 12, sería palindromo en este método viendo el inverso del ultimo.

*El ultimo que aplique al ver que fallaba (las cifras podían ser asimétricas, por ejemplo: 3,44,43). Fue verificar todas las posibilidades de rotaciones de cifras del número en cada base hallada. Es mucho más lento, porque los casos verificados son muchos más.

def base_convertion(num): count=1 veri=False while not veri: count+=1 c=num chan=[] while not c<count: chan.append(c%count) c//=count chan.append(c) chan.reverse() veri=palindrome(chan) if count==num: count=0 veri=True print() print("La base palindromica minima es: ", count) print("cifras: ", chan) def palindrome(otnum): cadabra=list(map(list, zip(map(str, otnum),[0 for i in otnum]))) for u in range(2**len(otnum)): lut=[] for rever in cadabra: if rever[1]==1: lut.append(rever[0][::-1]) else: lut.append(rever[0]) test="".join(lut) if test==test[::-1]: return True indc=list(list(zip(*cadabra))[1]) if indc==[1 for i in indc]: continue aux=indc.index(0) indc[aux]=1 indc=[0 for i in indc[:aux]]+indc[aux:] cadabra=list(map(list, zip(map(str, otnum),indc))) return False base_convertion(int(input("Ingrese un número: ")))

El código sigue sin dar el resultado para jurados, me dio para 9999994, la base 1447, con estas cifras: 4, 1122, 1224 (es palindromo al rotar la cifra central 4, 2211, 1224 422111224)

La cual es menor que la presente en el texto, aquí ya me pierdo con la noción de lo que se requiere como palindromo en el texto.

PD: Sé que el código puede optimizarse con itertools, pero prefería hacerlo lo más "artesanal" posible.

PD2: Para quien llegue a interesarle, explico la lógica del código:

*Se crean dos funciones, base_convertion: Transforma al número a otras bases, empezando desde el 2. En una lista con sus cifras. palindrome: Genera una lista con sub-listas compuestas por pares, la cifra convertida a string, y un cero que lo acompaña. Luego con el siguiente algoritmo:

El primer cero hallado se convierte en 1, por ejemplo: ["23",0,"2",0,"321",0,"21",0] pasa a ser ["23",1,"2",0,"321",0,"21",0] Todos los unos de derecha a izquierda del cero hallado, en caso de existir, se convierte en 0. ["23",1,"2",1,"321",0,"21",1] pasa a ser ["23",0,"2",1,"321",0,"21",1] Esto se repite 2n veces, siendo n la cantidad de cifras del número. **Las cifras con asignación 1, son invertidas.

***En cada ciclo se evalúa si es un palindromo, en caso de serlo devuelve True y corta el ciclo.

Avatar
Segadorfelix León

@segadorfelixleon

def gusanolover(a,b,c): posiciones_gusano=[b*i for i in range(int(a/b)+1)] posiciones_hojas=[c*i for i in range(int(a/c)+1)] comido=len(set(posiciones_gusano).intersection(set(posiciones_hojas))) return comido

Primero la función recibe las variables, largo de rama (a), distancia que recorre para descansar el gusano (b), y la separación de hojas contiguas (una al lado de la otra) (c).

Luego por recursividad, genera dos arrays con las posiciones que ocupa en la rama el gusano, y las posiciones de las hojas.

Y finalmente compara para saber cuantas posiciones poseen en común, como conjuntos. Tomando en cuenta que siempre comparten la posición 0.

Muy buen ejercicio de practica.

Amigos

Segadorfelix aún no tiene un enlace de referidos

Si eres estudiante premium ya tienes el enlace en tu perfil de usuario. Si aún no eres premium recibirás tu enlace de referidos como recompensa cada vez que completes un curso gratuito.

Más información

Estos son los beneficios que tú y Segadorfelix recibirán si compras con su enlace de referidos 🙌

BeneficiosMensualSemestralAnual
Descuento ()$ 3 USD$ 15 USD$ 30 USD
Semanas gratis (Segadorfelix)1612

Al comprar con el enlace de referidos aceptas los términos y condiciones

Publicaciones
Certificados
Me gusta
Referidos