Русский
Русский
English
Статистика
Реклама

Задача

Что за черт, JavaScript?

16.07.2020 16:05:50 | Автор: admin


Доброго времени суток, друзья!

Представляю Вашему вниманию перевод списка забавных и сложных примеров работы JavaScript What the f*ck JavaScript? автора Denys Dovhan.

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



GitHub Pages.

Скачать pdf.

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

Благодарю за внимание.
Подробнее..

JavaScript 250 практических вопроса (список викторина бонус)

13.08.2020 16:14:35 | Автор: admin


Доброго времени суток, друзья!

Представляю вашему вниманию список из 250+ практических вопроса по JavaScript с подробными (насколько это возможно и уместно в контексте чеклиста) ответами, возможностью проверить свои знания с помощью викторины, состоящей из 30 случайных вопроса из списка, и бонусом в виде вопросов, разделенных на логические блоки (в разработке).

В действительности, на данный момент в приложении содержится 193 вопроса. Я активно работаю над продолжением (бонусом).

Посмотреть и установить приложение можно здесь (Netlify) и здесь (PWA Store).

Код приложения на GitHub.

Песочница:



Особенности приложения (на правах рекламы):

  • Приложение содержит самую большую на сегодняшний день коллекцию практических заданий в Рунете
  • Вопросы имеют разный уровень сложности и касаются всех аспектов работы JavaScript, включая самые последние возможности типа динамического импорта или оператора опциональной цепочки
  • Приложение представляет интерес как для опытных разработчиков, так и для тех, кто только начинается погружаться в удивительный мир веб-программирования
  • Формат приложение один из лучших способов определения своего уровня мастерства и углубленного изучения языка
  • Приложение адаптировано под мобильные (является прогрессивным, что означает, что его можно установить на телефон или компьютер) и работает в офлайн-режиме (кэширование, сервис-воркер)
  • Список вопросов очень длинный, поэтому в приложении реализовано запоминание последнего изученного вопроса (Intersection Observer + локальное хранилище), что позволяет в любой момент сделать паузу, выйти из приложения, выпить кофе, посмотреть Netflix, прогуляться, зайти в приложение и продолжить с того места, на котором остановились
  • В приложении нет ничего лишнего: только JavaScript, только хардкор, т.е., я хотел сказать, практика

На десктопе приложение выглядит следующим образом:





А на смарфоне так:







Приложение основано на следующих репозиториях:


Большое спасибо авторам за проделанную работу.

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

Буду рад любым отзывам, замечаниям и предложениям. Как известно, не совершает ошибок лишь тот, кто ничего не делает, так что приношу извинения за возможные ошибки и опечатки (все-таки 5000+ строк кода, и это только исходники-вопросы).

Надеюсь, приложение вам понравится. Благодарю за внимание.
Подробнее..

Перевод 20 ES6-сниппетов для решения практических задач

11.11.2020 10:16:50 | Автор: admin


Доброго времени суток, друзья!

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

Предполагается, что вы имеете определенный опыт программирования на JavaScript.

1. Как скрыть все элементы определенного типа?


// вспомогательная функция для нахождения всех элементов определенного типаconst findAll = (parent, selector) => parent.querySelectorAll(selector)const hide = (...els) => [...els].forEach(el => el.style.display = 'none')// примерhide(findAll(document, 'img')) // находим и скрываем все элементы "img" на странице

2. Как проверить, что элемент имеет определенный класс?


// вспомогательная функция для нахождения одного элемента определенного типаconst findOne = (parent, selector) => parent.querySelector(selector)const hasClass = (el, className) => el.classList.contains(className)// примерhasClass(findOne(document, 'p'), 'special') // true

3. Как переключить классы элемента?


const toggleClass = (el, className) => el.classList.toggleClass(className)// примерtoggleClass(findOne('p'), 'special') // параграф больше не имеет класса "special"

4. Как получить величину прокрутки текущей страницы?


const getScrollPosition = (el = window) => ({  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop})// примерgetScrollPosition() // { x: 0, y: 200 }

5. Как сделать плавную прокрутку в начало страницы?


const scrollToTop = () => {  const c = document.documentElement.scrollTop || document.body.scrollTop  if (c > 0) {    requestAnimationFrame(scrollToTop)    scrollTo(0, c - c / 8)  }}// илиscrollTo({  top: 0,  behavior: 'smooth'})// примерscrollToTop()

6. Как проверить, содержит ли один элемент другой?


const elementContains = (parent, child) => parent !== child && parent.contains(child)// примерelementContains(findOne(document, 'head'), findOne(document, 'title')) // trueelementContains(findOne(document, 'body'), findOne(document, 'body')) // false

7. Как определить, попадает ли элемент в область просмотра?


const elemIsVidibleInViewport = (el, partiallyVisible = false) => {  const { top, left, bottom, right } = el.getBoundingClientRect()  const { innerHeight, innerWidth } = window  return partiallyVisible    ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&      ((left > 0 && left < innerWidth || right > 0 && right < innerWidth))    : top >= 0 & left >=0 && bottom <= innerHeight && rigth <= innerWidth}// примерelemIsVidibleInViewport(el) // элемент должен быть виден полностьюelemIsVidibleInViewport(el, true) // может быть виден частично

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


const getImages = (el, includeDuplicates = false) => {  const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src'))  return includeDuplicates ? images : [...new Set(images)]}// примерgetImages(document, true) // получаем все изображения на страницеgetImages(document, false) // получаем только уникальные изображения

9. Как определить устройство пользователя?


const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)    ? 'Mobile'    : 'Desktop'// ExampledetectDeviceType()

11. Как создать объект, содержащий параметры текущего URL?


const getURLParams = url => (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(  (a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a),  {})// примерgetURLParams('http://url.com/page?f=John&l=Smith') // { f: 'John', l: 'Smith' }getURLParams('https://google.com') // { }

12. Как преобразовать элементы формы в объект?


const formToObject = form =>  Array.from(new FormData(form)).reduce(    (acc, [key, value]) => ({      ...acc,      [key]: value    }),    {}  )// примерformToObject(findOne(document, 'form')) // { name: 'John', email: "myemail@example.com" }

13. Как извлечь определенные свойства объекта?


const getProps = (from, ...selectors) =>  [...selectors].map(s =>    s      .replace(/\[([^\[\]]*)\]/g, '.$1.')      .split('.')      .filter(t => t !== '')      .reduce((prev, cur) => prev && prev[cur], from)  )const obj = { selector: { to: { value: 'value to select' } }, target: [ 1, 2, { a: 'test' } ] }// примерgetProps(obj, 'selector.to.value', 'target[0]', 'target[2].a') // [ 'value to select', 1, 'test' ]

14. Как вызвать функцию через определенное время (в миллисекундах)?


// вспомогательная функция для вывода сообщения в консольconst log = (value) => console.log(value)const delay = (fn, wait, ...rest) => setTimeout(fn, wait, ...rest)// примерdelay(  text => log(text),  1000,  'позже')// 'позже' через 1 секунду

16. Как удалить обработчик события, зарегистрированный на определенном элементе?


// вспомогательная функция для добавления обработчикаaddListener = (el, evt, cb) => el.addEventListener(evt, cb)const removeListener = (el, evt, fn, opts = false) => el.removeEventListener(evt, fn, opts)const fn = () => log('!')// пример;((B) => {  addListener(B, 'click', fn)  removeListener(B, 'click', fn) // сообщение "!" больше не выводится в консоль после клика})(document.body)

17. Как преобразовать миллисекунды в читаемый формат?


const formatDuration = ms => {  if (ms < 0) ms = -ms  const time = {    // ~~ = Math.floor    day: ~~(ms / 86400000),    hour: ~~(ms / 3600000) % 24,    minute: ~~(ms / 60000) % 60,    second: ~~(ms / 1000) % 60,    millisecond: ~~(ms) % 1000  }  return Object.entries(time)    .filter(val => val[1] !== 0)    .map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`)    .join(', ')}// примерformatDuration(1001); // 1 second, 1 millisecondformatDuration(34325055574); // 397 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds

18. Как получить разницу между двумя датами в днях?


const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24)// примерlog(  getDaysDiffBetweenDates(new Date('2020-11-01'), new Date('2020-11-09'))) // 8

19. Как сделать GET-запрос?


// XMLHttpRequestconst httpGet = (url, cb, err = console.error) => {  const req = new XMLHttpRequest()  req.open('GET', url, true)  req.onload = () => cb(req.responseText)  req.onerror = () => err(req)  req.send()}httpGet(  'https://jsonplaceholder.typicode.com/posts/1',  log) // { "userId": 1, "id": 1, "title": "some title", "body": "some text" }// fetchconst httpGet = (url, cb, err = console.error) =>  fetch(url)    .then(response => response.json())    .then(result => cb(result))    .catch(error => err(error))// async/awaitconst httpGet = async (url, cb, err = console.error) => {  try {    const response = await fetch(url);    const result = await response.json();    cb(result);  } catch (error) {    err(error)  }}

20. Как сделать POST-запрос?


// XMLHttpsRequestconst httpPost = (url, data, cb, err = console.error) => {  const req = new XMLHttpRequest()  req.open('POST', url, true)  req.setRequestHeader('Content-Type', 'application/json')  req.onload = () => cb(req.responseText)  req.onerror = () => err(req)  req.send(data)}const newPost = {  userId: 1234,  title: 'foo',  body: 'bar baz qux'}const data = JSON.stringify(newPost)httpPost(  'https://jsonplaceholder.typicode.com/posts',  data,  log) // { "id": 101, "userId": 1234, "title": "foo", "body": "bar baz qux" }// async/awaitconst httpPost = async (url, data, cb, err = console.error) => {  try {    const response = await fetch(url, {      method: 'POST',      headers: {        'Content-Type': 'application/json'      },      body: JSON.stringify(data)    })    const result = await response.json()    cb(result)  } catch (error) {    err(error)  }}httpPost(  'https://jsonplaceholder.typicode.com/posts',  newPost,  log)

21. Как создать счетчик с определенным диапазоном, шагом и продолжительностью?


const counter = (selector, start, end, step = 1, duration = 2000) => {  let current = start,    _step = (end - start) * step < 0 ? -step : step,    timer = setInterval(() => {      current += _step      findOne(document, selector).innerHTML = current      if (current >= end) findOne(document, selector).innerHTML = end      if (current >= end) clearInterval(timer)    }, Math.abs(~~(duration / (end - start))))    return timer}// примерcounter('#some_id', 1, 1000, 5, 2000) // создаем двухсекундный таймер для элемента с идентификатором "some_id"

22. Как скопировать строку в буфер обмена?


const copyToClipboard = str => {  const el = document.createElement('textarea')  el.value = str  el.setAttribute('readonly')  el.style.position = 'absolute'  el.style.left = '-999px'  document.body.append(el)  const selected = document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false  el.select()  document.execCommand('copy')  el.remove()  if (selected) {    document.getSelection().removeAllRanges()    document.getSelection().addRange(selected)  }}// примерcopyToClipboard('some text') // строка "some text" скопирована в буфер обмена

Надеюсь, вы нашли для себя что-нибудь интересное. Еще больше JavaScript в моем приложении. Благодарю за внимание.
Подробнее..

Короткий путь к Искусственному интеллекту?

07.07.2020 06:22:58 | Автор: admin
Давайте признаемся: мы как-то буксуем. Разработки в сфере ИИ, при всех значительных затратах, не дают ожидаемого выхлопа. Конечно, кое-чего получается, но дело идет медленно. Медленнее, чем хотелось бы. Может, задача не решается потому, что решается не та задача?

Сейчас у нас есть много алгоритмов, выполняющих те или иные (отдельные) когнитивные функции. Одни обыгрывают нас в игры, другие водят машины, третьи Не мне вам рассказывать. Мы создали программы компьютерного зрения, которые различают дорожные знаки лучше, чем мы сами. Программы, которые рисуют и пишут музыку. Алгоритмы ставят медицинские диагнозы. Алгоритмы могут заткнуть нас за пояс в распознавании котиков, но конкретно этот, который для котиков, ни в чем ином, кроме распознавания котиков. А мы-то хотим такую программу, которая решала любые задачи! Нам нужен сильный или универсальный ИИ, но без собственного сознания, чтоб не смог отказаться решать поставленную задачу, верно? Где нам его взять?



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

Наш мозг. Представьте его себе. Два кило (по максимуму) податливого розовато-серого вещества. Сто миллиардов (тоже возьмем по максимуму) нейронов, каждый из которых готов отрастить до десяти тысяч динамических связей синапсов, которые могут то появляться, то исчезать. Плюс несколько типов сигналов между ними, да еще и глия сюрприз подкинула тоже что-то проводит, помогает и способствует. (Для справки: нейроглия или просто глия совокупность вспомогательных клеток нервной ткани. Составляет около 40% объёма ЦНС. Количество глиальных клеток в среднем в 10-50 раз больше, чем нейронов). Дендриты недавно удивили оказывается, они выполняют куда больше функций, чем считалось ранее (1). Мозг очень сложная штука. Если не верите спросите у Константина Анохина. Он подтвердит.

Человек все делает с помощью мозга. Собственно, мы это и есть он. Отсюда совершенно неудивительным является представление человека о том, что мозг = интеллект и еще более неудивительна идея скопировать устройство мозга и вуаля! получить искомое. Но мозг это не интеллект. Мозг это носитель. Железо. А Интеллект это алгоритм, софт. Попытки повторить софт через копирование железа это провальная идея. Это культ карго (2). Вы же знаете, что такое культ карго?

Аборигены островов Меланезии (увидев во время WWII, как самолеты привозят оружие, продовольствие, медикаменты и многое другое), соорудили из соломы копии самолетов и будку диспетчера, но никак не помогли себе в получении товаров, потому что не имели никакого представления о том, что скрывается за внешним видом самолетов. Так и мы, разобрав до винтиков калькулятор, не найдем внутри ни одной цифры. И, тем более, никакого намека на какие-либо операции с числами.

Пару лет назад Андрей Константинов в одном из номеров журнала Кот Шрёдингера (12 за 2017 г.), в своей колонке Где у робота душа, написал: Со времён Лейбница мы так и не нашли в мозге ничего, кроме частей, толкающих одна другую. Конечно не нашли! И не найдем. По компьютерному железу мы пытаемся восстановить программу, а это невозможно. В качестве подтверждающего аргумента приведу длинную цитату (3):

нейробиологи, вооружившись методами, обычно применяемыми для изучения живых нейроструктур, попытались использовать эти методы, чтобы понять, как функционирует простейшая микропроцессорная система. Мозгом стал MOS 6502 один из популярнейших микропроцессоров всех времён и народов: 8-битный чип, использованный во множестве ранних персональных компьютеров и игровых приставок, в том числе Apple, Commodore, Atari. Естественно, что мы знаем об этом чипе всё ведь он создан человеком! Но исследователи сделали вид, что не знают ничего и попытались понять его работу, изучая теми же методами, которыми изучают живой мозг.

Химически была удалена крышка, под оптическим микроскопом изучена схема с точностью до отдельного транзистора, создана цифровая модель (тут я немного упрощаю, но суть верна), причём модель настолько точная, что на ней оказалось возможно запускать старые игры (Space Invaders, Donkey Kong, Pitfall). А дальше чип (точнее, его модель) был подвергнут тысячам измерений одновременно: во время исполнения игр измерены напряжения на каждом проводке и определено состояние каждого транзистора. Это породило поток данных в полтора гигабайта в секунду который уже и анализировался. Строились графики всплесков от отдельных транзисторов, выявлялись ритмы, отыскивались элементы схемы, отключение которых делало её неработоспособной, находились взаимные зависимости элементов и блоков и т. п.

Насколько сложной была эта система по сравнению с живыми? Процессор 6502, конечно, и рядом не стоит с головным мозгом даже мыши. Но он приближается по сложности к червю Caenorhabditis elegans ломовой лошадке биологов: этот червь изучен вдоль и поперёк и уже предпринимаются попытки смоделировать его полностью в цифровом виде () Таким образом, задача анализа системы на чипе 6502 не является чрезмерным упрощением. И результаты имеют право быть экстраполированы на системы in vivo.

Вот только исследователи потерпели поражение! Нет, какие-то результаты, конечно, получены были. Анализируя чип, удалось выделить функциональные блоки, набросать схему их вероятных взаимосвязей, получить некоторые интересные подсказки насчёт того, как, вероятно, работает микропроцессор в целом. Однако понимания в том смысле, в каком его требует нейробиология (в данном случае: быть способным исправить любую поломку), достигнуто не было".

В какой-то момент появились исследователи, которые стали говорить примерно то же самое что надо изучать алгоритмы, что нужно понять, какую функцию выполняет интеллект. К примеру, Демис Хассабис (DeepMind), готовясь к выступлению на Singularity-саммите в Сан-Франциско (2010 г.), сказал следующее: В отличие от других выступлений на саммите по теме AGI, мой доклад будет другим, так как я интересуюсь системным уровнем нейронауки алгоритмами мозга а не деталями, как они реализуются мозговой тканью в виде спайков нейронов и синапсов или специфической нейрохимией и т. д. Я интересуюсь, какими алгоритмами мозг пользуется для решения проблем, и которые нам нужно найти, чтобы добраться до AGI.

Однако, спустя 10 (!!!!!) лет, все идет по-прежнему: ученые исследуют мозг и пытаются из внешних проявлений физиологической активности и его внутреннего устройства вычислить, как происходит интересующий процесс. Сколько задач столько процессов. Люди все разные. Мозги у всех немного, но отличаются. Некая усредненная картина, конечно, имеется, однако Представьте себе, что в любой произвольный момент времени мозг решает массу, в том числе и подсознательных задач, отслеживает и контролирует внутреннее состояние организма, воспринимает и интерпретирует сигналы внешней среды (и это мы не говорим о многочисленных петлях обратной связи). Сможем ли мы уверенно выявить, надежно идентифицировать и четко отделить эти активности одну от другой? Возможно ли это в принципе? Честно говоря, сомневаюсь. Не говоря уже о воспроизводимости этих процессов на небиологических носителях

Просмотрим на ситуацию иначе. Что такое задача вообще? Это затруднительная ситуация, с которой сталкивается, и которую пытается разрешить человек. Как показали в середине прошлого века американские математики Герберт Саймон и Аллен Ньюэлл, любая задача в общем виде может быть описана как переход из состояния Система с проблемой в состояние Система без проблемы. Они разработали компьютерную программу, назвав её General Problem Solver (Универсальный решатель задач), но дальше решения задач специфического вида они не продвинулись, поэтому универсальность именно их алгоритма осталась под вопросом. Но формула Система с проблемой --> Система без проблемы оказалась абсолютно верна!



Преобразование Системы это процесс ее перевода из исходного состояния с проблемой в желаемое состояние без проблемы (4). В процессе преобразования, (т. е. решения задачи) проблемная система становится беспроблемной (ну или менее проблемной), улучшается, избавляется от своих недостатков и выживает, т. е. продолжает использоваться. Ой, погодите, что это мы сейчас сказали? Избавление от недостатков? Выживание? Хм Что-то знакомое. Где-то мы это Ах, ну да. Эволюция! Чем меньше недостатков тем больше шансы выжить!

Давайте проверим себя, вспомним и повторим основной постулат: в живой природе бОльшие шансы на выживание имеют организмы, обладающие бОльшим числом полезных свойств (ну, условно рога ветвистее, хвост пышнее). Если же у организма перья бледнее, а голос противнее (вредные свойства), то, скорее всего, жизнь его будет недолгой и пройдет в одиночестве. В итоге, давление отбора ведет к тому, что организмы избавляются от недостатков и становятся все более и более жизнеспособными. Если не верите спросите у сэра Чарльза Дарвина. Он подтвердит.

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

Слышите треск? Это наши представления о сложности интеллекта начинают трещать по швам. Получается, что бытовавшие ранее понятия сложность мозга и сложность интеллекта перестают быть тождественными. Что если для получения Интеллекта не надо проводить реверс-инжиниринг нейрофизиологического процесса решения задачи, ловя призрачные тени мышления в коннектоме (тем более, что у каждого человека он уникален) или заниматься глубоким обучением сетей? Что если нам нужно алгоритмизировать процесс эволюции системы, т. е. путь ее преобразования из менее совершенного состояния в более совершенное с помощью известных нам законов эволюции? Что если до сегодняшнего дня мы, действительно, решали не ту задачу?

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

Кто-то мне сейчас наверняка возразит: задачи, которые решает человек, связаны с миллионами самых разных систем природными, общественными, производственными, техническими Материальными и абстрактными, находящимися на разных уровнях иерархии. И развиваются-де они каждая по-своему, а дарвиновская эволюция это про живую природу. Зайчики, цветочки, рыбки, птички Но исследования показывают, что законы эволюции универсальны. Доказательства долго искать не надо они все перед глазами. Имеющие их да увидят. Что ни возьми от спички до Боинга, от танка до контрабаса везде (5) мы видим наследственность, изменчивость и отбор! А все многообразие эволюционных изменений (кажущаяся сложность которых связана с тем, что все системы очень разные по своей природе и находятся на разных уровнях иерархии) можно выразить единственным циклом. Вы же помните, да? Система с проблемой --> Система без проблемы.

Что такое Система с проблемой? Это Система (материальная и абстрактная, социальная, производственная и техническая, научная и любая объект, идея, гипотеза всё, что угодно), в которой обнаружены какие-то недостатки, влияющие (внимание!) на наше желание и возможность её использования. Система недостаточно хороша. Система недостаточно эффективна. У неё низкое соотношение польза / затраты. Мы хотим, можем и готовы от нее отказаться, и часто отказываемся. Но нам нужна другая (выполняющая нужную нам полезную функцию), но уже без проблем более эффективная, без недостатков (или с меньшим их количеством). Ну, вы видели эту картинку выше Конечно, одной стрелочки между двумя крайними состояниями (исходным и желаемым) нам мало. Нам нужен тот самый оператор, преобразователь, верно? Попробуем его найти? Вы же согласитесь, что в случае успеха мы получим описание (хотя бы, для начала и упрощенное) так нужного нам универсального алгоритма?



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

Что мы делаем дальше? Мы либо а) создаем новую систему (если система с нужной функций либо не существует, либо у существующей системы нет ресурсов для улучшения) или же б) улучшаем, дорабатываем, существующую (если ресурсы еще есть). Мы изучаем внутреннее устройство и разбираемся с внешним окружением выявляем внешние и внутренние недостатки Системы и после их устранения получаем улучшенную Систему. Систему с повышенной идеальностью и повышенной жизнеспособностью!

В связи с тем, что представленная выше Схема описывает процесс развития, улучшения или, если хотите, эволюции любых систем (в чем легко убедиться, подставив вместо слова Система любое иное по желанию от Абажур до Якорь), я думаю, ее смело можно и даже нужно! назвать Универсальной Схемой Эволюции. И обратите внимание она абсолютно алгоритмична, т. е. полностью подпадает под определение алгоритма: Алгоритм точное предписание о выполнении в определённом порядке некоторой системы операций, ведущих к решению всех задач данного типа. значит может быть реализована в виде компьютерной программы).

В представленном виде Универсальная Схема Эволюции:
естественная законы эволюции выявлены в системах самого разного типа, и их действие проверено в технике, производстве, обществе, природе и мышлении;
объективная законы эволюции не зависят от мнения исследователя и/или пользователя;
логичная и непротиворечивая законы эволюции вытекают один из другого;
полная набор законов эволюции достаточен для описания любой системы;
жесткая законы эволюции нельзя переставлять и
замкнутая законы эволюции образуют цикл: система, пройдя один цикл изменений, тут же начинает новый.

Что у нас получается в итоге: Эволюция системы (представленная в виде Универсальной Схемы) это путь её улучшения, избавления от недостатков. Иными словами, это алгоритм решения задачи. А решение задачи это именно то, чем занимается интеллект. Упрощаем и получаем: Универсальная Схема = описание функции интеллекта.

Конструктивная критика приветствуется. :)



1. Дендриты важнее для мозга, чем ранее считалось chrdk.ru/news/dendrity-vazhnee-chem-schitalos
2. ru.wikipedia.org/wiki/Карго_культ
3. Е. Золотов. Пойми меня! Как неживое помогает разбираться в живом www.computerra.ru/161756/6502
4. Chapter 6. Problem Solving. Artificial Intelligence. A Knowledge-Based Approach by Morris W.Firebaugh University of Wisconsin Parkside PWS-Kent Publishing Company Boston 1988, p. 172.
5. Дарвиновская эволюция в мире техносферы. Мир вещей, создаваемый человеком, развивается по тем же законам, что и живая природа. www.ng.ru/science/2017-01-11/14_6899_evolution.html
Подробнее..

Алгоритм нахождения 1000 ферзей на шахматной доске

17.05.2021 18:06:47 | Автор: admin

Недавно разбирался в старых своих наработках/скриптах и наткнулся на скрипт где решалась задача о ферзях. Собственно это послужило написанию статьи о том как проходили этапы написания его алгоритма. Возможно пригодится начинающим программистам для решения похожих задач (код в примерах написан на java).

Вступление

4 года назад была шумиха по поводу задачи о расположении 1000 ферзей на доске 1000х1000. Дело в том что расположение ферзей так чтобы они не били друг друга на доске является задачей с большим количество итераций и как результат долгой по времени выполнения. Как и многим мне захотелось проверить можно ли её решить за приемлемое время.

Изучение задачи

На картинке расположено 8 ферзей которые не пересекаются по горизонтальной, вертикальной или диагональным линиям.

Надо написать скрипт который будет расставлять на доске ферзей по таким правилам.

Алгоритм нахождения ферзей

Для поиска фигур была выбрана рекурсия.

Описание метода который вызывает сам себя:

  • Если переданная клетка пересекается с другими фигурами то возвращаем false

  • Если переданная клетка не пересекается ни с кем то:

    • устанавливает флаг на доске в true для этой позиции.

    • Если мы дошли до конца (нету следующего ряда) то возвращаем true.

    • Находит первую клетку в следующем ряду и вызывает сам себя с новой клеткой.

      • Если вернулся false то отправляем следующую клетку из ряда или если не осталось клеток то возвращаем false) Предварительно ставим флаг в false на доске у клетки которую изначально получили.

      • Если вернулся true то возвращаем результат.

Такой метод для досок 8x8, 32x32, 50x50 отрабатывает хоть как то. Но если больше то уходит много времени.

Оптимизация

Красным помечены клетки на которые нельзя ставить фигуру (они под ударом других ферзей).Красным помечены клетки на которые нельзя ставить фигуру (они под ударом других ферзей).

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

В скрипте добавил два списка с свободными колонками и рядами.
Во время проверки из них генерируется список свободных клеток где ряды отсортированы по возрастанию. Поиск начинается с самого первого ряда.
Идея в том чтобы работать только с свободными клетками и начинать поиск с самого маленького ряда.

После этого результат можно было получить вплоть до 400x400.

Уменьшение возможных комбинаций

Есть множество комбинаций как расположить ферзей на доске.
Это и есть самая главная сложность в задаче.
Но в данном случае нужно найти лишь одну правильную комбинацию.


Обратите внимание на картинку.
Часть ферзей можно расположить заранее на доску в соответствии с правилами.
Нужно лишь начать с второй клетки первого ряда и дальше добавлять новые фигуры по формуле "row+1" и "column+2" Этот алгоритм заполнит половину ферзей на доске, а дальше всё сделает скрипт оптимизации который будет находить ряды с наименьшим числом клеток и устанавливать там фигуры.

Поиск на доске 1000x1000 занял ~4 минуты (на процессоре: Intel Core i5-10400H CPU 2.60GHz).

Поиск на доске 1116x1116 занял ~6 минут.

Сам скрипт можно найти тут

Подробнее..

Перевод После столетий поисков получено точное решение задачи о козе на привязи

15.01.2021 16:07:39 | Автор: admin

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




Вот вам простая на первый взгляд задачка. Представьте себе изгородь в форме окружности, с точно известной площадью пастбища, заключённого внутри. Внутрь вы помещаете козу, и привязываете её верёвкой к изгороди. Какой длины верёвка вам понадобится, чтобы у козы был доступ ровно к половине этой площади?

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

По сей день никто не знал точного ответа на базовый вопрос, сказал Марк Мейерсон, математик из академии военно-морского флота США. Решение всегда было приблизительным.

Однако в 2020-м году немецкий математик Инго Уллиш, наконец, достиг прогресса. Он нашёл, как считается, первое точное решение этой задачи хотя и выглядит оно достаточно громоздко и непонятно.

Это первое точное выражение для длины верёвки из всех, что я знаю, сказал Майкл Харрисон, математик из университета Карнеги-Меллона. Это определённо прорыв.

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

На скотном дворе и вокруг него


Первую задачу подобного типа опубликовали 1748 году в лондонском периодическом женском журнале The Ladies Diary: Or, The Womans Almanack [Дневник леди, или Женский альманах]. Журнал обещал новые улучшения в искусствах и науках и множество занимательных мелочей.

В оригинальном сценарии участвует лошадь, пасущаяся на привязи в парке. В задаче лошадь была привязана снаружи ограды. Если длина верёвки совпадает с длиной окружности ограды, на какой области сможет пастись лошадь? Позднее эту задачу назвали наружной, поскольку в ней пастбище находилось не внутри окружности, а снаружи.



Ответ на задачку появился в выпуске от 1749 года. Ответ составил некто мистер Хит, на основании, среди прочего, справочника исследования и таблицы логарифмов. Он дал ответ: 76 257,86 квадратных ярдов при верёвке длиной в 160 ярдов. И это был приблизительный ответ, а не точный расчёт. Поясним на примере: к уравнению x2 2 = 0 можно написать примерный численный ответ, x = 1,4142, но это будет не такой точный или удовлетворительный результат, как x = 2.

Вновь задача появилась в 1894 году в первом номере ежемесячника American Mathematical Monthly, переделанная для случая, когда животное пасётся внутри ограды. Такой тип задач называют внутренними, и в среднем они сложнее внешних, пояснил Уллиш. Во внешней задачи можно отталкиваться от радиуса круга и длины верёвки, после чего подсчитать площадь. Она решается через интегралы.

Решить её в обратном направлении, начав с заданной площади, и поставив вопрос о том, какие входные данные к ней приводят, гораздо труднее, сказал Уллиш.

В последовавшие десятилетия в ежемесячнике публиковали разные варианты внутренней задачи, в основном с участием лошадей (и, по меньшей мере, в одном случае с мулом) вместо коз. Ограды там фигурировали круглые, квадратные и эллиптические. Но в 1960-х годах по загадочным причинам козы начали постепенно вытеснять лошадей в литературе. Несмотря на то, что по утверждению математика Маршалла Фрейзера, козы слишком независимы для того, чтобы жить на привязи.

Козы в высших измерениях


В 1984 году Фрейзер проявил творческий подход, выведя задачу из плоской пасторальной темы на более сложный ландшафт. Он подсчитал, какой длины понадобится верёвка, чтобы коза смогла пастись ровно в половине объёма n-мерной сферы при приближении n к бесконечности. Мейерсон нашёл в его рассуждениях логическую ошибку и позже в том же году исправил её, но пришёл к тому же выводу. При приближении n к бесконечности отношение длины верёвки к радиусу сферы стремится к 2.

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


Задач о пасущейся козе бывает два вида. Оба они связаны с козой, привязанной к круглой ограде. Внутренняя версия задаёт вопрос о длине верёвки, которая даст доступ ровно к половине окружённой площади. Внешняя спрашивает, к какой площади есть доступ у козы при заданной длине верёвки и радиусе ограды (на рисунке длина верёвки равна длине окружности ограды).

В 1998 году Майкл Хоффман, ещё один математик из военно-морской академии США, расширил задачу в другом направлении, наткнувшись на пример внешней задачи в одной из новостных групп. В том её варианте нужно было оценить площадь, доступную быку, привязанному снаружи круглой силосной башни. Задача заинтересовала Хоффмана, и он решил обобщить её не только на круг, но на любую гладкую выпуклую кривую, включая эллипсы и даже незамкнутые кривые.

Встретив постановку задачи для простого случая, математик попытается понять, как её можно обобщить, сказал Хоффман.

Хоффман рассмотрел случай, в котором привязь длины L меньше или равна половине длины кривой. Сначала он нарисовал касательную в том месте, где привязана верёвка. Бык может пастись в полукруге площадью L2/2, ограниченном касательной. Затем Хоффман подсчитал точную площадь между касательной и кривой через интеграл.

Позднее Грэхем Джеймсон, математик из университета Ланкастера, и его сын Николас вывели подробное решение внутренней задачи для трёх измерений. Они выбрали этот случай потому, что он был не таким популярным. Поскольку козы не могут так легко перемещаться в трёх измерениях, Джеймсоны назвали эту задачу задачей птицы в работе 2017 года. Звучит она так: если привязать птицу к сферической клетке, какой длины должна быть верёвка, чтобы ограничить её перемещение ровно половиной объёма?

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

Достать козу


Тем не менее, точное решение двумерной задачи в формулировке 1894 года ускользало от математиков до появления в 2020-м работы Улллиша. Впервые об этой задаче Уллиш услышал от родственника в 2001 году, будучи ещё ребёнком. Работать над ней он начал в 2017 году, получив докторскую степень в Вестфальском университете имени Вильгельма в Мюнстере. Он решил попробовать новый подход.

К тому времени было хорошо известно, что задачу о козе можно свести к единому трансцендентному уравнению, в которое по определению входят тригонометрические члены, вроде синуса и косинуса. Это могло создать проблему, поскольку многие трансцендентные уравнения не поддаются решению. К примеру, у уравнения x = cos(x) нет точных решений.


Инго Уллиш

Однако Уллиш сформулировал задачу так, чтобы обеспечить себе более податливое трансцендентное уравнение: sin() cos() /2 = 0. И хотя оно тоже может показаться недоступным, он понял, что к нему можно подступиться при помощи комплексного анализа ветви математики, применяющей аналитические инструменты к уравнениям с комплексными числами. Комплексный анализ применяется уже несколько столетий, однако Уллиш, насколько ему известно, первым применил такой подход к голодным козам.

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


Решение задачи даётся в виде косинуса отношения двух криволинейных интегралов (формула из Википедии)

К сожалению, тут есть подвох. Решение Уллиша это не какое-то простое выражение вроде квадратного корня из 2. Это такая сложная штука, как отношение двух криволинейных интегралов с примесью различных тригонометрических функций. С практической точки зрения оно не скажет вам точно, какой длины должна быть привязь козы. Для получения ответа, применимого в сельском хозяйстве, всё равно требуется сделать несколько приближённых вычислений.

Но Уллиш всё равно считает точное решение ценным, пусть оно и не такое красивое и простое. Если мы будем использовать только числовые значения или приближения, мы так и не поймём сути природы решения, сказал он. Формула даёт нам понимание того, как выводится решение.

Не отказываться от козы


Пока что Уллиш отложил в сторону пасущуюся козу, поскольку не уверен, куда двигаться дальше. Но другие математики уже развивают собственные идеи. Харрисон, например, готовит работу для публикации в Mathematics Magazine, где исследует свойства сферы, чтобы подступиться к трёхмерному обобщению задачи про козу.

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

Именно поэтому математики потратили столько чернил на воображаемых животных. Мои инстинкты говорят, что работа над задачей о пасущейся козе не даст нам никаких прорывов, сказал Харрисон, но наверняка знать нельзя. Новая математика может появиться откуда угодно.

Хоффман более оптимистичен. Трансцендентное уравнение, выведенное Уллишем, связано с трансцендентными уравнениями, которые Хоффман изучал в работе 2017 года. Он же, в свою очередь, заинтересовался ими благодаря работе 1953 года, где общепринятые методы были выставлены в новом свете. Этот подход напоминает ему то, как Уллиш применил известные методы в комплексном анализе к трансцендентным уравнениям в новых условиях в данном случае, в задаче про козу.

Люди, совершающие фундаментальные прорывы в математике, отвечают не за весь прогресс, сказал Хоффман. Иногда он идёт благодаря тому, что кто-то изучает классические подходы и находит в них новые методы сборки головоломки, которые в итоге могут привести к новым результатам".
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru