Zadanie Spoj Flamaster

0

Cześć , robię poniższe zadanie
https://pl.spoj.com/problems/FLAMASTE/
w którym na pewnym etapie się zaciąłem.

ile=int(input())

for x in range(ile):
    slowo=input()
    ile=1
    j=0
    wynik=''
    
    while(j<len(slowo)):
        ile=1
        aktualnyZnak=slowo[j]
        j+=1
        
        for s in range(j<len(slowo)):
            j+=1
            ile+=1
            
            if ile==1:
                wynik+=aktualnyZnak
            elif ile==2:
                wynik+=aktualnyZnak
                wynik+=aktualnyZnak
                
            else:
                wynik+=aktualnyZnak

Do tego zadania przyjąłem zmienną wynik-przechowującą końcowy wynik zadania, j-zmienna chodząca po słowie , i zmienna zliczająca słowa które występują po sobie i są takie same

0

A co Ci tam nie wychodzi?

0
pavarotti napisał(a):

A co Ci tam nie wychodzi?

Gdy wypisuje wynik nic nie wyskakuje , na SPOJ-u też błędna odpowiedź.

0

A nie powinieneś tej zmiennej ile zerować?

0
pavarotti napisał(a):

A nie powinieneś tej zmiennej ile zerować?

no nie , jak wprowadzam pierwszy raz jakąś literkę , to ona liczy się jako '1'

0

A nie zapomniałeś wypisać wynik? :)

0
nalik napisał(a):

A nie zapomniałeś wypisać wynik? :)

:) Nie

1

Tak na szybko, pomijajac Twoj algorytm, mozesz zrobic chyba taki pseudo-online algorytm:

  1. Wczytujesz po jednym znaku z wejscia
  2. Jesli znak jest identyczny jak poprzedni wczytany to inkrementujesz licznik
  3. Jesli znak jest inny to natychmiast wypisujesz Znak+liczba i podmieniasz wartosci na nowy znak i jedno wystapienie
1

Ehh, to źle wkleiłeś kod. Trudno sprawdzić co nie działa, skoro nie ma części kodu ... Niedbalstwo.

To na pewno działa

n = int(input())
for _ in range(n):
    word = input()
    word_len = len(word)
    short = []
    count = 0
    for i, _ in enumerate(word):
        count += 1
        if i == word_len-1 or word[i] != word[i+1]:
            if count <= 2:
                short += [word[i] * count]
            else:
                short += [word[i], str(count)]
            count = 0
    print("".join(short))
1
import re,sys;next(sys.stdin);{print(end=re.sub(r'(.)\1{2,}',lambda m:m[1]+
str(len(m[0])),ln))for ln in sys.stdin}
0
nalik napisał(a):

Ehh, to źle wkleiłeś kod. Trudno sprawdzić co nie działa, skoro nie ma części kodu ... Niedbalstwo.

To na pewno działa

n = int(input())
for _ in range(n):
    word = input()
    word_len = len(word)
    short = []
    count = 0
    for i, _ in enumerate(word):
        count += 1
        if i == word_len-1 or word[i] != word[i+1]:
            if count <= 2:
                short += [word[i] * count]
            else:
                short += [word[i], str(count)]
            count = 0
    print("".join(short))

Dzięki za hiperbłyskawiczną odpowiedź , mam jeszcze pytanko odnośnie powyższego kodu a dokładnie tej części:

 if i == word_len-1 or word[i] != word[i+1]:

jeśli i==word_len-1 da zawsze TRUE i czy i word[i] też zawsze jest różny od word[i+1] bo word[i+1] wychodzi już poza zakres. Czyli ten warunek zawsze się spełni tak ?
Kurde chciałbym tak szybko z palca klepać takie algorytmy .

1

w ramach ćwiczeń pisanie w stylu "pythonic".
Pewnie da się to zrobić jeszcze bardziej "pythonic", więc jak ktoś zna lepiej Pythona chętnie zobaczę.

https://ideone.com/mFj1hT

import itertools

def count_generator(s):
	return sum(1 for _ in s)

def rle_encode(s):
	for key, items in itertools.groupby(s):
		n = count_generator(items)
		if n == 1:
			yield f"{key}"
		elif n == 2:
			yield f"{key}{key}"
		else:
			yield f"{key}{n}"

for _ in range(int(input())):
	s = input().strip()
	print("".join(rle_encode(s)))
2

czy bardziej pythonic to nie wiem, ale chetniej bym to zrobila tak:

def rle_encode(s):
	for key, items in itertools.groupby(s):
		n = len(list(items))
		yield key * n if n < 3 else key + str(n)
0
if i == word_len-1 or word[i] != word[i+1]:

Możecie mi dokładnie wytłumaczyć tą linijkę kodu? ten 'if' zawsze zwróci TRUE tak ?

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