Перейти к публикации
  • Сейчас на странице   Всего пользователей: 2   (0 пользователей, 2 гостя)

Rooster

Программирование[9]

Перепись  

260 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

для начала оформи в теги code

example
asd
example
asd

 


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

для начала засунь код в 

код

Потому что эту дрочь размазанную по строчкам читать никто не будет


65881.png

Поделиться сообщением


Ссылка на сообщение
Plants vs Zombies написал 2 часа назад:

помогите пж! скачал сурс код сапера и теперь рефакторю под себя но он довольно громоздкий и какой-то хуевый

например вот этот кусок, как его по нормальному можно переписать? плюс я не совсем понимаю что происходит

в этом методе для рассадки мин на поле, мне кажется можно сделать проще ток я чет хз как у меня голова кипит уже

void PlantMines(bool stop = false, int count = 0)

{

for (int i = 0; i < fieldArray.Length; i++)  // fieldArray это битовый массив который обозначает размер поля там хранятся 1(true) и 0(false) по дефолту вроде все 0

  {        

  if (count == countMines) break;    // тут все понятно

  if ( !fieldArray ) fieldArray = rnd.Next(0, fieldSize*fieldSize) < 50 && rnd.Next(0, 1000) > 800 ? true : false;  // вот тут нихуя непонятно что происходит я понимаю он реализовал метод рассадки но как он работет я хз можно же было проще сделать типа если  рандомный элемент массива равен false то туда пишем true

  else continue;  // почему дальше условия пишутся ведь тут есть уже if и else то есть выполнится в любом случае либо брейк либо конт не? зачем все вот это ниже писать?

  if ( fieldArray ) count++;     

  if (count < countMines) PlantMines(true, count);    

  if (stop) return; 

  }

}

или все ифы проверяются в любом случае независимо от расположения и else выполнится после всех if?

 

и во вторых 

Цитата

 

// fieldArray это битовый массив который обозначает размер поля там хранятся 1(true) и 0(false) по дефолту вроде все 0

...

 if ( !fieldArray ) fieldArray = rnd.Next(0, fieldSize*fieldSize) ...

 

где-то тут что-то не клеится

напиши тип fieldArray и перепеши вторую цитированную строчку тк там явно должна быть ячейка а не сам аррей

 

 

Цитата

или все ифы проверяются в любом случае независимо от расположения и else выполнится после всех if?

 ебаный врот. иди книжку перечитывай блять

 

 

 


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

я это вот так короче оформил

image.png.a79ab70ea2f4449659feefafe5549663.png

типа элемент бул массива должен принять тру или фолс и поэтому мы указываем что если число будет больше 79 (оптимальное значения для поля если меньше они все заполнятся в первой части поля если больше слишком рандомно) то тогда в эту ячейку пишется тру и мы увеличиваем каунт. хз зачем он так сильно только расписал условия рандома, возможно для большей точности но я вообще не заметил, у него наоборот кусками целыми поле открывалось при его значениях, хотя у него и мин меньше было.

 

короче хз легкие строки понял а где алгоритм поиска минок написан и рекурсивный метод на автооткрывание ячеек там я нихуища не понял. ну я бы его в жизни  не смог сам написать или хотя бы объяснить полностью как он работает. тут еще массив представлен одномерный из значений 1 и 0, с двумерным я видос смотрел, там вроде легче понять, там просто перебираются соседние координаты, ты их в бошке хотя бы можешь представить. а как тут перебирать координаты я хуй его знает

 

Поделиться сообщением


Ссылка на сообщение
(изменено)
Plants vs Zombies написал 13 минут назад:

я это вот так короче оформил

image.png.a79ab70ea2f4449659feefafe5549663.png

типа элемент бул массива должен принять тру или фолс и поэтому мы указываем что если число будет больше 79 (оптимальное значения для поля если меньше они все заполнятся в первой части поля если больше слишком рандомно) то тогда в эту ячейку пишется тру и мы увеличиваем каунт. хз зачем он так сильно только расписал условия рандома, возможно для большей точности но я вообще не заметил, у него наоборот кусками целыми поле открывалось при его значениях, хотя у него и мин меньше было.

 

короче хз легкие строки понял а где алгоритм поиска минок написан и рекурсивный метод на автооткрывание ячеек там я нихуища не понял. ну я бы его в жизни  не смог сам написать или хотя бы объяснить полностью как он работает. тут еще массив представлен одномерный из значений 1 и 0, с двумерным я видос смотрел, там вроде легче понять, там просто перебираются соседние координаты, ты их в бошке хотя бы можешь представить. а как тут перебирать координаты я хуй его знает

 

двумерный массив эквивалентен (в данном контексте) одномерному, просто делишь одномерный на отрезки длинной n (где n это количество столбцов в двумерном). первый отрезок - первая строка, второй отрезок - вторая и тд. 

в коде это вообще просто формулу взятия элемента меняешь 

arr[i][j] -> arr[j*n+i]

 


Изменено пользователем Just.Doit

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

rnd.Next(0, 100) > 79 

это типо 80% за true 20% за false но это калечный способ

норм пацаны пишут 

rnd.NextFloat() > 0.79

Поделиться сообщением


Ссылка на сообщение

да мне кажется это значение еще менять придется если количество ячеек в поле изменится, потому что тут подогнано так, что он + - до конца поля заполняет это

я хз я просто взял исходник у чела у него там и был вот этот булевый массив

проблема в том что сапер готовый на шарпе  это либо виндовс формс в которых я даже разбираться не хочу либо впф но программ очень мало, нашел точный клон виндовс сапера на впфке но там чел прям ебнуться как подошел к его написанию, там в солюшне куча проджектов я даже вэ той хуйне разбираться не хотел http://www.devowl.net/2018/03/csharp-saper-minesweeper-wpf.html

и второй вот этот сапер где чел написал его видимо на скорую руку и зачем-то сделал бул массив с кучей говна и палок

Поделиться сообщением


Ссылка на сообщение
Plants vs Zombies написал 1 час назад:

потому что тут подогнано так, что он + - до конца поля заполняет

может проще рандомить N уникальных индексов в которые заполнить поля?

ну типа


val placedMinesSet = Set()

while placedMinesSet.size < N

    (i,j) = (randomInt(0, n-1), randomInt(0,m-1)

    if (placedMinesSet.contains((i,j))

        continue

    else 

        placedMinesSet.add((i,j))


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

Пиздец говно выше (у дуита)

Щас бы в игре где надо обращаться к соседним клеткам хранить позиции мин блять как таплы в сете.

Захочешь ты проверить есть ли слева от клетки 5,7 мина, будешь делать блять тапл (5,7+1) и чекать есть ли он в хешмапе? Гениально. 

 

Для таких игр двумерный массив лучший вариант хранения. данных. Ну или какая-нибудь высокоуровневая обвязка которая позволит итерировать по прилегающим клеткам, проверять диагонали и тд, но опять же обвязка вокруг двумерного массива.

Не говоря уже про то, что алгоитм твой заполнит меньше чем N мин в случае выполнения

placedMinesSet.contains :chel:

Уходить на второй круг генерации тоже не вариант когда N приближается к n,m или даже равен так как это будет дохуища циклов тыканья пальцем в небо.

Поделиться сообщением


Ссылка на сообщение
    public static void main(String[] args)
    {
        int n = 16;
        int m = 32;
        int N = 4;
        List<int[]> cells = new ArrayList<>(n * m); //O(n*m) memory
        //O(n*m) complexity
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                cells.add(new int[]{i, j});
            }
        }
        //O(n*m) complexity
        Collections.shuffle(cells);
        //O(N) complexity
        final List<int[]> minedCells = cells.stream()
                                           .limit(N)
                                           .collect(Collectors.toList());
    }

Если надо сгенерить клетки для мин то вот как бы я сделал. Тут ещё можно оптимизацией заняться, типо если Мин больше чем m*n/2 то проще считать не клетки с минами, а клетки без мин.

Ну и можно рандомно распихивать на этапе заполнения cells но тут главное придумать алгоритм чтобы распределение было адекватным.

Drakonian понравилось это

Поделиться сообщением


Ссылка на сообщение

ебашут какие-то алгоритмы на рандоме

а мину в угол с 100% вероятностью засунуть забыли :chel:

GoldRobot и intuiciya_Genadiya понравилось это

Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

Index а ты шо сишарпист? Я чет думал ты  по задним концам почему-то

Поделиться сообщением


Ссылка на сообщение
Index написал 2 часа назад:

Пиздец говно выше (у дуита)

Щас бы в игре где надо обращаться к соседним клеткам хранить позиции мин блять как таплы в сете.

Захочешь ты проверить есть ли слева от клетки 5,7 мина, будешь делать блять тапл (5,7+1) и чекать есть ли он в хешмапе? Гениально.

я не предлагал их так хранить, я предлагал их так генерить. ты можешь без проблем конвертнуть данные таплы в любую удобную тебе структуру данных

Index написал 2 часа назад:

Не говоря уже про то, что алгоитм твой заполнит меньше чем N мин в случае выполнения

с хуяли

Index написал 2 часа назад:

Уходить на второй круг генерации тоже не вариант когда N приближается к n,m или даже равен так как это будет дохуища циклов тыканья пальцем в небо.

"второго круга" там нет, там 1 цикл который рандомит пока не заполнится как нужно

я думаю лучше мой компуктер рандомит, чем мне ломать голову и думать над эвристикой коэффициента чтобы заполнилось равномерно

ну и N к n*m не будет приближаться потому что это блять сапер и там должны быть пустые клетки, и насколько помню их больше чем мин значительно

 


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

А ну сорян, в глаза луплюсь. Можешь сделать поле 1000х1000 и 999999 мин и посмотреть сколько раз будет вызван цикл

Поделиться сообщением


Ссылка на сообщение
(изменено)
Index написал 1 час назад:

А ну сорян, в глаза луплюсь. Можешь сделать поле 1000х1000 и 999999 мин и посмотреть сколько раз будет вызван цикл

что за сапер такой с 

во первых 1000х1000 полями

во вторых 999999 мин


Изменено пользователем Just.Doit

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение
Just.Doit написал 2 часа назад:
Index написал 4 часа назад:

А ну сорян, в глаза луплюсь. Можешь сделать поле 1000х1000 и 999999 мин и посмотреть сколько раз будет вызван цикл

что за сапер такой с 

во первых 1000х1000 полями

во вторых 999999 мин

 

Ну если не вгоняться в гипотетические условности, вот классический сапер из винды (там можно было кастомизировать число мин)

 

Вопрос, сколько раз у тебя будет оверранать твой генератор?

Решил из любопытства проверить на жаве для данной ситуации для сидов из диапазона шортов.

    public static void main(String[] args)
    {
        int n = 30;
        int m = 24;
        int size = 667;
        Set<IntSummaryStatistics> statistics = new HashSet<>();
        for (int i = 0; i < Short.MAX_VALUE; i++)
        {
            Random random = new Random(i);
            Map<Tuple2<Integer, Integer>, AtomicInteger> count = new HashMap<>();
            while (count.keySet().size() < size)
            {
                count.computeIfAbsent(Tuples.of(random.nextInt(n), random.nextInt(m)), __ -> new AtomicInteger(0)).incrementAndGet();
            }
            final IntSummaryStatistics intSummaryStatistics = count.values()
                                                                  .stream()
                                                                  .mapToInt(AtomicInteger::get)
                                                                  .summaryStatistics();
            statistics.add(intSummaryStatistics);
        }
        statistics.stream()
            .sorted(Comparator.comparingLong(IntSummaryStatistics::getSum).reversed())
            .limit(5)
            .forEach(System.out::println);
        statistics.stream()
            .sorted(Comparator.comparingLong(IntSummaryStatistics::getSum))
            .limit(5)
            .forEach(System.out::println);
    }

Результаты:

IntSummaryStatistics{count=667, sum=2239, min=1, average=3,356822, max=9}
IntSummaryStatistics{count=667, sum=2236, min=1, average=3,352324, max=12}
IntSummaryStatistics{count=667, sum=2224, min=1, average=3,334333, max=10}
IntSummaryStatistics{count=667, sum=2209, min=1, average=3,311844, max=11}
IntSummaryStatistics{count=667, sum=2206, min=1, average=3,307346, max=9}
IntSummaryStatistics{count=667, sum=1575, min=1, average=2,361319, max=8}
IntSummaryStatistics{count=667, sum=1575, min=1, average=2,361319, max=7}
IntSummaryStatistics{count=667, sum=1579, min=1, average=2,367316, max=9}
IntSummaryStatistics{count=667, sum=1585, min=1, average=2,376312, max=7}
IntSummaryStatistics{count=667, sum=1587, min=1, average=2,379310, max=7}

В худшем сиде будет 2239 попыток, в лучшем 1575

 

Поделиться сообщением


Ссылка на сообщение
(изменено)
Index написал 8 часов назад:
Just.Doit написал 11 часов назад:
Index написал 13 часов назад:

А ну сорян, в глаза луплюсь. Можешь сделать поле 1000х1000 и 999999 мин и посмотреть сколько раз будет вызван цикл

что за сапер такой с 

во первых 1000х1000 полями

во вторых 999999 мин

 

Ну если не вгоняться в гипотетические условности, вот классический сапер из винды (там можно было кастомизировать число мин)

 

Вопрос, сколько раз у тебя будет оверранать твой генератор?

Решил из любопытства проверить на жаве для данной ситуации для сидов из диапазона шортов.


    public static void main(String[] args)
    {
        int n = 30;
        int m = 24;
        int size = 667;
        Set<IntSummaryStatistics> statistics = new HashSet<>();
        for (int i = 0; i < Short.MAX_VALUE; i++)
        {
            Random random = new Random(i);
            Map<Tuple2<Integer, Integer>, AtomicInteger> count = new HashMap<>();
            while (count.keySet().size() < size)
            {
                count.computeIfAbsent(Tuples.of(random.nextInt(n), random.nextInt(m)), __ -> new AtomicInteger(0)).incrementAndGet();
            }
            final IntSummaryStatistics intSummaryStatistics = count.values()
                                                                  .stream()
                                                                  .mapToInt(AtomicInteger::get)
                                                                  .summaryStatistics();
            statistics.add(intSummaryStatistics);
        }
        statistics.stream()
            .sorted(Comparator.comparingLong(IntSummaryStatistics::getSum).reversed())
            .limit(5)
            .forEach(System.out::println);
        statistics.stream()
            .sorted(Comparator.comparingLong(IntSummaryStatistics::getSum))
            .limit(5)
            .forEach(System.out::println);
    }

Результаты:


IntSummaryStatistics{count=667, sum=2239, min=1, average=3,356822, max=9}
IntSummaryStatistics{count=667, sum=2236, min=1, average=3,352324, max=12}
IntSummaryStatistics{count=667, sum=2224, min=1, average=3,334333, max=10}
IntSummaryStatistics{count=667, sum=2209, min=1, average=3,311844, max=11}
IntSummaryStatistics{count=667, sum=2206, min=1, average=3,307346, max=9}
IntSummaryStatistics{count=667, sum=1575, min=1, average=2,361319, max=8}
IntSummaryStatistics{count=667, sum=1575, min=1, average=2,361319, max=7}
IntSummaryStatistics{count=667, sum=1579, min=1, average=2,367316, max=9}
IntSummaryStatistics{count=667, sum=1585, min=1, average=2,376312, max=7}
IntSummaryStatistics{count=667, sum=1587, min=1, average=2,379310, max=7}

В худшем сиде будет 2239 попыток, в лучшем 1575

 

чел, это считается по терверу, зачем машину насилуешь

ну а теперь посчитай сколько времени это занимает и сколько времени и мыслетоплева ты потратил на то чтобы это обсудить

никто не спорит что это не эффективно. я говорю что неэффективно в данном случае похую


Изменено пользователем Just.Doit

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение
(изменено)

начал рассылать резюме по берлинским компаниям

одна выслала тестовую сессию по алгоритмам на codility

компания для релокейта весьма норм (Zalando) и возможностями я сейчас не разбрасываюсь, так что приходится не скипать а делать

сижу щас тренируюсь в решении всякой хуйни на арреях, битовых операциях, мутабельной императвной хуйне и прочем юзлесс говне

за шо мне всё это :pepehands:

 

ладно хоть что пока что вроде как большинство императивных алгоритмов перекладывается в хвостовую рекурсию

 


Изменено пользователем Just.Doit

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

Чому именно Берлин?


Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...