Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск дубликатов чисел в массиве (https://javascript.ru/forum/misc/17312-poisk-dublikatov-chisel-v-massive.html)

hellpilot 14.05.2011 10:00

Поиск дубликатов чисел в массиве
 
Решил побаловаться с утра мозги размять и написать скрипт для генерации чисел в лото "6 из 40" :)
Задачка по идее тривиальная, но видать дома мозги не работают.
Что хотелось: есть 12 полей по 40 цифр, естественно нужно зачеркнуть только 6 в каждом, следовательно генерим 72 числа, МОЁ условие ради чего и затеял "числа не должны повторяться больше двух раз" (вот тут и споткнулся:( ).
Подтолкните пожалуйста мыслю, чтото я в тупике, уже все утро просидел на одном месте:write:
Аккуратнее с этой версией, браузер может зависнуть)))
<html>
<input type="button" onClick="Schet()" value="Считаем">
<div id="tableloto"></div>
<script>
function Schet()
{var headTable = '<table>';
var str='<table><tr>', j, m=0;
var k=new Array(), dub=new Array();
var tr='<tr>';
var tr2='</tr>';
	for (var i=0;i<72;i++)
	{
	j=Random(1,40);
	k[i]=j;
	m=0;
		for(var n=0; n<k.length; n++)//вот тут заковыка
		{
			if (j==k[n])
			{m=m+1;
				if (m==2){i--;
				}
			}
		}
	if (i==6||i==12||i==18||i==24||i==30||i==36||i==42||i==48||i==54||i==60||i==66||i==72)
	{str+='</tr><tr>'}
	str+='<td>  '+k[i]+'  </td>';
	}
document.getElementById('tableloto').innerHTML+=str+'</table>';
}

function Random(min, max)
{
	return Math.floor(Math.random() * (max - min + 1)) + min;
}

</script>
</html>

hellpilot 14.05.2011 10:58

Как обычно спросишь и сразу находишь ответ:lol:
function Schet()
{var headTable = '<table>';
var str='<table><tr>', j, m=0, n=0;
var k=new Array(), dub=new Array();
var tr='<tr>';
var tr2='</tr>';
	for (var i=0;i<72;i++)
	{
	j=Random(1,40);
	k[i]=j;
	m=0;
		for(n; n<k.length; n++)
		{
			if (j==k[n])
			{m=m+1;
				if (m==3){i--;j='';
				}
			}
		}
		if (i==6||i==12||i==18||i==24||i==30||i==36||i==42||i==48||i==54||i==60||i==66||i==72)
		{	if(m!=3){if (i==72){str+='</tr>';}
					str+='</tr><tr>';
			}
		}
		(j=='')?j='':str+='<td>  '+j+'  </td>';
	}
document.getElementById('tableloto').innerHTML+=str+'</table>';
}

Но теперь такой вопрос: нужно обеспечить уникальность в строках по 6, а иначе бред получается и опять я в тупике:)

ASerputko 14.05.2011 11:13

Вот отличная библиотека для работы с массивами и объектами
http://documentcloud.github.com/underscore/#uniq

Gvozd 14.05.2011 11:20

ваш код говнокод.

для начала научитесь нормально форматировать код, чтобы его можно было читать без чувства от вращение.
прогоните код, через какой-нибудь js beautifier, и посмотрите как можно красиво оформлять код.

во-вторых, изучите базовые операторы JS
например % - оператор остатка от деления

Sweet 14.05.2011 11:41

Цитата:

Сообщение от hellpilot
мозги размять и написать скрипт

Вот без комментариев...
Цитата:

Сообщение от hellpilot
if (i==6||i==12||i==18||i==24||i==30||i==36||i==42||i ==48||i==54||i==60||i==66||i==72)

Не смущает такая кошмарная конструкция??? Как насчет сделать так:
if( !(i%6) )

рони 14.05.2011 16:54

Цитата:

Сообщение от hellpilot
"числа не должны повторяться больше двух раз"

Вариант ...
<script type="text/javascript">
var m = [],arr = [],a;
function s(c, d) {return c - d};
function random(c, d, f) {
    var g = [],
        e = 0;
    if (m.length < f) for (var b = 0; b <= d - c; b++) m[b] = b + c;
    for (b = 0; b < f; b++) e = Math.floor(Math.random() * m.length), g[b] = m[e], m.splice(e, 1);
    return g
};
for (var i = 0; i < 12; i++) a = random(1, 40, 6),
document.write(a.sort(s) + "<br />"),
arr = arr.concat(a); // для проверки
document.write(arr.sort(s) + "<br />");
</script>

hellpilot 14.05.2011 19:17

Цитата:

Сообщение от ASerputko (Сообщение 104623)
Вот отличная библиотека для работы с массивами и объектами
http://documentcloud.github.com/underscore/#uniq

Спасибо, хотелось самому состряпать:)

Цитата:

Сообщение от Gvozd (Сообщение 104624)
ваш код говнокод.

Все может быть, но слушать человека с таким аватаркой :stop: .
Про % я знаю, во вторник соревновались с коллегой, кто быстрее найдет все простые числа в любом заданном интервале:haha:
Здесь добавил такой ужас просто потому, что вопрос уже задал, а форматирование согласно задаче не сделал, пришлось на лету добавлять и редактировать, самый простой вариант и сделал.

Цитата:

Сообщение от рони (Сообщение 104661)
Вариант ...
<script type="text/javascript">
var m = [],arr = [],a;
function s(c, d) {return c - d};
function random(c, d, f) {
    var g = [],
        e = 0;
    if (m.length < f) for (var b = 0; b <= d - c; b++) m[b] = b + c;
    for (b = 0; b < f; b++) e = Math.floor(Math.random() * m.length), g[b] = m[e], m.splice(e, 1);
    return g
};
for (var i = 0; i < 12; i++) a = random(1, 40, 6),
document.write(a.sort(s) + "<br />"),
arr = arr.concat(a); // для проверки
document.write(arr.sort(s) + "<br />");
</script>

Спасибо, вопрос видимо решен :) Завтра протестирую седня на юбилей ездил, теперь не до этого:D


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