Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Интересное задание codewars.com (https://javascript.ru/forum/misc/73461-interesnoe-zadanie-codewars-com.html)

Alexandroppolus 20.04.2018 18:03

Цитата:

Сообщение от j0hnik (Сообщение 483715)

что-то я не раскурил задачу :)

----
https://www.codewars.com/users/Alexandroppolus

Белый шум 21.04.2018 02:52

Цитата:

Сообщение от j0hnik (Сообщение 483715)

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

function crack(login) {
  console.log('login:', login);

  var n=0;
  var pass = ''
  for( var len=0; len<28; len++ ) {
    var probes = []
    var list = [0,1,2,3,4,5,6,7,8,9] //список цифр для подстановки
    var probe=0
    do {
      probe+=2
      var a = []
      for( n in list ) {
        var nn = pass+n
        var hr1, hr = process.hrtime()
        for( var i=0; i<12000+(len*100*probe); i++ ) {//<--подобрать кол-во расшифровок
          login(nn)
        }
        hr1 = process.hrtime()
        hr1 = String(hr1[0]).slice(-1) + String(hr1[1]).padStart(9, '0')
        hr = String(hr[0]).slice(-1) + String(hr[1]).padStart(9, '0')
        var t = Number(hr1) - Number(hr)
        a[n] = t
      }
      var max = Math.max.apply(null, a.filter(n=> n!=undefined))
      var pass_probe = pass + a.indexOf(max)
      var next = true
      probes[pass_probe] = Number(probes[pass_probe] || 0) + 1
      //надо чтоб число несколько раз оказалось самым долгим:
      if( probes[pass_probe] > 2 ) {
        next = false
        pass = pass_probe
      }
      //console.log( 'PASS:', pass_probe )
      
//удалить индекс с самым маленьким временем выполнения:
var del_list = []
var min = Math.min.apply(null, a.filter(n=>n != undefined));
del_list.push(min)
if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );
//ещё раз
var min = Math.min.apply(null, a.filter(n=>n != undefined && del_list.indexOf(n) == -1));
del_list.push(min)
if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );
//третий раз
var min = Math.min.apply(null, a.filter(n=>n != undefined && del_list.indexOf(n) == -1));
del_list.push(min)
if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );
//4-ый
//var min = Math.min.apply(null, a.filter(n=>n != undefined && del_list.indexOf(n) == -1));
//del_list.push(min)
//if( probes[pass + a.indexOf(min)] == undefined ) delete( list[ a.indexOf(min) ] );

    } while( next )
  }

   //последние четыре цифры быстрее подобрать влоб:
   for( i=0; i<=9999; i++ ) {
     if( login(pass + String(i).padStart(4, '0')) ) break
   }
return pass + String(i).padStart(4, '0')
//return '12345678901234567890123456789012';
}

j0hnik 21.04.2018 03:19

Белый шум,
:) действительно успевает один крякнуть.
назовем ваш код "Вредоносный процесс"

j0hnik 21.04.2018 03:34

вот еще мне понравилась

Уровень сложности 4Kyu (Мидл)

На входе многомерные массивы вида

array = [[1,2,3],
         [4,5,6],
         [7,8,9]]


array = [[1,2,3,4],
        [5,6,7,8],
        [9,10,11,12],
        [13,14,15,16]]


Содержимое может быть произвольное, не обязательно цифры.

на выходе надо получить массивы вида
1) [1,2,3,6,9,8,7,4,5];
2) [1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

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


рони 21.04.2018 08:59

Цитата:

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

в примере против часовой :)
Змейка робот

j0hnik 05.05.2018 20:44

Интересная ката 6kyu (новичок+)

Напишите код который позволит стабильно выводить true в консоль.

var guess = // ваш код
// ваш код

console.log(Math.floor(Math.random() * 100 + 1) == guess);// проверка

рони 05.05.2018 21:19

j0hnik,
var guess = function() {
    var b = Math.random,
        a;
    Math.random = function() {
        a = b();
        guess = Math.floor(100 * a + 1);
        return a
    }
}();

console.log(Math.floor(Math.random() * 100 + 1) == guess);// проверка
console.log(Math.floor(Math.random() * 100 + 1) == guess);// проверка
console.log(Math.floor(Math.random() * 100 + 1) == guess);// проверка

j0hnik 05.05.2018 21:24

рони,
Ок, работает, можно даже чуть проще

Math.random = () => 0;
var guess = 1

Alexandroppolus 06.05.2018 14:38

Цитата:

Сообщение от j0hnik
Ок, работает, можно даже чуть проще

Math.random = () => 0;
var guess = 1

проще, но убивает Math.random
а тот вариант "без травматизма" :)

недавно по работе пришлось таким же образом пропатчить некоторые встроенные функции. Так что это имеет практический смысл.

j0hnik 06.05.2018 14:45

Alexandroppolus,
Для ката это без разницы.


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