21 / 69
May 2017

Każdy język ma swoje wady i zalety. Wyrażenia LINQ w C# mają swoją moc.

Z perspektywy spoja C++ jest szybszy i bardziej popularny.
Z perspektywy rynku pracy wciąż króluje Java.

Jednak po 5 latach pracy z .NET muszę powiedzieć że Microsoft wciąż za wolno adaptuje się do dynamicznego rynku wytwarzania oprogramowania i praktycznie każdy ich produkt można zastąpić lepszym i zazwyczaj tańszym rozwiązaniem. Jednak tutaj nie czas i miejsce by o tym pisać.

Może:
Napisałem wcześniej, że: "Może....", ale to twój wybór, twoja decyzja ..[i twoja flustarcja, że coś nie ma sensu :wink:]

PS
Nie wiem, czy w twoim znalezisku, są podane najlepsze metody wczytywania i to co ja tam napisałem to tylko taka moja łatka, wymyślona, przy analogicznych problemach z wczytywaniem w innych językach, więc nie mam pojęcia, czy jest najlepsza. Czy naprawdę, nie ma[sz] innych, lepszych [np papierowych, książkowych, podręcznbikowych] źródeł nauki i wyszukiwania rozwiązań problemów w c# ? W necie, podpowiedzi, nie zawsze muszą być najlepsze, wynikające z chęci pomocy, i nie zawsze optymalne.

Nie wiem już kompletnie jak to zrobić, jak to wczytać, nie wiem i nie mam pojęcia. Dla tego zadania jest to moim zdaniem kompletnie nie istotne.
A polecasz jakieś dobre książki? Bo ze wszystkimi którymi się spotkałem to dużo gadania/teorii a mało przykładów z których można się czegokolwiek nauczyć.

Poczytaj [poszukaj] o metodzie Trim().

Niestety nie znam nic do nauki języka c#, ale nauka programowania to też niestety czytanie dużo teorii i nie tylko nauka języka programowania ale też nauka algorytmiki, matematyki, a nawet warto liznąć chociaż trochę j. angielskiego itd. Nauka na podstawie przykładów chyba nie jest najlepszą metodą nauki.

Ale do C#? Najfajniejsza jest "Rusz głową C#". Ale to książka o samym języku, nie znajdziesz w niej przykładów algorytmów bo C# nie jest do tego. Za to co rozdział piszę się projekt zazwyczaj jakiejś minigry lub prostego symulatora.
Przykłady algorytmów są oczywiście w "Algorytmice praktycznej" Stańczyka, ale tam jest C++ z użyciem makr.

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: