Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Тут собираем годные задачи (javascript) (https://javascript.ru/forum/offtopic/32201-tut-sobiraem-godnye-zadachi-javascript.html)

Maxmaxmахimus 10.10.2012 12:04

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

Maxmaxmахimus 10.10.2012 12:10

вторая задача должна работать так?

var result = calc( '12124234325234234234234234234234234234234 + 3242343424234342423424234324234234 - 41' );
result // 4453463573474675475674654654654675465465465465465464


или так?

var a = new BigNumber( '12' );
var b = new BigNumber( '324234' );
var c = new BigNumber( '41' );

var d = ( a.plus( b ).minus( c ) ).multiply( a );

Hekumok 10.10.2012 12:20

я вообще не понял 2-ую задачу >.<

Maxmaxmахimus 10.10.2012 12:23

написать функцию для возможности работы с бОльшими числами чем поддерживает javascript/

В каком месте не понятно?

________________________________________

не ну вы посмотрите как удобно это пишется на Class

ВЫ только посмотрите какая красота получается ^__^


var BigNumber = new Class( function BigNumber( BigNumber ) {

	this.__construct__ = function ( value ) {
		this.stringValue = value + '';
	};


	this.plus = function ( bigNumber ) {
		var result = parseInt( this.stringValue.toString() ) + parseInt( bigNumber.toString() );
		return new BigNumber( result )
	};


	this.minus = function ( bigNumber ) {
		var result = parseInt( this.stringValue.toString() ) - parseInt( bigNumber.toString() );
		return new BigNumber( result )
	};


	this.multiply = function ( bigNumber ) {
		var result = parseInt( this.stringValue.toString() ) * parseInt( bigNumber.toString() );
		return new BigNumber( result )
	};


	this.toString = function () {
		return this.stringValue
	};


	this.valueOf = function () {
		return this.stringValue
	};

} );


var a = new BigNumber( '12' );
var b = new BigNumber( '324234' );
var c = new BigNumber( '41' );

var d = ( a.plus( b ).minus( c ) ).multiply( a );

nerv_ 10.10.2012 12:52

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 208642)
Задача № 0

Создать переменную видимую только в блоке (аналог let в ECMA6).

for ( var i = 0; i < 10; i++ ){
    var ololo = i; // сделать так чтобы ololo  был виден только в блоке с циклом

}

// но не тут
window.ololo // undefined

for( var i = 0; i < 10; i++ ) {
    (function() {
        var ololo = i; // сделать так чтобы ololo  был виден только в блоке с циклом
    }());
}

Maxmaxmахimus 10.10.2012 13:59

Так нельзя потому что eval там не корректно работать будет, если сделаем eval('var qq = 11') то вар объявится в контексте внутренней функции, а не внешней)

Nekromancer 10.10.2012 14:02

Maxmaxmахimus,
это как некорректно?

Maxmaxmахimus 10.10.2012 14:05

если сделаем eval('var qq = 11') то вар объявится в контексте внутренней функции, а не внешней)

Nekromancer 10.10.2012 14:18

Ну и без eval так же будет, если там объявить переменную.

melky 10.10.2012 14:24

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 209197)
вторая задача должна работать так?

var result = calc( '12124234325234234234234234234234234234234 + 3242343424234342423424234324234234 - 41' );
result // 4453463573474675475674654654654675465465465465465464


или так?

var a = new BigNumber( '12' );
var b = new BigNumber( '324234' );
var c = new BigNumber( '41' );

var d = ( a.plus( b ).minus( c ) ).multiply( a );

как хочешь - главное, чтобы можно было производить арифметические действия с числами, которые больше Number.MAX_VALUE.

в чём проблема? а вот в чём - все числа больше максимального обращаются в бесконечность :
alert( Number.MAX_VALUE * 10 );

Hekumok 10.10.2012 14:27

а, всё, я понял вторую задачу)))

Maxmaxmахimus 10.10.2012 14:48

подсказка: Столбиком уже не считается да)? ;)

Дзен-трансгуманист 10.10.2012 23:21

Цитата:

Сообщение от Maxmaxmахimus
Задача № 1

Составить функцию, которая продолжала бы числовую последовательность (арифметическую).


Мое решение через полином Лагранжа.

function throwError (fname, error) { throw new Error(fname + ": " + error); }

function lagrangePoly (points) {

  if (points.length % 2) { throwError("lagrangePoly", "bad number of elements"); }

  var result = [];
  var degree = points.length / 2;
  var i, j, t, cn, c, c0, c1;

  for (i=0, t=[]; i<points.length; i++) {

    if (!isFinite(points[i])) { throwError("lagrangePoly", "non-finite value encountered"); }
    if (!(i % 2)) { t.push(points[i]); }
  }

  t.sort(function (a, b) { return a - b; });

  for (i=0; i<degree-1; i++) { if (t[i] == t[i+1]) { return false; } }

  for (i=0, c1=[]; i<degree; i++) {

    c1.push(points[i*2 + 1]);

    for (j=1, t=1; j<degree; j++) { t *= points[i*2]; c1.push(-t); }
  }

  c = [c1];

  for (cn=degree; cn>1; cn--) {

    c0 = c1;
    c1 = [];

    for (i=0; i<cn-1; i++) {

      t = c0[i * cn + 1] - c0[(i+1) * cn + 1];

      for (j=0; j<cn; j++) {

        if (j == 1) { continue; }

        c1.push(-(c0[i * cn + j] - c0[(i+1) * cn + j]) / t);
      }
    }

    c.push(c1);
  }

  for (cn=degree-1; cn>-1; cn--) {

    result[cn] = c[cn][0];

    for (i=1; i<degree-cn; i++) { result[cn] += c[cn][i] * result[cn+i]; }
  }

  return result;
}

function polyFunction (poly) {

  var _poly = [].concat(poly);

  return function (x) {

    var i, e, y;

    for (i=0, e=1, y=0; i<_poly.length; i++) {

      y += e * _poly[i];
      e *= x;
    }

    return y;
  }
}

function continueSequence (sequence) {

  var points = [], polyfn, i;

  for (i=0; i<sequence.length; i++) { points.push(i, sequence[i]); }

  polyfn = polyFunction(lagrangePoly(points));

  return function () { return polyfn(i++); }
}

function maxFraction (value, digits) {

  if (!isFinite(value) || !isFinite(digits)) { throwError("maxFraction", "bad argument(s)"); }

  var fixed = (+value).toFixed(digits);
  var i = fixed.length - 1;

  loop: while (true) {

    switch (fixed.charAt(i)) {

    case "0": i--; continue;
    case ".": i--; break loop;
    }

    break;
  }

  return fixed.slice(0, i+1);
}

function test (sequence, iterations) {

  var generator = continueSequence(sequence);
  var result = sequence.join(", ") + "...\n";

  while (iterations--) { result += maxFraction(generator(), 6) + (iterations? ", ": "...\n\n"); }

  return result;
}

var result = "";

result += test([ 0, 1, 4, 7, 10], 15);
result += test([-2, 1, 4, 7, 10], 15);
result += test([ 0, 1, 3, 6, 10], 15);

result += test([0, 1, 4, 9], 15);
result += test([0, 1, 8, 27], 15);

result += test([9, 8, 7, 6, 5, 4, 3, 2, 1], 15);
result += test([9, 8, 7, 6, 5, 4, 3, 2, 2, 2, 10], 15);

alert(result);

tenshi 11.10.2012 06:00

Цитата:

Сообщение от melky (Сообщение 208878)
это уже было (сортировка слов по количеству повторений в строке) ... ту тему снесли.

это что-то не то

melky 11.10.2012 06:32

Цитата:

Сообщение от tenshi (Сообщение 209380)
это что-то не то

тогда поподробней, пожалуйста :)

Цитата:

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


tenshi 11.10.2012 06:42

поисковой индекс, только локально на клиенте. например, я делал хтмл документацию, распространяющуюся на cd, где требовался поиск по содержимому.

DjDiablo 11.10.2012 13:09

Как вам вот такая задача ?

for i=1 to 6 step 2
    alert(i)
next i;


распарсите пример на бейсике в вид пригодный для компиляции
о бэйсике - for начало тела цикла, next -конец, шаг это значение которое прибавляется к i
должно получится что то вроде

{
     command:"for",
     varname:"i",
     start:"1",
     end:6,
     step:2,
     code:[
           {
                command:"call",
                functionName:"alert",
                params:["i"]
           }
     ]
     
}

nerv_ 11.10.2012 15:37

DjDiablo,
For i = 1 To 6 [step 2]
    alert(i)
Next

step - может быть опушен. При этом, оба варианта ниже являются правильными

For i = 1 To 6 [step 2]
    For j = 1 To 6 [step 2]
        alert(i)
    Next
Next

For i = 1 To 6 [step 2]
    For j = 1 To 6 [step 2]
        alert(i)
Next j, i

Maxmaxmахimus 11.10.2012 16:51

Тогда уж напишите синтаксический анализатор кода на javascript)))
Чтобы можно было настраивать токены )) таким образом он был бы универсальным)

DimaJS 11.10.2012 17:00

№ 0, пожалуй самое смешное решение :D
for ( var i = 0; i < 10; i++ ){
    var ololo = i; // сделать так чтобы ololo  был виден только в блоке с циклом
    ....//somecode
    ololo = undefined;//или null, кому как нравится
}
 
// но не тут
window.ololo // undefined

Maxmaxmахimus 11.10.2012 17:03

ololo создается только один раз когда скрипт входит в контекст функции или чего там.

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

DimaJS 11.10.2012 17:05

Maxmaxmахimus,
WTF???:blink: переведи нормально:)

DjDiablo 11.10.2012 18:11

думаю речь об этом.

alert (i);
for(var i=0;i<10;i++){        }
alert (i);

Maxmaxmахimus 11.10.2012 18:14

нужно чтобы переменная ololo создавалась каждый раз РАЗНАЯ при каждой итерации цикла. а не использовалась одна и та же

DimaJS 11.10.2012 20:26

Maxmaxmахimus,
:blink: :blink: :
for (var i = 0, someObject = {}; i < 10; i++) {
 if (someObject.ololo) alert("Я никогда не выполнюсь!!!");
 someObject.ololo = i;
 alert(someObject.ololo);
 delete someObject.ololo;
}
alert(someObject.ololo);//меня не видно :D

DjDiablo 11.10.2012 20:56

DimaJS - в примере маленький недостаток, в виде оставшегося бесхозного ОБЬЕКТА.

for (var i = 0, someObject = {}; i < 10; i++) {
 if (someObject.ololo) alert("Я никогда не выполнюсь!!!");
 someObject.ololo = i;
 alert(someObject.ololo);
 delete someObject.ololo;
}
alert(someObject.ololo);//меня не видно :D

alert(someObject);//зато видно МЕНЯ !!!!!!!!!

DimaJS 11.10.2012 21:10

DjDiablo,
это не так страшно, его видно, память он не жрёт (по крайней мере в FF), и его можно удалить (естественно через
someObject = null;
):)

Maxmaxmахimus 11.10.2012 22:15

var funcs = [];

for ( i = 0; i<10; i++ ) {
    var ololo = i;
    funcs[i] = function(){  alert( ololo )  };
}


funcs[0] () // 0??? нет 9!! откуда 9 ??
funcs[4] () // 4??? нет!! 9, а должно 4


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



var funcs = [];

for ( i = 0; i<10; i++ ) try{throw 0} catch( ololo ) {
    ololo = i;
    funcs[i] = function(){  alert( ololo )  };
}


funcs[0] () // 0 ОПА
funcs[4] () // 4 ОПА

monolithed 12.10.2012 00:29

Maxmaxmахimus,

На всякий:

var foo = [];

for (var i = 0; i < 10; i++) {
   foo.push(function(i) {
      return function() {
          alert(i);
      };
   }(i));
}

foo[0]();
foo[4]();


На CoffeeScript это конечно элегантней будет:

foo = ((do (i) -> -> i) for i in [0..10])

DjDiablo 12.10.2012 00:55

monolithed - помоему перемудрил
вот так было бы почитабельней

var foo = [];
      for (var i = 0; i < 10; i++) (function(i) {
        
       foo.push(function(){
          alert (i);
        } );
      
      })(i);
foo[0]();
foo[4]();

Maxmaxmахimus 12.10.2012 01:00

DjDiablo, только хотел написать)) что за место блока можно функцию юзать.
Кстати проверьте кто нить что быстрее функция или try{throw 0} catch

monolithed 12.10.2012 01:00

Цитата:

Сообщение от DjDiablo
monolithed - помоему ты перемудрил
вот так было бы почитабельней

Интересно в чем это я перемудрил?

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

Maxmaxmахimus 12.10.2012 01:03

перемудрил тем что фиксированное знчаение текущей итерации цикла , то есть i, должна иметь возможность использоваться ВЕЗДЕ в блоке цикла... а у тебя не везде. у тебя чтобы использовать еще раз фиксированный i придется опять создавать саморазвивающеюся функцию

monolithed 12.10.2012 01:03

Цитата:

Сообщение от Maxmaxmахimus
Кстати проверьте кто нить что быстрее функция или try{throw 0} catch

Тут даже проверять нечего.

Maxmaxmахimus 12.10.2012 01:04

и что еж быстрее?

monolithed 12.10.2012 01:04

Цитата:

Сообщение от Maxmaxmахimus
перемудрил тем что фиксированное знчаение текущей итерации цикла , то есть i, должна иметь возможность использоваться ВЕЗДЕ в блоке цикла... а у тебя не везде

В конкретном примере мне это не грозит.

Maxmaxmахimus 12.10.2012 01:06

Цитата:

Сообщение от monolithed
В конкретном примере мне это не грозит.

по этому мы тебе и делаем замечание что это только для этого примера а не универсально а должно быть универсально потому что универсально работает И тут и везде а твое работает ТОЛЬКО тут так что твое хуже.

А ТАК ЖЕ, в чем ты перемудрил? Отвечаю: ЗАЧЕМ одна функция ретурнит другую?

Nekromancer 12.10.2012 01:12

Maxmaxmахimus,
функция быстрее.

monolithed 12.10.2012 01:13

Цитата:

Сообщение от monolithed
и что еж быстрее?

http://jsperf.com/closure-in-loop

Maxmaxmахimus 12.10.2012 01:16

уже првоерил, кстати классынй сайт
Цитата:

Сообщение от Nekromancer
функция быстрее.

почему?


Часовой пояс GMT +3, время: 21:19.