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

Obliczenie ilości znaków [FLAMASTE - Spoj]
M1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • 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:około 20 lat
  • Ostatnio:około 12 godzin
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".


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
M1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • 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:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
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)


Linux Mint
Arduino / Python 3.5.2
M1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • 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:prawie 14 lat
  • Ostatnio:około 9 godzin
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))
edytowany 1x, ostatnio: sig
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.