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

j0hnik 17.04.2018 17:07

Интересное задание codewars.com
 
codewars.com
уровень сложности 3Kyu (далеко не самая сложная по местным меркам.)

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

reverse=a=>ваш код;


1) нельзя использовать метод reverse()
2) ваш код : не может превышать 19 символов

для теста используйте различные массивы пример:
console.log(reverse(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']));

Alexandroppolus 17.04.2018 17:30

наверно тут что-то из ES7

в 19 символов очень трудно впихнуться...

рони 17.04.2018 17:46

j0hnik,
не 19, но может кому пригодится
reverse=a=>a.reduce((a,b)=>[b,...a]);
console.log(reverse(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']));

j0hnik 17.04.2018 17:52

рони,
reverse=a=>a.map((e,i)=>a[a.length-1-i]);


вот наподобие, тоже не вписывается

j0hnik 17.04.2018 17:54

Alexandroppolus,
в ES7 что нового для массивов появилось не подходит ничего.
(ну или я слепой)

j0hnik 17.04.2018 17:56

рони,
мб там с sort что поколдовать?

рони 17.04.2018 17:58

j0hnik,
проверял sort, не получилось ... может ловчее кто.

destus 17.04.2018 19:42

Более находчивые люди придумали так https://stackoverflow.com/questions/...without-revers

j0hnik 17.04.2018 20:02

destus,
неа, не катит, пробовал так.

Alexandroppolus 17.04.2018 21:37

ага, в хроме уже на 11 элементах обломалось. Видно, метод сортировки на таком количестве меняется (как известно, для маленьких массивов быстрее всего работает одна из простых сортировок)

рони 17.04.2018 22:58

:write:
ещё вариант...
reverse=a=>Array.from([...a],()=>a.pop());
console.log(reverse(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']));

MallSerg 17.04.2018 23:06

имхо задача не решаема в 19 байт.

Белый шум 18.04.2018 09:26

reverse=a=>[...a].map(a.pop,a)
console.log(reverse(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']))
alert(reverse(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']))

:dance: :thanks:

рони 18.04.2018 09:42

Белый шум,
:victory: смотрел в эту сторону, но половину массива терял на выходе :) a.map(a.pop,a)

рони 18.04.2018 10:01

;) и пост №11, никак не выходило a.pop добавить :) контекста не хватало ,a

reverse=a=>Array.from([...a],a.pop,a);
console.log(reverse(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']));

Белый шум, ещё раз поздравляю!!!

MallSerg 18.04.2018 14:34

Тоже вчера находил такой вариант
https://repl.it/@chiu_les1/array-methods-explained
Была у меня идейка тут всего то 20 байт значит можно брутфорсом подобрать

Alexandroppolus 18.04.2018 15:12

да, круто.

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

Alexandroppolus 18.04.2018 15:19

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

По сути ничего особенного, но тут можно знатно облажаться :)

j0hnik 18.04.2018 15:35

О ВЕЛИКИЙ БЕЛЫЙ ШУМ! Красавчег!

j0hnik 18.04.2018 15:50

Там почти у всех задач много решений, а у этой можно сказать одно.
либо небольшая рокировка
reverse=a=>a.map(a.pop,[...a])

j0hnik 19.04.2018 02:29

уровень сложности 6Kyu (новичок+)

нужно дописать функцию которая возводит каждую цифру в квадрат

sd=x=>ваш код;

1) ваш код : не может превышать 30 символов

вход/выход

sd(0)=>    0
sd(64)=>   3616
sd(1111)=> 1111
sd(2222)=> 4444
sd(3333)=> 9999
sd(3212)=> 9414
sd(1234)=> 14916
sd(77455754)=> 4949162525492516
sd(99999999)=> 8181818181818181


решений множество

на входе - выходе Number

Белый шум 19.04.2018 04:29

sd=x=>+[...x+""].map(n=>n*n).join("") //если убрать плюс в начале, то уложится в 30 символов, но результат будет строкой, а не Number
//sd=x=>+[...x+""].reduce((s,n)=>s+n*n,"") //так длиннее получается

function test(n, res){
  var r = sd(n);
  console.log('sd('+n+')='+r+'; ', r===res);
}
test(64, 3616)
test(1111, 1111)
test(2222, 4444)
test(3333, 9999)
test(3212, 9414)
test(1234, 14916)
test(77455754, 4949162525492516)
test(99999999, 8181818181818181)

Цитата:

Сообщение от рони
Белый шум, ещё раз поздравляю!!!

Цитата:

Сообщение от j0hnik
О ВЕЛИКИЙ БЕЛЫЙ ШУМ! Красавчег!

Перехвалили %)

j0hnik 19.04.2018 04:39

Белый шум,
решается даже в 28

Белый шум 19.04.2018 07:13

Цитата:

Сообщение от j0hnik
решается даже в 28

Уговорил, шайтан %)
sd=x=>+(x+"").replace(/./g,n=>n*n)

function test(n, res){
  var r = sd(n);
  console.log('sd('+n+')='+r+'; ', r===res);
}
test(64, 3616)
test(1111, 1111)
test(2222, 4444)
test(3333, 9999)
test(3212, 9414)
test(1234, 14916)
test(77455754, 4949162525492516)
test(99999999, 8181818181818181)

j0hnik 20.04.2018 05:56

уровень сложности 2Kyu (Бородатый кодер)

Создайте регулярное выражение, способное оценивать двоичные строки (которые состоят только из 1 и 0) и определять, является ли данная строка числом, делящимся на 7.

function regexp(bin){
	const solution = /ваш код/;
	var dec = parseInt(bin,2);
	return solution.test(bin)+' => '+dec+'/7='+dec/7;
}

console.log(regexp('110001'));


для тех кто шарит в регулярках и двоичном коде.

Alexandroppolus если решали сразу не подсказывайте. ;)

Alexandroppolus 20.04.2018 14:03

Цитата:

Сообщение от j0hnik
Alexandroppolus если решали сразу не подсказывайте.

не, эту не решал. Я решал про делимость на 3 (ссылка на пред. странице), там уже указан конечный автомат, надо просто его зарегексить.

Здесь ещё КА придумать надо, или найти )

Кстати, 'Anti-cheat tests' здесь хреновые, пример того как не надо делать. Вот такой вариант нечестного решения прокатывает:
const solution = new RegExp('.');
var str = solution.test.toString();
solution.test = function(x) { /* тут любое решение )) */ };
solution.test.toString = function() { return str; };

j0hnik 20.04.2018 16:41

Alexandroppolus,
Не натыкались там на задачку где нужно взломать 32-х битный ключ, который меняется каждые 12 сек? как такие решаются?

Alexandroppolus 20.04.2018 16:43

j0hnik,
дай ссылку, гляну

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

j0hnik 20.04.2018 16:56

Alexandroppolus,
https://www.codewars.com/kata/tap-in...ain/javascript

j0hnik 20.04.2018 16:57

Alexandroppolus,
Какой у вас там Kuy ?

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, время: 02:04.