20 / 56
Nov 2017

Witam, podany niżej kod nie dostaje akceptacji ze względu na przekroczony czas. Proszę o jakąś wskazówkę smile
kod usuniety

1 year later

Witam, czy ktoś mogłby powiedzieć mi jak ma wyglądać wyjście w tym zadaniu? Obecnie przedstawia się to u mnie w ten sposób:https://ideone.com/WXO6oT25 i dostaję błąd wykonania. Z góry dziękuję.

Samo wyjście wygląda w porządku, tylko kod jest dość skomplikowany. Np co to jest?:

if (counter == 11)
    break;

To nie Ty masz sprawdzać czy jest już 10 prób tylko sędzia to robi. I ten limit ze sporym zapasem wystarcza żeby odgadnąć kod.

Tak zinterpretowałem część polecenia

Po odgadnięciu kodu (lub wyczerpaniu limitu 10 prób) Twój program powinien się zakończyć.

Czyli jeśli mój program nie zgadnie w 10 próbach(counter==11), to kończy działanie.

Zmieniłem na wybieranie strzału ze zbioru S w sposób losowy, zamiast zawsze brania jego pierwszego elementu i dla danych, które sobie wymyśliłem zazwyczaj program zgaduje przy około piątej próbie. Może to kwestia tego, iż nie potrafię wymyślić jakiegoś złośliwego testu.

Kod trzeba odgadnąć w maksymalnie 10 próbach

Nie wiem jaki komunikat jest gdy Ci się to nie uda. Błąd wykonania jest bardzo prawdopodobny.

Nie jestem pewien czy rozumiesz zadanie. Twój program ma odgadnąć jaki jest kod. Ty zaczynasz od wypisania:

1 1 2 2

No ok. Podaje na wejściu:

1 -1 1 1

Twój program nie próbuje dalej zgadywać kodu tylko się wywala błędem wykonania. A powinien podjąć następną próbę rozwiązania kodu:

Zdaje mi się, że rozumiem zadanie, a mój program zamiast próbować dalej zgadnąć, to wywala błąd, gdyż Twóje wejście jest nieprawidłowe(według mojego zrozumienia zadania). Jeśli użyte są tylko dwie liczby(w strzale 1 1 2 2 są tylko 1 i 2) to nie mogą być 3 na dobrym miejscu a jednej w ogóle nie być. Poprawnym wejściem byłoby na przykład 1 0 1 0 co oznaczałoby, że dwie liczby trzeba zamienić miejscami.

No to źle rozumiesz zadanie :slight_smile: Do tego ja kompletnie nie rozumiem Twojego toku rozumowania.

Przypadek wyżej podany w przykładzie oznacza, że po pierwszym strzale sekretny kod to:

1 * 2 2

gdzie * to liczba z przedziału 1-6 ale inna niż 1, bo dla tej liczby sędzia zwrócił -1.

Teraz twój program może wypisać np.

1 2 2 2

i albo dostanie od sędziego

1 1 1 1

wtedy zgadłeś i zakończ program, albo znów

1 -1 1 1

zgaduj dalej. Ale teraz wiesz, że na drugim miejscu nie ma też 2.

Ok, czyli w tym zadaniu każda liczba w odpowiedzi odnosi się do liczby strzału w tej samej kolumnie. Z mojej wiedzy wynikało, że w grze mastermind odpowiedź polega na wskazaniu, że jakaś liczba(z 4, ale nie konkretna) jest na złym/dobrym miejscu, lub w ogóle nie ma jej w kodzie. I teraz znowu, albo kompletnie wszystko mylę, albo właśnie na tej zasadzie działa rozwiązujący to zadanie algorytm Knuth’a.

No cóż, po zrozumieniu o co chodziło autorowi, rozwiązałem to zadanie 2 prostymi pętlami i jest AC, aczkolwiek wciąż nurtuje mnie to, czy źle zrozumiałem zasady gry Mastermind, czy to zadanie jest po prostu źle skonstruowane.

Zadanie po dziś dzień uważam za dzikie - z tego też powodu rozwiązałem je stosunkowo późno w mojej karierze. Po prostu dziwnie się czuję, gdy sędzia mówi mi coś poza AC, a jeszcze dziwniej, gdy zwraca mi jakieś znaczki i ja mam je analizować :wink:

Zasady gry są podane na plwiki i na SPOJu.

W każdej próbie podajesz propozycje kodu - wypisujesz na standarowe wyjście cztery liczby z zakresu 1…6. w odpowiedzi otrzymujesz podpowiedź które elementy zostały wytypowane poprawnie a które nie - wczytujesz ze standardowego wejścia cztery liczby o możliwych wartościach: 1 (trafione), 0 (element nie na swoim miejscu) lub -1 (pudło).

7 months later

Witam, napisałem program i niby wszystko działa dobrze, jednak sędzie zwraca Przekroczono limit czasu

#include “iostream”
#include “cstdlib”
#include "ctime"
using namespace std;

int main()
{
int liczba1,liczba2,liczba3,liczba4;
srand(time(NULL));
int a = (rand() % 6) + 1;
int b = (rand() % 6) + 1;
int c = (rand() % 6) + 1;
int d = (rand() % 6) + 1;
for(int i = 0; i < 10; i++)
{
cin >> liczba1 >> liczba2 >> liczba3 >> liczba4;
int prawda1, prawda2, prawda3, prawda4;
if (liczba1 == a) prawda1 = 1;
else if (liczba1 == b || liczba1 == c || liczba1 == d)
prawda1 = 0;
else prawda1 = -1;

	if (liczba2 == b) prawda2 = 1;
	else if (liczba2 == a || liczba2 == c || liczba2 == d)
		prawda2 = 0;
	else prawda2 = -1;
		
	if (liczba3 == c) prawda3 = 1;
	else if (liczba3 == a || liczba3 == b || liczba3 == d)
	prawda3 = 0;
	else prawda3 = -1;

	if (liczba4 == d) prawda4 = 1;
	else if (liczba4 == a || liczba4 == b || liczba4 == c)
		prawda4 = 0;
	else prawda4 = -1;

	cout << prawda1 << " " << prawda2 << " " << prawda3 << " " << prawda4 << endl;

	if (prawda1 == 1 && prawda2 == 1 && prawda3 == 1 && prawda4 == 1)
		break;
}
return 0;

}

Możesz wytłumaczyć co robi twój program? Bo wydaje mi sie że nie to czego wymaga zadanie.

Na początku losuje 4 cyfry, później wczytuje 4 liczby i sprawdza czy zgadzają się z tymi wylosowanymi.

Przeczytaj zadanie uważnie, i określ kto ma zgadywać. Ty uważasz że komputer, a czy na pewno ?

1 month later

Dobra już się całkowicie pogubiłem. Tego nie da się zrealizować bo taka gra wymaga interakcji obu stron. A jak mam nawiązać interakcję ze spojem? Spoj nie jest w stanie ani mi udzielać odpowiedzi kiedy ja jestem graczem, ani też nie jest w stanie odgadywać moich liczb (wylosowanych randomowo?), no chyba że w każdej rundzie będzie strzelał na ślepo.

ten sędzia jest w stanie pobierać twoje odpowiedzi i generować odpowiedź na nie. W opisie jest opisana interakcja i działa tak jak opisano. 570 rozwiązań chyba skutecznie mówi że da sie zrealizować

Ktoś mi podesłał gotowca krótkiego na kilka linijek. Wynika z tego że to mój program ma być graczem a sędzie na spoju będzie wypisywał 1, 0 albo -1. Ale jak to technicznie jest zrobione to nie wiem bo musiałby być po stronie serwera jakiś skrypt który będzie przetwarzał moje wpisywane liczby. Tak czy inaczej zadanie bez sensu bo bez kompletnie żadnej implementacji AI da się to za każdym razem rozwiązać maksymalnie w 6 próbach.

człowiek uczy się przez całe życie (choć być może nie każdy). Do tej pory myślałem, że spoj służy do zabawy/nauki/programowania. A tu okazuje się że jeszcze do narzekania: zadanie niejasne, za trudne, za łatwe, nie da się zrobić, a jeżeli się da, to niczego nie uczy

No zadanie zaskoczyło mnie dwukrotnie. Pierwsze to że spoj może w jakiś sposób komunikować się z testowanym programem, pierwszy raz takie zadanie mi się trafiło. A drugie to myślałem że będzie trzeba trochę pokombinować ułożyć jakiś skomplikowany algorytm odpowiednio reagujący na odpowiedzi . Jak padnie “1” to reaguj tak,jak padnie “-1” to reaguj jeszcze inaczej itp… A tu wystarczy metodą głupiego po kolei podstawiać wszystkie liczby… Dosłownie zero algorytmiki :wink: Trochę słabo :wink:

Ależ informacje o interaktywnej wersji sędziego są dostępne nawet na forum (wystarczy poszukać). Oczywiście żadnego skryptu nie ma bo i po co?

Ależ to zadanie łatwe, które w większym stopniu ma oswoić Cię z tego rodzaju problemami aniżeli nauczyć jakichś minimaxów. Gotowiec i szok “o kurde, to faktycznie da się zrobić” to wystarczający efekt

A wg mnie to dobrze, że ktoś narzeka. Nie grozi nam stanie się śmietanką alias “kółko wzajemnej adoracji”. Każdy przeczyta, wyciągnie wnioski (albo i nie) i tyle.