Jump to content

[Mikrokonkurs] linia produkcyjna


Toster

Recommended Posts

Witam, oto kolejna propozycja mikrokonkursa :)

W zalozeniach to powinien byc konkurs tylko na watkach ale da sie go zrealizowac rowniez bez nich wiec jak kto lubi.

 

proponowany termin konca: niedziela do godziny 24.

adres zgloszenia: toster[at]ps.pl

poziom trudnosci: sredni (3/5)

 

a teraz miesko :) czyli o co kaman:

 

mamy linie produkcyjna zlozona z 4 stolow, 1 pudla i 8 robotow.

ustawienie lini wyglada tak:

Obrazek

 

Linia produkcyjna przerzuca landrynki miedzy stolami i na koncu do pudla.

zalorzenia do zrealizowania:

 

1) z kazdego stolu landrynke moze podniesc 1 z 2 robotow i przenies na nastepny stol (lub do pudla). Czyli ze stolu nr 1 landrynke moze podniesc R1 lub R2 i polozyc to na stol2. Itd.

2) Kazdy robot reaguje co okreslony czas. Czas reakcji kazdego robota jest staly przy czym kazdy robot ma ten czas inny, wylosowany raz przy uruchomieniu lini.

3) na stole nr 1 na poczatku jest 68 landrynek.

4) na poczatku linia jest wylaczona (powinno to byc gdzies zaznaczone) po nacisnieciu klawisza linia sie wlacza, i jest tak dlugo wlaczona az wszystkie landrynki wyladuja w pudle. Gdy pudlo jest pelne linia powinna sie wylaczyc.

5) po zakonczeniu pracy powinno zostac wyswietlone podsumowanie ile kazdy robot przeniosl landrynek :)

UPDATE:

6) czas przelozenia landrynki z jednego miejsca w 2 gie jest 0. Jest to wartosc stala dla wszystkch robotow zalozmy nie mniej niz 50ms.

 

Punktacja:

+1 punkt jesli liczba landrynek w pudle na koniec = 68 :)

+2 punkty jesli dodane zostana oznaczenia ktore roboty sa w aktualnej chwili wlaczone (rozbudowa punktu 4, linia jest wlaczona gdy conajmniej jeden robot jest wlaczony. Robot jest wlaczony jesli przez 3 cykle swojej aktywnosci mial cos do roboty, jesli przez 3 cykle nie mial nic do roboto to zostaje wylaczony)

+3 jesli kazdy robot bedzie zrealizowany na osobnym watku.

 

Pozdrawiam, Toster

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link to comment
Share on other sites

Force

1) landrynki sie zgadzaja +1 pkt

2) nie, jest oznaczenie gdy robot przenosi landrynke, nie ma oznaczenia czy jest wlaczony. Nie ma tez tego w kodzie.

3) Tak +3

 

Blind

1) landrynki sie zgadzaja +1 pkt

2) Tak, +1 (nie spelnia wszystkich wymogow opisanych w konkursie)

3) Tak +3

 

Suma:

Force: 4

Blind: 5

 

Winner: Blind

 

Kilka slow ponadto:

Forca kod jest duzo ladniejszy i czytelniejszy +

Blinda robociki sa bardziej zabawne +

Za kod Blinda powinno byc biczowanie -

 

dzieki za udzial w konkursie.

 

Ponizej link gdzie mozna sciagnac prace, bedzie aktywny przez pewien czas: Prace

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link to comment
Share on other sites

Cześć!

 

Ja miałem inny pomysł na roboty,

 

moje maszynki mają dwie wysuwane ręce i stoją w miejscu :rolleyes:

 

niestety, z braku czasu nie udało mi się dokończyć programu :(

 

poza konkursem pokazuje to, co udało mi się zrobić

 

oczywiście jest to tylko prototyp, więc nie spodziewajcie się zbyt wiele :lol:

 

posiada dużo błędów

 

-> -> -> Tasma

 

instrukcja:

1. spacją przechodzimy do menu,

2. enter,

3. spacją włączamy robota nr 1.

 

Pozdrawiam!

 

P.S. Toster - przeszłoby takie rozwiązanie??

Link to comment
Share on other sites

Kazdy moj konkurs ma cos na celu. W zaleznosci na co stawiam nacisk to najwyzej punktuje, ale po czesci zgadzam sie z Forcem. Dobry styl kodowania to podstawa kogos kto chce nazywac sie programista. Sam czasami robi bublowaty kod, ale porownujac swoj kod z przed 3-5 lat widze roznice. Juz po prostu nie protrafie pisac kodu bez indentacji, robie to odruchowo niezaleznie od tego czy jestem pijany czy nie :)

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link to comment
Share on other sites

  • 2 weeks later...

Ok ogolnie niezle, nie bede punktowal wg punktow kilka uwag:

1) function Check: Boolean; jako funkcja wewnetrzna, wg kilku artsow rowniez na Borlandzie i moich doswiadczen: NIE rob tego. Poza tym ze zaciemnia kod nic nie wnosi a bardzie przeszkadza (polecam znalezc i poczytac artsy)

2) Roboty sa na watkech jest ok, ale jest powazny mankament: skad wiesz czy operacja pobrania/zapisania do/z tablicy jest operacja atomowa ? Nie robisz synchronizowanego odczytu/zapisu zmiennej

3) brak porzadnej enkapsulacji. Zmienne globalne raczje nie sa dobrym pomyslem jesli chcesz sie uczyc.

4) przy malutkich zmianach mamy deadlocka. sproboj wprowadzic takie zmiany:

linie 64, 65, 66 zmien typy na integer

linia 65 zamiast (68, daj (250,

linia 219: zamiast Landrynki[1]:=68 daj Landrynki[1]:=250;

uruchom aplikacje kilka razy. Srednio 3 na 5 uruchomien mialem deadlocka.... FAIL :P

 

PS. Plus za ladnie sformatowany kod.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link to comment
Share on other sites

Dzięki wielkie za uwagi.

 

Mam kilka pytań:

 

Ad.1) Czyli powinna być to zwykła funkcja zadeklarowana w klasie?

Ad.2) Roboty mają różne czasy reakcji, więc chyba nie powinno być problemu z jednoczesnym dostępem?

Ad.3) Umieszczenie tych zmiennych w klasie formy byłoby lepsze?

Ad.4) Około 10 razy odpalałem po wprowadzeniu tych zmian co pisałeś i za każdym razem poprawnie dochodziło do końca :) nie wiem co jest przyczyną :)

Moje projekty: http://wojciechkulik.pl

Link to comment
Share on other sites

Ad Ad2) Musisz używać mutexy lub strefy krytyczne. chodzi o to, że funkcja Inc działa tak - pobierz wartość zmiennej, zwiększ o 1 zapisz. Może się zdarzyć tak: jeden wątek pobiera wartość zmiennej, a tu system zabiera mu czas i daje drugiemu wątkowi, on też pobiera wartość zmiennej, zwiększa o 1 i zapisuje, potem znowu odzyskuje władzę wątek numer 1, nic nie wie, że zwiększono zmienną, on ma jej starą wartość, zwiększa o 1 to co ma w rejestrze i zapisuje. Przez to dwa razy wywołujesz Inc, ale wartość zwiększa się tylko o 1. Te sleepy może Twoją czujność zmniejszają. Zobacz jak mój kod wygląda, zasada działania podobna jak u Ciebie, tylko, że pudełko nie jest zmienną integer, a klasą i jej metody zwiększające/zmniejszające mają sekcje krytyczne

Baza tysięcy lotnisk: http://airportsbase.com

Link to comment
Share on other sites

Ad 1) tak

Ad 2) Force dobrze mowi, nie masz gwarancji ze w srodku pracy watka nr 1 nie zostanie on zawieszony a w tym samym miejscu namiesza ci inny watek, po czym pierwszy watek wroci do pracy jakby nigdy nic i poznikaja ci dane. Sleepy wlasnie utrudniaja zalkladamy sytuacje:

t=0

Watek 1: Sleep(100), Inc(t), Dec(t)

Watek 2: Sleep(50), Inc(t), Sleep(50), t := t * 2

Ile wynosi t ? po 101ms ? 0, 1, 2, 4 ? nie wiadomo ktory watek wczesniej dostal sie do zmiennej t.

Ad 3) I tak i nie:

tak: bo bylaby to czesc obiektu, co juz ogranicza mozliwosc ze ktos inny cos spapra (jak oczywiscie nie bylby to dane o swobodnym dostepie)

nie: bo forma ni jak sie ma do znaczenia tych danych.

Ogolnie rzecz biorac spora grupa osob (w tym ja do pewnego czasu) popelnia zasadniczy blad w Delphi/C++/Javie.

Zabiera sie za programowanie strukturalne ozdabiajac je obiektowoscia. Zastanow sie jakie powinny byc obiekty opisujace twoj algorytm, za co jaki obiekt powinnien odpowiadac i z jakimi obiektami wspolpracowac. Co kazdy obiekt moze pokazac innym a do czego blokuje innym dostepu.

Ad 4) Uroki deadlockow sa takie za na moim kompie wszystko dziala ale na wszystkich innych wysypie sie nie wiadomo kiedy. Wyscigi watkow to smutna rzecz ;)

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link to comment
Share on other sites

  • 1 year later...

Witam,

 

wlasnie przeszukiwałem sieć w celu znalezienia rozwiązania podobnego problemu linii produkcyjnej gdyż sam stanąłem w miejscu. Czy istnieje jeszcze możliwość wglądu do waszych kodów?

 

Pozdrawiam,

 

zenn

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...