[openmp/solved] zlecenie - automat komorkowy

0

Witam,

Poszukuję osoby, która byłaby w stanie napisać następujący program z zakresu programowania równloległego (w C++ oczywiście):

Mamy dany automat komórkowy jednowymiarowy składający się z czarnych i białych komórek z regułą przejścia polegającą na tym, że komórki, które sąsiadują tylko z komórkami swojego koloru w kolejnym kroku stają się białe, a pozostałe czarne.
Przykład (czarne komórki oznaczone są jako „X”):

krok nr | automat
------------------------------
 0 | |X|X|X| | | | | | | | |
 1 |X|X| |X|X| | | | | | | |
 2 | |X|X|X|X|X| | | | | | |
 3 |X|X| | | |X|X| | | | | |
 4 | |X|X| |X|X|X|X| | | | |
 5 |X|X|X|X|X| | |X|X| | | |
 6 | | | | |X|X|X|X|X|X| | |
 7 | | | |X|X| | | | |X|X| |
 8 | | |X|X|X|X| | |X|X|X|X|
 9 | |X|X| | |X|X|X|X| | | |
10 |X|X|X|X|X|X| | |X|X| | |
11 | | | | | |X|X|X|X|X|X| |
12 | | | | |X|X| | | | |X|X|
13 | | | |X|X|X|X| | |X|X| |
... 

Napisać program pobierający ze standardowego wejścia kolejno liczby całkowite dodatnie r (rozmiar automatu), i n. Następnie pobiera ze standardowego wejścia stan początkowy automatu w postaci r zer i jedynek (zero oznacza pole białe, a jedynka - czarne). Program wyświetla na standardowym wyjściu stan automatu po n przejściach w postaci zer i jedynek.
Na przykład dla wejścia

12 10 0 1 1 1 0 0 0 0 0 0 0 0 

wyjściem będzie

1 1 1 1 1 1 0 0 1 1 0 0 

Program zrównoleglić za pomocą OpenMP.

Za wykonanie pracy oczywiście zapłacę. Więcej info na gg: 2630886. Pilne.

Pozdrawiam,
rake

0

mam dziwny humor i sie nudzilem, wiec wersja minimum ponizej za free.
poza tym wstydzilbys sie, zajelo to mi <=18 minut, lacznie z malym testowaniem..
NIE gwarantuje ze dziala poprawnie, MALO testowalem.

#include <iostream>
#include <vector>

// 12 10 0 1 1 1 0 0 0 0 0 0 0 0
// 1 1 1 1 1 1 0 0 1 1 0 0

using namespace std;

typedef unsigned char byte;

void read_params(istream& inp, size_t& r, size_t& n)
{
    inp >> r >> n;
    if(r==-1 || n==-1) throw runtime_error("");
}

vector<vector<byte>> reserve_states(size_t rows, size_t columns)
{
    return vector<vector<byte>>(rows, vector<byte>(columns));
}

void load_state(istream& inp, vector<byte>& state)
{
    for(size_t cell, idx=0, max_idx = state.size(); idx < max_idx; ++idx)
    {
        cin >> cell;
        if(cin.fail()) throw runtime_error("");
        state[idx] = cell;
    }
}

void dump_state(ostream& inp, vector<byte> const & state)
{
    for(size_t idx=0, max_idx = state.size(); idx < max_idx; ++idx)
    {
        if(idx) cout << " ";
        cout << static_cast<unsigned int>(state[idx]);
    }
}

void derive_next_state(vector<byte> const & inp_state, vector<byte> & out_state)
{
    size_t const idx_max = inp_state.size();
    #pragma omp parallel for
    for(long idx=0; idx<idx_max; ++idx)
    {
        size_t n = 0, n_max = 0;
        
        if(idx > 0         && ++n_max) n+= inp_state[idx-1] == inp_state[idx];
        if(idx < idx_max-1 && ++n_max) n+= inp_state[idx+1] == inp_state[idx];
        
        out_state[idx] = n != n_max;
    }
}

int main()
{
    try
    {
        size_t r = -1, n = -1;

        read_params(cin, r, n);

        vector<vector<byte>> states = reserve_states(n+1, r);

        load_state(cin, states[0]);

        for(size_t completed_state = 0; completed_state < n; ++completed_state)
                derive_next_state(states[completed_state], states[completed_state+1]);

        dump_state(cout, states[states.size()-1]);
        cout << endl;
    }
    catch(exception& ex)
    {
        cout << ex.what() << endl;
    }
}

ps. jesli czujesz sie winny i koniecznie chcesz placic, moj email masz pod mailem

0

Witam,

Powiem szczerze, że zdaję sobie sprawę z tego, iż napisanie czegoś takiego dla osoby, która jest w tym dobra to max 30 min, bo to jest zadanie z początku materiału. Nie czas wykonania powinien jednak stanowić kryterium do zapłaty, prawda?

Tak czy inaczej...niestety (dla Ciebie), zlecenie zostało wykonane już w sobotę, zdecydowałem się w sumie na pierwszą osobę, która się zgłosiła, ze względu na to, iż pasowała mi kwota do zapłaty :) poza tym...z tego co się orientuję, to trzeba do zrównoleglania użyć dyrektyw #pragma omp parallel ..., a u Ciebie widzę robione jest to inaczej, więc zapewne by nie przeszło.

Przykro mi więc, ale nie jestem w stanie nic Ci zaoferować na chwilę obecną:) Nie omieszkam jednak napisać, gdy będę miał kolejną pracę (a na pewno będę miał :)).

Pozdrawiam,
rake

0

Ahh, zapomniałem dodać, że dla mnie to jest niemalże czarna magia + ogromnie nie lubię programowania, i zamiast siedzieć nad tym i dumać godzinami, to wolę ten czas poświęcić na ważniejsze dla mnie kwestie (praca, magisterka, prywatne zlecenia).

EDIT: nvm, widzę, że są deryktywy :D No cóż, tak czy inaczej już to mam, ale dzięki za chęci:)

0

Spokojnie, rozumiem.. z czasem oraz wstydzeniem się chodziło mi, że tak postawione zadanie kwalifikuje się pod weztutorial-lekkozmien-ojużzrobione, a nie o wywyższanie się czy dołowanie kogoś..
Dyrektywę zauważyłeś, więc tylko podkreślę:

quetzalcoatl napisał(a)

mam dziwny humor i sie nudzilem, wiec wersja minimum ponizej za free.
....
ps. jeśli ... i koniecznie chcesz placic ...

Czytaj uważniej:) Staram się pisać precyzyjnie - notka o 'winności' miała Cię tym bardziej nakierować na 'za free' (koniec koncow, mało kto obecnie się źle czuje nie robiąc zadań samodzielnie)

1 użytkowników online, w tym zalogowanych: 0, gości: 1