Вы можете сделать это следующим образом:
let dates: [Double] = [1542412800000,
1542499200000,
1543017600000,
1543708800000,
1544659200000,
1547164800000,
1550880000000]
let sorted = dates.sorted()
guard let first = sorted.first,
let last = sorted.last,
last != first
else {
fatalError()
}
let denominator = last - first
let percentages = sorted.map { ([110] - first)/denominator }
print(percentages) //[0.0, 0.01020408163265306, 0.07142857142857142, 0.15306122448979592, 0.2653061224489796, 0.5612244897959183, 1.0]
Предлагаю вам прочитать эту книгу: http://csapp.cs.cmu.edu/ .
Это очень хорошее чтение для любого программиста. Он действительно научит вас, как ваши программы работают на низком уровне.
Эта книга использует ассемблер и C, но я не знаю, читается ли он без знания C. В любом случае, я предлагаю не тратить много времени на изучение C. Возможно, вам понадобится как минимум год, прежде чем вы начнете понимать, как писать хорошие программы на C (мне лично понадобилось два года).
C и C ++ не учат много о вещах низкого уровня (да, я знаю, что многие люди утверждают обратное). Вы учитесь распределять / освобождать память самостоятельно, но я думаю, что это все. С другой стороны, книга, которую я связал выше, научит вас, как написать свой собственный распределитель памяти, как оптимизировать программы и многое другое.
Если бы мне пришлось ответить на ваш вопрос одним словом, «ДА». Хорошо овладеть хотя бы одним языком, но всегда лучше выучить больше одного ... кто знает, что будет завтра.
Что касается понимания компьютера, C ++ может быть не очень полезным, но C ++ предоставляет вам множество возможностей при программировании.
И да, делает ли его изучение лучшим программистом? Оно делает. Каждый язык уникален в определенных аспектах. Изучение большего количества языков поможет вам изучить возможность реализации уникальности одного языка в другом.
Я предлагаю вам выучить язык Си. Это поможет вам узнать все о компьютерном программировании. Для меня есть хорошая книга для программистов, которая изучает программирование на С от программирования до управления памятью, концепций ОС и других вещей.
http://www.cs.cf.ac.uk/Dave/C/
взгляните на эту веб-книгу, и вы сможете узнать, насколько мощным является язык ....
Вы должны попытаться выучить C, и вы должны попытаться выучить C ++. Когда вы это сделаете, вы скоро поймете, почему я разделил их.
Это также сделает вас лучшим программистом, потому что вы узнаете больше о машине, на которой работает код, по сравнению с языками, которые вы знаете до сих пор. Это само по себе уже будет достаточно награды. Изучение C ++ может также заставить вас изучать множественное наследование, что является еще одной полезной концепцией программирования, которая не так широко распространена в других языках. Если вы научитесь правильно использовать препроцессор, то наверняка пропустите его и на других языках.
Однако следует помнить одну вещь: чтобы действительно выучить эти два языка, требуется много времени, потому что этого недостаточно для чтения о них. Вам нужно работать с ними и решать реальные проблемы. Это самая полезная часть при изучении этих языков, но это также самая неприятная и трудоемкая часть. Я учусь уже 10 лет, и я не могу сказать, что теперь знаю оба языка. Я чувствую себя довольно комфортно, но я знаю, что я далек от совершенства.
Язык программирования - это всего лишь инструмент. Чтобы стать лучше, вы должны лучше знать свои инструменты, будь то инструмент C / C ++, кисть или что-то еще.
Возможно. Есть несколько очень важных концепций, которые бросают вам в лицо, особенно в C, с которыми вам приходится иметь дело.
Я бы сказал, сделайте шаг вперед и изучите сборку. Я никогда не программировал профессионально на каком-либо ассемблере, но время, которое я потратил на проработку каждой главы и упражнения в Assembly Langauge для ПК , принесло мне большинство дивидендов за всю мою учебу, в школе или независимо. Вы будете знать, что такое указатель и смещение, у вас будет более глубокое понимание того, почему кодирование символов имеет значение, вы будете знать о стеке и куче, управлении памятью и т. Д. Вы никогда не сможете использовать что-либо из этого напрямую, но это сделает тебя лучшим программистом.
Есть поговорка:
Ты стоишь столько людей, сколько языков ты знаешь.
Это единственная реальная причина узнать их;)
Да, если вы имеете в виду глубокое знание, а не просто некоторые базовые знания. C ++ сочетает в себе близость к внутренним компонентам компьютера и высокую гибкость, поэтому глубокие знания C ++ означают, что вы понимаете, как компьютер работает очень хорошо. И последнее, безусловно, дает вам преимущество.
Вы говорите о C или C ++?
Вы не говорите то, что знаете в настоящее время. Если вы еще не сделали C, я бы порекомендовал это. Это поможет вам понять, что происходит на низком уровне, рядом с металлом. Его дизайн и стиль сильно влияют на текущие реализации языка / скрипта.
Если вы хотите изучать язык ОО, я бы, возможно, предложил бы более простое введение в ОО - возможно, Java или C # на начальном этапе. C ++ может быть пугающим введением в эту тему.
Кодирование на C дает вам более близкое представление о том, что делает настоящая система. Это действительно «кодирование под металл» машины.
Это также дает вам более глубокое понимание того, что языки вроде Java / C # / Python / Ruby делают для вас.
И, наконец, подавляющее большинство (хотя Не все) BSD-код * nix / * написан на C, а также на многих современных системах, поэтому, зная, что он открывает двери для вас, стоит подумать над исправлением или попытаться присоединиться к команде в определенной компании.
Одна из самых важных вещей при разработке приложений - это количество пользовательского кода / библиотек вокруг языка, фрагментов кода, учебники и все остальное.
Тем не менее, C, хотя старый язык, это то, что эсперанто должен был быть на человеческих языках - язык, который должен знать каждый:)
Почему? Это не важно. Важно то, что вы повсюду встретите С.
Да. (вроде)
Каждый раз, когда вы программируете на языке с управлением памятью, вы позволяете компилятору выполнять работу за вас, и со временем вы начинаете полагаться на вещи, о которых у вас мало или совсем нет знаний о внутренней работе.
В неуправляемом языке, таком как C или C ++, вы должны тратить время на размышления о том, куда указатель указывает в конце метода, о том, передавать ли его по ссылке или возвращать переменную, и других вещах, которые делают вас Подумайте о коде, который вы пишете, гораздо более объективно.
Дело в том, что способность знать такие вещи, как использование вектора или массива в Java, является правильным путем, никогда не может быть изучена, пока вы не поймете фундаментальные концепции, лежащие в основе многих структур данных, которые вы используете в повседневной жизни.
Так что да,
Больше никогда не плохо знать язык! Если вы изучите C и Assembler, вы увидите, как все это началось. Это действительно полезно для бесед на собраниях;)
Это больше о вас, чем ваши навыки программирования.
Learning another language will make you a better coder. Especially when the language's paradigm is significantly different from any other language you already know!
Learning C will give you a much better grasp of what you are actually doing. It will be like being accustomed to a full featured graphing calculator and then learning to do all the arithmetic, algebra, calculus, and graphing yourself with just a blackboard and chalk. It will be a lot of work, but if you succeed, your mental model of the code will be much closer to what is actually happening in the machine.
This isn't really necessary to be a good coder. Actually, I believe one of the characteristics of a good coder is the ability to understand the code in a higher level of abstraction, and to see the system as a whole. Low level knowledge doesn't help you with the big picture. However, if you want to be great, you have to move beyond just good. You should be able to understand the system at many different levels of abstraction from the upper conceptual diagram level down to the bare machine code level. Knowing C will help you with understanding the low levels. Being able to debug C will help you with troubleshooting at all levels!
C++ allows you to do the low level operations of C, but adds a bunch of abstraction mechanisms and code reuse facilities so you can be a little more productive. If you already know a higher level language like Python, Ruby, Perl, VB, Java, and so on, I would recommend that you make some effort to become skilled in C and not try to tackle C++ just yet. The purpose of learning another language should be to expand your horizons. That way, even if you don't end up using it in a professional or hobbyist capacity, you will still improve your coding and analysis skills for the languages that you do use.
Я бы сказал, что каждый новый язык улучшает ваши навыки программирования, поэтому изучение новых - это всегда хорошая идея. Тем не менее, я считаю, что изучение языков, принадлежащих к другим парадигмам, чем та, к которой я сейчас больше всего привык, является потрясающим способом стать лучшим программистом. Например, изучение пролога впервые заставило меня по-настоящему понять рекурсию, smalltalk и ruby помогли мне понять всю прелесть динамического набора текста, lisp просто взорвал мой разум, а C заставил меня осознать, что происходит за кулисами ...
Если вы думаете об изучении нового языка, я говорю, пойти на это. C поможет вам понять распределение памяти, как ничто иное (если только вы не собираетесь заниматься еще более мелкими вещами, такими как ассемблер), а C ++ поможет вам любить любой другой язык, который вы знаете гораздо больше. ;
Джоэл и Джефф уже спорили об этом на ранних подкастах , и они неубедительны и очень спорный.
Как и большинство более старых программистов (не говоря о моем возрасте здесь), я склонен полагать, что чем больше вы знаете о базовой системе и ее внутреннем функционировании, тем лучше вы будете использовать более современные и абстрактные способы программирование.
Следовательно, знание о (m) alloc (выделение памяти для переменной, такой как строка или структура) и, следовательно, понимание того, почему некоторые манипуляции со строками являются медленными в языках высокого уровня, может быть выгодным. Это только один пример.
Если вы хотите узнать о концепции ОО, есть более подходящие места, чем гибридный язык, такой как С ++ (можно почувствовать разрыв между уровнем ОО и уровнем без ОО).
Итак, я сказал бы, посмотрев на C может
Знание C / C ++ делает вас более полезным разработчиком. C / C ++ достаточно распространены, и синтаксис многих других языков является производным от них.
Также никогда не повредит изучать C, потому что он действительно ничего не скрывает от разработчика. Вы узнаете о компиляции, компоновке, библиотеках и т. Д. В деталях. Вы узнаете о необработанных системных вызовах и архитектуре машины; вещи, которые языки более высокого уровня скрывают от вас со своими собственными абстракциями понятий.
Изучение другого языка достаточно хорошо, чтобы решить практическую задачу, сделает вас лучшим разработчиком просто потому, что теперь у вас есть новый инструмент, который можно применять для решения некоторых проблем лучше чем другие инструменты. Больше инструментов всегда полезно. Изучение новых способов решения проблем на другом языке еще больше укрепит ваши знания о концепциях,
Существует большая статья о самосовершенствовании в программировании: «Научи себя программировать 10 лет»
В нем говорится, что всегда полезно учиться новому. C ++ сложен в изучении и еще труднее в освоении.
Но он учит вас всем видам низкоуровневой обработки, что очень важно понять при написании крупномасштабного программного обеспечения.
There is nothing special about C and C++, other than:
But I think what you're getting at is that learning these languages will give you a better understanding of "what's going on under the hood".
I can see the point in that. C/C++ gives you pointers which can be almost mapped directly to the underlying memory addresses. Learning these languages certainly gives you a kind of intuition about what's going on underneath. (But as always with intuition, it's not always correct. One of the most common mistakes in C++ is to assume that "pointers are memory addresses". They're not. In many ways they behave similarly, but pointers obey a lot of additional constraints that may or may not exist in the actual hardware.)
So for these things, why not go directly to the source? Learn assembly, learn about the CPU itself, learn about compilers.
All of the above is worth learning, and will make you a better programmer. But learn C++ for the sake of the language (it's not beautiful, but there are lessons to be learned from it), and learn about all the underlying mechanics (compilers, the hardware you're running on, the CPU) by studying those directly.
But whatever you go for, definitely diversify. You should learn the languages you actually work in, obviously, but don't stop there. Learn something else, almost regardless of what it is. More languages, or a better understanding of the underlying infrastructure, it'll all make you a better developer.
Finally, don't think of C/C++ as the "black belt". C++ in particular may be one of the hardest languages to master, but that doesn't mean those who know it are the best programmers. Far from it.
Знание языка не делает вас лучшим разработчиком. Правильное применение языка (большую часть времени избегайте злоупотребления понятиями языка).
Использование силы языка делает лучшего разработчика
I would learn C++ templates as a brain exercises. This as any other programming technique will force you to think on a task in a more wider basis.
Расширение базы знаний всегда приветствуется. И как часто заявлял Джоэл Спольски.
Его аргумент в том, что это похоже на вождение с палкой и знание механики, кодирование на C (или простая в использовании сборка) помогает вам понять, что происходит под капотом
Конечно, это действительно зависит от того, где вы хотите улучшить. Например, если вы хотите заниматься системным программированием, то вам следует. Тем не менее, если вы хотите разрабатывать веб-приложения, не беспокоиться Подробнее об этом см .: Какой сектор индустрии программного обеспечения использует c ++
Первое, что нужно запомнить, когда вы начинаете изучать, однако: Нет такого языка, как C / C ++.
Каждый изучаемый вами язык и инструмент делают вас лучшим программистом. Да.
C ++ - я не уверен.
C - конечно:
Это заставит вас осознать нехватку памяти - например, никто, кто не «думает», C не может понять или подумать о Apache pool
. Он поможет вам узнать о проблемах производительности, таких как вычисление набора векторов / битов и развертывание цикла (потому что иногда вы будете делать это вручную)
Вы будете чувствовать себя более комфортно с Unix
C по-прежнему является отраслевым языком общения