папа Стасик
тыжпрограммистНа сайте с января 2018t.me/origin_of_species

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

Кроме того, с точки зрения конструкции подводные ружья бывают пневматическими, пружинными, арбалетного типа и т.п. Поэтому по закону "об оружии" охотиться с арбалетным ружьём в России нельзя.

А ещё гарпун часто привязывают тросиком, поэтому далеко он не улетит :)

Давайте решим это уравнение относительно x.

x * (a - 2) = 5

x = 5 / (a - 2)

1) a∈(2, +∞), так как для а=2 это выражение не имеет смысла. Для всех a меньше 2 это выражение меньше 0.

2) (a-2) можно записать дробью p/q, такой, что 5q/p должно быть сократимо (другими p делит 5q нацело). Это значит, что для натуральных q, p должно быть одним из делителей 5: p∈{1, 5}. Получаем

(a-2) = 1/q, 5/q;

a = 1/q + 2; 5/q + 2;

Все эти числа удовлетворяют условию (1):

Например, a=3, 7, 2.5, 4.5, 2.(3), 3.(6), 2.25, 3.25, ...

Оригинально это задача была представлена на конкурсе им. Савина в журнале Квант #4 в 2006 году. В такой формулировке:

В ряд выложены 28 одинаковых по внешнему виду монет. Среди них есть две рядом лежащие фальшивые монеты — более тяжёлые, чем настоящие. Можно ли за 3 взвешивания на чашечных весах без гирь найти фальшивые монеты?

Решения в интернете я не нашёл, поэтому приведу своё решение. Любая задача на взвешивание монет на каждом шаге даёт 3 варианта: тяжелее, легче или равны. В самом сбалансированном случае это означает принадлежность искомого объекта к одной из кучек, большая из которых не может быть меньше, чем 1/3 от размера исходного числа монет. Тогда поиск одной монеты за 3 взвешивания осуществим только для 3^3=27 монет (или меньше).

В нашей постановке задачи есть дополнительная информация о том, что пара монет лежит рядом, поэтому мы будем искать позицию пары. Таких позиций будет ровно 27 (1-2, 2-3, ..., 27-28) -- значит у нас всё может получиться!

Разделим монеты на 3 кучки по 10 штук с перекрытием в одну монету: 1-10, 10-19, 19-28, и попробуем определить принадлежность нашей пары к одной из этих кучек. Для этого взвесим на весах первые 9 монет (1-9) и последние 9 (20-28). Если они равны, в них нет фальшивых монет, а обе тяжёлые монеты принадлежат средней кучек из 10 монет (10-19). Если одна из них окажется тяжелее, это значит, что 1 или 2 тяжёлые монеты попали в неё. Мы знаем, что тяжёлые монеты ходят парами, поэтому мы гарантируем, что обе попадут в "расширенную" кучку (1-10) или (19-28).

Теперь у нас есть кучка из 10 монет, в которой прячется фальшивая пара. Повторим процедуру для 3 кучек размером 4 монеты с перекрытием: 1-4, 4-7, 7-10. Взвесим 1-3 и 8-10 и найдём четвёрку, в которой скрывается наша пара монет, по тому же принципу.

Последний шаг - найти пару среди 4 монет. Взвесим крайние 1 и 4. Если равны - пара посередине, если 1я тяжелее, то фальшивые 1-2, если легче - 3-4.

Если обе видеокарты установлены корректно, то приложение самостоятельно совершает выбор наиболее подходящей. Иногда операционная система предлагает сделать выбор - правой кнопкой мыши на приложении: запустить с использованием указанной видеокарты. У NVidia есть приложение, в котором можно выбрать видеокарту по умолчанию - для этого нужно воспользоваться иконкой в трее. Если же вас интересует именно использование одной карты, тогда воспользуейтесь оснастной "Управление компьютером".

Вот условие:

(1) x/y = 13/14

(2) (x + 13)/(y + 13) = 19/10

Перепишем (1):

x = 13/14*y

Подставим в (2):

13/14*y + 13 = 19/10*(y + 13)

(13/14 - 19/10) * y = 19/10*13 - 13

(13/14 - 19/10) * y = 9/10 * 13 | умножим обе части на 10

(130/14 - 19) * y = 117

(130 - 266)/14 * y = 117

-136/14 * y = 117

y = -117*7/68 = -819/68

x = -(13 * 819)/(14 * 68) = -(13 * 117)/(2 * 68) = -1521/136

Подставим:

(-1521/136 + 13)/(-819/68 + 13) = ((1768-1521)/136)/((884-819)/68) = (247/136) / (65/68) = (247/2)/65 = 247/130 = 19/10

Судя по формулировке, ошибка случилась в 1С. Скорее всего происходит попытка неявного приведения типов переменной. Если ошибка случается постоянно, проверьте, что что аргументы арифметических операций - числа. Если ошибка случается эпизодически, вероятно, иногда одна из переменных принимает значение NULL. Тогда ошибку можно исправить, используя функцию ЕСТЬNULL(переменная, 0).

По методу мы поднимается от меньшего простого (2) до большего и вычёркиваем все кратные им числа от 2*prime до k*prime <= 966290.

Наибольшее простое, кратные которого могли быть не были вычеркнуты до того - 983 (округлённый вниз корень из 966290), ведь для всех больших чисел множители уже прошли через решето. Тогда последнее вычеркрутое число равно last = k*983 <= 966290

Решением этого неравенства является k = 983, а значит

last = 966289.

Искусственный интеллект -- это "зонтичный" термин, который накрывает собой множество не очень связанных дисциплин.

Так, если вас интересует машинное обучение -- то там почти безраздельно правит Python. Также используют R, Matlab/Octave, .... При этом, когда дело доходит до применения в индустриальных системах, то решения часто переписывают на C/C++. Особенно это касается машинного зрения.

Если говорить про математический ИИ - то там правят математические языки: Mathematica (см. Wolfram Alpha), Matlab, Maple.

Для систем автоматического доказательства и экспертных систем часто используют декларативные языки, такие как LISP, Prolog, CLIPS.

Но это всё не ограничивает разработчика в творчестве. Поэтому появляются такие милые вещи, как свёрточные нейронные сети в браузере: https://cs.stanford.edu/people/karpathy/convnetjs/

Это очень просто :)

Конечно, чтобы сделать это осмысленно, нужно образование. Но в целом, искусственная нейронная сеть (ИНС) -- один из множества инструментов машинного обучения. И решает она задачи классификации (к какому из N известных классов относится объект, например, кошка это, собака или ни то ни другое) и регрессии (оценить объект числом, например, ценой).

Чтобы обучить любую модель (не только ИНС), нужно, чтобы объекты, которые вы хотите классифицировать/оценивать были представимы в виде последовательности действительных чисел - вектора. И чтобы для существенного числа этих объектов у вас был ожидаемый результат (известен класс или известна оценка). Вместе объекты с их оценками называются обучающей выборкой. Если её нет, никакой магии не получится. Если вам удалось собрать эти данные в матрицы, то дальше всё просто - в интернете есть куча примеров того, как обучить любую модель при наличии данных с помощью scikit learn, tensorflow, keras, caffe.

Что касается нейронной сети, то самое важное определиться с числом слоёв и их размером. Общее эмпирическое правил - чем меньше данных, тем меньше должно быть параметров у модели. Для нейронной сети это значит, что если примеров у вас не очень много, то слоёв в сети должно быть мало, и их размер должен быть небольшим. Иначе сеть просто "запомнит" все ваши примеры и не будет обладать предсказательной силой для неизвестных объектов.

И да, размер входного слоя должен быть равен размеру вектора объекта, а размер выходного - числу классов. Всё, дальше дело техники и фантазии :)

Например, в библиотеке scikit learn есть класс MLPClassifier, для которого есть примеры использования: http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier

У меня в курсе был пример с использование различных библиотек: https://github.com/str-anger/practical-ai/blob/master/4/classification-ann.ipynb