Четвърта задача

  1. да питам - че да съм сигурен:

    1. когато някой спре той спира за винаги (независимо защо е спрял) и си заема мястото и си стои там?

    2. в случая като долния

         [[- - - -]
          [- x - x]
          [- - x -]
          [- x - x]]

    [2,2] може и да е заклещен може и да не е а може и [3,3] да е заклещен или [1,1] a може и никой да не е заклещен? според-зависи кой кога се мръдне ?

    п.п. не съм сигурен дали вие е preview-то ама code blocks със 4 спейса не сработи

  2. @Михаил

    1) Както виждам от условието си е казано, че си спира и завинаги седи на мястото си:

    Движи се по този този начин или докато направи 100 премествания или докато не бъде заклещен и няма къде да ходи. Което и от двете да се случи, обитателят спира и никога повече не се мърда.

    2) Тъй като в условието е казано, че Обитателите трябва да се мърдат паралелно един с друг и независимо един от друг. аз го тълкувам така: първо всеки се оглежда дали има накъде да мръдне и след това мърда, т.е. тъй като при оглеждането [2,2] и [3,3] не са видели свободно място, те си остават завинаги на това място, докато останалите си се мърдат по схемата.

    От този пример на мен ми изникна друг въпрос - ако имаме тази схема:

    [[x - - -]
     [- x - x]
     [x - x -]
     [- x - x]]
    

    По правилата [1,1] трябва да тръгне към [0,2], но [1,3] също ще тръгне натам, защото това е единствената му възможност и се оказваме с 2 човека в един магазин. Какво трябва да направим по въпроса ?

  3. @Александър

    1) беше за да съм сигурен че като са го написали са го имали мислили и даваме 2) като якия пример за това

    а в 2) илюстрирам и твоя случай [3,3] принципно има 3 места където може да отиде но ако [1,1], [1,3] и [3,1] мръднат заимва 0 :). същото важи за всяко едно от [1,1], [1,3], [3,1] и [3,3] - тоест ако [2,2] не мръдне още едно не може да мръдне :)

    според мен независимо означава че не се оглеждат а отиват и ако успеят - успеят. При което в моя случай може да се окаже че всичките мърдат или 2 си стоят на мястото (както обясних по горе). И пак според моето разбиране в твоя пример може да мръднат от 1 до всички както казах според-зависи кой кога се мръдне.

  4. @Михаил:

    Движи се по този този начин или докато направи 100 премествания или докато не бъде заклещен и няма къде да ходи. Което и от двете да се случи, обитателят спира и никога повече не се мърда.

    @Александър:

    [..] в никой момент не трябва да има повече от един обитател на едно поле

    Т.е. един от тях ще успее да влезе в желаната клетка, останалите гледат на нея като на заета.

  5. Опитах да се кача решение на задачата, но системата ми казва, че имам синтактична грешка.

    Първоначално си помислих, че проблема може да е от това, че gofmt ми форматира for ; condition; { до for condition {, но това не оправи нещата.

    Тъй като не се изписва на кой ред евентуално е грешката, не знам какво да правя по въпроса (няма никакъв проблем при рънване на кода и си минава примерния тест).

  6. Едно доуточнение. Или подсказка. :) Проверяването дали даден човек може да се мръдне в коя да е посока трябва да е атомарно - тоест не трябва да има случай, в който някой има свободно място долу-вдясно, но той първо проверява горе-вляво, там е заето, след което някой успява да му "вземе" мястото долу-вдясно, той го проверява, и заради това спира, защото е stuck. Надявам се стана ясно. :)

  7. още един тест от мен:

    func TestNonInteractingDwellers(t *testing.T) {
        var NonInteractingDwellers = [4][4]rune{
            {'-', '-', '-', 'X'},
            {'-', '-', '-', 'X'},
            {'-', '-', '-', 'X'},
            {'-', '-', '-', 'X'},
        }
        result := playMall(NonInteractingDwellers)
    
        if 404 != len(result) {
            t.Fail()
        }
    
        for i := 0; i < len(result); i++ {
            if reflect.DeepEqual(result[i][1], [2]int{-1, -1}) { // In the last move, dwellers must be at the position where they started from
                if result[i][0][1] != 3 {
                    t.Fail()
                }
                continue
            }
            if !reflect.DeepEqual(result[i][0], [2]int{(result[i][1][0]+1)%4, (result[i][1][1]+1)%4}) { // Check if all of them move to up-right
                t.Fail()
            }
        }
    }
    
  8. Това, което написа Борис аз разбирам като последователно синхронно движение. Ако един обитател замразява света докато се чуди къде да ходи => синхронност. Тогава какво ни пречи да си направим последователна програма в една нишка, която просто да цикли през обитателите? В момента си противоречите.

  9. Да кажем, че го направим с go рутини. Какво ще стане ако scheduler-а реши да мести само един обитател много пъти докато му свършат ходовете и никога не "захапе" друг? После пусне втори и с него повтори същото нещо и така докато ходовете на всички са свършили. Това изглежда като напълно вероятен резултат на еднопроцесорна машина. Това валидно решение ли ще е?

  10. Това, което написа Борис аз разбирам като последователно синхронно движение. Ако един обитател замразява света докато се чуди къде да ходи => синхронност.

    Наличието на атомарни операции не прави цялото приложение синхронно. То единствено ни пази от това да останем без работа.

    Тогава какво ни пречи да си направим последователна програма в една нишка, която просто да цикли през обитателите?

    Условието ви пречи. Целта на задачата е да напишете нещо с конкурентен дизайн и да се справите с многото възможни race condition-и.

    Какво ще стане ако scheduler-а реши да мести само един обитател много пъти докато му свършат ходовете и никога не "захапе" друг? После пусне втори и с него повтори същото нещо и така докато ходовете на всички са свършили. Това изглежда като напълно вероятен резултат на еднопроцесорна машина. Това валидно решение ли ще е?

    Валидно си е отвсякъде. Стига това решение да е взето от scheduler, а не от студент :)

  11. Съгласен съм с Дойчин - задачата след изказването на Борис вече няма смисъл да се пише конкурентно - тоест конкурентност няма да има.

    Мисля в момента по конкурентен вариант на задачата (тоест такъв в който ще може двама+ обитатели да минават едновременно) но още от самото начало знам че няма да има смисъл - просто за спорта :).

    @Кирил мисля че Дойчин имаше предвид "валидно ли е всички обитатели да си стоят на мястото докато един си направи всичките 100 хода и след това следващия да си почне неговите 100 хода?" Поне аз така разбрах:

    Какво ще стане ако scheduler-а реши да мести само един обитател много пъти докато му свършат ходовете и никога не "захапе" друг? После пусне втори и с него повтори същото нещо и така докато ходовете на всички са свършили. Това изглежда като напълно вероятен резултат на еднопроцесорна машина. Това валидно решение ли ще е?

  12. Аз пък мисля, че в четвъртък ще трябва отново да се съсредоточа върху разликите между concurrency и parallelism.

    @Михаил, ще дам и на теб същия отговор: Да валидно решение е, стига това да се случи заради scheduler-а, а не защото студентът е решил да се случи. Аз лично не вярвам, че има реални шансове това да стане. Не говорим за три, а за сто хода.

    Нека отново да прочетем коментара на Борко, преди да правим странни заключения. Искате ли?

    Проверяването дали даден човек може да се мръдне в коя да е посока трябва да е атомарно - тоест не трябва да има случай, в който някой има свободно място долу-вдясно, но той първо проверява горе-вляво, там е заето, след което някой успява да му "вземе" мястото долу-вдясно, той го проверява, и заради това спира, защото е stuck.

    Кое тук ви кара да мислите, че два обитателя, които нямат общи, интересни за тях, клетки не могат да се движат едновременно? Борко не е казал нищо за спиране на света.

  13. Ами аз го разбрах като "не трябва да има случай, в който някой има свободно място долу-вдясно и някой друг успява да му 'вземе' мястото след като първия вече си го е 'заплюл', макар че още се занимава с проверки по другите места".

    Можеше и още в първия отговор да кажеш, че не съм разбрал правилно.

  14. Добре, разбрахме се. Поради това ето малко тестове от мен. Но за нещастие не са plug-and-play. Разчитат на функция

    func possibleMoves(position [2]int) [][2]int
    

    която за определна позиция връща възможните придвижвания от тази позция, подредени по реда в условието на задачата. Няма да ви я давам, сами ще трябва да си я напишете.

    Основната идея на този тест е да пусне няколко сценария и след това да "преиграе" всички ходове за всеки от тях.

Трябва да сте влезли в системата, за да може да отговаряте на теми.