31 / 69
May 2017

Znam metodę Trim, próbowałem z nią we wczesnych fazach testu ale ją wywaliłem.
Mimo tego że teraz uwzględniłem ją "chyba dosyć dobrze" i mogę sobie dopisywać do mojego kodu tyle spacji, tabulatorów ile tylko zapragnę to... sędzia dalej nie zalicza mi tego zadania, o to kod:
https://ideone.com/Komf2X3
Nie mam pomysłu co jest jeszcze źle...

Kojarzę tą książkę "Rusz głową C#" ale jakoś bardzo się nie wczytywałem w nią. Bardziej szukałem opcji robienia zadań (tak jak na matmie) ale jak widzę to tutaj tylko jest taka możliwość. W C++ jest w prawdzie tego naprawdę mnóstwo, ale bardziej obecnie siedzę w C# więc na tym by mi najbardziej zależało.

Widziałem tą książkę, tak są przykłady ale tylko trochę. Myślę że tutaj zbiór tych zadań jest o niebo lepszy :slight_smile:

No cóż, podsumowując:

  1. Warto uczyć się różnych języków, a także języka[ów] publikowania w niektórych publikacjach, tzw pseudokodu.
  2. Jeżeli korzysta się z podpowiedzi na forum, to warto jednak uwzględniać i pokazywać w kolejnych kodach, że się wykorzystało te podpowiedzi, a w przeciwnym wypadku po co wstawiać kolejne? Po co podpowiadać?.
  3. Poczytaj sobie o sortowaniu leksykograficznym, jak na dzisiaj, mam już dosyć forum i twoich pytań o sens i bezsens.
  4. Naucz się lepiej testować i dobierać testy - test z zadania to minimalny test zerowy.

PS
AD 3
To tylko przypuszczenie, ja tego nie sprawdzałem.

1.Co do tego zadania ma pseudokod?

2.Przecież wstawiłem kod w którym wykorzystałem Twoją podpowiedź i mimo tego to nie pomogło.
Od paru postów nie pisze już o sensie/bezsensie zadania.

3.Inny sposób sortowania może sprawić że zadanie będzie "poprawne"? Nie przekroczyłem tutaj limitu czasowego więc myślę że rodzaj sortowania "chyba" nie ma tutaj znaczenia?

4.Testowałem różne kombinacje liczb i dla każdych testów program działał.

AD 1
Zupełnie nic.

AD 2

Więc w takim razie, czemu nie oczyściłeś, ze zbędnych śmieci swojego programu?

AD 3 i AD 4
prosty test:
1 11 111 2 22 222 3 33 333 itd
- uzupełnij o ilości testów i ilość danych w teście.

Z punktu widzenia SPOJa warte uwagi są C i C++ i pod te języki pomyślane są zadania (z nielicznymi wyjątkami jak BF). Oczywiście nikt nikomu nie broni używać np. Pythona, ale w wielu przypadkach jest to bardzo trudne a nawet niewykonalne ze względu na limity czasowe. Sam próbowałem kiedyś robić zadania w Bashu - podołałem aż jednemu i zrezygnowałem z tego chorego pomysłu :smiley:

Jeżeli ktoś chce nauczyć się języka to polecam inne metody niż SPOJa. Za najlepszą uważam realizowanie własnych projektów. Najprościej jest chyba zacząć od gier komputerowych - każdy wie jak powinny wyglądać Saper albo Pacman, zaś wymyślanie użytecznych aplikacji dla księgowych, bibliotekarzy i wojska to nieco większe wyzwanie :wink:

C# również nie polecam na SPOJu, ale oczywiście co kto lubi.

PS
Właśnie dowiedziałem się, że na SPOJu można pisać w assemblerze i Octave (czyli de facto Matlab został dodany do SPOJa). Asmy wszelakie rozumiem - w sumie to nawet ciekawe doświadczenie napisać bardziej złożony program w assemblerze. Niemniej podejrzewam, że będzie sporo problemów z uzyskaniem pomocy na forum i z wczytywaniem danych...

Osobom, które na SPOJu będą uczyły się Octave szczerze współczuję. Sortowanie liczb i analiza dostaw pizzy na obszarze Bitocji wykonana w Octave jest po prostu stratą czasu bo nie do tego służy ta technologia. Osoby, które zamiast prowadzić obliczenia numeryczne i ich wizualizacje (nie wiem... metoda Rungego-Kutty czwartego rzędu, równania Lotki-Volterry, modele SIR, metoda Hartree-Focka czy kultowy MES) będą trzaskały BFSy w rzeczywistości nie nauczą się Octave. Podobnie ma się sytuacja z Bashem, Perlem, a jak sądzę, również z Pythonem, Javą i C#.

Mówię to z perspektywy osoby, która z wykształcenia jest inżynierem technologii chemicznej, a lwią część kodzenia (C++) opanowała na SPOJu. Na pierwszej rozmowie o pracę (C++) dowiedziałem się, że z algorytmami jest u mnie ok, gorzej z C++ i ogólnie programowaniem, bo i po co komuś na SPOJu konstruktory kopiujące, dziedziczenie, metody wirtualne, listy inicjalizacyjne, programowanie zwinne, wzorce projektowe, asercje, obsługa wyjątków, SOLID czy szablony? Wiele z tych rzeczy można wprowadzić do rozwiązywania zadań, ale będzie to tak sztuczne, że nic się z tego nie wyniesie. Przykładowo SPOJ przyjmuje pojedyncze pliki, co przeczy podstawowym zasadom kodzenia obiektowego.

Słowem: zalecam pamiętać o wadach i zaletach języków oraz SPOJa, a w związku z tym dobrze dobierać język do danego zadania. Jednocześnie zaznaczam, że niniejszy wpis jest wyłącznie moją opinią wyrobioną na podstawie moich doświadczeń i mojej wiedzy. Jeżeli ktoś uważa, że programowanie poza SPOJem jest beee albo widzi inne zastosowania GNU Octave, zaś Python i SPOJ tworzą dla niego doskonałe połączenie to proszę bardzo :slight_smile:

Z punktu widzenia SPOJ'a nie ma gorszych czy lepszych języków. To problemsetterzy przygotowują zadania, testy, limity, a przecież powszechnie wiadomo jakiego my najczęściej używamy języka [prawie zawsze]. Więc jeżeli problemsetter postanowi, że zadanie/a można rozwiązać tylko w jednym [czy dwu ...] wybranych językach, to tak będzie i testy i limity będą dostosowane do rozwiązań "wzorcowych" w tym wybranym języku.

Nauka języka jest trudna, ale jeszcze trudniejsze jest nauczenie się prowadzenie konwersacji z komputerem w tym języku na ciekawe tematy. Owszem, można uczyć się języka korzystając ze SPOJ'a, ale lepiej znać już podstawy języka, a na SPOJ'u uczyć się algorytmiki a przy okazji utrwalać i szlifować znajomość języka.

Programowanie OBIEKTOWE

  1. Czy naprawdę, jednoplikowość kodu jest zaprzeczeniem programowania obiektowego?
  2. Czy na SPOJ'u używasz pojedyńczego pliku?
  3. SPOJ nie zabrania programowania obiektowego, i to tylko twoja sprawa, czy będzie to sztuczne i czy coś z tego wyniesiesz czy nie. Jeżeli chcesz uczyć się obiektowości, możesz spokojnie robić to na SPOJ'u i nawet jeżeli na początku twoje programy będą sztuczne, to napewno i tak z takich prób dużo wyniesiesz.
  4. Oczywiście SPOJ nie jest doskonały, ma wiele wad, ale przecież wiele też umożliwia i [ciągle] jest rozwijany i udoskonalany/poprawiany.

PS
Warto znać więcej niż tylko jeden język, a w tym skryptowe. Więc bash jest jak najbardziej ok [- chyba zrobiłem w nim więcej niż jedno zadanie, jako kolejne AC w "obcym" języku]

Zgoda.

Nie jestem problemsetterem, ale myślę, że problemsetter rzadko postanawia, iż zadanie można rozwiązać tylko w jednym czy dwóch językach. To raczej garstka problemów, np. tylko BF albo równie rzadko tylko C/C++ (nota bene właśnie po to, by ktoś nie próbował używać np. funkcji typu eval, dostępnej w Pythonie czy Javie (ScriptEngine i odwołanie się do eval w JavaScript). W praktyce zwyczajnie nikt nie zna wszystkich języków, a już na pewno nie chce mu się próbować rozwiązania w każdym istniejącym języku. Chociażby trudno zadbać o to by każde zadanie było rozwiązywalne w BF z taką łatwością jak w Pascalu, albo żeby limity czasowe zostały ustawione tak, że nieoptymalne rozwiązanie w C nie przejdzie, ale pojawi się możliwość rozwiązania zadania w Pythonie.

Po prostu wybierając C i C++ można rozwiązać na SPOJu więcej zadań niż wybierając inne języki, a dodatkowo jest to prostsze - dużo materiałów w sieci, pomoc na forum itd. C i C++ są także dopuszczane na różnych "oficjalnych" konkursach informatycznych, co wyróżnia je na tle prawie wszystkich innych języków. Np. na Olimpiadzie Informatycznej jak pamiętam dozwolone są tylko Pascal, C i C++. W tym sensie języki te są lepsze.

Pełna zgoda.

Już od kilkudziesięciu lat ludzie dzielą kod na pliki nawet nie stosując się do paradygmatu obiektowego. Kwestia czytelności itd. Jednoplikowość nie jest zaprzeczeniem, ale pewnym wypaczeniem a jeszcze ściślej - wyrabianiem złych nawyków. Bardzo złych nawyków. Dobrą zasadą jest podział na pliki w taki sposób, że mamy prawie pustego maina (na SPOJu rzadkość) i klasy podzielone na zasadzie jeden plik - jedna klasa.

Wklejam swój kod a więc tak.

Zgoda, ale to trochę jak klocki Lego jako nauka budownictwa. Można tak zacząć (sam tak zacząłem), ale na dłuższą metę to ślepa uliczka.

I tak już jest super :wink:

Warto, warto. Tylko czy "znać Basha" oznacza 500 AC na SPOJu zaklepanych w Bashu czy może np. umiejętność sprawnego posługiwania się terminalem, pisania skryptów służących np. do tworzenia kopii zapasowych itd? Siłą rzeczy Bash to niezbyt dobry wybór jeśli chodzi o algorytmy.

:wink: Czy za każdym razem, używając: #include<...> <-- coś tam z STL [lub boost, a możliwe, że są/będą dostępne i inne biblioteki?] nie korzystasz z więcej niż jednego pliku i jednocześnie czy twój program, nie jest już w pewnym sensie trochę obiektowy? :wink: [raczej pytam retorycznie]

Jeżeli naprwdę chcesz "liznąć" PO, możesz u siebie to robić i robić to tak jak lubisz, w wielu plikach, klasach, podklasach itd, a po skompilowaniu i przetestowaniu u siebie, możesz wysyłać taki kod, sklejając wcześniej odpowiednie pliki źródłowe w jeden - pewnie wystarczyłby do tego nawet bash, ale możesz sobie napisać też specjalny programik [obiektowo] w c++, automatycznie sklejający potrzebne pliki.

Jeżeli miałeś w ręku Algorytmikę praktyczną, to pewnie zauważyłeś, że większość kodu jest pisana tam z użyciem klas, struktur, template, więc może jednak można i warto?

PS
Powyższe piszę tylko teoretycznie, bo sam tak [jeszcze] nie robię. :wink:

Słusznie węszyłem haczyk w Twoim pytaniu :wink: Ale fakt - w tym sensie plików jest duużo więcej :wink:

Ło ma lamo, to byłby koszmar :wink:

Ależ ja (sporadycznie) również stosuję na SPOJu szablony, struktury a by nie pisać unsigned long long zbyt często - także define. Czasami takie podejście ułatwia sprawę bo jest mniej kodu do zaklepania. Tylko czy na SPOJu tego rodzaju twory stosuje się podobnie jak w rzeczywistych projektach programistycznych? :wink: Myślę, że podobieństwo dotyczy głównie słów kluczowych :wink:

11 days later

Hej, sklecilem kod do zadania MWPZ06H 6, na danych z przykladu i moich wlasnych wyglada, ze dziala w porzadku, niestety otrzymuje zwrotke ze uplynal limit czasu... czy ktos moze mi powiedizec co jest tego powodem? sam kod jest zbyt powolny? sortowanie kiepskie? czy po prostu w ktoryms momencie program czeka na wprowadzenie danych, ktore nie nastepuje?

http://ideone.com/3zQwvI6

Witam,

Czy mógłby ktoś wrzucić więcej testów do tego zadania. Poszukuję błędu w swoim kodzie (C#). Sędzia zgłasza NZEC. Testy na ideone przechodzą
http://ideone.com/ULyfa09
Z góry dziękuję.

Dobrym nawykiem po zrobieniu zadania jest sprawdzenie na minimalnych danych wejściowych jakie mogą być w zadaniu. Jeśli autor pisze:

N (1 ≤ N ≤ 200)

To najprawdopodobniej będzie przynajmniej jeden test z N = 1 i N = 200 :wink:

Racja, umknęła mi ta jedynka. Dzięki za podpowiedź, kod zaliczony :slight_smile:

3 months later

Witam
Zainteresował mnie bardzo punkt 11) Twojej wypowiedzi. Miałem ten sam problem co autor posta (program działa w konsoli ale na ideone już nie a sędzie zwraca błąd SIGABRT). Oto mój kod (który swoją drogą nie podaje nadal poprawnej odpowiedzi, jeszcze głowie się nad tym dlaczego): https://ideone.com/Tl6aRq9 Jednak po usunięciu linii z instrukcjami "delete" już wspomniany błąd nie pojawia się. Czy mógłby ktoś wytłumaczyć od strony technicznej (sposobu działania sędziego) dlaczego tak się dzieje? :wink:

Sędzia nie ma tu nic do rzeczy,sędzia tylko informuje o nieoczekiwanym zakończeniu programu, czyli nie poprzez return 0 w main()

Zaś program kończy działanie, gdy próbujesz zwalniać pamięć, której poprzednio nie zarezerwowałeś lub jest już zwolniona

Też nie do końca wiem dla czego, ale już się nie głowię i dałem sobie spokój. Przyjmij [na wiarę], że po prostu twój kod jest tak brzydki, że kompilator nie wie jak go skompilować i tworzy błędny program. Mam na myśli nowy kompilator. Stary nie ma zastrzeżeń i jest AC :wink:
Oczywiście z kompilatorem to żart, aale reszta to szczera prawda :wink:

Dlaczego, nie mam pomysłu i po prostu przyjmij to za dobrą monetę [AC na starym kompilatorze] i na przyszłość zacznij pisać lepsze kody, a przede wszystkim pisz jak najwięcej [ i jak najlepiej].

PS

Co masz na myśli? Rozumiem, że chodzi Ci o jakąś wypowiedż tarpauwatratar'a, ale o jaką?

PS 2

@mariusz193 wyjaśnił więc tylko powtórzę.
Nawet gdybyś był problemsetterem, to na początku, do prostych zadań nie jest Ci potrzebna wiedza na temat techniki działania sędziego. Wystarczy wiedza, że wyłapuje błędy - ale czasami są problemy - tak jak tu.
U Ciebie t nie wskazuje adresu początku tablicy, więc delete [] t powoduje natychmiast błąd SIGABRT. Nie można też kasować dwukrotnie tego samego obiektu więc gdyby jednak delete [] t zadziałało to delete [] tab spowodowałoby błąd SIGABRT, ale program już wcześniej zostaje przerwany, przez delete [] t.

Coś czuję że częściej będę się udzielał na forum ze swoimi rozwiązaniami :wink:. Dzięki, naprawdę, nic tak dobrze nie robi nauce jak krytyka kodu przez kogoś bardziej kompetentnego. Ale czy mógłbyś sprecyzować co tu z grubsza jest takiego beznadziejnego? Podejrzewam że trochę mocno przesadziłem ze wskaźnikami no i też sposób sortowania nie jest zbyt górnolotny, ale to na pewno nie jedyne problemy. Idąc dalej, skąd brać Twoim zdaniem i na czym można się wzorować przeglądając "ładny" kod? A co do mojego pytania o inną wypowiedź to już wyjaśniłeś wszystko dwie linijki niżej.