3 votos

Problema interesante...

Ordenar las siguientes letras del alfabeto según cantidad de apariciones, de mayor a menor (en caso de empate, considerar órden alfabético). La respuesta debe estar en minúscula y sin letras repetidas.

rfGjnVCzqaIXuFTLfvTSVqjhlXzTUdfQzTYYJLDNWfFDiuiukjMTmPiscqQkmkKeqlKTcMlHSiAUeTrzraYraDPNhmDbIRsjDhWvFpjbNspFhUVUOTVozwvRpknJgLvCiHNewTMTvDDdFsNgdLKhSQMbvbmxDCUyOqisfzXEFkCOHRKHMbpBRNaaerQaVPdnVSOPCcy

Bueno mi pregunta es : ¿Como lo harias de la manera mas corta?

#! /usr/bin/env python3
Cadena1 = "rfGjnVCzqaIXuFTLfvTSVqjhlXzTUdfQzTYYJLDNWfFDiuiukjMTmPiscqQkmkKeqlKTcMlHSiAUeTrzraYraDPNhmDbIRsjDhWvFpjbNspFhUVUOTVozwvRpknJgLvCiHNewTMTvDDdFsNgdLKhSQMbvbmxDCUyOqisfzXEFkCOHRKHMbpBRNaaerQaVPdnVSOPCcy"
Cadena = Cadena1.lower()

list = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','z','y']
canta = 0
cantb = 0
cantc = 0
cantd = 0
cante = 0
cantf = 0
cantg = 0
canth = 0
canti = 0
cantj = 0
cantk = 0
cantl = 0
cantm = 0
cantn = 0
canto = 0
cantp = 0
cantq = 0
cantr = 0
cants = 0
cantt = 0
cantu = 0
cantv = 0
cantw = 0
cantx = 0
canty = 0
cantz = 0

for x in Cadena:
    if(x == list[0]):
        canta +=1
        a= canta
    elif(x == list[1]):
        cantb += 1
        b= cantb
    elif(x == list[2]):
        cantc += 1
        c= cantc
    elif(x == list[3]):
        cantd += 1
        d= cantd
    elif(x == list[4]):
        cante += 1
        e= cante
    elif(x == list[5]):
        cantf += 1
        f= cantf
    elif(x == list[6]):
        cantg += 1
        g= cantg
    elif(x == list[7]):
        canth += 1
        h= canth
    elif(x == list[8]):
        canti += 1
        i= canti
    elif(x == list[9]):
        cantj += 1
        j= cantj
    elif(x == list[10]):
        cantk += 1
        k= cantk
    elif(x == list[11]):
        cantl += 1
        l= cantl
    elif(x == list[12]):
        cantm += 1
        m= cantm
    elif(x == list[13]):
        cantn += 1
        n= cantn
    elif(x == list[14]):
        canto += 1
        o= canto
    elif(x == list[15]):
        cantp += 1
        p= cantp
    elif(x == list[16]):
        cantq += 1
        q= cantq
    elif(x == list[17]):
        cantr += 1
        r= cantr
    elif(x == list[18]):
        cants += 1
        s= cants
    elif(x == list[19]):
        cantt += 1
        t= cantt
    elif(x == list[20]):
        cantu += 1
        u= cantu
    elif(x == list[21]):
        cantv += 1
        v= cantv
    elif(x == list[22]):
        cantw += 1
        w= cantw
    elif(x == list[23]):
        cantx += 1
        x= cantx
    elif(x == list[24]):
        canty += 1
        y= canty
    elif(x == list[25]):
        cantz += 1
        z = cantz

list1 = [canta, cantb, cantc, cantd, cante, cantf, cantg, canth, canti ,cantj, cantk, cantl, cantm, cantn, canto, cantp, cantq, cantr, cants, cantt, cantu ,cantv, cantw, cantx, canty, cantz]

Lista_ordenada = sorted(list1,reverse = True)

print Lista_ordenada

Ese fue mi desarrollo se que no se ve muy bien disculpen eso .

Muy aparte , No importa en que lenguaje lo desarrolles , Solo me gustaria ver la logica que emplean ya que no se me ocurre una idea de hacerlo mas corto. Muchas gracias , Buenas noches.

3voto

ArtEze Puntos 285

Sería como lo que voy a poner a continuación. El algoritmo de la búsqueda no está del todo bien.

Edit: Ahora lo mejoré, pero no me funciona, me devuelve un array vacío.

Edit 2: Ya funciona.

function abecedarioMinúscula()
{
    var abecedario="ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
    return abecedario.toLowerCase()
}
function comparaLetras(A,B)
{
    var a=0
    var b=0
    var abecedario=abecedarioMinúscula()
    for(var i=0;i<abecedario.length;i++)
    {
        if(abecedario[i]==A){a=i}
        if(abecedario[i]==B){b=i}
    }
    var res
    if(a==b){res="="}
    if(a<b){res="<"}
    if(a>b){res=">"}
    return res
}
function comparaNúmeros(A,B)
{
    var res
    var a=A[1]
    var b=B[1]
    if(a==b){res=comparaLetras(A[0],B[0])}
    if(a<b){res="<"}
    if(a>b){res=">"}
    return res
}
function buscar(A,valor)
{
    var res=-1
    for(var i=0;i<A.length;i++)
    {
        if(A[i]==valor)
        {
            res=i
            break
        }
    }
    return res
}
function búsquedaBinaria(A,valor,compara)
{
    var mínimo=0, máximo=A.length,centro=-1
    while(mínimo<máximo)
    {

        centro = Math.floor( (mínimo+máximo)/2 )
        valorMedio = A[centro]
        if(compara(valorMedio,valor)==">")
        {
            mínimo=centro+1
        }
        else
        {
            máximo=centro
        }
    }
    return centro
}
function insertar(A,pos,valor,compara)
{
    var B=[]
    if(!valor){valor=0}
    if(!A.length){B[B.length]=valor}
    for(var i=0;i<A.length;i++)
    {
        B[B.length]=A[i]
        if(i==pos)
        {
            B[B.length]=valor   
            if(compara( B[B.length-2],B[B.length-1] )=="<")
            {
                var c=B[B.length-2]
                B[B.length-2]=B[B.length-1]
                B[B.length-1]=c
            }
        }
    }
    return B
}
function ordenar(A,compara)
{
    var B=[]
    for(var i=0;i<A.length;i++)
    {
        var valor=A[i]
        var pos=búsquedaBinaria(B,valor,compara)
        B=insertar(B,pos,valor,compara)
    }
    return B
}
function xCeros(x)
{
    var A=[]
    for(var i=0;i<x;i++)
    {
        A[i]=0
    }
    return A
}
function mezclar(A,B)
{
    var res=[]
    for(var i=0;i<A.length;i++)
    {
        res[i]=[A[i],B[i]]
    }
    return res
}
function frecuencias(cadena)
{
    cadena=cadena.toLowerCase()
    var abecedario=abecedarioMinúscula()
    var apariciones=xCeros(abecedario.length)
    for(var i=0;i<cadena.length;i++)
    {
        var letra=cadena[i]
        var pos=buscar(abecedario,letra)
        apariciones[pos]++
    }
    var res=mezclar(abecedario,apariciones)
    return ordenar(res,comparaNúmeros)
}
JSON.stringify(frecuencias("rfGjnVCzqaIXuFTLfvTSVqjhlXzTUdfQzTYYJLDNWfFDiuiukjMTmPiscqQkmkKeqlKTcMlHSiAUeTrzraYraDPNhmDbIRsjDhWvFpjbNspFhUVUOTVozwvRpknJgLvCiHNewTMTvDDdFsNgdLKhSQMbvbmxDCUyOqisfzXEFkCOHRKHMbpBRNaaerQaVPdnVSOPCcy"))

El resultado es este.

[["v",12],["d",12],["f",11],["t",10],["s",9],["r",9],["q",9],["n",9],["m",9],["k",9],["h",9],["u",8],["p",8],["i",8],["c",8],["l",7],["j",7],["a",7],["z",6],["b",6],["y",5],["o",5],["e",5],["x",4],["w",4],["g",3],["ñ",0]]

0 votos

Ya está, pero supongo que lo querías en Python o Java.

2voto

ArtEze Puntos 285

La misma respuesta, pero para python, que es el lenguaje en el que lo has presentado.

#! /usr/bin/env python3

def abecedarioMinuscula():
    abecedario="ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
    return abecedario.lower()

def comparaLetras(A,B):
    a=0
    b=0
    abecedario=abecedarioMinuscula()
    for i in abecedario:
        if abecedario[i]==A:
            a=i
        if abecedario[i]==B:
            b=i
    if a==b:
        res="="
    if a<b:
        res="<"
    if a>b:
        res=">"
    return res

def comparaNumeros(A,B):
    a=A[1]
    b=B[1]
    if a==b:
        res=comparaLetras(A[0],B[0])
    if a<b:
        res="<"
    if a>b:
        res=">"
    return res

def buscar(A,valor):
    res=-1
    for i in A:
        if A[i]==valor:
            res=i
            break
    return res

def busquedaBinaria(A,valor,compara):
    minimo=0
    maximo=len(A)
    centro=-1
    while minimo<maximo:        
        centro = Math.floor( (minimo+maximo)/2 )
        valorMedio = A[centro]
        if compara(valorMedio,valor)==">":
            minimo=centro+1
        else:
            maximo=centro
    return centro

def insertar(A,pos,valor,compara):
    B=[]
    if !valor:
        valor=0
    if len(A)==0:
        B.append(valor)
    for i in A:
        B.append(A[i])
        if i==pos:
            B.append(valor)
            if compara( B[B.length-2],B[B.length-1] )=="<":
                c=B[B.length-2]
                B[B.length-2]=B[B.length-1]
                B[B.length-1]=c
    return B

def ordenar(A,compara):
    B=[]
    for i in A:
        valor=A[i]
        pos=busquedaBinaria(B,valor,compara)
        B=insertar(B,pos,valor,compara)
    return B

def xCeros(x):
    A=[]
    for i in x:
        A[i]=0
    return A

def mezclar(A,B)
    res=[]
    for i in A:
        res[i]=[A[i],B[i]]
    return res

def frecuencias(cadena):
    cadena=cadena.toLowerCase()
    abecedario=abecedarioMinuscula()
    apariciones=xCeros( len(abecedario) )
    for i in cadena:
        letra=cadena[i]
        pos=buscar(abecedario,letra)
        apariciones[pos]++
    res=mezclar(abecedario,apariciones)
    return ordenar(res,comparaNumeros)

print frecuencias("rfGjnVCzqaIXuFTLfvTSVqjhlXzTUdfQzTYYJLDNWfFDiuiukjMTmPiscqQkmkKeqlKTcMlHSiAUeTrzraYraDPNhmDbIRsjDhWvFpjbNspFhUVUOTVozwvRpknJgLvCiHNewTMTvDDdFsNgdLKhSQMbvbmxDCUyOqisfzXEFkCOHRKHMbpBRNaaerQaVPdnVSOPCcy")

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X