1. JavaScript / Говнокод #13265

    +157

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    function timeToString(year, month, day, hour, minute, sec, msec) {
    		var date = new Date(year, month, day, hour, minute, sec, msec);
    		var now = new Date();
    		var msec = now.getTime() - date.getTime(); // Миллисекунды
    		var sec = Math.round(msec / 1000);
    		var years = Math.floor(sec / (86400 * 365));
    		var days = Math.floor((sec - years * 86400 * 365) / 86400);
    		var hours = Math.floor((sec - years * 86400 * 365 - days * 86400) / 3600);
    		var minutes = Math.floor((sec - years * 86400 * 365 - days * 86400 - hours * 3600) / 60);
    		var seconds = sec - years * 86400 * 365 - days * 86400 - hours * 3600 - minutes * 60;	
    		// Проверяем, были ли високосные года?
    		var i;
    		for(i = date.getFullYear(); i <= now.getFullYear(); i++) {
    				if(i % 4 === 0) {
    						if(i === now.getFullYear()) {
    								if(now.getMonth > 2) {
    										days++;
    								}
    								elseif(now.getMonth === 2) {
    										if(now.getDay === 28) {
    												days++;
    										}
    								}
    						}
    						else
    							{
    								days++;
    							}
    		}
    		var yearName;
    		var yearOst = years % 10;
    		if(years === 1 || (yearOst === 1 && years > 20))
    			{
    				yearName = 'год'
    			}
    		else if((years === 2 || years === 3 || years === 4) || ((yearOst === 2 || yearOst === 3 || yearOst === 4) && years > 20))
    			{
    				yearName = 'года';
    			}
    		else
    			{
    				yearName = 'лет';
    			}
    		var hourName;
    		var hourOst = hours % 10;
    		if(hours === 1 || (hourOst === 1 && hours > 20))
    			{
    				hourName = 'час'
    			}
    		else if((hours === 2 || hours === 3 || hours === 4) || ((hourOst === 2 || hourOst === 3 || hourOst === 4) && hours > 20))
    			{
    				hourName = 'часа';
    			}
    		else
    			{
    				hourName = 'часов';
    			}
    		var dayName;
    		var dayOst = days % 10;
    		if(days === 1 || (dayOst === 1 && days > 20))
    			{
    				dayName = 'день'
    			}
    		else if((days === 2 || days === 3 || days === 4) || ((dayOst === 2 || dayOst === 3 || dayOst === 4) && days > 20))
    			{
    				dayName = 'дня';
    			}
    		else
    			{
    				dayName = 'дней';
    			}
    		var minuteName;
    		var minuteOst = minutes % 10;
    		if(minutes === 1 || (minuteOst === 1 && minutes > 20))
    			{
    				minuteName = 'минута'
    			}
    		else if((minutes === 2 || minutes === 3 || minutes === 4) || ((minuteOst === 2 || minuteOst === 3 || minuteOst === 4) && minutes > 20))
    			{
    				minuteName = 'минуты';
    			}
    		else
    			{
    				minuteName = 'минут';
    			}
    		var secondName;
    		var secondOst = seconds % 10;
    		if(seconds === 1 || (secondOst === 1 && seconds > 20))
    			{
    				secondName = 'секунда'
    			}
    		else if((seconds === 2 || seconds === 3 || seconds === 4) || ((secondOst === 2 || secondOst === 3 || secondOst === 4) && seconds > 20))
    			{
    				secondName = 'секунды';
    			}
    		else {
    				secondName = 'секунд';
    			}
    		document.getElementById("time").innerHTML = years + " " + yearName + ", " + days + " " + dayName + ", " + hours + " " + hourName + ", " + minutes + " " + minuteName + ", " + seconds + " " + secondName;
    	}

    Функция для подсчета того, сколько времени прошло с указанной даты.
    JavaScript начал изучать вчера. Чувствую, что уже можно заканчивать.
    Пришлось код урезать, чтобы вместиться в 100 строк. Более-менее читаемый тут: http://dumpz.org/573381/

    Запостил: 3Jlou_OguHo4ka, 30 Июня 2013

    Комментарии (150) RSS

    • Проблема больше из-за неумения придумать алгоритм, а не "этот страшный язык я изучаю два часа". Про остаток от деления автор явно не слышал. Числительные формируются буквально одним классическим способом всегда.
      Нужно больше работать над собой и читать вумные книжки.
      Зато усердно.
      Бывает, что усердие превозмогает и рассудок. (q)
      Ответить
      • проблема большинства программистов не в том, что они плохо знают язык, а в том, что они плохо знают алгоритмы...
        Ответить
        • ...и структуры данных!
          Ответить
          • показать все, что скрытоСтруктуры данных не нужны. Массивов и целых чисел хватит для всех.
            Ответить
            • Покажи мне свои структуры данных и я скажу кто ты. Alan Curtis Kay(c)
              А теперь я вам скажу правду: Структуры данных для анскильных питушков. Последний Кароль этого мира(c)
              Ответить
            • Можно даже зелёный цвет отклеить, брейнфак же.
              Ответить
            • От как питушки плюсуют тебя, нихрена не зная об устройстве этих самых структур данных.


              Они, как и ты, думают, что узнай они, что такое связный список( хотя что такое связный список, брёвна и т.п. понимает любой человек, который осилил указатели) они знают сруктуру данных, наивные анскильности. Никто из этих животных не напишет оптимальный двусвязный список - только примитивщину из учебника за 3-й класс.


              И что мы в конечном итоге имеем? Человек(имеющий мозг в районе <1-2%, 99% животных, которые обитают тут не попадают под этот 1% людей, из которых программистов намного меньше 1%), который в совершенстве знает массивы и указатели - уже знает все мыслимые и не мыслимые структуры данных автоматом.


              Как вменяемый електронщик и схематехник автоматом знает все примитивные и не примитивныел огические( и не только) елементы. Патамучто, он знает, что такое транзистор(конденсатор).


              Питухам это не дано понять, поэтому питушки так и дальше будут кукарекать. Неся какую-то херню, не понимая, что тот же двусвязный список - есть обычный массив, в котором prev/next - это не p-1/p+1, а p-offset/p+offset. Хотя питухи, даже не оспилят написать двусвязный список на оффетах, ибо питухи.


              И что мы имеем - мы имеем бездарных животных, которые нихрена о структурах данных и вообще о представлении данных не знают, а заучили пару примитивных конструкций, выдавая это за "структуры данных".
              Ответить
              • показать все, что скрыто> оптимальный двусвязный список
                Ты имеешь в виду ту реализацию, которая экономит память за счет использования всего одного слова вместо двух указателей?

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

                > p-offset/p+offset
                > Хотя питухи, даже не оспилят написать двусвязный список на оффетах, ибо питухи.
                Ты, наверное, все-таки имел в виду p-offset1/p+offset2? Потому что с одинаковым офсетом в обоих случаях ничего не получится. Ну а если разные - то офсетный список легко пишется, и его удобно юзать, к примеру, на замапаном в память файле.
                Ответить
                • он имеет ввиду, что абстрактное представление могут себе представить многие, а вот написать различные эффективные реализации - гораздо меньше.
                  Ответить
                • >Ты имеешь в виду ту реализацию, которая экономит память за счет использования всего одного слова вместо двух указателей?
                  Что такое слово? Экономят память пару оффсетов, а <<| делают только питухи.

                  >Или же реализацию с двойным кольцом, за счет которого вставки и удаления становятся простыми и шустрыми (из-за того что не нужно ничего проверять на NULL'ы)?
                  А разве есть идиоты, которые юзают списки с нуллами на концах? Хотя да, те, кто знают алгоритмы - они знают.

                  >Ты, наверное, все-таки имел в виду p-offset1/p+offset2? Потому что с одинаковым офсетом в обоих случаях ничего не получится. Ну а если разные - то офсетный список легко пишется, и его удобно юзать, к примеру, на замапаном в память файле.
                  Что я имелл ввиду - это офсеты, одинаковые - разные не имеет значения. Там -+, поэтому они могут быть одинаковыми и будет работать.

                  Всё легко пишется и понмиается, только питушки кукарекают.
                  Ответить
                  • показать все, что скрыто> Что такое слово? Экономят память пару оффсетов, а <<| делают только питухи.
                    xor linked list, в котором вместо двух указателей на соседние элементы лежит один size_t, в который помещают ((size_t)next) ^ ((size_t)prev). Там, правда, есть небольшая проблема при обходе: надо тащить 2 указателя - на предыдущий и на текущий элемент. И имея только один указатель на элемент нельзя его удалить или вставить что-то рядом. Так что это только для тех случаев, когда элементы списка мелкие, список длинный, а памяти мало.

                    > поэтому они могут быть одинаковыми
                    Не ну они конечно могут совпасть, потому что в куче элементы удачно легли (например их создавали подряд). Но в общем-то случае они разные.
                    Ответить
                    • >xor linked list, в котором вместо двух указателей на соседние элементы лежит один size_t, в который помещают ((size_t)next) ^ ((size_t)prev). Там, правда, есть небольшая проблема при обходе: надо тащить 2 указателя - на предыдущий и на текущий элемент. И имея только один указатель на элемент нельзя его удалить или вставить что-то рядом. Так что это только для тех случаев, когда элементы списка мелкие, список длинный, а памяти мало.

                      Хреначишь пуллоподобный аллокатор - начало у тебя 0, остальное у тебя оффсет. Для 4-х миллиардов елементов - тебе хватит 32бит+32бита. Получаешь 2указателя за 2-4битовые операции.


                      >Не ну они конечно могут совпасть, потому что в куче элементы удачно легли (например их создавали подряд). Но в общем-то случае они разные.
                      Любая нормальная реализация спискаска имеет свой аллоктор. Никто не говорит, что они одинаковые, но никто так же не говорит, что они обязаны быть разными. Это твоя придирка к моему описанию.
                      Ответить
                      • что такое
                        уже узнал не только про массивы, но и про хеш-мапы и связные списки?
                        прогресс
                        Ответить
                        • Питух, ты о5 вылез? Животное, хешмап и есть массив, только с не прямым индексом, тупое животное. Структура данных там именно массив.


                          Связный список, питух, как я уже говорил - нагромаждение указателей над массивом.


                          Я просто не представляю, как ты анскильные ущербаны, удел которых ваять формочки на делфях - лезут в спор со мной, говорят о какие-то хешмапы, причем говоряют полную ересь. Нихрена не знают, не понимают - но нести херню они всегда горазды.

                          Уйди отсюда питушок, ты мне, животное, до сих пор не описал семантику конста в сишке.
                          Ответить
                          • говорят полную ересь? бгг
                            хеш-таблица массив только наполовину, неужели ты этого не знал?
                            > Нихрена не знают, не понимают - но нести херню они всегда горазды.
                            ты с зеркалом разговариваешь?

                            ну так и как ты собираешься хранить значения в корзине твоего хешмапа?
                            связный список?

                            питушок, развлеки меня сегодня
                            Ответить
                            • >хеш-таблица массив только наполовину, неужели ты этого не знал?
                              Реально? С чего это на половину? data[1 << bit]; data get_data(key_t key) {retrnt data[perfect_hash(key)];}

                              С коллизиями делается в 2массива.

                              >ну так и как ты собираешься хранить значения в корзине твоего хешмапа?
                              >связный список?
                              Животное, что такое "корзина"?


                              >питушок, развлеки меня сегодня
                              то-то ты в прошлый раз слился как детя.
                              Ответить
                              • тебя как всегда подводит полнейшее незнание терминологии, юный питушок
                                bucket - это тот контейнер в хеш-мапе, который хранит значения, попавшие под один хеш - коллизии этого значения хеша

                                ну так что там у тебя - массив? отсортированный? связный список? еще один хеш?
                                Ответить
                                • >тебя как всегда подводит полнейшее незнание терминологии, юный питушок
                                  >bucket - это тот контейнер в хеш-мапе, который хранит значения, попавшие под один >хеш - коллизии этого значения хеша
                                  Мне похрен как питушки вроде тебя что-то называют.

                                  В моём первом примере он не нужен, но ты это проигнорил, как питух.

                                  Что мне будет удобней. Массив - массив. Ещё один хеш - массив. Связный список - массив(для вас питухов не массив). От питушок прокукарекался. В 80% случаях хешмап состоит на 100% из массивов.
                                  Ответить
                                  • а как называют это питушки вроде тебя?
                                    расскажи почему связный список это массив?
                                    Ответить
                                    • Потомучто - связный список - есть произвольная индексация массива. Как хешмассив - есть не прямая индексация массива.


                                      У тебя есть 0 ... N массив и ты пишешь правый елемент n, а левый елеменин n. Код тоже индексируется переходами, но от этого он не перестаёт быть масивом.


                                      Твоё жалкое сознание примитивно, основанно на бездарном недопонимании каких-то абстракций.
                                      Ответить
                                    • > почему связный список это массив

                                      Ну, если список интрузивный (а сишные Цари используют только такие), то для реализации вполне достаточно одного массива. Вместо указателей - индексы.
                                      Ответить
                                      • тем не менее, это будет список, т.к. 1) для обращения к i элементу нужно будет совершить i действий, 2) не будет пенальти при вставке и удалении
                                        в отличие от массива, где 1) для обращения к i элементу нужно совершить 1 действие и 2) при вставке в середину ломается перформанс
                                        Ответить
                                        • > тем не менее, это будет список

                                          Мы-то, анскильные жывотные, привыкли отделять питушиные абстракции от анскильных реализаций. Но наш гениальный друг не желает опускаться до пренебрежения деталями. Ибо всё есть массив и гнуц - пророк его. Питаминь.
                                          Ответить
                                        • >1) для обращения к i элементу нужно будет совершить i действий
                                          Животное упоротое. Никаких i елементов у взаимозависимых индексов нет - питух тупой.

                                          >не будет пенальти при вставке и удалении в отличие от массива
                                          Упоролся чтоли? Иди покури man x86, питушара.

                                          >для обращения к i элементу нужно совершить 1 действие и 2) при вставке в середину ломается перформанс
                                          Упоролся, животное? Не 1 действие, животное, а (3*кешлайн)/длинну елемента( в твоих питушарских плюсах всё ещё хуже). И застопорить конвейер. Но тыж питух, кроме детсодовских "1действие" нихрена не знаешь.

                                          Ты, животное, нихрена не знаешь о перфомансе, даже не заикайся мне о нём - твой удел ваять говно за еду, не более.
                                          Ответить
                                          • начинаешь утомлять
                                            ты же ранее уже спизднул, что у нас не хватает уровня абстракции, что массив и список - это всё суть некие контейнеры, которые хранят в себе элементы
                                            "N элементов"- твои слова?

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

                                            теперь тут будет вопрос о твоей нелюбимой О-нотации
                                            для тебя же понятно, надеюсь, что container[1] - элемент, следующий за container[0]
                                            итак, сколько попугаев-элементарных абстрактных действий надо будет сделать при обращении к container[5] в случае, если этот container - массив и в случае, если container - список, в котором, как ты хотел, роль указателя на следующий элемент исполняет индекс этого самого следующего элемента?

                                            затем аналогично про удаление container[5] и вставку элемента между container[5] и container[6]

                                            доступно?
                                            Ответить
                                            • Животное, ты что несёшь? Идексация списка взаимозависимая, но индексация его данных - прямая.

                                              0 1 2 3 4 5 6 - это стркутура данных - она хранит.

                                              3 0 2 5 6 4 1 - это индекс, который можно записать как ещё один линейный индекс, либо как связный список. Нулевой елемент тут 2-й, поэтому p+0 - будет нулевой елемент О(1).


                                              Ты животное, у тебя нет прямой индексации к индексу над массивом, которыйм является список.

                                              >затем аналогично про удаление container[5] и вставку элемента между container[5] и container[6]
                                              Животное - ты не можешь вставлять между чем-то упрошка - у твоего списка нет прямой индексации - ты можешь добавлять в хвост. Чтобы ты мог вставлять как ты говоришь - тебе надо захреначить ещё одини ндекс над списком.

                                              В связном списке без верхнего индекса - это бесполезно, с ним - одинаково, что там, что там.

                                              >затем аналогично про удаление container[5] и вставку элемента между container[5] и container[6]
                                              Одинакого и там и там на удалении. Вставка без индексации - одинакова, вставка с индексацией одинаковая - если всё в кеше связный список с внешним индексом будет быстрее, но его полезная нагрузка на байт 20 на елемент меньше, чем у массива.


                                              Питух, ты нихрена не понимаешь - ты несёшь полную херню, ты кроме стл"а ничего не знаешь. Ты не знаешь своих же "стрктур данных". Ты не понимаешь, что [] требует для списка ещё один индекс и это уже далеко не связный список.
                                              Ответить
                                              • у тебя в каша голове и ты нас всех запутал, назвав списком вообще непонятную байду
                                                связный список в стл, в кнуте и других пока еще непонятных для тебя словах на пальцах описывается вот тут: http://ru.wikipedia.org/wiki/Связный_список

                                                в общем я постарался декодировать то, что ты написал
                                                у тебя, походу, каша из абстрактного понятия "список" и понятия "LRU"
                                                какую то ересь нахерачил

                                                каждый элемент списка знает, где находится соседний к нему элемент
                                                нулевой должен знать про первый, первый должен знать про второй
                                                с помощью массива это запиливается несложно - каждая ячейка массива хранит { T data; size_t next; }
                                                список - идеальная структура данных, в которой важен как порядок соседствования элементов при обходе, так и сравнительная дешевизна размещения нового элемента/удаления ненужного между существующими двумя

                                                [] для списка требует последовательного прохода от головы списка до нужного i-го элемента
                                                сравни с массивом

                                                вставка в середину массива и удаление из середины от тебя потребует (даже если аллоцированный размер позволяет) переноса всех элементов справа
                                                в списке же тебе достаточно найти любую свободную ячейку и переназначить ссылки на нее - все старые элементы остаются на своих местах и никуда не двигаются

                                                что непонятного?
                                                Ответить
                                                • Животное, тупое - что ты несёшь.

                                                  Вот тебе надо вставить по одному елементу на 10, 100, 1000, 10000, 100000 позицию в твоём списке - для того, чтобы получить указатель на 10, 100, 1000, 10000, 100000 елемент в твоём списке - тебе надо обойти 10, 100, 1000, 10000, 100000 елементов, ибо ты знаешь указатель только на первый елемент списка.


                                                  Для того, чтобы тебе не надо было обходить елементы, питух тупорылый, пацаны в стл"е пишут для тебя ещё один индекс, но ты этого не понимаешь.

                                                  Вставка в произвольное место массива - требует сдвинуть все последующие елементы - вставка в произвольное место списка - требует перебора всех елементов до нужного тебе.


                                                  Ты поймёшь это?
                                                  Ответить
                                                  • ты упускаешь важную деталь
                                                    я уже знаю указатель на 10000й элемент
                                                    как в массиве, так и в списке
                                                    я хочу вставить сразу после него новый элемент
                                                    ничего дополнительно искать с головы не надо - это задача совсем другого алгоритма
                                                    Ответить
                                                    • Нет, глупое существо. Быстрая вставка в списке только в конец. В остальных случаях он в говном сливает массиву, даже будучи целиком в кеше.

                                                      Знал бы ты ещё х86, как строитель материал - ты бы такую херню не нёс. Скорость памяти уже давно перешагнула планку 20гигов на нить.

                                                      Максимум, что ты можешь выжать из обхода списка - это отсилы гига 2-3/с. Даже если ты будешь обходить елементов в 2раза меньше, чем я в массиве копировать - вставка у тебя будет медленней.

                                                      Так же - ты будешь убивать кеш, ибо ты будешь сбрасывать кешлайны на запись, что убьёт перфоманс оперативы ещё в 2раза. nt обход на списке не реализуем. Префетч тоже.

                                                      Вобщем ты анскильное говно, которое несёт просто тотальную херню - вставка в произвольное место списка не быстрее вставки в произвольное место у массива, даже если ты будешь кешировать последние обращения.
                                                      Ответить
                                                      • на тебе простейший тест на вставку в контейнер
                                                        можешь переписать на сишке
                                                        http://pastebin.com/FptZPZxk

                                                        насчет актуальности проца и его кешей - i7-2600k
                                                        Ответить
                                                        • Твой тест говно. Ты что мериешь, животинушка? С какого хрена ты обходишь свой список? Тыж говорил про произвольную вставку - ты же юзаешь ен произвольную вставку, а вставку в начало - ты питух.

                                                          Произвольная вставка - это имея голову - хреначит в любую часть списка, а не смешать голову и хреначить в неё.


                                                          Теперь запили мне бенчь, где ты записываешь в (std::rand() % 1000000) елемент единицу 1000000 раз и слейся, животное.
                                                          Ответить
                                              • Что ты за хуйню несёшь, дебил? Несвязный набор фраз.
                                                Ответить
                            • > хеш-таблица массив только наполовину
                              > С коллизиями делается в 2массива.

                              HashTable = 2 * Array
                              HashTable / 2 = Array

                              Лол, занимательная математика
                              Ответить
                          • семантику конста?
                            ну про .rodata ты, надеюсь, помнишь, у тебя же абсолютная память
                            ну и помнишь про функцию с названием примерно strchrnul
                            представь, что ты пишешь перформанс библиотеку для анскильных питухов
                            напиши мне прототип этой одной функции strchrnul, я тебе приведу пример как хочу её использовать
                            Ответить
                            • показать все, что скрыто> про .rodata ты, надеюсь, помнишь
                              А вот, кстати, хрен там. Если бы const гарантировал помещение в r/o память, то зачем бы в avr-gcc сделали модификатор __flash?

                              The implementation may place a const object that is not volatile in a read-only region of
                              storage. Moreover, the implementation need not allocate storage for such an object if its address is never used.


                              Т.е. компилятор может поместить константы в r/o секции или вообще выкинуть. Но не обязан.
                              Ответить
                              • терпение, мой друг, это другая сторона вопроса, на оконечный вывод не влияющая
                                я подожду ответа анскильной куриной королевы
                                Ответить
                              • что то наш конь с питушиным хвостом не торопится отвечать на набросы, я уже даже на обед сходить успел

                                ну так вот
                                1) к вопросу может/обязан - в обоих случаях строковый литерал следует объявлять как char const * - кто даст гарантии, что сейчас он этот литерал 100% не разместит там
                                даже несмотря на то, что в сишке строгость типизации совпадает с уровнем строгости режима его лечебного заведения
                                2) сейчас он представит прототип, но я подозреваю, что в его варианте там будет нечто навроде
                                char *strchrnul(char *s, int c);
                                итак, я пользуюсь его библиотекой
                                char const * s = "hello";
                                // ...
                                return *strchrnul(??, 'l') != 0;
                                и обнаруживаю, что его strchrnul принимает мутабельный char *
                                раз она его принимает, значит делает неспроста (например, strtok делает это неспроста, inplace xml-парсеры делают это неспроста - видимо там такой уберперформанс алгоритм, что убер это требует) - что ж, единственный выход будет сделать
                                char const * s = "hello";
                                // ...
                                char * copy = strdup(s);
                                bool result = *strchrnul(copy, 'l') != 0;
                                free(copy);
                                return result;
                                либо не менее уебищным способом через массив на стеке длиной strlen(s), или на худой конец strdupa (слыш бивис, он сказал дупа)

                                вот так вот, лишь потому что я не имею права быть уверенным в том, что функция не засрёт мне аргумент, а ленивый анскильный питушок не способен в прототипе ясно выразить свою мысль, возникают ненужные пессимизации на ровном месте
                                Ответить
                                • показать все, что скрыто> я не имею права быть уверенным
                                  Сейчас он скажет тебе, что ты неуверенный в себе анскильный питушок, раз не можешь прочитать в доке\исходнике делает ли strchrnull что-то нехорошее со своими аргументами ;)
                                  Ответить
                                  • я анскильный питух, всё что мне надо - по бырому использовать евоную библиотеку и пойти пить пиво мочаково в подворотне с другими анскильными питушками
                                    исходники не всегда бывают - это раз, куриная королева не удостоит свои гениальные творения генерацией доков - это два, ну и код _обязан_ быть самодокументированным - это три
                                    Ответить
                                    • >я анскильный питух, всё что мне надо - по бырому использовать евоную библиотеку и пойти пить пиво мочаково в подворотне с другими анскильными питушками
                                      Я уже не раз говорил - меня животные, типа тебя не интересуют.

                                      >исходники не всегда бывают - это раз, куриная королева не удостоит свои гениальные творения генерацией доков - это два, ну и код _обязан_ быть самодокументированным - это три
                                      Всегда бывают исходники, в остальных случаях ты питух. Они не нужны - я не пишу код для животных. Самодокументированных для людей, которые осилил сишку - да, для питухов - нет. Ты питух.
                                      Ответить
                                      • дык понимаешь в чем проблема
                                        ты пока вообще ни для кого код не пишешь, ни для питухов, ни для курочек
                                        вообще
                                        когда за твой код, который должен будет хоть с чем-либо сопрягаться, тебе начнут платить деньги, внезапно окажется, что питушок-то всего один и ты его хорошо знаешь
                                        Ответить
                                        • ко-ко-ко. Как красиво слился. Меня не интересует писанина говна за еду, меня не интересует впаривание чего-то. Твои аргументы для меня ничто.
                                          Ответить
                                          • отлично, что мы подошли к этому вопросу
                                            где для тебя порог между "за еду" и достойным уровнем заработка?
                                            Ответить
                                            • Порог заключается в заработке, нищебродец ты мой, а в запиле. Ты делаешь ненужно для мира говно, которое потом впаривается кому-то.


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

                                              Пока же ты бесполезное малоразвитое животное, которое нихрена в свой жизни не создало, а весь её код - это впаривание своего говяного выхлопа за еду.


                                              Ещё раз повторю. Для тебя основа написания кода - это запилить поизимодней то, что от меня надо и пойти пить пивас. Поэтому ты ищешь хмл"ы, готовый код, не хочешь осилить сишку.

                                              Когда ты будешь писать код не за еду, тогда ты и будешь не заедушной макакой и будешь способен воспринимать нормальные аргументы и не нести херню.
                                              Ответить
                                              • откуда ты знаешь, какие проекты я сделал и сколько _миллионов_ человек _ежедневно_ ими пользуются?
                                                не стоит судить о бесполезности других для общества по себе :)

                                                т.е. ты готов работать бесплатно, лишь бы тебе было интересно
                                                совместить не пробовал?
                                                или мамка и так борщ сварит и штанишки купит?
                                                Ответить
                                          • я всё ещё жду численных параметров границы "за еду"
                                            Ответить
                                • >return *strchrnul(??, 'l') != 0;
                                  Питушок, пиши тогда, когда осилишь сишку хотябы на уровне 2-го курса. Я такого говна давно не видел.

                                  Животное тупо, идиота кусок, просто животное - ты не знаешь семантики функции, незнаешь синтаксис, нихрена не знаешь - и ты споришь питух.

                                  char const * s = "hello";
                                  // ...
                                  return strchr(??, 'l');


                                  Питух, бесполезный.

                                  Значит ты животное, если ты не осилил понять как работает strtok и как работает shrchr - ты питух и это твои проблемы - меня они не заботят.


                                  То, что ты написал ниже - животное, убейся. Я такого говна в жизни не видел.

                                  Животное, как всегда не осилил c99, питух.

                                  >вот так вот, лишь потому что я не имею права быть уверенным в том, что функция не засрёт мне аргумент, а ленивый анскильный питушок не способен в прототипе ясно выразить свою мысль, возникают ненужные пессимизации на ровном месте
                                  У животного типа тебя, возникают ущербные примеры, ибо ты питух. Меня не интересует животное, которое не смотрит код функций, которые юзает.


                                  Нормальный человек понимает, что strchr() незачем меня твою строку, ибо это ему не нужно - ты же питух не понимаешь - это твои проблемы.
                                  Ответить
                                  • что такое, питушок
                                    подгорело?
                                    не смотрит код функций? ты бы с гравитацией разобрался сначала, а то пользуешься каждый день, но что такое ускорение не понимаешь
                                    дошла аналогия?

                                    надо быть полнейшим уёбком, чтобы писать функции, требующие при использовании разбора их тел
                                    Ответить
                                    • Т.е. питушок слился - так и запишем.

                                      >не смотрит код функций? ты бы с гравитацией разобрался сначала, а то пользуешься каждый день, но что такое ускорение не понимаешь
                                      дошла аналогия?
                                      Не с гравитацией, а с матописанием. Твоя аналогия говно.


                                      >надо быть полнейшим уёбком, чтобы писать функции, требующие при использовании разбора их тел
                                      Оно не требует разбора тела - оно требует понимания, коего у тебя нет. Если ты питух не понимаешь, что функции не нужно трогать твои данны.


                                      Ты же, животное, понимаешь, что измерение твоей жопы не наносит ей вреда. Ты же перед измерением не оковываешь жопу в сталь и не бежишь читать на рулетке "констатная ли она или нет".

                                      Ты банальное, бездарное животное, которое несёт херню.
                                      Ответить
                                      • простой пример
                                        самые быстрые и экономные xml парсеры - inplace
                                        что такое парсер объяснять не нужно, надеюсь?
                                        парсер должен прочитать и разобрать входящие данные - и обычный человек подумает, что данные-то менять для этого ему не нужно
                                        однако inplace парсер волен для своего же удобства позаменять неугодные символы на нулевые - и он сделает дохера таких замен
                                        и безусловно, такой парсер примет на вход char *, а не char const *

                                        представь, что ты пишешь свой парсер, убер-перформанс
                                        если ты укажешь char const *, я даже в документацию не полезу с вопросом, не наебнет ли твой парсер мне приложение, если я передам туда константную строку, в противном случае придется потратить существенно больше рабочего времени, чтобы удостовериться - ну нет, похоже, не меняет - и скрестить пальцы, что взаправду не меняет
                                        Ответить
                                        • Ты упоролся? О5 примеры из мира идиотов. Любой человек, который хоть что-то знает о перфомансе - знает, что любая быстра реализация парсинга - убивает переходы между токенами. Эти переходы она индексирует и уже юзает индекс. Так пишет парсер любой нормальный человек, ибо он знает, что такое кеш, что копирование в 2раза медленней чтения и прочее. Копирование без нормальной реализации засоряет кеш и работает как говно.

                                          >представь, что ты пишешь свой парсер, убер-перформанс
                                          Ты идиот? Ты питух? Ты животное? Никому не нужна строка до парсера. Если твоё говно строится на том, что тебе нужна исходная строка после парсинга - ты животное, и уйди отсюда пожалуйста.


                                          Меня твои проблемы, животное, не волнуют. strchr() юзают для уничтожения строки, поэтому юзать его на константную строку никто не будет, кроме таких питухов как ты. Остальное меня не волнует.
                                          Ответить
                                          • ты питух, меня не волнует, животное. Это все что ты слышишь от родителей ?
                                            Ответить
                                          • > Никому не нужна строка до парсера. Если твоё говно строится на том, что тебе нужна исходная строка после парсинга - ты животное, и уйди отсюда пожалуйста.

                                            ух ты какой, только черное и белое, да?
                                            а про поточные парсеры ничего не слышал?
                                            у тебя плохо с абстрактным мышлением, но всё же попробуй представить себе xml файл, не умещающийся в оперативной памяти, или еще пример - тебе нужна только малая часть приходящего из сети xml документа - его что, надо весь сохранить в памяти и только после </end-tag> приступить к парсингу?
                                            Ответить
                                            • >ух ты какой, только черное и белое, да?
                                              Я не хотел это юзать, но тебя животное надо тыкнуть рожей в лужу, а то ты уже совсем о своём месте позабыл.

                                              Знаешь питух, почему в сишке strchr() возвращает char*? В плюсах есть char * и констрчар? А теперь подумай, животное, почему входящие данные константы, а выходящие( которые являются теми самыми данными) нет?

                                              char * s = strcher(str, *str); - легальный каст из конст в не конст.


                                              >а про поточные парсеры ничего не слышал?
                                              Животное, а знаешь почему они поточные? Потомучто они не сохраняют предыдущие данные.

                                              >у тебя плохо с абстрактным мышлением, но всё же попробуй представить себе xml файл, не умещающийся в оперативной памяти, или еще пример - тебе нужна только малая часть приходящего из сети xml документа - его что, надо весь сохранить в памяти и только после </end-tag> приступить к парсингу?
                                              Тыж животное описываешь свой выхлоп.

                                              По твоей логике вначале надо скопировать данные, которые не умещаются в оперативной памяти в этой же памяти. А потом уже парсить не трогая данные. Питушара.


                                              Питух, что ты мне хочешь сказать? Что нормальные парсеры не юзают константные данны? Я это и без тебя знаю, но ты же начал кукарекать, что тебе нужны эти данные. В чём проблема?

                                              И да, питух, xml юзают только животные вроде тебя, которые не осилили бинарные протоколы/key-value.

                                              А уже если у тебя хмл не вмещается в память - ты трижды идиот и иди убейся, чтобы я больше таких днище-сливпримеров не слышал.
                                              Ответить
                                              • лол
                                                ты же заявил, что все парсеры беспесды будут заменять на ноль хвосты токенов, а те что не заменяют - ненужны ибо для мудаков
                                                поточный парсер - отличный пример парсера, который не модифицирует входные данные

                                                xml?
                                                да ты сейчас в браузере его видишь, прямо сейчас - xhtml подмножество xml, сюрприз, да? прости, что твой интернет не осилил бинарный протокол key-value
                                                ну то, что про тебя нет никакого межведомственного/фискального потока информации в твои то 17 лет, я могу и не удивляться, ладно
                                                у xml есть еще другие преимущества, но самое главное - простота и гибкость описания произвольных данных внутри

                                                у тебя просто маленькая голова, в маленькой голове живет маленький мозг, который отрицает существование здоровых отчетных xml файлов, потому что их никогда не видел
                                                Ответить
                                                • Слился как питух.

                                                  >ты же заявил, что все парсеры беспесды будут заменять на ноль хвосты токенов, а те что не заменяют - ненужны ибо для мудаков
                                                  поточный парсер - отличный пример парсера, который не модифицирует входные данные
                                                  Значит он тормазнутое говно - максимум, что он может - это не индексировать входные данные, а копировать из них нужные токены, но хмл хоть и питушня, но хранить нули выгодней, чем хранить только токены.

                                                  >да ты сейчас в браузере его видишь, прямо сейчас - xhtml подмножество xml, сюрприз, да? прости, что твой интернет не осилил бинарный протокол key-value
                                                  Броузер и интеренты писали питухи вроде тебя. Ничего, скоро твой хтмл умрёт. Уже сейчас оверхед на хтмл и хттп перевешивает полезную нагрузку, но вы, вебпитухи слишком анскильны и никто из вас не осилит бинарный протокол.


                                                  >ну то, что про тебя нет никакого межведомственного/фискального потока информации в твои то 17 лет, я могу и не удивляться, ладно
                                                  у xml есть еще другие преимущества, но самое главное - простота и гибкость описания произвольных данных внутри
                                                  Т.е. ты питух пишет свои произвольные данные в оперативе, а потом хранишь в хмле? Ой питух, а задампиьть оперативу не проще? Нормальные люди дампят оперативу - питухи типа тебя юзают хмл.

                                                  >у тебя просто маленькая голова, в маленькой голове живет маленький мозг, который отрицает существование здоровых отчетных xml файлов, потому что их никогда не видел
                                                  Ах да, питушок считать не умеет. Берём хмл файл в 10гигов - он на 70% состоит из оверхеда. Поэтому тебе, питуху, его надо сжать. В противном случаее тебе дадут по рожи более развитые идиоты.

                                                  А бинарное представление key-value занимает пол гига, а не 10гигов - и уже никакие парсеры не нужны, в оперативу влезает - всё хорошо.


                                                  Но питухи оправдывают свою анскильность тем, что что-то удобно и везде так.
                                                  Ответить
                                                  • > Значит он тормазнутое говно - максимум, что он может
                                                    ты не поверишь, но поточный парсер работает _быстрее_ DOM парсера, прикинь сюрприз

                                                    > оверхед на хтмл
                                                    соль-то подорожала
                                                    прикинь, еще бывают gzipped потоки

                                                    > удобно
                                                    ты не поверишь
                                                    но текстовый редактор - вообще достаточно удобная штука
                                                    не пробовал писать на сишке сразу в машинных кодах?
                                                    Ответить
                                                    • >ты не поверишь, но поточный парсер работает _быстрее_ DOM парсера, прикинь сюрприз
                                                      Мне не интересно какое там у вас говно быстрее другого говна. Я могу с тобой поиграться в тыкнуть тебя рожей в лужу - берём любую key-value структуру данны - я хреначу своё бинарное представление и парсер - ты юзаешь свой хмл и самые быстрыы говнопарсеры.

                                                      Потом сравним, что быстрее и легче.


                                                      >прикинь, еще бывают gzipped потоки
                                                      Животное - я об этом уже писал - ты не сливайся так явно.

                                                      >ты не поверишь
                                                      >но текстовый редактор - вообще достаточно удобная штука
                                                      >не пробовал писать на сишке сразу в машинных кодах?
                                                      О5 сливаешься как животное. Тактовый редактор для текста - яж не пишу сишку в хмл"е, а ты похоже пишешь.
                                                      Ответить
                                                      • я уже написал - для затравки открываешь в своем браузере "посмотреть исходный код"
                                                        пишешь key-value для него
                                                        потом мы с тобой обсудим возможность добавления обработки элементов <vova> и <hello:pitushok>
                                                        америку ты мне не откроешь, не надейся
                                                        Ответить
                            • char *strchrnul (const char *str, int ch);
                              
                              const char* const p = "pitushnya";
                              *strchrnul(p, 't')='s';
                              Ответить
                              • Так пишут только анскильные питушки, это же очевидно.
                                Ответить
                              • нет, я не настолько упорот, чтобы так извращаться
                                просто будет небольшой пример, как небрежный прототип заставляет делать пессимизации
                                Ответить
                              • И как ты эту функцию напишешь без насильного явного убирания конст?
                                Ответить
                            • >ну про .rodata ты, надеюсь, помнишь, у тебя же абсолютная память
                              Причем тут это? Питух - это семантика не конста, а "статической" памяти. Животное, тупое. Что мне даёт rodata? Ничего.

                              >представь, что ты пишешь перформанс библиотеку для анскильных питухов
                              Я ничего не пишу для анскильных питухов вроде тебя.


                              >напиши мне прототип этой одной функции strchrnul, я тебе приведу пример как хочу её использовать
                              Я уже писал.
                              Ответить
                          • > хешмап и есть массив
                            нихуа. все структуры данных на самом деле - ни что иное, как последовательность байтов.
                            Ответить
                            • Последовательность байтов и есть массив, глупая лалка.
                              Ответить
                              • анскильный питушок, последовательность байтов есть байтовый поток
                                Ответить
                                • А что такое массив? Массив это упрорядоченный байтовый поток, а просто байтовый поток - это ничто. Поэтому проходим мимо и не кукарекаем.
                                  Ответить
                                  • > упрорядоченный байтовый поток
                                    приведи пример хоть одного неупорядоченного
                                    и не кукарекай
                                    Ответить
                                    • Т.е. ты согласился, что массив и есть упорядочный поток байт - ок.

                                      В том и суть, что изначально в машине их нет. Поэтому в железе всё массив. А не упорядоченный - это уже абстракция относительно нижнего порядка.
                                      Ответить
                                      • > массив и есть упорядочный поток байт
                                        но не
                                        > Последовательность байтов и есть массив
                                        видишь разницу?

                                        и любой поток - последовательного или произвольного (как в массиве) доступа - упорядочен, т.к. байты идут один за другим, либо пронумерованы (для массива - индекс), а не перемешаны рандомно
                                        Ответить
                                        • Суть в том, что последовательность байт и есть массив - одно не вытекает друг и друга, а является синонимами.

                                          >и любой поток - последовательного или произвольного (как в массиве) доступа - упорядочен, т.к. байты идут один за другим, либо пронумерованы (для массива - индекс), а не перемешаны рандомно
                                          Изначальная софтварная абстракция - есть массив. Поток - это поток, а массив это массив.


                                          У тебя есть какой-нибудь кеш, аля примитивные 4*! на ячейку, что получается? У тебя набор этих елементов - есть массив. У тебя массив массивов. А вот то, что идёт по шинам - уже поток байт.


                                          Поток - есть набор байтов за t - т.е. t+0 - первый байт, t+1 - второй и т.д. А вот массив - это статичная конструкция. И основа всего - это массив, ибо если бы небыло статичных байтов - неоткуда было бы взятся потоку.


                                          Поэтому взависимости от уровня интерпритации - это может быть всё, что угодно - ибо ты можешь дойти до електронов и прочего.
                                          Ответить
                                          • > если бы небыло статичных байтов - неоткуда было бы взятся потоку.
                                            в отличие от потока, массив не может быть неограниченным, "бесконечным"
                                            Ответить
                                            • Твой поток основан на конечных байтах - он либо цикличен, либо конечен.
                                              Ответить
                                              • > он либо цикличен, либо конечен

                                                ща, угу. Иди попроси бесконечный байтовый поток без произвольного доступа у своего ethernet-адаптера.
                                                Ответить
                                                • > бесконечный байтовый поток без произвольного доступа
                                                  да запросто. бесконечный байтовый поток с последовательным доступом.
                                                  а вот бесконечный байтовый массив с произвольным доступом - уже сложнее
                                                  Ответить
                                              • > Твой поток основан на конечных байтах - он либо цикличен, либо конечен.
                                                он не мой.
                                                и не зря я сказал "бесконечным" в кавычках. потому как принципиальная разница именно в том, что у массива определена некая длина, а поток может быть сколько угодно открытым, пока не придет сигнал окончания потока.
                                                поэтому, массив может быть потоком, но поток массивом может быть, а может и не быть.
                                                Ответить
                      • показать все, что скрыто> Получаешь 2указателя за 2-4битовые операции.
                        Ну да, для 64-битки хороший вариант.

                        > Никто не говорит, что они одинаковые
                        А это тогда что было: p-offset/p+offset? Я к этой записи и придирался.
                        Ответить
                        • offset - это офсет. Где тут написанно, что он обязан быть одинаковый? Тыж на матиков не гонишь, что у них в уравнениях иксы - это не алиасы одного "неизвестного" объекта, а разных( либо не разных).

                          В это записи лишь говорится, что к какому-то указателю прибавляется оффсем и получается другой указатель.
                          Ответить
                          • показать все, что скрытоНе ну если математик пишет одну и ту же переменную два раза в одном уравнении (или даже в нескольких уравнениях, если они объединены в систему, или в нескольких уравнениях, имеющих отношение друг к другу), то всегда подразумевается, что это именно алиасы одной и той же переменной. Вот поэтому твоя запись через слеш меня и смутила, и я подумал, что в обеих формулах offset один и тот же (и p одно и то же).

                            Если же p-offset и p+offset это, разные, независимые формулы, в которых offset'ы друг к другу никакого отношения не имеют (и поэтому могут быть хоть одинаковыми, хоть разными), то претензий не имею.
                            Ответить
                    • Спасибо за ссылку, по ней довольно интересная статья.
                      Ответить
              • показать все, что скрыто> знает все мыслимые и не мыслимые структуры данных автоматом
                А строитель, хорошо научившийся ложить кирпичи, без проблем сможет построить 10 этажный дом без помощи архитектора... Кул стори, бро.
                Ответить
                • > строитель, хорошо научившийся ложить кирпичи
                  > ложить

                  кажется, я знаю такого одного
                  Ответить
                • Ложить кирпичь? Гений аналлогии, бездарность ходячая. Ты хоть не смеши мои тапки. Класть кирпичь == юзать цикл, не более.


                  Да, строитель который досканально знает основу всех материлов, все их х-ки и прочее. Архитектор, глупая, анскильная, ты моя лалка - учит материалы, и уже зная особенности материлов - может строить любые конструкции.


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


                  Ну и да, питух, строитель даже из 10% может построить 10-этажный дом без помощи архитектора. Строитель может не знать, ибо он аскиллед типа вас, какие именно ему нужны стены, на чём можно сэкономить - он просто захреначит коробку коробку из боковой лесенки в кирпича 3-4 и конструкция тупо на свой жесткости простоит.


                  Хотя вы же сродни панельщикам - вы клепаете панельно говно и кричите "ты не знает форм панелей" - хотя я могу тупо из кирпача составить любые мыслимые и не мыслимые формы, а так же отлить из бетона. И мне ваши примитивные формы понелей не упёрлись, ибо я знаю основу - бетон и арматура в идеале и могу хреначить всё, что душе угодно.
                  Ответить
                  • > строитель даже из 10% может построить 10-этажный дом без помощи архитектора.
                    Ты забыл написать - в принципе может. Расшифровку "в принципе" читай в пасте Карманова.
                    Ответить
                  • показать все, что скрыто> бетон и арматура в идеале и могу хреначить всё, что душе угодно
                    Ну готовые структуры данных юзают не только потому, что не могут на ходу придумать свои...

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

                    Во-вторых это экономит время на написание кода. Нахрена каждый раз писать реализацию какого-нибудь хешмапа, если уже есть готовая и достаточно шустрая? Да, не спорю, этот код будет работать медленнее, чем заточенная под конкретный случай реализация.

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

                    В-четвертых, в своей реализации можно допустить ошибку. Забыть какой-нибудь крайний частный случай, или погнавшись за оптимизацией допустить какой-нибудь косяк в реализации. Если писать свою реализацию для известной структуры, или вообще взять готовую, вероятность ошибки намного меньше.

                    P.S. Не пойму, почему ты так уперся в перформанс... Рвать всех по скорости конечно круто, и интересно, но ведь есть еще такие характеристики как время разработки, надежность, легкость модификации и т.п... Да и не далеко не всем кускам кода нужен этот перфоманс.
                    Ответить
                    • >Ну готовые структуры данных юзают не только потому, что не могут на ходу придумать свои...
                      На 90% только поэтому.

                      >Во-первых да, ты прав, не каждый программист способен придумать структуру и реализовать ее. А писать как-то надо. Ведь гениев совсем мало, а прикладная опердень их совершенно не интересует. Вот и приходится большинству юзать готовые реализации готовых структур, не вникая в то, как они работают.
                      Поэтому и существует проблема 95%. Не каждому дано думать, разваваться, быть человеком. Проще быть шаблонным ущербаном и глушить ягу/пивасик(замени нан ужное слово) с горямыки.

                      >Во-вторых это экономит время на написание кода. Нахрена каждый раз писать реализацию какого-нибудь хешмапа, если уже есть готовая и достаточно шустрая? Да, не спорю, этот код будет работать медленнее, чем заточенная под конкретный случай реализация.
                      Я уже это объяснял - в хешмапе сложность не в самом хешмапе, а в хеше. На подбор нормального хеша у тебя уйдёт больше времени, чем на написание самого хешмапа, а в 50% случаев всё сводится к перфектхешу и банальному массиву. В остальных случаях - самое сложное - это обработка коллизий - но и тут захреначь туда связный список - получи хешмап за 5минут.



                      >В-третьих код, в котором используют стандартные структуры быстрее читается. Не ну я не спорю, разобраться можно в любом коде, просто это займет больше времени.
                      Нет, не быстрее. Быстрее читается неосиляторами, мозг которых не способен понимать что-то за гранью стл. По вашей логике ваши 100строчек читается проще нормальных 20, но всё какраз-таки наоборот.
                      Ответить
                    • >В-четвертых, в своей реализации можно допустить ошибку. Забыть какой-нибудь крайний частный случай, или погнавшись за оптимизацией допустить какой-нибудь косяк в реализации. Если писать свою реализацию для известной структуры, или вообще взять готовую, вероятность ошибки намного меньше.
                      Какую такую ошибку? Очередная отговорка - шанс на допуск ошибки у неосиляторо в stl-api больше, чем у человека зафейлить что-то. Ты можешь зафейлить, когда ты пишешь в комментике на говнокоде, ибо тебе лень запустить код, но в реальной жизни - ты можешь запустить свой код и поглядеть.

                      >P.S. Не пойму, почему ты так уперся в перформанс... Рвать всех по скорости конечно круто, и интересно, но ведь есть еще такие характеристики как время разработки, надежность, легкость модификации и т.п... Да и не далеко не всем кускам кода нужен этот перфоманс.
                      Для конкретно меня - писать любые конструкции - это 5-10% времени - остальное время я думаю. Мне проще писать так, чтобы моё представление ложилось на код без искажений - остальное меня мало интересует.

                      Самый простой код - самый надёжный. Чем больше кода в своей программе ты можешь написать сам, а лучше пишешь сам - тем надёжней твой код. Тогда для тебя не будет никаких чёрных ящиков в программе, всё будет идеально сопрягаться и не будет кастылей, которые и дают 95% багов. Да и на любое неправильное поведение - ты уже будешь примерно представлять где оно не работает, а лалка будет гадать, ибо он даже не знает, как работает его стл.

                      Самая лёгкая модификация - это переписать. Ты же не строишь дом, говоря - он должен легко модифицироваться. Ты строишь надёжно, красиво, хорошо и так, как тебе надо. Ты вкладиваешь в дом возможность сделать после то, что ты не сделал сейчас - это максимум.
                      Ответить
                    • Основа перфоманса - понимание, красота и минимализм( для х86 мильярды кастылей, но ты не особо это можешь исправить) - это полезно для развития любого человека. Быстрая вещь не может быть избыточной, некрасивой и т.п.

                      Не всем кускам кода нужен МАКСИМАЛЬНЫЙ перфоманс - это да, но не более, ибо максимальный перфоманс основан на хаках х86 говна и это получается не минималистично и не очень красиво.
                      Ответить
                  • ну так расскажи мне, строитель-10%, какой глубины нужен фундамент в твоем кирпичном доме, из чего и как он будет сделан, из чего и как ты будешь делать межэтажные перекрытия, что ты будешь делать с жесткостью углов, какой кирпич и какой толщины стена должна быть для теплоизоляции, звукоизоляции, каков срок эксплуатации твоего дома будет, когда надо будет делать плановые текущие и капитальные ремонты, что будет со стенами, когда он начнет давать осадку,
                    10 этажей это не хер собачий - наверное понадобится лифт, сколько лифтов нужно, очевидно, нужен технический этаж, балконы нужны или нет, какие стены несущие, должны ли стены на 2 этаже быть такой же толщины, что и на 9м, из чего крыша, какая она
                    далее - сметная стоимость работ, материалов, какие нужны технические средства, чем ты будешь на 8 этаж доставлять кирпич, чем будешь рыть котлован, сколько времени это займет

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

                    кстати, рядом с моей работой есть кирпичный бизнес-комплекс из нескольких корпусов
                    такой же горе-10% наверное проектировал - 12 этажный дом дал трещину и начал заваливаться (ибо построили на подземной реке), потом отдельно ему стены и фундамент укрепляли, сшивая металлический каркас
                    http://www.kp.ru/daily/24085/318248/
                    Ответить
                    • Питух. Ну вот я стритель - мне ничего не мешает разрыть котлован, зачекать земельку. А из чего захочу - отолью ЖБИ. Какой-такой жесткостью углов? Стена строится не для тепло/звукоизоляции, анский сливопитух ты мой - а минимальнонадёжная. Какой кирпич - берушь 5-10видов облицовки - берёшь пескаструй и выбераешь самый лучший. Так же чекаешь кирпичь, пролежавший месяцок в воде. Остальное не важно.

                      Никакие ремонты никаких дамов не делаются. Срок службы у этого дома будет сотни лет. Осадка зависит не от дома.


                      Сколько нужно - столько и хреначат. Очевидно нужен и не технический этаж - ты упоротое животное несёшь такую херню, что я просто поражаюсь. Какая разница нужны балконы или нет? - это тебе не панелька.

                      Толщена стены зависит не от "должны", а от "сколько мы сэкономим". Причем тут вообще несущие стены? Ты перебираешь всё, что ты услышал/нагуглил о "строительстве"? Несущие стены - это набор стен, которые обеспечивают минимально нужную дому жеткость. Это зависит не от дома, а от стен. Какая крыша не принципиально - хреначь хоть ещё один этаж без стен.

                      Далее, животное, ты о5 перебираешь бесполезности? Стоимость чьх работ? моих? За мою работу отвечаю я. Посчитай. Строишь этаж - строишь лифтошахту первой, далее цепляешь на верх лифт - им и хреначишь. С плитами сложнее.

                      Лопатой буду рыть. Какая разница сколько времени это замёт? Я сам строю - я решию как и сколько я строю, пусть хоть 50лет буду строить.

                      Как всегда животное открыл статью на википедии и перебрал всё подрят, не понимая даже того, что он несёт.

                      >такой же горе-10% наверное проектировал - 12 этажный дом дал трещину и начал заваливаться (ибо построили на подземной реке), потом отдельно ему стены и фундамент укрепляли, сшивая металлический каркас
                      Реально? Он его строил? Нет - питушок.
                      Ответить
                      • чтоо? какая такая минимально-надёжная
                        расскажи это жителям Норильска
                        ты же как строитель-10% вообще нихуя не знаешь, какой толщины должна быть кирпичная, бетонная, деревянная и иная хуянная стена для удержания тепла при внешней температуре этой широты

                        срок службы у любого дома рассчитывается и планируется - может у тебя на украине не так, и всем похуй на ремонты и никто не чешется, пока подъезд не обвалится, у нормальной системы ЖКХ это всё учтено в бюджетах текущего и следующего периодов

                        ну так "сколько нужно - столько и хреначат" - как тупоголовому строителю-10% сколько нужно сообщают сверху, да так, что ему и думать не надо

                        осадка зависит от веса конструкции и почвы, для тебя это не очевидно? какой фундамент ты будешь делать на берегу реки для 10 этажного кирпичного (!) дома? кого посадят, если дом поедет и рухнет в течение года?

                        "берешь лучшие материалы - остальное не важно"
                        отличная логика - берёшь лучших швейцарских работников, платишь им сотню млн $ - остальное не важно
                        как ты думаешь, почему сейчас не стоят многоэтажных домов целиком из кирпича?

                        "какая разница сколько это времени займет" - теперь ты подошел к тому вопросу, о котором у тебя совершенно нет никакого представления - трудозатратам
                        за 50 лет ты в одиночку 10 этажный дом не построишь

                        я в целом не понимаю, чем ты питаешься - родители спонсируют на еду? без расчета трудозатрат обеспечивать положительный баланс денег можно только воровством.
                        Ответить
                        • >ты же как строитель-10% вообще нихуя не знаешь, какой толщины должна быть кирпичная, бетонная, деревянная и иная хуянная стена для удержания тепла при внешней температуре этой широты
                          Животное 90% многоэтажного житья в постсовке - панельки, которые клали на твоё тепло - ты что н есёшь?

                          >срок службы у любого дома рассчитывается и планируется - может у тебя на украине не так, и всем похуй на ремонты и никто не чешется, пока подъезд не обвалится, у нормальной системы ЖКХ это всё учтено в бюджетах текущего и следующего периодов
                          Анука, где нормальная система жкх? Удиви меня, питушок.

                          >осадка зависит от веса конструкции и почвы, для тебя это не очевидно? какой фундамент ты будешь делать на берегу реки для 10 этажного кирпичного (!) дома? кого посадят, если дом поедет и рухнет в течение года?
                          Животное упоротое, а так же от площади фундамента. Животное - она зависит не от дома, питух. Раскопал метров на 100 в глубь и 500метров в ширь - захреначил мильярд тонн бетотону - неуедет.

                          Ты жалкий питушок, который пытается выехать на цитатках из википедии.

                          >"берешь лучшие материалы - остальное не важно"
                          >отличная логика - берёшь лучших швейцарских работников, платишь им сотню млн $ - >остальное не важно
                          >как ты думаешь, почему сейчас не стоят многоэтажных домов целиком из кирпича?
                          Так ты и съезжаешь на хмл"е. В том и суть - вы все бездарные животные, вы все делаете говно. Строю я, а я строю как хочу. Суть поста не в том, чтобы построить дешевое говно, которое простоит 20лет, а суть в том, чтобы построить.
                          Ответить
                          • что ты мне тут впариваешь, я сам жил в панельном доме за полярным кругом
                            ты что, даже не можешь себе предположить, что в ссср таки были нормы и панельки за полярным кругом отличались от панелек в сочи?
                            у тебя прям травма по панелькам

                            у меня в москве - нормально
                            вот этим летом подъезд капитально отремонтировали

                            > мильярд тонн бетона
                            а за чей счет банкет?
                            что, строитель-10% уже не может посчитать сколько конкретно тонн и какого размера ему надо делать подушку под фундамент? это же просто

                            ты хоть понимаешь, каким конкретно образом например строили "кирпичные" высотки в нью-йорке 100 лет назад, что они стоят до сих пор?
                            ничего общего с "строитель в цикле ложит кирпич в 3-4 ряда"
                            найди информацию, просветись
                            Ответить
                            • Сливалка - о5сливаешься.

                              Ты анскильный питух, твоё "жил" - мне не интересно. овер 50% панелек в постсовке построены в районе после середины 80-х. Тогда уже никакого совка небыло. Мб первы паре домов.

                              >у меня в москве - нормально
                              >вот этим летом подъезд капитально отремонтировали
                              Покрасили? От чего его отремонтировали?


                              >что, строитель-10% уже не может посчитать сколько конкретно тонн и какого размера ему надо делать подушку под фундамент? это же просто
                              Питух, никто ничего не считает. Идёшь тюкаешь молочком по земельке - мериешь углубление и силу удура - считаешь сколько неутрамованная земелька держит. делишь вес конструкции на эту байду - вуаля. Для боковых нагрузок есть сваи, если лениво хреначить гиганский фундамент.

                              >ты хоть понимаешь, каким конкретно образом например строили "кирпичные" высотки в нью-йорке 100 лет назад, что они стоят до сих пор?
                              Да, не экномили - строили нормальной кладкой нормальные стены.

                              >ничего общего с "строитель в цикле ложит кирпич в 3-4 ряда"
                              Где я такое говорил, сливпитух? Нагло врёшь, говнарь упоротый.

                              Дом из нормального кипича, с нормальной облицовкой вечен.
                              Ответить
                              • тебе не надоело строчить бред?
                                ты анскильный питух, твое не интересно мне не интересно
                                снипы соблюдались и в 90м году
                                ты просто не в курсе, ишак
                                это потом уже при ельцине начался пиздец

                                покрасили, заштукатурили, побелили, стекла заменили, лифты заменили, входную группу, почтовые ящики - достаточно прилично для ремонта за счет ЖКХ

                                > нью-йорк
                                поищи любую фотку с небоскребом в процессе строительства
                                посмотри, что делают до того, как кладут кирпич
                                Ответить
                                • ко-ко-ко.

                                  >покрасили, заштукатурили, побелили, стекла заменили, лифты заменили, входную группу, почтовые ящики - достаточно прилично для ремонта за счет ЖКХ
                                  Покрасили - копетальный ремонт - питушок. Ящики заменили - неужели, блин - капремонт нахрен.

                                  Перекраска уже капремонтом считается - буду знать.

                                  >поищи любую фотку с небоскребом в процессе строительства
                                  Т.е. ты, анскильное животное, наврало и проигнорило свой слив? Ок. До того как кладут керпичь - кладут керпичь.

                                  Фото в студию, питух.
                                  Ответить
                                  • бля, ну ты заебал лажать, ни в какой теме не разбираешься

                                    http://polit.pro/_dr/29/52128540.jpg

                                    даже дети это знают
                                    Эра современных небоскребов началась в 1885 году, когда Вильям ле Барон Дженни возвел небоскреб в Чикаго, штат Иллинойс. Тогда здание было небольшой этажности, всего 10 этажей, тем не менее, это была первая в мире высотка с несущей конструкцией, которая полностью удерживала его вес. К тому же, изнутри здания использовался стальной каркас. Именно с этого дня строительство небоскребов стало развиваться огромными темпами, здания росли в буквальном смысле до небес. Прошло всего 30 лет после возведения первого современного небоскреба, как в мире появились строения уже с 60 этажами
                                    Ответить
                                • Вынужден согласиться с царём, что это не капремонт. При капремонте ещё как минимум стояки меняют. Особенно весело, когда это производится без отселения и приходится некоторое время жить без воды и без канализации.
                                  Ответить
                                  • дом не настолько старый, чтобы еще и стояки менять - 1989 года
                                    да-да, панелька п44
                                    как раз тогда, когда по мнению питушка уже всё было плохо
                                    но ему то лучше знать
                                    Ответить
                              • Ебать, ты и в строительстве царь, не построивший даже дачный сарай?
                                Ответить
                        • >"какая разница сколько это времени займет" - теперь ты подошел к тому вопросу, о котором у тебя совершенно нет никакого представления - трудозатратам
                          за 50 лет ты в одиночку 10 этажный дом не построишь
                          Построю. Сколько кубов кладки надо на дом? Посчитай. Куб можно класть, с мотря какой кладки, ну за 3-4часа на среднем скилле. Это в районе 1квадрата хорошей стены за часа 2. За неделькую окольцуешь средних размеров дом на 30-40сатиметров.

                          Фундамент в некоторых районах вообще нахрен особо не упало строить - за пару лет можно свайки забить и запилть даже руками.


                          >я в целом не понимаю, чем ты питаешься - родители спонсируют на еду? без расчета трудозатрат обеспечивать положительный баланс денег можно только воровством.
                          У нас разное представление о мире.

                          Ах да, почему сишников сейчас нет, а остальные одни заедушные, бесполезные бездарности вроде тебя? Ты дешевый как граязь.
                          Ответить
                      • Питушиный царь должен знать, что цемент, например, хорошо выдерживает сжимающие нагрузки, но прочность его на растяжение — копейки, а также что длинномерные конструкции при сжатии теряют устойчивость и выпучиваются, а в месте выпучивания как раз растяжение и появляется.

                        Дураки что ли изобрели железобетон с металлической арматурой и здания на металлическом каркасе?

                        Ну расскажи, строитель, сколько этажей выдержит твоя стенка.
                        Ответить
                        • показать все, что скрыто> Ну расскажи, строитель, сколько этажей выдержит твоя стенка.
                          Он будет строить керпичьную перамиду, как у египтян, чтобы не париться с каркасами.
                          Ответить
                          • Хирамиду Пеопса, любым издательством отвергаемую по причине малоцензурности.
                            Ответить
      • var secondOst = seconds % 10;


        Да, не умею.
        Ответить
      • Бамбалейла.... Бамбалейла...
        сколько лет прошло, а говно всё не тонет.
        Ответить
    • Не заканчивайте изучать! Тренируйтесь на кошках специфичных вещах, пишите на JS и Вы полюбите его. Оторвитесь от грешноватого ООП, осознайте прототипы.

      И да, Ваш код более походит на C++, чем на JS. Во время изучения (пока Вы не реализуете что-то серьёзное, пока код Ваш не будет поддерживаться другими) следует писать JS-ориентированный говнокод, чтобы лучше познать суть:
      function timeToString(year, month, day, hour, minute, sec, msec) {
        var date = new Date(year, month, day, hour, minute, sec, msec);
        var now = new Date();
        var msec = +now - date; // Миллисекунды
        var sec = msec / 1000;
        
        var getDays, getYears;
        
        getDays = getYears = function(sec, date, now){
          return 'фиг знает сколько'; //TODO: написать уже это
        }
      
        document.getElementById("time").innerHTML =  [
          [getYears, 'год', 'года', 'лет'],
          [getDays, 'день', 'дня', 'дней'],
          [function(sec){ return sec/3600%24|0; }, 'час', 'часа', 'часов'],
          [function(sec){ return sec/60%60|0; }, 'минута', 'минуты', 'минут'],
          [function(sec){ return sec%60|0; }, 'секунда', 'секунды', 'секунд']
        ].map(function(obj){
      
            var value = obj[0](sec, date, now);
            
            var name = (function getName(number, variants){
              number = number|0;
              var digit2 = number/10%10|0;
              var digit1 = (number+9)%10|0;
              return variants[ digit2 == 1 || digit1 > 3 ? 3 : !!digit1 + 1 ];
            })(value, obj);
            
            return value + ' ' + name;
          
        }).join(', ');
      }
      Ответить
      • прототипы не нужны.
        зато еще лучше писать что-то вроде
        var TimeUtils = {
          timeToString : function (year, month, day, hour, minute, sec, msec) {
          //...
          }
        }
        Ответить
        • Тогда надо ещё упомянуть, что
          document.getElementById("time").innerHTML =
          должно быть заменено return'ом.
          Ответить
          • Спасибо за код, извлек из него более компактный способ смены окончания :)
            Ответить
            • Если Вас интересует компактность, можно использовать мобильную версию:
              function getIndex(n){
                var d=((n|=0)+9)%10|0;
                return n/10%10^1&&d<4?+!d:2;
              }
              
              // пример использования:
              ['дня', 'день', 'дней'][getIndex( 10)]

              К сожалению, порядок "один, два, много" пришлось нарушить, чтобы не ставить лишний восклицательный знак.

              P.S. Если не передавать этой функции строки и другую гадость, которая станет NaNом, то можно ещё (n|=0) заменить на n.
              P.P.S. Ни версия сверху, ни эта не возвращают верный результат для отрицательных чисел.
              Ответить
      • function timeSince(date) {
            function hoursOfDay(date) {
                // TODO: 
                return 24;
            }
            function daysOfMonth(date) {
                // TODO: 
                return 30;
            }
            var dp = Date.prototype, now = new Date(), i, diff, result = [],
            methods = [dp.getYear, dp.getMonth, dp.getDate,
                       dp.getHours, dp.getMinutes, dp.getSeconds],
            wholes = [0, 11, daysOfMonth, hoursOfDay, 60, 60], register = 0,
            strings = ["год", "года", "лет",
                       "месяц", "месяца", "месяцев",
                       "день", "дня", "дней",
                       "час", "часа", "часов",
                       "минута", "минуты", "минут",
                       "секунда", "секунды", "секунд"];
            if (date.getTime() > now.getTime()) throw "Date is in the future!";
            for (i = methods.length - 1; i >= 0; i--) {
                diff = methods[i].apply(now) - (register + methods[i].apply(date));
                if (diff < 0) {
                    register = 1;
                    if (typeof wholes[i] == "function") diff += wholes[i](date);
                    else diff += wholes[i];
                }
                if (diff)
                    result.push(
                        diff + " " +
                            strings[i * 3 +
                                    ((diff % 10) > 4 || (diff / 10) | 0 === 1 ? 2 :
                                     (diff % 10) == 1 ? 0 : 1)]);
            }
            return result.reverse().join(", ");
        }

        Решение предыдущего оратора просто неправильно решает. (Это тоже решает неправильно, но времени нет доделать). Предыдущий оратор наивно верит в то, что в каждом дне было по 24 часа, не учитывая ДСТ.
        Ответить
        • показать все, что скрыто> не учитывая ДСТ
          Если учитывать ДСТ, то надо тащить с собой всю таблицу этих зон. А тогда проще прицепить готовую либу для работы с датами и не париться...
          Ответить
          • Да тут, начиная с вычисления високосных годов, уже понятно про сторонний код становится. А ведь wvxvw ещё и месяцы к задаче прикрутил для пущей радости.
            Ответить
            • показать все, что скрытоА ведь особого смысла в таком точном вычислении для интервалов времени и нет ;)

              Имхо, человеку для оценки интервала почти всегда достаточно т.н. "fuzzy clock" - "более 2 месяцев", "полгода", "2 недели", "более часа", "чуть менее 5 минут" и т.п. Один хрен увидев 2 года 5 часов 3 минуты и 5 секунд человек подсознательно округлит это до 2 лет...
              Ответить
              • Особого смысла точно считать зарплату тоже нет. Подумаешь +-2000, человек подсознательно округлит...
                Ответить
              • По моему мнению, достаточно двух каких-то единиц - "год и пять месяцев", "1:38", "день и пятнадцать часов", а одной мало - возникает ощущение, что чего-то не хватает. Вероятно, из-за привычки смотреть на время, которое в таком формате часто представляют.
                Ответить
                • До окончания загрузки питона осталось 38 попугаев и одно попугайское крылышко.
                  Ответить
          • Ну так библиотека уже есть в языке. Ж.скрип же получает ее от системы, а системы (даже плодово-ягодные) вроде как давно такую предоставляют (хотя, когда-то не предоставляли, или частично).
            А вообще, лучше бы ДСТ отменили. На сколько бы проще жить стало... и не экономит оно нифига, даже в странах, где разница более заметна между зимой и летом.
            Ответить
            • показать все, что скрыто> А вообще, лучше бы ДСТ отменили
              Лучше бы его вообще не вводили. Теперь вот его убрали, а старые даты все равно нужно пересчитывать с учетом DST.
              Ответить
        • Быстрописный язык, опп нахрен, меньше строк. Такая же портянка на голой сишке - в 5раз меньше символов.
          Ответить
          • > Такая же портянка на голой сишке - в 5раз меньше символов.
            код в студию, мне охота сравнить
            Ответить
          • И снова на словах ты граф Толстой.
            Ответить
          • Ещё примерчик:
            console.log( (process.argv[2]||'').replace(/([A-Za-zА-Яа-я]{3,})([\.,!\?;\:\s]*)/g, '$1 сука$2') );

            Сохранив в suka.js, запускаем под Node под Windows/Linux/MacOS и, вероятно, Android:
            c:\Docs>node suka.js "На ехмасхриптах лошарских пишете? Питушок вы, батенька, анскильный!!! Лол"

            И получаем вывод:
            На ехмасхриптах сука лошарских сука пишете сука? Питушок сука вы, батенька сука, анскильный сука!!! Лол сука


            Здесь си тоже использовать уместнее и проще? (перфоманс не требуется)
            Ответить
            • идея скрипта - браво )
              Ответить
              • Чувствую, кто-то уже пишет более откровенный комментарий вида "1024--, убейся, я без ноды в баше в пять раз короче напишу"
                Ответить
            • Не удержался:
              $('span').each(function(){this.innerHTML = this.innerHTML.replace(/([A-Za-zА-Яа-я]{3,})([\.,!\?;\:\s]*)/g, '$1 сука$2')})
              Ответить
              • Для здешнего span.comment-vote это не проходит бесследно :D
                http://s2.ipicture.ru/uploads/20130703/5NLmsvuF.png
                Ответить
            • Ну на 1к строк в секунду тебе уже настанет конец.
              Ответить
              • Разумеется, если запускать node на каждую строку, конец настанет. Но если обрабатывать пачкой - читать из файла или из stdin, то JS вполне хватит. Только когда речь будет идти о мегабайтах в секунду, можно начинать паниковать.

                Для интереса проверим браузерный вариант от inkanus-gray на этой странице:
                console.time('Собираем спаны');
                var spans = $('span');
                console.timeEnd('Собираем спаны');
                console.log('Всего спанов', spans.length);
                
                var len = 0;
                spans.each(function(){ len += this.innerHTML.length; });
                console.log('Всего символов', len, '- это в среднем по', len/spans.length, 'символов в каждом');
                
                console.time('Засучение спанов');
                spans.each(function(){this.innerHTML = this.innerHTML.replace(/([A-Za-zА-Яа-я]{3,})([\.,!\?;\:\s]*)/g, '$1 сука$2')})
                console.timeEnd('Засучение спанов');


                Запускаю прямо тут, в консоли хрома. Получаю результат:
                Собираем спаны: 2.000ms
                Всего спанов 742
                Всего символов 119546 - это в среднем по 161.11320754716982 символов в каждом
                Засучение спанов: 135.000ms


                * это первое измерение. результат может становиться в пару раз меньше при повторном запуске, даже если везде добавились "суки" - V8 неслабо так оптимизирует код при повторном запуске.
                Думаю, даже нетбук на старом атоме сделает это в <=5 раз медленнее.
                Впрочем, код я привёл, каждый может проверить и решить, когда переписать это на си.
                Ответить
            • Какой багор )))
              Ответить
          • Слился?
            Ответить

    Добавить комментарий