http://ideone.com/GwJFIp139
Poprawilem typ przyjmowanego argumentu we funkcji.
Out: 1.
Nadal WA ;/
Dostałem na PW poniższy list i pozwoliłem sobie, zacytować go w całości:
Cześć Ci Narbej,
Właśnie rozwiązałem zadanie z czarodziejskim lusterkiem i jestem w lekkim szoku.
Wpierw
użyłem stringa, żeby wrzucić do niego liczbę w postaci dwójkowej i
później od końca obliczałem nowo powstałą liczbę i się udało.
Później
wpadłem na pomysł, aby zrezygnować ze stringa i od razu w rekurencji
wyliczać nową liczbę. Też ten sposób zaliczył, ale z opóźnieniem od
starszego o około 8%. Kilka razy próbowałem zmienić co nieco, ale z
coraz gorszym skutkiem.
Patrzyłem na oba rozwiązania i byłem w 100%
pewny, że rezygnacja ze stringa jest szybszym rozwiązaniem i prawdę
mówiąc się zbulwersowałem.
Nie ufałem sędziemu, więc sprawdziłem na
kompie szybkość obu przypadków przy wariancie pesymistycznym. Okazało
się, że drugie rozwiązanie jest o około 30% szybsze.
W sumie to jest sztuka dla sztuki, ale chciałbym wiedzieć czemu tak się stało.Wybacz, że do Ciebie piszę z tym kłopotem, ale nie chciałem uderzać z
tym kłopotem na forum, żeby innym nie popsuć przyjemności z
rozwiązywania. Jeśli nie będzie miał chęci odpowiadać to za jakiś czas
zgłoszę się z problemem na forum.Dziękuję za jakąkolwiek odpowiedź.
Pozdrawiam
Konrad
Trochę Ci ułatwię. Jesteś już na forum
- Różnica czasu rzędu +- 0.02 jest, przy "dłuższych" czasach czasami nie pomierzalna - tak działa sędzia i taką ma dokładność [tolerancję] pomiaru czasu. Więc np twoje dwa wyniki: 0,12 i 0.13 mogłyby równie dobrze pomierzone jako 0.14 i 0.11 [trochę przejaskrawiam, bo nie jest to takie proste]
- Aby optymalizować kod, trzeba wiedzieć więcej, niż tylko umieć napisać w miarę poprawny kod. Powinno się wiedzieć co to jest "wąskie gardło" w optymalizowanym kodzie i to te miejsca w pierwszej kolejności optymalizować. W przeciwnym wypoadku, strzelanie, że "TO" będzie lepsze i poprawi na 100% wydajność, mogą faktycznie przynieść niewielką poprawę wydajności , ale równie dobrze sowodować odwrotny skutek. Na SPOJu często wąskim gardłem jest i/o [input, output]
- Jeżeli tak [pkt 2], to testowanie u siebie, zapewne na mniejszych testach i na innym sprzęcie może dawać zupełnie inny wynik [np u Ciebie poprawa wydajności o 30%].
- Twoje kody różnią się bardzo od mojej wzorcówki i są [w moim odczuciu] brzydkie
Tu rekurencja nie jest potrzebna, a jej użycie [zamiast iteracji] spowalnia program. Mój negatywny stosunek do zmiennych globalnych jest stały i nie zmienny.Ale u Ciebie, może wszystkie zmienne, zaczniesz przekazywać jako zmienne globalne?
W pamięci komputera liczby już są zapisane i pamiętane w formie bitowej, więc można i warto z teko skorzystać.
- ..... nie pamiętam, co jeszcze miałem napisać?
...
.....
Milczenie jest złotem, a czytanie?
Na temat tego zadania są dwa wątki: http://discuss.spoj.com/search?q=czarodziejskie%20lusterko%20category%3A52
Ale jak już się dokleiłeś do któregoś, to przynajmniej ten kontynuowany należało dokładnie przeczytać. Są w nim już dużo wcześniej, podane przez @mariusz193, dwa testy, z których twój program jednego nie przechodzi. Testy w większości zadań to niezbędne minimum, ale często nie gwarantują AC - należy dokładnie [i despacito] czytać treść zadania, specyfikacje wejścia i wyciągać wnioski [myśleć].
PS
Jako autor zadania, powinienem podkręcić “lekko” limit czasu, aby takie rozwiązania na stringach dostawały “z automatu” TLE, ale co z tymi wszystkimi biednymi rozwiązaczami w javie, pythonie, haskelu[!? ] i wszystkich innych wolniejszych językach? No i po prostu nie chce mi się, trudno jeżeli początkujący koderzy [rozwiązywacze] są tacy jak każdy widzi, to przecież to wina koderów a nie autorów zadań, nieprawdaż?. Może kiedyś się nauczą?
Po pierwsze zanim sam zaczniesz coś komentować to sprawdź źródło. Widziałem, że są 2 takie wątki, a w rzeczywistości 1 - dlaczego? Sprawdź sam swój link.
Po drugie - gdy dokleiłem się do tego to czytałem wcześniejsze testy i wychodziło, że jest dobrze (widocznie źle sprawdziłem ten drugi test), teraz dostałem od Mariusza jeszcze jeden test, który pozwolił mi na znalezienie błędu.
Zadanie - AC.
Nie mam więcej pytań.
Z punktu widzenia osoby rozwiazujacej zadanie jedynym kryterium oceny poprawnosci rozwiazania jest AC. Estetyka kodu, styl rozwiazania a nawet jego wywalanie sie dla danych innych niz w testach autora (tak zwane slabe testy) nie moga byc omowione na forum ani nigdzie indziej.
Temu uwazam ze wstawiony kod powinien z automatu dostac TLE jako rozwiazanie algorytmicznie bezmyslne - to zwykly brut i tyle.
Ale to i tak nic w porownaniu z tym co przechodzi obecnie w zadaniu dotyczacym generowania liczb pierwszych.
Że nie są, nie znaczy że nie mogą. A szkoda. Kiedyś, często, przy podpowiadaniu, przy okazji komentowałem też błędy “stylistyczne” w kodzie pytającego, ale że do tanga trzeba dwojga, więc zaprzestałem. Szkoda mi mojego czasu i zdrowia, bo czasami zamiast wdzięczności było tylko obrażanie się, za taką [przecież konstruktywną, a nie złośliwą?] krytykę. Więc chyba masz rację, że większość osób [na pewno nie wszystkie] interesuje tylko uzyskanie AC i: “nie mam więcej pytań”
PS
W tym zadaniu 2x long to o jeden bit za mało. Należy koniecznie użyć unsigned.
linux/python
>>> bin(4294967296)
'0b100000000000000000000000000000000'
>>> bin(4294967297)
'0b100000000000000000000000000000001'
>>> bin(18446744073709551615)
'0b1111111111111111111111111111111111111111111111111111111111111111'
>>> bin(18446744073709551616)
'0b10000000000000000000000000000000000000000000000000000000000000000'
>>>