Cześć! Jeśli mógłbym prosić o podpowiedź co może być źle w tym kodzie (C++): https://ideone.com/e.js/E7kvXa15
Czy chodzi tutaj o walidację? Że wyraz nie powinien być dłuższy niż 200 znaków, nie powinien być pusty, a litery duże? Ostatnio robiłem sporo w angielskim spoju i tam takich problemów nie było. Co więcej, dosyć pomocne tam jest, że można zobaczyć co sprawdza sędzia…
Z góry dzięki za jakiekolwiek naprowadzenie. Testuję wszystkie możliwe kombinacje i zawsze liczy poprawnie.
Kompilatora albo jakiegoś z moich testów, który spowodował wywołanie instrukcji:
while(test < 1 || test > 50)
cin >> test;
(mogłem przez pomyłkę przypisać ten wynik do testu przykładowego)
Na ogół problemy z precyzyjnością zadania dotyczą nielicznych, starych zadań na polskim SPOJu. W tym zadaniu napisałem program realizujący to co chciał autor (skracanie wyrazu) i dostałem AC więc myślę, że to nie tutaj jest problem.
Największą trudnością w testowaniu Twojego kodu, która wyszła zresztą już w poprzednim poście, jest wielość dziwnych konstrukcji:
while(test < 1 || test > 50)
cin >> test;
A po co to? Jedyne co może z tego wyjść to WA gdy testów będzie wbrew opisowi np. 51, choć program podołałby im bez problemów. Choć nie podejrzewam autora o taki brak precyzji, lepiej na zimne dmuchać
j = j - j + i;
To jest magia, wręcz rekord zdolności obfuscowania kodu.
if((wyraz[i] != wyraz[j + 2] && wyraz[i] != wyraz[j - 1]) || (wyraz[i] != wyraz[j + 1] && wyraz[i] != wyraz[j - 2]))
Jeżeli i-ta litera jest różna od j+2 litery i i-ta litera jest różna od litery j-1 lub litera… what? Mój kod, tej samej długości, kończy na porównywaniu dwóch kolejnych liter.
Szczególnie martwi mnie to, że Twoje ify wyglądają jakby wychodziły poza zakres, np. dla i = 0 wołasz porównanie wyraz[0] i wyraz[-1] itd.
Podsumowując: dla mnie Twój kod jest przykładem oifowania prostego problemu. W efekcie masz zaimplementowaną logikę, która działa średnio na jeża, a nawet prawie doskonale (względem moich i Twoich testów). Dużo dokładniejszy sędzia sprawdza jednak dużo więcej testów i na którymś z nich złożony if albo wyjście poza zakres dają się we znaki.
Ooo super, dzięki wielkie za posta. To while dodałem na szybko, myśląc o walidacji i fakt, że w treści zadania było nie mniej niż 1 test i nie więcej niż 50 testów
Uczę się programowania od 2 miesięcy, tak więc takie rady są dla mnie mega cenne. Póki co faktycznie staram się za wszelką cenę rozwiązać problem, zapewne przy tym dosyć mocno sobie wszystko komplikując Dzięki, siądę do tego jeszcze raz i spróbuję znaleźć prostsze rozwiązanie.
Wyniki wychodzą prawidłowe, lecz sędzia mówi o błędnej odpowiedzi. Proszę o jakieś wskazówski w jaki sposób mogę poprawić kod.
#include <iostream>
using namespace std;
int main() {
int test;
cin>>test;
for(int i=0; i<test; i++)
{
string word; int licznik=0;
cin>>word;
for (int i=0; i<word.length(); i++)
{
if(word[i]==word[word.length()])
{
if(licznik==0) {cout<<word[i];}
else if(licznik<=1) {cout<<word[i-1]<<word[i]; licznik=0;}
else if(licznik>1) {cout<<word[i]<<licznik; licznik=0;}
}
else if(word[i]==word[i+1]) {licznik++;}
else if(licznik==0) {cout<<word[i];}
else if(licznik<=1) {cout<<word[i-1]<<word[i]; licznik=0;}
else if(licznik>1) {cout<<word[i]<<licznik; licznik=0;}
}
cout<<endl;
}
}
Mógłbym zrezygnować z if(word[i]==word[word.length()])
ale wtedy program będzie odwoływać sie do tabeli, która nie istnieje.
Napisałem kod do zadania, u mnie wyrzuca poprawne odpowiedzi przy różnych danych wejściowych jednak sędzia je odrzuca, widzi może ktoś o co chodzi?
Nie wiem jak wstawić tutaj sformatowany kod :/
mój kod:
using namespace std;
int count(string str, char ch) {
int num = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] == ch) {
num++;
}
}
return num;
}
bool alreadyChecked(vector c, char s) {
for (int i = 0; i < c.size(); i++) {
if (c[i] == s) {
return true;
}
}
return false;
}
int main()
{
vector checks;
int t, it = 0, num;
string str;
char currChar = ‘/’;
cin >> t;
do {
cin >> str;
transform(str.begin(), str.end(), str.begin(), ::toupper);
for (int i = 0; i < str.length(); i++) {
if (!alreadyChecked(checks, str[i])) {
checks.push_back(str[i]);
num = count(str, str[i]);
if (num <= 2) {
for (int g = 0; g < num; g++) {
cout << str[i];
}
}
else {
cout << str[i] << num;
}
}
}
checks.clear();
cout << endl;
it++;
} while (it < t);
return 0;
}
i po raz kolejny muszę pisać:
- nie zakładamy nowego wątku, gdy już istnieje wątek poświęcony temu zadania - to zadanie ma wiele wątków, dzięki niefrasobliwości takich jak ty
- jeżeli jest wątek, czytamy - z dużym prawdopodobieństwem problem został dawno temu omówiony
- wskazane jest przekazywanie kodu poprze ideone.com5 lub przynajmniej poprawnie go wklejając - tu zginęło formatowanie oraz fragmenty kodu - dzięki czemu stał się całkowicie nieczytelny
i dodatkowo - piszesz w niewłaściwym dziale - problemy związane z rozwiązywaniem zadań powinny być w http://discuss.spoj.com/c/pl-spoj-com/zbior-zadan4
Więc tego powinieneś się najpierw nauczyć i dowiedzieć, zanim zaczniesz wklejać kod i zadawać pytania [w odpowiednim dziale forum]. Dodatkowo, komentarze pod zadaniami są do komentowania a nie do zadawania pytań. Jeżeli nie potrafisz przeczytać 4 pkt krótkich uwag pod zadaniem, zrozumieć ich i się dostosować, to czy nie mam prawa mieć wątpliwości, czy przeczytasz z wystarczającą uwagą i zrozumieniem jakąkolwiek podpowiedź? A podpowiedzi do tego zadania, jak wspomniał już @mariusz193 jest już całe mnóstwo.
Piszę tutaj, bo nie znalazłem, żadnego podobnego rozwiązania problemu, który mam . A mój problem jest następujący. Zrobiłem sporo testów i szukałem, ale nie znalazłem błędu (od razu nadmieniam, że nie pisze tutaj od razu po tym jak nie zadziałało, czytaj: wysilałem się, nie czekam na gotowe). Program na moje oko działa dobrze, zgodnie z warunkami zadania, ale “sędzia” wyrzuca cały czas Błędną Odpowiedź. Co tu może być nie tak? [Kod w Cpp]
No popatrz, a ja wkleiłem przykład spod zadania i “nie działa”: https://ideone.com/tUCbzm9 gdzie jest wynik 4 testu?
cin.sync() nie uchroni Cię przed czekającym w buforze znakiem końca lini. To już lepiej cin.get() po prostu tam wstawić i powinno być lepiej.
Zadania zawsze testuj na ideone (lub używaj dokładnie tego samego kompilatora). Sędzia sprawdza Twój kod automatycznie generując wyjście i prównując je z wyjściem autora.
Jeśli nikt Ci nie pomoże sprawdzę później gdzie jest błąd. Możesz sprawdzić czy popdowiedź Mariusza rozwiązuje Twój problem: 506. Flamaster [FLAMASTE]
Hex. Po poprawieniu wyświetlania outputu dostałem tym kodem AC.
Kolega wyswietla (WA):
OPSS♪◙ABCDEF♪◙ABBC3D4E5FGGHIIJK3L ♪◙A10B16 ♪◙
Zamiast (AC):
OPSS♪◙ABCDEF♪◙ABBC3D4E5FGGHIIJK3L♪◙A10B16♪◙
PS:
Nie sprawdzałem testu @mariusz193, ale możliwe, że algorytm lub implementacja nie są do końca poprawne, natomiast danego testu nie ma w zadaniu lub moją poprawką niechcący rozwiązałem jeszcze jakiś problem