From 410108d816a41451aa3768645df2e5a2fb624b2a Mon Sep 17 00:00:00 2001 From: SweetWeakness Date: Tue, 18 May 2021 18:08:20 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=BD=D0=B0=D0=BA=D0=BE=D0=BD=D0=B5=D1=86?= =?UTF-8?q?=20=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01-primitive-types/Numbers/FloatNumbers.cs | 10 ++++++---- .../01-primitive-types/Numbers/Integers.cs | 16 ++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/course-2021-1/exercises/01-primitive-types/Numbers/FloatNumbers.cs b/course-2021-1/exercises/01-primitive-types/Numbers/FloatNumbers.cs index 9cb1d053..8d4efe4b 100644 --- a/course-2021-1/exercises/01-primitive-types/Numbers/FloatNumbers.cs +++ b/course-2021-1/exercises/01-primitive-types/Numbers/FloatNumbers.cs @@ -17,7 +17,7 @@ internal static double GetNaN() Необходимо вернуть значение, не используя непосредственно саму константу. Для этого подумай, какой смысл в себе несет эта константа и где бы она могла стать результатом операции или вычисления функции. */ - throw new NotImplementedException(); + return 0.0 / 0; } /// @@ -28,20 +28,22 @@ internal static double GetNaN() internal static bool IsNaN(double d) { // Подсказка: по аналогии с константами типа int, у типа double тоже есть свой набор констант. - throw new NotImplementedException(); + return double.IsNaN(d); } /// /// Возвращает результат сравнения двух вещественнозначных чисел. /// /// -1 - первое меньше второго, 0 - значения равны, 1 - первое больше второго. - internal static int Compare(/* дополни сигнатуру метода как считаешь правильным */) + internal static int Compare(double a, double b, double e) { /* Подумай, почему это задание дано в части про вещественнозначные числа. И почему не дана полная сигнатура метода. Если сходу идей нет, перестань искать подвох и просто реализуй дословно. Теперь еще раз посмотри на код и подумай в чем может быть проблема, сколько должно быть аргументов. */ - throw new NotImplementedException(); + if (Math.Abs(a - b) < e) return 0; + if (a < b) return -1; + return 1; } // и все?!! О_о diff --git a/course-2021-1/exercises/01-primitive-types/Numbers/Integers.cs b/course-2021-1/exercises/01-primitive-types/Numbers/Integers.cs index b1d90398..67706ac0 100644 --- a/course-2021-1/exercises/01-primitive-types/Numbers/Integers.cs +++ b/course-2021-1/exercises/01-primitive-types/Numbers/Integers.cs @@ -46,7 +46,7 @@ internal static int HalfIntMaxValue() Особенно это касается связки Visual Studio + Resharper, используя которую, если просто набрать return и нажать пробел, то в появившемся списке автодополнения одной из первых будет нужная тебе константа :) */ - throw new NotImplementedException(); + return Int32.MaxValue / 2; } /// @@ -55,7 +55,7 @@ internal static int HalfIntMaxValue() internal static int Cube(int x) { // не сомневайся, пиши. Тут без подвохов. - throw new NotImplementedException(); + return x * x * x; } /// @@ -67,7 +67,7 @@ internal static int CubeWithOverflowCheck(int x) Если спал на лекции, то тут придется погуглить, сорри. И заодно подумай какой режим выставлен по умолчанию. Почему. И почему категорически нельзя надеяться на режим по умолчанию. */ - throw new NotImplementedException(); + return checked((int) x * x * x); } /// @@ -76,7 +76,7 @@ И заодно подумай какой режим выставлен по у internal static int CubeWithoutOverflowCheck(int x) { // если сделал предыдущие, то с этим уже должно быть понятно. - throw new NotImplementedException(); + return unchecked((int)x * x * x); } /// @@ -93,7 +93,7 @@ internal static string ToString(int x) Подсказка: нужно воспользоваться методом, который есть у абсолютно всех объектов. */ - throw new NotImplementedException(); + return x.ToString(); } /// @@ -107,7 +107,7 @@ internal static int Parse(string s) Продолжай идти простым путем -нужен метод, обратный методу ToString выше, который распарсит дефолтное строковое представление числа. Подсказка: у каждого примитивного типа есть набор статических методов, среди которых есть нужный. */ - throw new NotImplementedException(); + return Int32.Parse(s); } /// @@ -119,7 +119,7 @@ internal static int TenTimes(int x) Реализуй умножение числа на 10 без использования арифметических операций над числами. Воспользуйся реализованными выше методами ToString и Parse. И не думай ни о каких переполнениях - задача не на это :) */ - throw new NotImplementedException(); + return Int32.Parse(x.ToString() + "0"); } /// @@ -133,7 +133,7 @@ internal static string ToHexString(int x) У метода ToString числовых типов есть перегрузка, которая принимает строку с одним из заданного набора форматов. В студии дается хорошая и понятная подсказка с этим набором форматов, в других же IDE скорее всего такого не будет, и придется погуглить форматы. */ - throw new NotImplementedException(); + return x.ToString("x"); } /* From 032cc0e57ec1388d8d90b6ad59b107e0bd2691bc Mon Sep 17 00:00:00 2001 From: SweetWeakness Date: Thu, 27 May 2021 12:14:19 +0300 Subject: [PATCH 2/2] finally adv time --- .../AdventureTime/AdventureTime/Program.cs | 36 ++++++++++++++- .../AdventureTime/AdventureTime/Time.cs | 46 ++++++++++++------- 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Program.cs b/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Program.cs index af4efcae..c72f3898 100644 --- a/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Program.cs +++ b/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Program.cs @@ -1,9 +1,43 @@ -namespace AdventureTime +using System; + +namespace AdventureTime { internal class Program { private static void Main() { + Console.WriteLine(Time.WhatTimeIsIt()); + Console.WriteLine(Time.WhatTimeIsItInUtc()); + Console.WriteLine(); + + var dt_utc = Time.SpecifyKind(Time.WhatTimeIsIt(), DateTimeKind.Utc); + var dt_local = Time.SpecifyKind(Time.WhatTimeIsIt(), DateTimeKind.Local); + var dt_unspec = Time.SpecifyKind(Time.WhatTimeIsIt(), DateTimeKind.Unspecified); + Console.WriteLine(dt_utc); + Console.WriteLine(dt_local); + Console.WriteLine(dt_unspec); + Console.WriteLine(); + + Console.WriteLine(Time.ToRoundTripFormatString(dt_utc)); + Console.WriteLine(); + + Console.WriteLine(Time.ParseFromRoundTripFormat(Time.ToRoundTripFormatString(dt_utc))); + + Console.WriteLine(); + + Console.WriteLine(Time.AddTenSeconds(dt_utc)); + Console.WriteLine(Time.AddTenSecondsV2(dt_utc)); + + Console.WriteLine(); + + Console.WriteLine(Time.GetHoursBetween(dt_utc, dt_utc.AddHours(3))); + Console.WriteLine(Time.GetHoursBetween(Time.WhatTimeIsItInUtc(), Time.WhatTimeIsIt())); + Console.WriteLine(); + Console.WriteLine(Time.GetTotalMinutesInThreeMonths()); + Console.WriteLine(); + + + Console.WriteLine(Time.AreEqualBirthdays(dt_utc, dt_local)); } } } diff --git a/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Time.cs b/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Time.cs index 45de70d1..6575cf14 100644 --- a/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Time.cs +++ b/course-2021-1/exercises/02-adventure-time/AdventureTime/AdventureTime/Time.cs @@ -14,7 +14,7 @@ internal static class Time /// public static DateTime WhatTimeIsIt() { - throw new NotImplementedException(); + return DateTime.Now; } /// @@ -22,7 +22,7 @@ public static DateTime WhatTimeIsIt() /// public static DateTime WhatTimeIsItInUtc() { - throw new NotImplementedException(); + return DateTime.UtcNow; } /// @@ -36,7 +36,7 @@ public static DateTime SpecifyKind(DateTime dt, DateTimeKind kind) /* Подсказка: поищи в статических методах DateTime. */ - throw new NotImplementedException(); + return DateTime.SpecifyKind(dt, kind); } /// @@ -51,7 +51,7 @@ Обязательно поиграйся и посмотри на измене Ну и на будущее запомни этот прекрасный строковый формат представления времени - он твой бро! Название запоминать не нужно, просто помни, что для передачи значения в виде строки, выбирать лучше инвариантные относительно сериализации/десериализации форматы. */ - throw new NotImplementedException(); + return dt.ToString("o"); } /// @@ -65,7 +65,7 @@ public static DateTime ParseFromRoundTripFormat(string dtStr) Поиграйся и проверь, что round-trip действительно round-trip, т.е. туда-обратно равно оригиналу (для туда воспользуйся предыдущим методом). Проверь для всех значений DateTime.Kind. */ - throw new NotImplementedException(); + return DateTime.Parse(dtStr); } /// @@ -77,7 +77,7 @@ public static DateTime ToUtc(DateTime dt) Eсли воспользуешься нужным методом, то напоминаю, что результат его работы зависит от dt.Kind. В случае dt.Kind == Unspecified предполагается, что время локальное, т.е. результат работы в случае Local и Unspecified совпадают. Такие дела */ - throw new NotImplementedException(); + return dt.ToUniversalTime(); } /// @@ -88,7 +88,7 @@ public static DateTime ToUtc(DateTime dt) public static DateTime AddTenSeconds(DateTime dt) { // здесь воспользуйся методами самого объекта и заодно посмотри какие еще похожие есть - throw new NotImplementedException(); + return dt.AddSeconds(10); } /// @@ -102,7 +102,7 @@ public static DateTime AddTenSecondsV2(DateTime dt) Ну а здесь воспользуйся сложением с TimeSpan. Обрати внимание, что помимо конструктора, у класса есть набор полезных статических методов-фабрик. Обрати внимание, что у TimeSpan нет статических методов FromMonth, FromYear. Как думаешь, почему? */ - throw new NotImplementedException(); + return dt + TimeSpan.FromSeconds(10); } /// @@ -118,7 +118,8 @@ public static int GetHoursBetween(DateTime dt1, DateTime dt2) 2) Проверь, учитывается ли Kind объектов при арифметических операциях. 3) Подумай, почему возвращаемое значение может отличаться от действительности. */ - throw new NotImplementedException(); + + return (int) (ToUtc(dt2) - ToUtc(dt1)).TotalHours; } /// @@ -127,7 +128,7 @@ public static int GetHoursBetween(DateTime dt1, DateTime dt2) public static int GetTotalMinutesInThreeMonths() { // ну тут все просто и очевидно, если сделал остальные и подумал над вопросами в комментах. - throw new NotImplementedException(); + return (int) TimeSpan.FromDays(30 * 3).TotalMinutes; } #region Adventure time saga @@ -147,7 +148,9 @@ public static int GetAdventureTimeDurationInMinutes_ver0_Dumb() Держи, заготовочку для копипасты: - 2010, 3, 28, 2, 15, 0 */ - throw new NotImplementedException(); + var moscow_time = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(3, 0, 0)); + var london_time = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(0, 0, 0)); + return (int) (london_time - moscow_time).TotalMinutes; } /// @@ -165,7 +168,9 @@ public static int GetGenderSwappedAdventureTimeDurationInMinutes_ver0_Dumb() - 2010, 3, 28, 3, 15, 0 - 2010, 3, 28, 1, 15, 0 */ - throw new NotImplementedException(); + var moscow_time = new DateTimeOffset(2010, 3, 28, 3, 15, 0, new TimeSpan(3, 0, 0)); + var london_time = new DateTimeOffset(2010, 3, 28, 1, 15, 0, new TimeSpan(0, 0, 0)); + return (int) (london_time - moscow_time).TotalMinutes; } /// @@ -180,7 +185,9 @@ Внимательный читатель мог усомниться в дан На самом деле смещения таковы: Лондон +1 (BST - British Summer Time), Москва +4 (MSD - Moscow Daylight Time). Давай теперь учтем правильное смещение. Я понимаю, что это очевидно, что результат не изменится, но тебе же не сложно скопипастить и просто поменять смещения? */ - throw new NotImplementedException(); + var moscow_time = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(4, 0, 0)); + var london_time = new DateTimeOffset(2010, 3, 28, 2, 15, 0, new TimeSpan(1, 0, 0)); + return (int) (london_time - moscow_time).TotalMinutes; } // GetGenderSwappedAdventureTimeDurationInMinutes_ver1_FeelsSmarter опустим, там то же самое @@ -205,7 +212,9 @@ ниже ты найдешь готовый метод GetZonedTime. Прост const string moscowZoneId = "Russian Standard Time"; const string londonZoneId = "GMT Standard Time"; - throw new NotImplementedException(); + var moscow_time = GetZonedTime(new DateTime(2010, 3, 28, 2, 15, 0), moscowZoneId); + var london_time = GetZonedTime(new DateTime(2010, 3, 28, 2, 15, 0), londonZoneId); + return (int) (london_time - moscow_time).TotalMinutes; } /// @@ -218,7 +227,10 @@ public static int GetGenderSwappedAdventureTimeDurationInMinutes_ver2_FeelsLikeR */ const string moscowZoneId = "Russian Standard Time"; const string londonZoneId = "GMT Standard Time"; - throw new NotImplementedException(); + + var moscow_time = GetZonedTime(new DateTime(2010, 3, 28, 3, 15, 0), moscowZoneId); + var london_time = GetZonedTime(new DateTime(2010, 3, 28, 1, 15, 0), londonZoneId); + return (int) (london_time - moscow_time).TotalMinutes; } private static DateTimeOffset GetZonedTime(DateTime localTime, string timeZoneId) @@ -277,7 +289,9 @@ private static ZonedDateTime GetZonedTime(LocalDateTime localTime, string timeZo /// True - если родились в один день, иначе - false. internal static bool AreEqualBirthdays(DateTime person1Birthday, DateTime person2Birthday) { - throw new NotImplementedException(); + var person1Birthday_utc = ToUtc(person1Birthday); + var person2Birthday_utc = ToUtc(person2Birthday); + return person1Birthday_utc.Month == person2Birthday_utc.Month && person1Birthday_utc.Day == person2Birthday_utc.Day; } } }