• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Polski SPOJ - zadanie pt Pisak -> uwaga spojler! (C++)

Object Storage Arubacloud
0 głosów
358 wizyt
pytanie zadane 19 lipca 2017 w SPOJ przez Jakub 0 Pasjonat (23,120 p.)

witam , pytanie dotyczy dość  trudnego jak dla mnie zadania z serwisu SPOJ : http://pl.spoj.com/problems/FLAMASTE/

jego celem jest odpowiednie zmodyfikowanie i skrócenie napisu ,treść w linku . Program jako tako wygodnie mi się pisało jednak co zgadniecie jest problem :) ,mianowicie kiedy na wejściu wpisze więcej niż jeden znak to program

się wysypuję

 

.

wiem że w natłoku informacji mogłem się pomieszać albo ten kod jest kompletnie bez sensu . Oczywiści sam poszukuje błędu ale taki kiepski ze mnie programista więc proszę o pomoc .
 

z góry dziękuje i pozdrawiam

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    int c;
    cin>>c;

    for(int i=0; i<c; i++) //dla iloscy prob
    {
        string word;
        cin>>word; //wczytujemy slowo

        char _char=word[0];//na poczatek jest pokazywany zerowy znak
        int counter = 0; //liczy ilosc znakow

        for(int w=1; w<word.length(); w++)
        {
            if(word[i]==_char) //jezeli jest taki sam jak poprzedni znak
            {
                counter++; //licznik++;
                word.erase(word[i],word[i]); //usowamy ta  litere
            }
            else
            {
                if(counter<=1) //jezeli byl tylko jeden znak
                {
                    string bufor; //bufor
                    bufor.push_back(_char); //wkladamy do niego znak
                    word.insert(word[i],bufor); //wkladamy tan znak
                }
                else //jezeli wiecej
                {
                    ostringstream ss; //calosc konwertuje inta na char
                    ss << counter;
                    string counter_str = ss.str();
                    char cc = counter_str[0];

                    string bufor; //taka samy sytuacja jak predtem ale najpierw wkładamy ilosc znakow a potem sam znak
                    bufor.push_back(cc);
                    bufor.push_back(_char);

                    word.insert(word[i],bufor); //wkladamy
                }

                _char = word[i]; //znak ma nowa wartosc
                counter=0; //zerujemy licznik
            }
        }

        cout<<word<<endl; //wyswietlamy tekst po modufikacji

    }

    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 19 lipca 2017 przez Maciek414 Obywatel (1,080 p.)
wybrane 19 lipca 2017 przez Jakub 0
 
Najlepsza
Na wstępie zaznaczam, że też jestem początkującym.

znalazłem kilka zastanawiających rzeczy:

Funkcja word.erase(,) powinna przyjąć jako pierwszy argument miejsce od którego ma usuwać a jako drugi ilość elementów do usunięcia np word.erase(0,1).

W pętli "for(int w=1; w<word.length(); w++)" usuwasz elementy string'a "word" co zmniejsza jego długość (word.length()) a więc i powtórzenia tej pętli. Wydaje mi się, że w tym przypadku nie jest to pożądane.

Funkcja word.insert( , ) jako pierwszy argument przyjmuje miejsce w stringu gdzie ma zostać wstawiony znak.

 

Mam wrażenie, że zabrałeś się do tego zadania od trudniejszej strony. Może zamiast modyfikować string zajmiesz się po prostu liczeniem powtórzeń i wypisywaniem. Sprawdzaj po kolei literki i zliczaj ile jest takich samych obok siebie bez żadnego kombinowania na stringu.

Jeśli masz jakieś pytania to pisz, postaram się pomóc (oczywiście na miarę moich możliwości ;p)
komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki ,w sumie zauważyłeś ciekawe rzeczy . Postaram się napisać to zadanie jeszcze raz  Wpadłem na pomysł żeby zamiast edytować ten napis to tworzyć nowy w tej skróconej formie . Jak coś to będę pisał  :)
1
komentarz 19 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
to zadanie mozna zrobic w 25 linijkach takze nie kombinuj az tak ;)
komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)

a ja zrobiłem w 55 linijkach ): Wiem ,kod wspaniały nie jest ale przynajmniej działa  :

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    int c;
    cin>>c;

    for(int i=0; i<c; i++)
    {
        string word;
        cin>>word;

        string ratunek = "r"; //PONIEWAZ PETLA NIE ZPRAWDZA OSTATNIEJ WARTOSCI *-* TO DO NAPISU DOLOZYLEM JESZCZE COS W RODZAJU NULL

        word+=ratunek;

        int counter = 1;
        char znak = word[0];
        string word2;

        for(int w=1; w<word.length(); w++) //*-* NIE MOGE DAC <= BO WTEDY WYSTAPI BLAD PRZY ZNAK=WORD[W];
        {
            if(word[w]==znak)
            {
                counter++; //TO JUZ DRUGI TAKI SAM ZNAK WIEC LICZNIK WYNIESIE 2
            }
            else
            {
                ostringstream ss; //KONWERTUJEMY LICZNIK NA STRING
                ss << counter;
                string str1 = ss.str();

                string str2; //MINUS JEDEN BO TERAZ ZNALEZLISMY NOWA LITERE A CHCEMY W TYM MOMENCIE PRACOWAC NA POPRZEDNIEJ
                str2.push_back(word[w-1]);

                if(counter>1){word2 = word2 + str1 + str2;}
                else{word2 = word2 + str2;}


                ////////////////PORA OCZYSCIC
                znak=word[w];
                counter=1;
                /////////////// ZNAK PRZYJMUJE WARTOSC TEJ TABLICY W NAPISIE A LICZNIK WYNOSI 1
            }
        }
        cout<<word2<<endl;
    }

    return 0;
}

 

komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
oczywiście sędzia mi nie zaakceptował : Błędna odpowiedź
komentarz 19 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
twoj kod nawet nie przechodzi testow z przykladu
komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
Aaa ,miało chyba najpierw pokazać literę a potem cyfre
+1 głos
odpowiedź 19 lipca 2017 przez Maciek414 Obywatel (1,080 p.)
Wydaje mi się, że nie uwzględniasz tego, że przy ostatnim znaku funkcja else się nie wykona.
komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)

a to niby czemu miała by się nie wykonać ? Mi akurat else działa ok np:

podam->aass

i na wyjściu program wypisze mi a2s2 - wykonała się

możliwe że źle zrozumiałem ,jak coś to mnie popraw

komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
nie rozumiem tylko czemu w tabelce z przykładowymi danymi na stronie napis OPSS pozostaje taki a nie zmienia się na OPS2
1
komentarz 19 lipca 2017 przez Maciek414 Obywatel (1,080 p.)
Wybacz, rzuciłem na to okiem i wydawało mi się, że się nie wykona ale potem jak sprawdziłem to faktycznie się wykonuje. Mój błąd ^^
komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
spoko ,ja już dzisiaj jestem padnięty po całym dniu walki z tym algorytmem . A najgorsze że to jest zadanie zaliczane do łatwych . Nie wiem czy będzie ze mnie kiedykolwiek chociaż mega słaby developer ):
komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
mi niby działa ale sędzia mi nie akceptuje
komentarz 19 lipca 2017 przez Maciek414 Obywatel (1,080 p.)
treść zadania "jeśli miała zamiar napisać więcej niż dwie takie same literki ". czyli jak są dwie takie same to ma zostać a jak powyżej dwóch to skracać.

Tym się nie przejmuj. Im więcej będziesz się uczył i ćwiczył tym łatwiej ci będzie robić takie zadania, chyba każdy musi przejść taką drogę ;p
komentarz 19 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki ,nie przeczytałem ze zrozumieniem ...

Podobne pytania

–1 głos
2 odpowiedzi 458 wizyt
pytanie zadane 17 kwietnia 2017 w SPOJ przez BinaryMan Stary wyjadacz (12,620 p.)
0 głosów
1 odpowiedź 1,008 wizyt
pytanie zadane 17 lipca 2017 w SPOJ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 457 wizyt

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...