Показать сообщение отдельно
  #32 (permalink)  
Старый 21.04.2018, 02:52
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от j0hnik Посмотреть сообщение
Alexandroppolus,
https://www.codewars.com/kata/tap-in...ain/javascript
Накостылил путём замера времени выполнения ф-ии - иногда срабатывает на одиночном пароле, но чаще либо ошибается либо в лимит времени не укладывается. Возможно надо искать не самый долгий цикл, а присваивать им рейтинги (и потом сложить). Нет времени возиться.

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';
}
Ответить с цитированием