powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная задачка для ума за 1 миллион $
25 сообщений из 491, страница 18 из 20
Пятничная задачка для ума за 1 миллион $
    #39532799
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это утка. :)
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39532877
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вчера накрапал. Есть много TODO-s. Но в целом. Работает.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
package mayton.chess;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Nonnull;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static java.lang.String.join;
import static java.lang.String.valueOf;
import static java.lang.System.out;

public class MtnQueensGenerator {

    static Logger logger = LoggerFactory.getLogger(MtnQueensGenerator.class);

    public static Integer tailElement(@Nonnull List<Integer> arg) {
        return arg.get(arg.size() - 1);
    }

    // TODO: Remove
    public static List<Integer> headElements(@Nonnull List<Integer> arg) {
        int n = arg.size();
        return arg.stream().limit(n - 1).collect(Collectors.toList());
    }
    public static List<Integer> subList(@Nonnull List<Integer> arg, int i) {
        if (arg == null) {
            throw new IllegalArgumentException("Array cannot be null!");
        }
        int n = arg.size();
        if (i < 0 || i >= n) {
            throw new IllegalArgumentException("Index is out of range");
        }
        if (i == 0) {
            if (n == 1) {
                return Collections.emptyList();
            } else {
                // TODO: Investigate for performance
                return arg.stream().skip(1).collect(Collectors.toList());
            }
        }
        if (i == n - 1) {
            // TODO: Investigate for performance
            return arg.stream().limit(n - 1).collect(Collectors.toList());
        }
        // TODO: Investigate for performance
        List<Integer> res = new ArrayList<>(arg.stream().limit(i).collect(Collectors.toList()));
        res.addAll(arg.stream().skip(i + 1).collect(Collectors.toList()));
        return res;
    }

    public static boolean isConsistent(@Nonnull List<Integer> q, int candidate) {
        int n = q.size();
        for (int i = 0; i < n; i++) {
            int qi = q.get(i);
            int deltai = n - i;
            int deltaRow = qi - candidate;
            if (Math.abs(deltaRow) == deltai) {
                return false;
            }
        }
        return true;
    }

    private static void printSolution(@Nonnull List<Integer> queens) {
        out.printf("Queens : %s\n", formatQueens(queens));
        out.printf("----------------\n");
        int n = queens.size();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                out.print(queens.get(i) == j ? "Q" : "*");
                out.print(" ");
            }
            out.println();
        }
        out.println();
    }

    // TODO: Replace with Guava or smth else
    static List<Integer> fromArray(@Nonnull int[] array) {
        List<Integer> res = new ArrayList<>(array.length);
        for (int elem : array) {
            res.add(elem);
        }
        return res;
    }


    public static String formatQueens(List<Integer> list) {
        StringBuilder sb = new StringBuilder("");
        sb.append(join(",", valueOf(list)));
        sb.append("");
        return sb.toString();
    }

    public static void process(int n, int level, @Nonnull List<Integer> candidates, @Nonnull List<Integer> selected) {
        if (selected.size() == n) {
            // TODO: Improove overloaded isConsistent
            if (isConsistent(headElements(selected), tailElement(selected))) {
                solutions++;
                printSolution(selected);
            }
        } else {
            for (int i = 0; i < candidates.size(); i++) {
                int newCandidate = candidates.get(i);
                if (isConsistent(selected, newCandidate)) {
                    List<Integer> newSelected = new ArrayList<>(selected);
                    newSelected.add(newCandidate);
                    process(n, level + 1, subList(candidates, i), newSelected);
                }
            }
        }
    }

    static int solutions = 0;

    public static void main(String[] args) {
        int n = 8;
        process(n, 0, fromArray(IntStream.range(0, n).toArray()), new ArrayList<>());
        out.printf("Solutions : %d", solutions);
    }

}

...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39532932
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю... форкну тему в Java в части оптимизации массивов. Здесь - будем обсуждать алгоритмизацию
а техники language-related - лучше отдельно.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39532994
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор взял и поудалял мои сообщения, хотя в коде реализации обсуждаемого алгоритма есть явные ошибки.
Модератор: Надо указывать на ошибки, а не разводить холивар с переходом на личности
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39532996
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2, там нет major ошибок. Основной алгоритм-то работает? Работает.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39532998
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

хуже нет, когда правильный алгоритм реализован с ошибками в коде. И потом получается, что на тестовых данных все работает, выпускаем в продакшн, начинаются непонятки.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39532999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2, как вы определите какой алгоритм правильный а какой нет?

Шарахов реализовал расстановку ферзей. На тестовых данных она работает.

Я точно так-же поступаю. Супер-провидения насчет ошибок которых я не увидел
у меня нет. Модульные тесты + four eyes check. Вот на чем стоит весь ентерпрайз.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533000
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И если говорить о реализации, не увидел использования распараллеливания.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533001
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2И если говорить о реализации, не увидел использования распараллеливания.
А что он претендовал на это?
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533002
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonasutp2, как вы определите какой алгоритм правильный а какой нет?

Шарахов реализовал расстановку ферзей. На тестовых данных она работает.

Я точно так-же поступаю. Супер-провидения насчет ошибок которых я не увидел
у меня нет. Модульные тесты + four eyes check. Вот на чем стоит весь ентерпрайз.Я не знаю, правильный алгоритм или нет (не вникал). Но я вижу опубликованный код конкретной функции на delphi, содержащей явные ошибки. Мне кажется, этого вполне достаточно, чтобы судить о качестве реализации. И предполагаю, что если таким же образом написан весь остальной код алгоритма, то правильность его работы вызывает как минимум сомнение.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533006
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сказать короче: там нет ошибок.

Чтобы утверждать другое, необходимо привести хотя бы один пример, когда функция выдает неверный результат.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533007
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сделал ему своё замечание касающееся стиля разработки. И коллаборации.

Кстати мой сорс опубликован здесь . Велкам.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533008
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Но я вижу опубликованный код конкретной функции на delphi, содержащей явные ошибки. Мне кажется, этого вполне достаточно, чтобы судить о качестве реализации.
Вы знаете. Функция которая складывает 2 числа типа integer УЖЕ содержит ошибки. Но они касаются
очень глубоких случаев behaviour когда переполняется разрядная сетка и надо принять решение.

Я уверен. Что ВЫ. Шарахов. И я. И все другие разработчики в 99.99% случаев не обращают
на это внимание. Хотя это баг, на который надо среагировать и покрыть это тестами хотя-бы
на уровне пограничных.

Но мы в энтерпрайзе обычно считаем что эти кейсов с переполнением нет и быть не может.
И именно поэтому мы НЕ считаем что функция с ошибкой. Мы просто считаем что ситуация
настолько маловероятна что не стоит с ней заморачиваться. Это как коллизия GUID. Она
теоретически есть но всем забить на нее болт ибо вероятнее вам по башке упадет метеорит.

Как то так.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533016
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovПопробовал на поле 50000х50000 в центральный квадрат 25000х25000 случайно ставить 12500 ферзей.
Завершение нашлось во всех 10 проведенных тестах.

поле 50000x50000 содержит 2.500.000.000 клеток. У Integer (в delphi) максимально возможное число 2.147.483.647. Как проводились тесты с наличием потенциальной ошибка переполнения из за используемых типов данных? И еще - для поля такого размера использовано всего 10 тестов?
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533018
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо мы в энтерпрайзе обычно считаем что эти кейсов с переполнением нет и быть не может.
И именно поэтому мы НЕ считаем что функция с ошибкой. Мы просто считаем что ситуация
настолько маловероятна что не стоит с ней заморачиваться. Это как коллизия GUID. Она
теоретически есть но всем забить на нее болт ибо вероятнее вам по башке упадет метеорит.Это вы за ВСЕХ в энтерпрайзе так говорите или только за себя?
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533020
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Я не знаю, правильный алгоритм или нет (не вникал). Но я вижу опубликованный код конкретной функции на delphi, содержащей явные ошибки. Мне кажется, этого вполне достаточно, чтобы судить о качестве реализации. И предполагаю, что если таким же образом написан весь остальной код алгоритма, то правильность его работы вызывает как минимум сомнение.

Хватит пороть бред. От этого код не станет неверным.

Укажи конкретное место ошибки. Что должны получить и что получаем.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533026
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Aleksandr SharahovПопробовал на поле 50000х50000 в центральный квадрат 25000х25000 случайно ставить 12500 ферзей.
Завершение нашлось во всех 10 проведенных тестах.

поле 50000x50000 содержит 2.500.000.000 клеток. У Integer (в delphi) максимально возможное число 2.147.483.647.
И что? На твой взгляд, это имеет значение, когда мы ищем единственное завершение?


asutp2Как проводились тесты с наличием потенциальной ошибка переполнения из за используемых типов данных?
Весь код доступен. Диапазон количества решений известен. Не увидеть тип int64 невозможно. Глаза есть?
Зато есть непоколебимая уверенность в наличии ошибки.


asutp2И еще - для поля такого размера использовано всего 10 тестов?
Конечно, нет. Это была отладка.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533030
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Не понимаю зачем тут приплетать энтерпрайз? Тут не курсы для джунов, не надо тут демагогию на эту тему устраивать.
Какой вообще может быть энтерпрайз по расстановке ферзей?

Прекращаем обсуждать подходы и стили написания кода, т.к. топик совсем не про это.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533038
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2maytonНо мы в энтерпрайзе обычно считаем что эти кейсов с переполнением нет и быть не может.
И именно поэтому мы НЕ считаем что функция с ошибкой. Мы просто считаем что ситуация
настолько маловероятна что не стоит с ней заморачиваться. Это как коллизия GUID. Она
теоретически есть но всем забить на нее болт ибо вероятнее вам по башке упадет метеорит.Это вы за ВСЕХ в энтерпрайзе так говорите или только за себя?
Я говорю за себя и за то комьюнити которое меня окружает последние лет 10-15.
Ничего нового в оценке качества ПО не было придумано. Модульные тесты. UAT.
Акцептенс-тестинг. И всё. Никаких других магий не придумано для поиска ошибок.

И разумеется коде-ревью про которое я уже упоминал. И которое вообще ниочом
и просто гарантирует что коллега во время просмотра вашего кода ни разу не воскликнул
"Whats the fuck...".
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533053
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovasutp2Я не знаю, правильный алгоритм или нет (не вникал). Но я вижу опубликованный код конкретной функции на delphi, содержащей явные ошибки. Мне кажется, этого вполне достаточно, чтобы судить о качестве реализации. И предполагаю, что если таким же образом написан весь остальной код алгоритма, то правильность его работы вызывает как минимум сомнение.

Хватит пороть бред. От этого код не станет неверным.

Укажи конкретное место ошибки. Что должны получить и что получаем.

ок, укажу конкретное место ошибки в IsSolutionValid:

Код: pascal
1.
2.
var
  i, r, c: integer;


помним, что I может принимать значения в диапазоне [-2147483648..2147483647]
теперь смотрим цикл
Код: pascal
1.
for i:=0 to BoardSize-1 do


и смотрим в цикле код
Код: pascal
1.
if (cardinal(c)>=BoardSize) or (cardinal(r)>=BoardSize) then exit;


последний участок кода говорит о том, что BoardSize имеет тип Cardinal. Что говорит дока делфи о Cardinal? Это беззнаковый тип, хранящий значения в диапазоне [0..4294967295].
Значит при I: Integer и BoardSize: Cardinal имеем ситуацию, что при достижении I=2147483647 цикл выполнится, а затем прервется и проверка в большем диапазоне значений не будет выполнена (т.е. когда > 2147483647). Это нормально?
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533054
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovВесь код доступенДоступен где? Ссылку плиз
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533071
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2ок, укажу конкретное место ошибки в IsSolutionValid:

Код: pascal
1.
2.
var
  i, r, c: integer;


помним, что I может принимать значения в диапазоне [-2147483648..2147483647]
теперь смотрим цикл
Код: pascal
1.
for i:=0 to BoardSize-1 do


и смотрим в цикле код
Код: pascal
1.
if (cardinal(c)>=BoardSize) or (cardinal(r)>=BoardSize) then exit;


последний участок кода говорит о том, что BoardSize имеет тип Cardinal.


Последний участок кода говорит о том, что использовано явное приведение переменной c к типу cardinal, и еще о том, что тебе пора в школу, учить уроки.
Переменная BoardSize имеет тип integer, и ты б это знал, если бы прежде чем делать выводы не поленился заглянуть в код.



asutp2Что говорит дока делфи о Cardinal? Это беззнаковый тип, хранящий значения в диапазоне [0..4294967295].
Значит при I: Integer и BoardSize: Cardinal имеем ситуацию, что при достижении I=2147483647 цикл выполнится, а затем прервется и проверка в большем диапазоне значений не будет выполнена (т.е. когда > 2147483647). Это нормально?
[/quot]
Опять же, если б ты учился на пятерки, то знал бы, что при установленном знаковом бите в значении BoardSize-1 цикл вообще не начнет выполняться. Опять двойка.

Это как раз тот случай, когда лучше молчать.




asutp2Aleksandr SharahovВесь код доступенДоступен где? Ссылку плиз

mayton, извини, придется ему отрыть тайну: http://guildalfa.ru/alsha/node/35
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533074
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovif (cardinal(c)>=BoardSize) or (cardinal(r)>=BoardSize) then exit;
Aleksandr SharahovПоследний участок кода говорит о том, что использовано явное приведение переменной c к типу cardinal
Aleksandr SharahovПеременная BoardSize имеет тип integer

Сравниваешь Integer с Integer, но первый Integer приводишь к Cardinal? Точно индусы курят нервно в стороне)))))
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533076
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Aleksandr Sharahovif (cardinal(c)>=BoardSize) or (cardinal(r)>=BoardSize) then exit;
Aleksandr SharahovПоследний участок кода говорит о том, что использовано явное приведение переменной c к типу cardinal
Aleksandr SharahovПеременная BoardSize имеет тип integer

Сравниваешь Integer с Integer, но первый Integer приводишь к Cardinal? Точно индусы курят нервно в стороне)))))

Для переменных типа integer этот код эквивалентен такому
Код: pascal
1.
if (c>=BoardSize) or (c<0) or (r>=BoardSize) or (r<0) then exit;



Ты не выучил урок "Прямое попадание" отсюда http://guildalfa.ru/alsha/node/20
Третья двойка. Второгодник.

Достал уже. Иди лечи свои комплексы.
...
Рейтинг: 0 / 0
Пятничная задачка для ума за 1 миллион $
    #39533077
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йоу, посмотрел код по ссылке. Жесть.

Код: pascal
1.
2.
3.
4.
5.
const
  MaxBoardSize= 100000;
  CountCol: array[0..MaxBoardSize-1] of byte;   
  CountRow: array[0..MaxBoardSize-1] of byte;  
  CountDiagP: array[0..2*MaxBoardSize-2] of byte;

реально что ли используются статические массивы такого размера?
Код: pascal
1.
begin;

што?
Код: pascal
1.
2.
label
  NEXT1, NEXT2, NEXT3, PROC1, PROC2, PROC3, BACK1, BACK2, BACK3, FINISH;

на turbo pascal что ли пишешь?)

Не увидел по ссылке обсуждаемую выше функцию. Протухшая версия?
...
Рейтинг: 0 / 0
25 сообщений из 491, страница 18 из 20
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная задачка для ума за 1 миллион $
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]