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

рони 21.08.2018 09:29

j0hnik,
:thanks:

Белый шум 21.08.2018 12:32

Цитата:

Сообщение от j0hnik (Сообщение 493115)
если кому интересно #112 пост
решение

[2,5,9,9,2,2].reduce((a, b) => a ^ b)
//7

?? :-?

рони 21.08.2018 12:48

Белый шум,
наверно в задании только пары чисел и одно одиночное число

Alexandroppolus 21.08.2018 13:17

как уже говорил, с двумя уникальными числами (надо найти оба) тоже есть решение, и там чуть интереснее

j0hnik 21.08.2018 13:20

Цитата:

Сообщение от рони
наверно в задании только пары чисел и одно одиночное число

Все верно, одно уникальное, остальные пары.
Alexandroppolus,
ссылку

Alexandroppolus 21.08.2018 13:26

Цитата:

Сообщение от j0hnik
Alexandroppolus,
ссылку

я не нашел на кодоварсе такой задачи, просто давно когда-то решал

j0hnik 21.08.2018 13:45

Alexandroppolus,
var arr = [1,1,2,5,9,9,7,7];
function unq(arr){
	var newArr = [];
	for(var i = 0; i<arr.length; i++){
		var x = arr[i];
		arr[i] = null;
		if(!arr.includes(x)) {
			newArr.push(x);
			if(newArr.length == 2) return newArr;
			continue;
		}
		arr[i] = x;
	}
}

console.log(unq(arr));

Alexandroppolus 21.08.2018 14:16

j0hnik,
не то :)
решается аналогично предыдущей, с теми же ограничениями - O(n) по времени выполнения, O(1) по вспомогательной памяти

j0hnik 21.08.2018 14:22

Alexandroppolus,
в массиве пары могут быть любыми? могут быть пропуски? например с пару сотен пропущенных.
два уникальных остальные пары?

Alexandroppolus 21.08.2018 14:28

Цитата:

Сообщение от j0hnik
Alexandroppolus,
в массиве пары могут быть любыми? могут быть пропуски? например с пару сотен пропущенных.
два уникальных остальные пары?

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

j0hnik 21.08.2018 14:53

Alexandroppolus,
var arr = [1,1,2,5,9,9,7,7];

function unq(arr) {
	var obj = {};
	for(var i = 0;  i < arr.length; i++){
		var num = arr[i];
		obj[num] ? delete obj[num] : obj[num] = 1;
	}
	return Object.keys(obj).map(n=>+n);
}

console.log(unq(arr));

Alexandroppolus 21.08.2018 15:00

опять не то. В таком решении вспомогательной памяти дохрена используется. А нужно O(1), т.е. несколько байт, независимо от длины массива. Как в решении для одного уникального

j0hnik 21.08.2018 15:04

Alexandroppolus,
это решение проходит на кодварс, по заданию где один уникальный, надо лишь заменить
return +Object.keys(obj)[0]

j0hnik 21.08.2018 15:06

Alexandroppolus,
как еще быстрей я хз, я сдаюсь, пишите

Alexandroppolus 21.08.2018 15:18

Цитата:

Сообщение от j0hnik
это решение проходит на кодварс

но работает в разы дольше. На самом деле это косяк автора каты, он просто "не дожал" по объемам тестов :) при этом говорит о какой-то исключительной скорости..

----
ответ писать пока не буду, вдруг ещё кто заинтересуется

j0hnik 21.08.2018 15:20

Alexandroppolus,
в личку

nerv_ 22.08.2018 12:12

если задача найти уникальные для массива целых чисел, то это можно сделать так:

const arr = [1,1,2,5,9,9,7,7]

function uniq (x) {
	return Array.from(new Set(x))
}

alert(uniq(arr))


:)

j0hnik 22.08.2018 16:27

Кто знает существует ли более быстрый способ оставить уникальные элементы?
массив +- как в примере.
var rnd =()=> Math.floor(Math.random() * 500);
var arr = [], i = 1000;
while(i--) arr.push(rnd());
var uniq =arr=>{
     var newArr = [];
	for (var i = 0; i<arr.length; i++){
		var flag = true;
		for (var j = 0; j<newArr.length; j++){
			if(arr[i]===newArr[j]) {
				flag = false;
				break;
			}
		}
		if(flag) newArr.push(arr[i]);
	}
	return newArr;
};
console.log(uniq(arr))

Alexandroppolus 22.08.2018 16:49

вариант из предыдущего поста должен быть в разы быстрее.

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

j0hnik 22.08.2018 16:58

Цитата:

Сообщение от Alexandroppolus
вариант из предыдущего поста должен быть в разы быстрее.

Нет Сань, это к сожалению не так.

https://jsperf.com/4543543543

Alexandroppolus 22.08.2018 17:58

Цитата:

Сообщение от j0hnik
Нет Сань, это к сожалению не так.

https://jsperf.com/4543543543

ты забыл скобки после rnd в строке while(i--) arr.push(rnd); :)
в итоге в массив напушилось одно и то же значение, и никакого вложенного цикла по факту и не было

https://jsperf.com/uniqs5436436/ - исправленное и дополненное
вариант 3 - тоже с Set, только заполняется по ходу пьесы, в Хроме он оказался быстрее первого варианта, в ФФ медленнее (но оба они существенно быстрее второго, который рулит, только если разных значений совсем мало).
вариант 4 "читерский", заточен под конкретные данные, вместо Set используется настоящий массив, и он ожидаемо уделывает всех без шансов

j0hnik 22.08.2018 18:33

Alexandroppolus,
Цитата:

Сообщение от Alexandroppolus
while(i--) arr.push(rnd);

да, прошу прощения, напушил функцию.

спасибо за способы, и почему я сразу до такого 'кеша' не додумался.
if (s[v] === 0) {
          newArr.push(v);
          s[v] = 1;
        }

Alexandroppolus 23.08.2018 15:44

Продолжаем тему reverse, с которой стартовал топик :)

https://www.codewars.com/kata/block-exchanging-reverse/

Требуется развернуть массив из 99 элементов, единственное допустимое действие - обменять местами любые два соседних слайса, и надо уложиться в 50 обменов.

Пример действия:
было [0, 1, 2, 3, 4, 5, 6], стало [0, 3, 4, 5, 1, 2, 6] - обменяли местами куски [1, 2] и [3, 4, 5]

рони 23.08.2018 16:58

вариант reverse
function doReverse(a) {
    var c = a.length,
        d = Math.floor(c / 2),
        b = a.slice(d);
        a.length = d;
    2 < c && (b = doReverse(b), a = doReverse(a));
    return b.concat(a)
    };
    var i = doReverse([0, 1, 2, 3, 4, 5, 6])
    alert(i);
    var a = Array.from({length : 100}, (a,b)=>b)
    alert(a);
    a = doReverse(a);
    alert(a);

Alexandroppolus 23.08.2018 17:45

рони,
нет, сами куски во время обмена нельзя разворачивать. См. пример.

MC-XOBAHCK 02.09.2018 15:07

Извиняюсь что врываюсь в тему, а не подскажите к какой математической теории (решению, алгоритму) мне обратится с такой задачей:

Есть лист бумаги размером 1250 х 2000 мм
Нужно его раскроить по размеру 1250 на заготовки размерами 180, 230, 95 мм чтобы получился минимальный отход. Размер 2000 не трогаем он остаётся для заготовок. Кол-во заготовок задаётся динамически (под заказ). В реальности и размеры 180, 230, 95 тоже под заказ, я их как пример указал.

Нужно найти оптимальную схему раскроя.

Вы тут люди с большим опытом и наверняка решали подобные задачи. Я нашёл задачу Канторовича, разбираю её и вроде как понимаю смысл, но решить и написать код пока не пробовал - по моему у него для решения более сложных задач, чем то что мне нужно.

Подскажите пожалуйста, куда мне копать?

рони 02.09.2018 16:02

MC-XOBAHCK,
95,95,95,95,180,230,230,230

MC-XOBAHCK 02.09.2018 16:43

Цитата:

Сообщение от рони (Сообщение 493814)
95,95,95,95,180,230,230,230

Спасибо!
Я наверно как обычно непонятно описал задачу, имеется ввиду оптимально раскроить какое то кол-во листов, чтобы получить например:
230 - 40 штук
180 - 45 штук
95 - 16 штук.

рони 02.09.2018 16:46

Цитата:

Сообщение от MC-XOBAHCK
Подскажите пожалуйста, куда мне копать?

https://javascript.ru/forum/misc/619...tml#post411098

Aetae 02.09.2018 17:27

Цитата:

Сообщение от MC-XOBAHCK (Сообщение 493810)
Извиняюсь что врываюсь в тему, а не подскажите к какой математической теории (решению, алгоритму) мне обратится с такой задачей:

Есть лист бумаги размером 1250 х 2000 мм
Нужно его раскроить по размеру 1250 на заготовки размерами 180, 230, 95 мм чтобы получился минимальный отход. Размер 2000 не трогаем он остаётся для заготовок. Кол-во заготовок задаётся динамически (под заказ). В реальности и размеры 180, 230, 95 тоже под заказ, я их как пример указал.

Нужно найти оптимальную схему раскроя.

Вы тут люди с большим опытом и наверняка решали подобные задачи. Я нашёл задачу Канторовича, разбираю её и вроде как понимаю смысл, но решить и написать код пока не пробовал - по моему у него для решения более сложных задач, чем то что мне нужно.

Подскажите пожалуйста, куда мне копать?

Так и копать: задача раскроя.:)


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