Тут собираем годные задачи (javascript)
Этот пост будет пополняться лучшими задачами которые мы будем писать в каментах)
а пока тут пусть полежит ссылочка на это видео http://www.youtube.com/watch?v=KaqC5FnvAEc __________________________________________________ Задача № 0 Создать переменную видимую только в блоке (аналог let в ECMA6). for ( var i = 0; i < 10; i++ ){ var ololo = i; // сделать так чтобы ololo был виден только в блоке с циклом } // но не тут window.ololo // undefined __________________________________________________ Задача № 1 Составить функцию, которая продолжала бы числовую последовательность (арифметическую). Например : var mySequence = continueSequence([ 1, 4, 7, 10 ]); mySequence(); // 13 mySequence(); // 16 __________________________________________________ Задача № 2 Реализовать функцию для сложения чисел, которые превышают Number.MAX_VALUE plus( "1e500", "1e500" ); // "2e500" (экпоненциальный вид для краткости. думаю, все знают про них) |
Интересная задача которая возникла пока с 2d игрался.
Определение коллизий 2х спрайтов. Принадлежность точки прямоугольнику, это элементарно. а вот столкновение двух прямоугольников как определить ? придумал вот такое алгоритм. Идея в том что, разница между двумя крайними точками системы из двух столкнувшихся прямоугольников,будет всегда меньше суммы ширин, двух прямоуоугольников. Если условие выполняется для высоты и ширины, значит есть пересечение. r=function(x,y,w,h,x1,y1,w1,h1){ var sx=x<x1?x:x1, sy=y<y1?y:y1, ex=x+w>x1+w1?x+w:x1+w1, ey=y+h>y1+h1?y+h:y1+h1; return ex-sx<w+w1 && ey-sy<h+h1; //if (ex-sx<w+w1 && ey-sy<h+h1)return true; //else return false } // true alert(r( 0,0,100,100, 50,50,100,100 )); // false alert(r( 0,0,100,100, 150,50,100,100 )); // true alert(r( 51,51,100,100, 50,50,100,100 )); // (один квадрат внутри другого) true alert(r( 0,0,100,100, 50,50,10,10 )); |
Просто проверяешь принадлежит ли каждая вершина многоугольника к другому, если ни одна не принадлежит, то проверяешь пересекаются ли их отрезки друг с другом.
|
Задача № 0
|
Цитата:
Цитата:
|
|
Эту не выбрал потому что там концовку ждать долго
|
Цитата:
Был бы многоугольник веротно пришлось бы бить на треугольники. Алгоритм вроде тесты проходит, но в движок встроить неудаётся. |
Цитата:
|
Стоп так ты про прямоугольники паришься? так это вообще не задача даже О_О это же слишком сложно для простых умов..
Я то думал ты про многоугольники. Цитата:
|
Цитата:
на ЖПУ ещё, скажи.:D |
Ну серьезно, разве возможно написать АЛГОРИТМ определяющий закономерности последовательностей чисел)?
не используя ИИ, нейросети и системы образов. |
Цитата:
|
функция должна определить ОБРАЗ закономерности последовательности данных. простой ты пример сделал или сложный сути не меняет.
она должна одинаково определять закономерность между 1 2 3 4 5 выдавать 6 так и между 1 -2 4 -8 16 выдавать -32 так и между 0 0 1 0 0 выдавать 1 так и между 3 5 8 13 21 выдавать 34 тут нужна нейросеть умеющая строить абстракции , абстракции на абстракциях (как наш мозг) и абстрактные модели чисел и их связи дуг с другом. ну короче это жесть. сделать можно так то но это немного не для javascript )) |
Цитата:
|
Ну реши задачку давай простыми способами)
|
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Окей, и почему там должно быть 13 и 16??? Если бы первое число было -2, тогда да, но тут я даже интуитивно не могу предположить, КАКИЕ там должны быть числа дальше... Единственное решение "в лоб": 11, 14, 17, 20, 21, 24... - если предположить, что элементы 0 и 10 образуют линейный арифметический период. melky, Думаю, тут не помешает поработать над формулировкой задачи. |
И еще, насчет этой задачи, ее вполне можно решить, например, разложив элементы в ряд Тейлора или в ряд Фурье. Но заниматься этим мозгоебством - не-не-не, я пас. :D
|
http://ru.wikipedia.org/wiki/%D0%90%...81%D0%B8%D1%8F
это арифметическая прогрессия, единственное число 1 как то выпадает из определения, |
Shaci,
Для арифметической прогрессии первого порядка нужно строго ДВА элемента (определяют две степени свободы: смещение относительно нуля и шаг). Тут этого ограничения явно нет. *чешет подбородок* |
Цитата:
p.s. мне одному слово ИИ режет слух?, почему то я под ним воспринимаю что-то фантастическое, а не алгоритм полного перебора компьютерного игрока в шашки) |
Цитата:
Задача класса P налицо, какой тут нафиг ИИ... |
Цитата:
там нолик затесался, с прошлой прогрессии. не знаю, почему он там остался. вот почему задача такой ажиотаж вызвала :) Цитата:
|
Цитата:
|
Цитата:
Пожалуй даже для такой суперфункции до какой-то степени можно обойтись без ИИ :) к примеру Если есть два образаца последовательности в одном массиве, и образцы операций. То можно отсеять только те операции которые дадут один результат в обоих последовательностях. Затем свести все обнаруженные операции в один паттерн, и по этому паттерну возвращать значения. Вот набросал пример (с двумя образцами операций). demo ( [0,1,2,3,4] ); demo ( [10,8,6,4,2] ); demo ( [1,2,3,2, 3,4,3] ); demo ( [1,10,100,1000,10000,100000,1000000] ); demo ( [1,2,3,30,31,32,320] ); demo ( [8192,4096,2048,1024,512] ); function demo(data){ var z =continueSequence( data ); for (var i=1;i<10;i++) var ret=z(); alert(ret); } function continueSequence(data){ matrix=[]; var matrix=zakon1(); mergeMatrix(matrix,zakon2()); console.log(matrix); var step=0; cnt=data.length; return function(){ var ret=matrix[step].calc() step++; if (step>=matrix.length) step=0; return ret; } function mergeMatrix(matrix,matrix2){ for(var i=0;i<matrix.length;i++){ if (matrix[i]==false ) matrix[i]=matrix2[i]; } } //арифметическая последовательность с шагом function zakon1(){ var res=[]; var pattern=[]; //вычислим все разницы for (var i=1;i<data.length;i++){ res[i-1]= data[i]-data[i-1] ; } pattern=helper(res,act); function act(step){ return { name:"zakon1", step:step, calc:function(){ var r=data[data.length-1]; r=r+this.step; data.push(r); return data; } }; } console.log(data); console.log(res); console.log(pattern); return pattern; } //арифметическая последовательность с шагом function zakon2(){ var res=[]; var pattern=[]; //вычислим все разницы for (var i=1;i<data.length;i++){ res[i-1]= data[i]/data[i-1] ; } pattern=helper(res,act); function act(step){ return { name:"zakon2", step:step, calc:function(){ var r=data[data.length-1]; r=r*this.step; data.push(r); return data; } }; } console.log(data); console.log(res); console.log(pattern); return pattern; } function helper(res,act){ var pattern=[]; for (var i=0;i<res.length/2;i++){ if (res[i] == res[i+res.length/2] ){ pattern[i]=act(res[i]); } else { pattern[i]=false; } } return pattern; } } В перспективе думаю можно и отойти от двух образцов, но в этом случае мы можем получить несколько обьяснений одного числа, придётся перебирать комбинации этих конкурирующих обьяснений, сводить в один паттерн, и искать повторяющийся кусок в этой комбинации. Самый короткий но наиболее часто повторяющийся из всех кусков это и будет тот набор правил что мы ищем. |
Цитата:
DjDiablo, основная проблема с тем что последовательность может иметь бесконечно паттернов обьясняющих её. А так же проблема в том что алгоритм должен понимать отношения чисел друг к другу. ключивое слово ПОНИМАТЬ.. ну если я ошибаюсь сделайте это без ии. |
Ой не спроста у тебя 666 кармы. :D :D :D
Речь о том что какой-то алгоритм превзойдёт человека или хотябы нейронную сеть не идёт. Я постарался приблизится к решению настолько насколько получилось, и предложил более совершенный алгоритм как развитие идеи. Если кол-во паттернов бесконечно это уже хаос, и закономерности там не найти, ни человеку ни компьютеру. да и вообще непонятно откуда там возьмётся бесконечное кол-во паттернов, если данная последовательность небесконечна, а кол-во операций в математике ограничено. Даже мой пример обнаруживающий + - * /, будет работать с любой комбинацией этих операций. другое дело если вместо паттерна набор правил. к примеру: 1-2-4-8-10-15-30-35-70-75-150-300-600 тоесть. числа умножаюся на два Но если они меньше 100 и делятся на 10 без остатка то к ним прибавляется 5 в прочем думаю обнаружение правил формирующих эту закономерность это тоже разрешимая задача. |
\
Цитата:
0 /* + 1 */ 1 /* + 2 */ 3 /* + 3 */ 6 /* + 4*/ 7 ... continueSequence () // после этого : ... /* + 5*/ 12 /* + 6 */ 18 /* + 7 */ 25 элементарные ряды, можно сказать. не думаю, что для решения рядов нужен ИИ - для нахождения первообразной даже есть код (на хабре была программа для решения матановой капчи) тут нужна комбинаторика и алгоритмы :) вперёд, за Кнутом*! * всё ещё собираюсь его книжку прочитать. |
Цитата:
В любом случае, как уже заметил Maxmaxmахimus6, определение последовательности, основываясь на дискретных данных - задача нейронных сетей, да и бессмысленная совсем. Цитата:
|
а как вам такая задача: есть пачка текстов, нужно реализовать по ним нескольких произвольных слов в произвольном порядке. отранжировать по количеству найденных слов.
|
Цитата:
|
Цитата:
|
добавил 1 задачу) решайте
п.с. научите меня под спойлер ответы кидать, сразу ответ напишу туда и под спойлер кину. |
Цитата:
with ({ ololo: null }) { for ( var i = 0; i < 10; i++ ){ var ololo = i; // сделать так чтобы ololo был виден только в блоке с циклом } } // но не тут alert( window.ololo) // undefined |
Цитата:
[js hide]Я тут спойлер[ /js] |
Задача номер 1 решение работающее в strict mode XD
for ( var i = 0; i < 20; i++ ) try {throw 0} catch ( ololo ) { ololo = i; } |
Задача № 2
|
Цитата:
Еще раз вернусь к твоей последовательности в ее изначальном виде: var mySequence = continueSequence([ 0, 1, 4, 7, 10 ]); Если значение элемента считать как значение функции от позиции самого элемента, то интерполяция Лагранжа дает вот такой интересный полином: ![]() А образованная последовательность продолжается в целых числах: 15, 26, 49, 92, 165, 280, 451, 694, 1027, 1470, 2045, 2776, 3689, 4812, 6175... :) |
Часовой пояс GMT +3, время: 17:28. |