 
			
				07.12.2011, 22:50
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 что-то знаю 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.05.2009 
					
					
					
						Сообщений: 5,176
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 ну да, особенно вот это для новичков чаще всего не понятно: "~~" 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				07.12.2011, 22:59
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.04.2010 
					
					
					
						Сообщений: 3,417
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от devote
			
		
	 | 
 
	| 
		ну да, особенно вот это для новичков чаще всего не понятно: "~~"
	 | 
 
	
 
 Нас препод (не по js, нет - по C++), помнится, специально заставлял использовать побитовые операторы - чтобы в будущем хоть представляли, что это.  
		
	
		
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				08.12.2011, 18:00
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 junior 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.11.2011 
					
					
					
						Сообщений: 3,924
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		вы для людей код пишите? вы добровольно решаете задачу, выкладываете решение на форум.. да, для людей! так почему не следуете стилю написания?
	 | 
 
	
 
  в данном случае такое написание мне кажется более логичным   
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		а попытки ручного преобразования в байт-код оставьте для второй версии скрипта, которая называется "минифицированной" и после всех ухищрений ещё и сжата в GCC.
	 | 
 
	
 
 Вы заблуждаетесь, попыток обфускации я не предпринимал. За ссылку спасибо)
 melky, да, в js я новичок и скорее всего у меня еще нет чувства стиля именно в нем. Но, я пишу так, как понятно мне и как мне кажется наиболее логичным.
 Тут надо внести ясность: если бы я знал, что этот код придется кому-нибудь сопровождать, то написал бы по другому (отчасти) и дополнил его комментариями   
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		PSS если выложите код в двух версиях - для разработчиков (с комментариями и со всем порядочным) и для пользователей (минифицированная), то я поставлю вам плюсик, если это важно
	 | 
 
	
 
  Поставите - спасибо, нет - ну значит нет) Для меня сейчас главное врубиться в синтаксис js, его особенности и нюансы; попытаться понять причуды браузеров.
 
Думается мне, что большинство из Вас "пришло" в js уже зная C, C++, Java или какой-нибудь другой язык со схожим синтаксисом. К сожалению, это не про меня.  trikadin, и вообще, я самоучка,  препод мне никогда не чего не объяснял) Самостоятельно изучал Assembler (к сожалению не очень долго), VBA, html, css, bat (немного). Так что, "багаж" у меня совсем скромный    
Всех Вас я уважаю и мне очень интересно (и познавательно) наблюдать за Вашими советами/ответами и решениями. Надеюсь, что скоро смогу вступать с Вами в полноценные дискуссии по js    
melky, уж не знаю, пригодится или нет, в следующих двух постах приведенные выше алгоритмы с комментариями. Надеюсь, ни чего не напутал ^_^  
		
	
		
		
		
		
		
			
				__________________ 
				Чебурашка стал символом олимпийских игр. А чего достиг ты? 
Тишина - самый громкий звук
			 
		
		
		
		
		
						  
				
				Последний раз редактировалось nerv_, 08.12.2011 в 18:04.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				08.12.2011, 18:03
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 junior 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.11.2011 
					
					
					
						Сообщений: 3,924
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
// Переводит римские числа в арабские
var num = prompt("Введите римское число", "ammmCMXCIX"); // default - 3999
if(num) alert(RomanToArabic(num));
			
function RomanToArabic() {
	// объявляем переменные, инициализируем объект
	var i, alph = { I:1, V:5, X:10, L:50, C:100, D:500, M:1000 };
	// j - счетчик символов
	// h - результат предыдущих вычислений
	// n - возвращаемое число
	// По буквам строки/римского числа
	for(var h = 0, j = 0, n = 0; j < arguments[0].length; j++) {
		// используем объект как ассоциативный массив - по римской цифре определяем арабскую
		i = alph[arguments[0].charAt(j).toUpperCase()];
	/*	// строку ниже, в данном случае, можно записать так:
				if(i != undefined) {		// римская цифра?
					if(h < i) {				// предыдующая цифра < текущей, вычитаем
						h = i - h * 2;		// т.е. h = i - (h << 1)
					}
					else {					// предыдующая цифра >= текущей, получаем эту цифру			
						h = i;
					}
					n += h;					// собираем число
				}							*/
		if(i) n += h = (h < i ? i - (h << 1) : i);
	}
	// возвращаем число
	return n;
}
 
		
	
		
		
		
		
		
			
				__________________ 
				Чебурашка стал символом олимпийских игр. А чего достиг ты? 
Тишина - самый громкий звук
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				08.12.2011, 18:03
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 junior 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.11.2011 
					
					
					
						Сообщений: 3,924
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
// Переводит арабские числа в римские 
var num = prompt("Введите число", 19); // default - 19
if(num) alert(ArabicToRoman(num));
function ArabicToRoman() {
	// массив соответствий римских и арабских чисел
	var alph = [["I",1], ["IV",4], ["V",5], ["IX",9], ["X",10], ["XL",40], ["L",50], ["XC",90], ["C",100], ["CD",400], ["D",500], ["CM",900], ["M",1000]];
	// j - счетчик эл. массива
	// i - число (арабское), кот. требуется перевести
	// n - возвращаемое римское число
	// По элементам массива -> от большего к меньшему
	for(var j = alph.length - 1, i = arguments[0], n = ""; j != -1; j--) {
	/*	строку ниже можно записать следующим образом
		if(~~(i / alph[j][1]) > 0) { 	// целочисленное деление и сравнение с 0
			n += alph[j][0];			// собираем римское число
			i -= alph[j][1];			// корректируем арабское число на то, кот. определили
			j++;						// проверяем пару (эл. массива) еще раз
		}							*/					
		if(~~(i / alph[j][1]) > 0) { n += alph[j][0]; i -= alph[j][1]; j++; }
	}
	// возвращаем римское число
	return n;
}
 
		
	
		
		
		
		
		
			
				__________________ 
				Чебурашка стал символом олимпийских игр. А чего достиг ты? 
Тишина - самый громкий звук
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				08.12.2011, 22:30
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от nerv_
			 
		
	 | 
 
	| 
		melky, да, в js я новичок и скорее всего у меня еще нет чувства стиля именно в нем. Но, я пишу так, как понятно мне и как мне кажется наиболее логичным.
	 | 
 
	
 
 код перестанет быть таким через месяц   
я сейчас изменил стиль на более подробный ...  и спустя месяц (проект застыл, дела. сейчас снова будет работать) я сел смотреть код. доя меня было радостным событием: я смог с первой попытки понять, что он делает !
 
торжественно! хотя что за файлы и каково их содержимое, я перестал помнить по истечении недели паузы разработки.
 
	
 
	
		
			Сообщение от nerv_
			 
		
	 | 
 
	
		Думается мне, что большинство из Вас "пришло" в js уже зная C, C++, Java или какой-нибудь другой язык со схожим синтаксисом. К сожалению, это не про меня. trikadin, и вообще, я самоучка,  препод мне никогда не чего не объяснял) Самостоятельно изучал Assembler (к сожалению не очень долго), VBA, html, css, bat (немного). Так что, "багаж" у меня совсем скромный   
	 | 
 
	
 
 я изучал html+css+php на уровне гавнокода. потом сел за C#, в котором понимал многопоточность 2 дня (!!!!полностью допёрло,как это использовать. помню кстати до сих пор эти проклятые new Thread(), myth.start() и myth.reportProgress(a,b,c,d) .....)
 
а потом пересел на JS и читал про него днями (!)... так сильно мне понравился этот язык.
 
	
 
	
		
			Сообщение от nerv_
			 
		
	 | 
 
	
		Всех Вас я уважаю и мне очень интересно (и познавательно) наблюдать за Вашими советами/ответами и решениями. Надеюсь, что скоро смогу вступать с Вами в полноценные дискуссии по js  
	 | 
 
	
 
 +1 собеседник. было бы неплохо! обращайся, если будут вопросы   
PS начал учить JS осенью 2010
 
///////////////////  по делу  ////////////////////////////// 
кстати,
 
~~(i / alph[j][1]) > 0
 
лучше бы заменить на
 
(i / alph[j][1])|0
 
тоже "приведение к числу", но быстрее.
 
это одно и то же , что и 
 
parseInt(i / alph[j][1])
  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось melky, 08.12.2011 в 22:40.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				08.12.2011, 23:01
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 ⊞ Развернуть 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2010 
					
					
					
						Сообщений: 1,810
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		(i / alph[j][1])|0
	 | 
 
	
 
 Только | 0 нужно писать внутри скобок. 
alert( [2/2 | 0 > 1, (2/2 | 0) > 1] )
 
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		это одно и то же , что и
	 | 
 
	
 
 Не совсем.  
alert([1/3 * 1e10, parseInt(1/3 * 1e10), 1/3 * 1e10 | 0].join('\n'))
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				08.12.2011, 23:19
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.04.2010 
					
					
					
						Сообщений: 3,417
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		nerv_, а я тоже, считай, сам всё изучал. Препод был по теории алгоритмов, а не по JS. Да и то недолго, ибо не школьный он был.
 
Кстати, по теме - js был первым языком, на котором я стал писать что-то сложнее print("Hello, world"). А нормально (то есть очень усиленно, с прочтением кучи литературы, тематических сайтов и т.д.) я его изучаю... Ну, полгода, наверное. Так что мы с вами в одном положении, можно сказать)
 
	
 
	| 
		
			Сообщение от nerv_
			
		
	 | 
 
	| 
		 Думается мне
	 | 
 
	
 
 Хех) Одна из моих любимых фраз)  
		
	
		
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				08.12.2011, 23:35
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от B@rmaley.e><e
			 
		
	 | 
 
	
		Только | 0 нужно писать внутри скобок.
alert( [2/2 | 0 > 1, (2/2 | 0) > 1] )
 
	 | 
 
	
 
 в вышестоящем примере была проверка на положительное число, поэтому можно таки опустить.
 
	
 
	
		
			Сообщение от B@rmaley.e><e
			 
		
	 | 
 
	
		Не совсем. 
alert([1/3 * 1e10, parseInt(1/3 * 1e10), 1/3 * 1e10 | 0].join('\n'))
	 | 
 
	
 
 спасибо за пример. почему так происходит ?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				09.12.2011, 01:16
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 ⊞ Развернуть 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2010 
					
					
					
						Сообщений: 1,810
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		в вышестоящем примере была проверка на положительное число, поэтому можно таки опустить.
	 | 
 
	
 
 ? 
alert( [-2/2 | 0 > 0, (-2/2 | 0) > 0] )
 
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		спасибо за пример. почему так происходит ?
	 | 
 
	
 
 Согласно  стандарту, у побитовых операторов есть такой шаг как вызов  ToInt32. Т.е. каждый из аргументов приводится к 32-х битовому знаковому числу. В то время как обычно JS оперирует 64-битными числами двойной точности (IEEE 754). Отсюда и получается сужение множества значений.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |