12 / 14
Aug 2018

Zaczynam ten wątek, mimo że, jako autor tego zadania http://pl.spoj.pl/problems/MBREV18 nie mam z nim większych problemów.
Na pomysł tego zadania, wpadłem, usiłując na tym forum, pomagać i podpowiadać rozwiązania problemów z innym zadaniem http://pl.spoj.pl/problems/TABLICA32. Sama nazwa tamtego zadania, sugeruje do jego rozwiązania użycie tablicy i iteracyjne jej wypisywanie od końca. Dlatego moje zadanie nie nazwałem tablica II, 5, 10 czy jakoś podobnie, aby samą nazwą nic nie sugerować. Jednocześnie, zablokowałem wysyłanie kodów dłuższych od 60 bajtów, mając nadzieję, że w ten sposób zablokuję wszystkie rozwiązania oparte o normalne wczytywanie do jakiejś struktury i iteracyjne wypisywanie i chyba to osiągnąłem. Ponieważ jednak SPOJ powinien być platformą pomagającą także osobom dopiero zaczynającym zabawę i przygodę z informatyką a nie tylko "ściganiu" się tych najlepszych [no może trochę] więc może jednak powinienem trochę pomóc i podpowiedzieć, doklejając do nazwy zadania albo jego kodu słówko [REKURENCJA]?. Rekurencja, rekurencją ale jak zmieścić się z nią w 60 bajtach, żeby ją praktycznie przetestować? Oczywiście, jak zwykle można to zrobić na ideone ale można też swoje rozwiązanie, wysłać właśnie na http://pl.spoj.pl/problems/TABLICA32. gdzie nie ma takiego ograniczenia na długość kodu. Tutaj [MBREV], jeżeli kod jest dłuższy niż 60 nie zostanie nawet przyjęty do sprawdzenia i przetestowania.

Druga sprawa, pisząc to zadanie nie napisałem, że liczby na wejściu mają być rozdzielone spacją. Zrobiłem [a właściwie nie zrobiłem] tego świadomie. Sędzia na SPOJ'u sprawdza tylko czy w wyniku pojawiają się odpowiednie liczby w odpowiedniej kolejności i mogą one być oddzielone dowolnymi pojedynczymi lub wielokrotnymi "białymi" znakami, i nie koniecznie muszą to być tak jak w moim wzorcowym pliku wyjściowym pojedyncze spacje.

  • created

    Jun '12
  • last reply

    Aug '18
  • 13

    replies

  • 2.2k

    views

  • 10

    users

  • 5

    links

jako do najlepszych nie należę to pytam sie grzecznie co tu można skrócić, albo przynajmniej czy kierunek jet dobry smile
[bbone=CPP,796]
dalej nie wiem jak, ale będę walczyć smile
[/bbone]

Ja mam inne pytanie, czy używacie return 0;? Albo jakiegoś "tajnego" substytutu, bo zszedłem do 48 znaków, ale bez return 0 dostaje NZEC. Piszę w C jakby coś.
Yula moim zdaniem w C++ (jako takim) tego nie zrobisz, będziesz potrzebować i tak funkcji z czystego C. Zobacz ile ci zjada znaków głupia przestrzeń nazw

poproszę o przykład, chyba jakaś niekumata jestem confused

Może to za mało snu Julio a nie brak kumatości? Moze powinnaś się bardziej wysypiać? wink

hmmm, a więc chcesz przykład Julio? Ale jaki?
ANO BIERZESZ WĘDKĘ, PRZYNĘTĘ ,,,
sorry, włączył mi się nie chcący CAPSEL LOCK wink

inny przykład:

include

include

include

include

main(int robaki){
//zapodaj kilka liczb-robaków oddzielonych dowolnym białym znakiem - najlepiej w pliku
return {ścanf("%d", &robaki) !=EOF) ?? /* jeżeli program "stwierdzi" że to co jest wcześniej, przed ??, jest równe zero, więc co by dalej nie było zostanie pominięte i nie będzie obliczane, jeżeli nie zero to "lecim" dalej*/ main()printf("maiałem aż %d robali a i tak zero brań\n",robaki)0*3.1415*2.728;
}
Nie wiem czy to choć trochę jest czytelniejsze, prawdopodobnie przesadziłem z inkludami.

Nie mój kompóter, nie mój CAPSEL LOCK, {tu skasowałem osobiste refleksje nie na temat} ... sprawdzić czy się gdzies nie pomyliłem, piszę całkowicie z pamieci.

?? - zamiast tego, należy użyć pewnego triku, który wcześniej podałem, ale teraz skasowałem, ze wzglęgu na "tace"

Rozumiem Piotrka, doszedł sam w tym zadaniu do naprawdę bardzo krótkiego kodu i każda zbyt duża podpowiedź siłą rzeczy trochę musi denerwować w takim wypadku. Z drugiej strony popieram argumenty za takimi podpowiedziami. Niestety prawda jest dosyć oczywista, skuteczne mini kodowanie rozpoczynamy dopiero wtedy kiedy obejrzymy jakiś przykładowy mini kod. Do tego czasu ciężko jest sobie uświadomić jak pogmatwanych tricków musimy szukać, a zatem dzielmy się wiedzą Panie i Panowie!

W chwili obecnej SPOJ jest chyba największą społecznością algorytmików w polskim Internecie. Może w takim wypadku wykorzystalibyśmy to forum do dzielenia się nie tylko wiedzą odnośnie mini kodów, ale również jakiś ciekawszych/rzadko spotykanych algorytmów tudzież implementacji. W końcu na tym forum mamy sporo mądrych głów, a przynajmniej tak mi się zdaje smile Co wy na to?

No fajnie by było, ale ja np. nie znam jakichś super-sprytnych, mało-znanych algorytmów a jestem wysoko w ranku (przynajmniej w tym).
Tak więc musiałyby pisać to osoby z czołówki, a oni mają raczej inne rzeczy do roboty. No i nie każdy chce się dzielić ze wszystkimi rzeczami, w które włożył sporo pracy, żeby się nauczyć.
Pomysł świetny, ale taka trochę utopia wg mnie.
Można założyć jakiś temat: "Ciekawe algorytmy i struktury" i w nich każdy może opisać jakiś algo jaki zna. Ale trzeba by też przemyśleć jakie algo mają tam być. Bo np. ja znalazłem algo na zadanie SUMACIERZE (czy jakoś tak) no i jakbym go wytłumaczył to by jakby był gotowiec do zadania.

Edit: A co do zadania to nie do końca sam doszedłem do tego kodu. No i nie wkurza mnie to o ile nie będzie jakichś wielkich spojli (spojlów?). Po prostu przedstawiałem swoje zdanie. Bo jak zaczynałem pisać krótkie kody to też myślałem, żeby założyć taki temat i napisać tam wszystko co wiem. Ale po jakimś czasie zmieniłem zdanie.

Pozwolę sobie wyrazić swoją opinię.
Uważam, że o wiele więcej pożytku jest z samodzielnego rozwiązania zadania. Tak jak gdzieś wcześniej pisał narbej "lepiej dać wędkę niż rybę". Rozwiązując zadanie, staram się sam opracować (lub dopasować znany) algorytm. Dopiero po pewnym czasie, jeśli rozwiązanie nie wychodzi, zaglądam do wujka googla i szukam - oczywiście algorytmu, nie gotowego kodu.
Jeśli chodzi o zadania na skracanie kodu, to, choć rozwiązanie powinno wynikać z gramatyki języka, często stosuję metodę prób i błędów (tak np. było gdy pierwszy raz szukałem sposobu na to, by program skończył się z kodem 0, bez pisania return lub exit). Inaczej trudno dojść do pewnych tricków, których działanie jest zaskakujące. Oczywiście kiedy patrzę na mój wynik np w zadaniu "sortowanie punktów" i porównuję go z najlepszym, to zachodzę w głowę "jak to możliwe" i widzę ile mi jeszcze wiedzy brakuje frowning .
P.S.
Na SPOJ zaglądam z dwóch powodów:
1. Od kilku lat uczę programowania w technikum informatycznym (zmusiło mnie to do samodzielnego nauczenia się c++ i javy, bo przedtem tylko pascal i basic (stare dzieje smile )
2. Rozwiązywanie zadań algorytmicznych i łamigłówek traktuję jako wczesną profilaktykę choroby Alzheimera, co już wynika z mojego wieku. Na szczęście sprawia mi to przyjemność. smile

6 years later

Znów wsadzę kij w mrowisko. Piszę ten post ponieważ już nie po raz pierwszy natknąłem się na takie zadanie tutaj. Jaki jest sens wymyślać tego typu problemy? Co to ma wspólnego z czystością kodu? Portal jest po to aby doskonalić swoje zdolności czy wymyślać głupie kody łamiące wszelkie standardy programowania? Czemu to w zasadzie ma służyć? To samo się tyczy zadań gdzie jedynym językiem jest brainfuck.

Nie trzeba się na takie zadania “natykać”. Są po prostu w dziale challenge.

Choć do pierwszej części posta mógłbym się połowicznie* chociaż zgodzić (że w tego typu zadaniach celem nadrzędnym nie jest napisanie ładnego i czystego kodu) to drugiej nie rozumiem. Co masz do brainfucka? Są zadania w których można użyć tylko C/C++, są zadania gdzie można użyć tylko Pythona i fajnie że są zadania gdzie można tylko użyć brainfucka. Ja się trochę nauczyłem próbując rozwiązać w nim zadania więc cel edukacyjny jest.

  • Uważam, że moje rozwiązanie dane w Pythonie jest czyste i zmieściłem się w 38 znaków to też można by się zastanowić jaki najkrótszy czysty kod można by wysłać. Czystość (lub 6 grzech - nieczystość) i bezproblemowe zmieszczenien się w limicie może potwierdzić autor (@narbej) zadania gdyż ma wgląd w moje rozwiązanie.

Jak ci sie wszystko nie podoba to może idź gdzie indziej a nie męcz sie tu? To akurat jest w dziale chalelenge czyli sama nazwa mowi że nietypowe czasem trzeba pogłówkować. A co do czystości kodu to nawet zwykłe działy tego nie oceniają, to jest twoja sprawa. Oczywiście lepiej jest pisać ładnie, czytelnie by później samemu sie nie pogubic

Ponieważ są ludzie, i jest ich niemało, który lubią tego typu problemy rozwiązywać.

Absolutnie nic, ale nigdzie nie jest powiedziane że musi mieć cokolwiek wspólnego.

Portal jest po to żeby doskonalić swoje zdolności rozwiązywania zadań algorytmicznych. Spoj nie jest portalem do nauki/doskonalenia standardów programowania.

Mam propozycję, zostaw sobie te zadania na koniec. Jak już zrobisz wszystkie pozostałe to napisz na forum że zostały Ci tylko zadania na minimalizację kodu albo w brainfucku i nie masz już co rozwiązywać. Jak dotąd zrobiłeś ~9% zadań.

Wymyślanie i rozwiązywanie takich problemów jest dla nauki i zabawy :wink:

PS

Ależ jak najbardziej masz do tego prawo. Tylko nie pojawiaj się w Działdowie ani na żadnym innym zlocie użytkowników SPOJa bo może się to źle skończyć, np. bieg może wyglądać tak9 :wink: Ja sam pewnie nawet nie wiem kiedy wsadziłem kij w mrowisko i dlatego zapłaciłem haracz. Może Ty też tak zrób? :wink:

To nie SPOJ odpowiada za czystość kodu tylko koder. Fajnie by było, gdyby SPOJ to robił, ale na razie może tylko porównać czy kod daje [czasami prawie] identyczny wynik jak kod wzorcowy. Dodatkowo może pomierzyć czas i właśnie wielkość pliku źródłowego. A ponieważ sami użytkownicy nie raz pisali i komentowali: “OMG 8 linijek kodu”, więc takiego typu zadania są właśnie dla nich, nie koniecznie dla miłośników czystego kodu.

No i jeszcze jedna uwaga.
Gdy przestają Ci się drogi czytelniku podobać zadania na SPOJ’u to wyraźny znak, że już najwyższy czas, abyś postarał się o uprawnienia problemsettera i zaczął wstawiać tu swoje własne. Zobaczysz jak to jest łatwo i przyjemnie i może przestaniesz w końcu narzekać.

Ale powyższa uwaga jest też tym bardziej dla Ciebie! Masz już tak dużo rozwiązanych zadań więc wstąp do [elitarnej :wink: ] grupy wymyślaczy zadań! Zapraszam.