Показать сообщение отдельно
  #7 (permalink)  
Старый 03.11.2018, 23:05
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Я понимаю так, что нужно взять две последние цифры и заменить их на двоеточие + две последние цифры. Вот функция printTime...

function printTime(time) { return String(time).padStart(4, "0").replace(/(\d{2}$)/, ":$1"); }

// пример
alert(printTime(1234));


UPD
Сообщение от AnthonyFink
Malleys,
рони это сделал идеально =)
Да! Но с другой стороны тема не называется "помогите решить задачу: составьте из 4 цифр всевозможные времена", поэтому я не понял, почему это так сложно. Перестановки из 4-ёх элементов дают 24 варианта, среди них выбрать только те, которые могут быть показаниями часов.

<script>
const permutations = xs0 => [xs0, ...perms(xs0, [])];
const perms = ([t, ...ts], is) => {
	if(t === undefined) return [];
	const interleave = (r, xs) => {
		const interleaveHelper = (f, [y, ...ys]) => {
			if(y === undefined) return [ts, r];
			const [us, zs] = interleaveHelper(x => f([y, ...x]), ys, r);
			return [[y, ...us], [f([t, y, ...us]), ...zs]];
		};
		const [, zs] = interleaveHelper(x => x, xs, r);
		return zs;
	};
	return permutations(is).reduceRight(interleave, perms(ts, [t, ...is]));
};

const times = permutations([1, 2, 3, 4])
	.filter(([a, b]) => 10 * a + b < 24)
	.map(([a, b, c, d]) => `${a}${b}:${c}${d}`)
	.join(", ");

document.write(times)</script>


UPD2 рони, зачем у вас цикл для поиска перестановок из 4-ёх элементов совершает 240 проходов, достаточно на порядок меньше homepage.math.uiowa.edu/~goodman/22m150.dir/2007/Permutation%20Generation%20Methods.pdf
<script>
function* permutations(xs0) {
	const length = xs0.length, c = Array(length).fill(0);
	let i = 1, j;

	yield xs0.slice();

	while(i < length)
		if (c[i] < i) {
			j = i % 2 && c[i];
			[xs0[i], xs0[j]] = [xs0[j], xs0[i]];
			c[i]++, i = 1;
			yield xs0.slice();
		} else
			c[i] = 0, i++;
}

const times = [...permutations([1, 2, 3, 4])]
	.filter(([a, b]) => 10 * a + b < 24)
	.map(([a, b, c, d]) => `${a}${b}:${c}${d}`)
	.join(", ");

document.write(times)</script>


UPD3 Логику поиска времён можно внедрить в алгоритм поиска перестановок...
<script>function* getTimes(xs0) {
	const length = xs0.length, c = Array(length).fill(0);
	let i = 0, j, xs, isFirst = true;

	while(i < length)
		if (c[i] < i || isFirst) {
			isFirst = false;
			j = i % 2 && c[i];
			[xs0[i], xs0[j]] = [xs0[j], xs0[i]];
			c[i]++, i = 1;
			xs = xs0.slice();
			if(10 * xs[0] + xs[1] < 24) yield xs.join("").replace(/(\d{2}$)/, ":$1");
		} else
			c[i] = 0, i++;
}

document.write([...getTimes([1, 2, 3, 4])].join(", "))</script>


UPD4 Гениально и просто, на основе предыдущих ответов
<script>function* permutations(xs0){
	if(xs0.length == 0) yield []
	for(const a of xs0) for(const x of permutations(xs0.filter(x => x !== a)))
		yield [a, ...x]
}
function* getTimes(l) {
	for(const [a, b, c, d] of permutations(l)) {
		if(10 * a + b >= 24) break
		yield `${a}${b}:${c}${d}`
	}         
}
document.write([...getTimes([1, 2, 3, 4])].join(", "))</script>


P. S. Тут используется рекурсивный генератор!

Последний раз редактировалось Malleys, 04.11.2018 в 06:17.
Ответить с цитированием