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

Obliczenie ilości znaków [FLAMASTE - Spoj]
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
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:

Kopiuj
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?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
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".

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
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

Guaz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Częstochowa
  • Postów: 220
1
Kopiuj
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)

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

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

SI
  • Rejestracja: dni
  • Ostatnio: dni
1

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

Kopiuj


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))
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
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'))

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.