41 / 110
Sep 2017

Chyba faktycznie jestem jednym z najmłodszych użytkowników SPOJa… dodatkowo nie mającym do czynienia z algorytmami i programowaniem na żadnym etapie kształcenia.

ARPANET też miał czemuś służyć, a wyszło jak wyszło i wszyscy mają dostęp do Internetu.

Powiem tak - (chyba) rozumiem Twój przekaz i Twoja rada by nie testować w innych kompilatorach była jak najbardziej słuszna.

@redysz dostał lajka bo jego wypowiedź jest dobitnie krótka i precyzyjna - składa się z jednej emotki wyrażającej więcej niż tysiąc słów.

A Tobie - wbrew temu co napisałem przy użyciu hasztagów (to miało być tylko żartobliwe) - dałem lajka ze względu na konkretną, rozbudowaną wypowiedź adekwatną do sytuacji :slight_smile:

25 days later

Hej,
męczę się z tym zadaniem już chwilke więc proszę o pomoc. Kod działa poprawnie, jednak sędzia nie zalicza:

Po przeczytaniu postów w tym temacie wiem, że łatwiej byłoby wyświetlać znaki od razu. W moim kodzie kolejne znaki są dodawane do vectora i wyświetlane na końcu po sprawdzeniu wszystkich.
Byłbym wdzięczny za pomoc :slight_smile:

być może poprawnie, ale czy zgodnie z warunkami zadania ?

sprawdziłeś może z przykładowymi danymi z zadania, czy masz taki sam wynik ?

ciekawe, poprzednio było inaczej :slight_smile:

więc w związku z tym, moja standardowa rada do tego zadania - jest gdzieś powyżej, poszukaj :slight_smile:

1 month later

Witajcie! Chciałam prosić o pomoc. Program działa dla przykładów które sprawdzam, sędzia komunikuje błąd, a ja nie mogę znaleźć… Oto link:
usuniety

więc po raz kolejny moja standardowa rada - poszukaj jej gdzieś powyżej w moich postach

Agatko!
Mam jakąś dziwną słabość do słabej płci :wink:
Chciałbym Ci zadać milion pytań … [jak testujesz, jakiego systemu używasz, co znaczy Morwa Fundation itd] … ale oik

Gdybyś testowała przekierowując wyjście do pliku i oglądając wynik w edytorze, szybko znalazłabyś swój błąd. Powiem Ci, że nie zobaczysz go ani w konsoli ani na ideone. Tak wygląda u mnie twój output zapisany do pliku:
OPSS^@
ABCDEF
ABBC3D4E5FGGHIIJK3L
A10B16^@

znaczek ‘^@’ to kod ASCI równy 0.

PS
Mariusz pisał już wcześniej o tym:

Hej, tak jak u większości, w ideone i kompilatorze działa ok, spoj jest innego zdania, przeczytałem Wasze wskazówki i nic nie pomaga. Macie jakiś pomysł gdzie się machnąłem? Z góry dzięki za odp!

słabo testujesz.
np
L
kk
L

PS
No i mógłbyś trochę oszczędzać papier, nie szkoda Ci lasów? :wink:
[trochę mniej tych ‘\n’]

Co do testowania za karę robię 10 pompek, zaliczone.
Co do drzew jeżdżę priusem więc się znosi :wink:
Dzięki za pomoc!

Hej, wielkie dzięki :slight_smile: nie dość że przeszło to jeszcze nauczyłam się czegoś nowego. pozdrawiam!

18 days later

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.

Jeżeli tak wyglądają Twoje kody, słusznie zauważasz, że robiłeś, a nie zrobiłeś sporo zadań.

Twój kod nie działa nawet dla przykładowego wejścia.

Dla przykładowego wejścia działa. Przesyłam print screen, bo nie wiem czy to kwestia kompilatora? Czy czegoś innego? Liczy mi prawidłowo również inne możliwości. Ewentualnie czy czegoś tu po prostu nie zauważam? Mam wrażenie po raz kolejny, że na angielskim spoju polecenia są dużo jaśniejsze.

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ć :wink:

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 :slight_smile:

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 :slight_smile: Dzięki, siądę do tego jeszcze raz i spróbuję znaleźć prostsze rozwiązanie.

19 days later

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.

a czy zadałeś sobie trud przetestowania programu ? choć dla danych testowych podanych w zadaniu ?
jeżeli widzisz, że są identyczne to konieczna wizyta u okulisty

a jaki sens mam ten warunek, czy może kiedykolwiek być spełniony ? - jaką wartość ma word[word.length()] ?

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;
}