Obliczenie ilości znaków [FLAMASTE - Spoj]

0

Cześć. Dzisiaj chciałbym zapytać o zadanie ze SPOJ w którym należy obliczyć ile razy dany znak pojawił się we wprowadzonym ciągu znaków przy założonym warunku (Zadanie)
Zadanie zrobiłem tak:

C = int(input())
for i in range(1, C + 1):
    zdanie = input()
    alfabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    policz = ""
    for char in alfabet:
        if char in zdanie:
            k = zdanie.count(char)
            if k > 2:
                policz += str(char) + str(k)
            else:
                policz += str(char) * k
    print(policz, end="\n")

Przy sprawdzeniu przykładów ze strony otrzymuję prawidłowe wyniki ale mimo to SPOJ nie chce tego zadania zaliczyć. Gdzie robię błąd?

1

Nie zrozumiałeś zadania. To, że w przykładach litery są w porządku leksykograficznym to przypadek (bądź, co bardziej prawdopodobne, celowe zagranie). To co masz zrobić to wariant run-length encoding. Np dla wejścia "AAABBAAA" masz wypisać "A3BBA3".

0
Wibowit napisał(a):

Nie zrozumiałeś zadania. To, że w przykładach litery są w porządku leksykograficznym to przypadek (bądź, co bardziej prawdopodobne, celowe zagranie). To co masz zrobić to wariant run-length encoding. Np dla wejścia "AAABBAAA" masz wypisać "A3BBA3".

Kurcze, nie pomyślałem o takim wariancie. Spróbuję tak zrobić i napiszę czy działa

1
def flamaster(string):
    char = string[0] #Do zabezpieczenia przed cyframi
    counter =  0
    result = ""
    for ind, ch in enumerate(string,0):
        if ch.isalpha():
            if ch is char:
                counter += 1
            else:
                if counter > 2:
                    result += string[ind-1]+str(counter)
                    counter = 1
                    char = ch
                else:
                    result += string[ind-1]*counter
                    counter = 1
                    char = ch
    else:
        if counter > 2:
            result += string[ind-1]+str(counter)
        else:
            result += string[ind-1]*counter
    return result

print(flamaster("AAABBBAABBBBAAA"))

To najprostsze, niezoptymalizowane rozwiązanie, musisz się nieco pobawić by to skrócić i uprościć, ale mniej więcej o to chodzi. Oczywiście da się to jeszcze zrobić w wersji jednolinijkowej z rekurencją, ale warto pozostawić czytelność ;p. (Ah i jeszcze musisz sobie poprawić char żeby dla stringa gdzie ciąg początkowych znaków jest cyframi, nie brał ci cyfr)

0

Wibowit, Guaz dzięki za pomoc. Nie potrafię sam zrobić tego zadania. Wrócę do niego kiedyś jak będę umiał więcej

1

Wydaje mi się że ten powinno być prostsze do zrozumienia



def flamaster(napis):
    wynik = ""
    pop = ""
    licznik = 1

    def dodaj(pop, licznik):
        if licznik == 1:
            return pop
        if licznik == 2:
            return pop + pop
        if licznik >= 3:
            return pop + str(licznik)
        return ""

    for znak in napis:
        if znak == pop:
            licznik += 1
        else:
            wynik = wynik + dodaj(pop, licznik)
            pop = znak
            licznik = 1
    return wynik + dodaj(pop, licznik)


ile = int(input())
for i in range(ile):
    linia = input().rstrip("\n")
    print(flamaster(linia))
1
def flamaster(s):
    string = ''.join([char for char in s if not char.isdigit()])   #Pozbywa się cyfr
    letters = [string[0]]
    numbers = [0]
    index = 0
    
    for char in string:
        if char == letters[index]:
            numbers[index] += 1
        else:
            letters.append(char)
            numbers.append(1)
            index += 1
            
    output = ''
    for num in numbers:
        if num == 1:
            output += letters[numbers.index(num)]
        elif num == 2:
            output += 2 * letters[numbers.index(num)]
        else:    
            output += letters[numbers.index(num)] + str(num)
        
    return output

print(flamaster('123AAABBBAABBBBCAAA'))

1 użytkowników online, w tym zalogowanych: 0, gości: 1