1 / 7
Aug 2017

Witam,
Proszę o pomoc w rozwiązaniu następującego wyzwania związanego z tym zadaniem.
Obecnie program skraca wyraz wtedy, kiedy występują min. 3 takie same znaki obok siebie. Natomiast chciałbym stworzyć taką funkcję, do której będziemy podawać wyrazDoSkrocenia oraz to od jakiej ilości znaków ma nastąpić skrócenie. Chodzi o to aby oprócz wyrazDoSkrocenia program przyjmował drugą zmienną całkowitą o nazwie iloscZnakow określającą to, od jakiej minimalnej ilości znaków ma zacząć skracać wyraz.
Takie uniwersalne usprawnienie tego zadania.

Z góry dziękuję za pomoc.

Poniżej kod źródłowy:

[cpp]

include

include

include

include

using namespace std;

string konwersjaIntNaString(int liczba)
{
ostringstream ss;
ss << liczba;
string str = ss.str();
return str;
}
int obliczWystapieniaWybranegoZnaku(string wyraz, int pozycjaZnaku)
{
int iloscWystapien = 1;
if(wyraz.length()>pozycjaZnaku)
{
while(wyraz[pozycjaZnaku] == wyraz[pozycjaZnaku+1])
{
iloscWystapien++;
pozycjaZnaku++;
}
}
else
iloscWystapien = 0;
return iloscWystapien;
}

string skracanieWyrazow(string wyrazDoSkrocenia)
{
int dlugosc = wyrazDoSkrocenia.length();
int iloscWystapien;
char powtarzajacySieZnak;

for(int i = 0; i < dlugosc - 2; i++)
{
    if((wyrazDoSkrocenia[i] == wyrazDoSkrocenia[i+1])&&(wyrazDoSkrocenia[i+1] == wyrazDoSkrocenia[i+2]))
    {
        iloscWystapien = obliczWystapieniaWybranegoZnaku(wyrazDoSkrocenia,i);
        powtarzajacySieZnak = wyrazDoSkrocenia[i];
        wyrazDoSkrocenia.replace(i,iloscWystapien,powtarzajacySieZnak+konwersjaIntNaString(iloscWystapien));
        dlugosc = wyrazDoSkrocenia.length();
    }
}
return wyrazDoSkrocenia;

}
int main()
{
string wyraz;
cin>>wyraz;
cout<<skracanieWyrazow(wyraz)<<endl;

return 0;

}
[/cpp]

  • created

    Aug '17
  • last reply

    Aug '17
  • 6

    replies

  • 916

    views

  • 4

    users

  • 6

    links

kod na spoj-u może obejrzeć tylko osoba, która wysłała rozwiązanie i autor zadania, dla pozostałych ten link jest bezużyteczny.

wskazane jest przekazywanie kodu jako linku do ideone.com5

natomiast co do pomocy - to nie rozumiem na czym miałaby polegać - problem nie nie jest trudny, na pewno jest to znacznie łatwiej zrobić, niż rozwiązać zadanie :slight_smile:

Sorry -:slight_smile:

Może to być kiedyś ciekaw dodatkowe wyzwanie dla Ciebie , ale teraz głównym podstawowym twoim wyzwaniem-celem, powinny być:

  1. Umiejętność prawidłowego wklejania-udostępniania swojego kodu do wglądu ewentualnym pomagającym. Wystarczy "pobyć" przez chwilę tu na forum i zobaczyć jak robią to inni. Twój link jest niedostępny dla innych - jest czytelny tylko dla Ciebie.
  2. Doprowadzenie aktualnego kodu do jak największej doskonałości, a dopiero potem myśleć o dodatkowym wyzwaniu. Inaczej będzie o wiele trudniej [samodzielnie!] zmierzyć się ze swoim dodatkowym wyzwaniem.

PS
Mała podpowiedź - dla tylko jednego fragmentu kodu, więcej nie analizowałem.

Jeżeli tak wymyśliłeś przy minimum trzech jednakowych znakach, to jak chcesz to zrobić przy dowolnym większym minimum np 10? Wnniosek, musisz wymyśleć w tym miejscu inny sposób.

Dodatkowe wyzwania:

  1. Nauczyć się korzystać z ideone.com.
  2. Poczytać: http://discuss.spoj.com/search?q=flamaster
  3. Pomyśleć?
  4. Korzystać z podpowiedzi?

PS
Ten fragment jest cały czas do bani [kiepski, nieefektywny, nie reformowalny - trudny do zmiany] i nie zmienia to fakt, że masz AC lub nie i czy dodasz komentarz:

Kolega kombinuje. Czy słusznie?

Jak widać, nie. Zadanie jest de facto proste. Wyzwaniem jest ono wyłącznie dla szanownego kolegi, co sugeruje, że jest on początkowym użytkownikiem. Zadanie rozwiązane przez kolegę również jest przeznaczone dla osób początkujących

A to już absolutny dowód na brak wprawy. Zadanie faktycznie można w ten sposób utrudnić, ale po co? Sama funkcja jest trywialna, a poza tym zupełnie nieprzydatna w praktycznych sytuacjach. Dowód? Nie ma jej podanej (wprost) w funkcjach bibliotecznych.

A teraz na poważnie i bardziej bezpośrednio.

Pomysł z dodatkowym wyzwaniem jest zły z kilku względów. Po pierwsze - podołałeś trzem znakom. Podołasz więc czterem znakom, pięciu znakom, ..., a w końcu stworzysz funkcję, która Cię interesuje. Stracisz na to ileś czasu. W tym czasie możesz przerobić inne zadania i poćwiczyć bardziej interesujące operacje na stringach czy czymkolwiek innym. Możesz też, jak słusznie radzi @narbej, poprawić swój aktualny kod. Więcej wiedzy zyskasz analizując zupełnie inny problem, a nie rozwijając obecny. Powiem więcej - z każdym kolejnym dodatkowym wyzwaniem Twój problem (zaczynający się od prostych trzech znaków!) będzie coraz bardziej abstrakcyjny. Bo dlaczego użyć jednej funkcji? Czy nie lepiej stworzyć możliwie krótki kod oparty na szablonach? I nie korzystający z iostream? A może wstawka w asmie? Poświęcisz kilka godzin na doktoryzowanie się z takich tematów, a w rzeczywistości stworzysz nienadający się do użytku kod i nie zdobędziesz żadnej interesującej wiedzy ani przydatnych umiejętności. W szczególności Twój kod będzie nieczytelny, oparty na kopiowaniu rozwiązań z sieci a dodatkowo algorytmicznie wołający o pomstę do nieba (a złożoność elementarnych algorytmów operujących na stringach jest znaczna: http://eduinf.waw.pl/inf/alg/001_search/0043.php5)

Moja rada: odpuść. Jeżeli chcesz nauczyć się funkcji, możesz rozwiązać np. to http://pl.spoj.com/problems/HANG/6 zadanie. Tam funkcje rzeczywiście mogą się przydać, ich zastosowanie jest dużo bardziej naturalne niż dla abstrakcyjnego problemu, sędzia sprawdzi poprawność rozwiązania (Twoje "wyzwanie" nie będzie tak dokładnie sprawdzone), ... .

A może nie używaj jeszcze funkcji tylko goto? Swojego czasu napisałem program do analizy algorytmów sortujących, w którym proste funkcje mieszałem z goto. Program nie działa za dobrze po dziś dzień, a ja już nie używam goto :wink: To cenna lekcja i doskonały pomysł na wolny weekend.

W każdym razie odradzam Ci realizowanie Twojego pomysłu bo gdy nabierzesz większej wprawy w kodzeniu uznasz, że była to strata czasu. To trochę jak LazyFoo i jego przygody opisane w sekcji Over Engineering (http://lazyfoo.net/articles/article01/index.php) - stworzysz super hiper ultra giga fajny kod, który w rzeczywistości będzie koszmarny, pewnie nie zawsze sprawny, a Ty stracisz na niego kilka godzin i powiesz sobie "Kurde, mogłem zrobić inne zadanie na SPOJu" :wink:

(Linki daję celowo byś miał jakąś lekturę -> to też lepsze od Twojego wyzwania)