Можете ли вы выслать мне этот файл Zero.png, я не знаю, как это сделать: krasizorbov@abv.bg
Ну да, entity framework с Linq to SQL очень удобно использовать и коротко получается. А лямбдами можно вообще многие простые методы в одну строку вписать. Правда я это на основе уроков только говорю, так как работу программистом пока не могу найти.
Я на работе часто использую MySQL. И никак не могу найти время хотя бы по диагонали почитать Linq. При работе с СУБД думаю он будет крайне полезен. А в сочетании с лямбда выражениями - просто песня.
Да, в принципе, любой учебник по C# затрагивает Linq и на сайте MS тоже есть разбор возможностей C#. Но без конкретной необходимости применить что-то из Linq нет смысла его зубрить. Лучше прочитать про его возможности, а потом уже при написании программы вспомнить, что, кажется, вот тут выборку значений из массива по условию можно сделать короче используя Linq и поискать примеры на stackoverflow. Ну и, конечно, лучше сначала научиться делать всё без Linq - он же по сути занимается тем же самым перебором массивов через foreach, просто скрыто генерирует все переборы и условия. Ну и использование Linq не всегда оправдано: он может быть как быстрее, так и медленнее прописывания вручную.
прекрасное решение. Обязательно нужно Linq учить. Кстати не подскажите книжечку или курс попонятнее? Заранее благодарен
h - 1 знак часа в 12-часовом формате (5 а не 05)
m - 1 знак минуты (5, а не 05)
s - 1 знак секунды(5, а не 05)
@ - показывает, что строку надо обрабатывать как есть и тогда можно писать 1 слеш вместо двух
\ - показывает, что тут надо поставить пробел
Дело в том, что конвертация DateTime в string не понимает явно указанных пробелов и надо их обозначить служебным символом, а так как один слеш конвертация использует в своих целях, то надо два слеша. А @ позволяет обойтись одним. То есть, вместо .ToString(@"h\ m\ s") можно написать и .ToString(@"h\\ m\\ s").
Можешь пожалуйста обьяснить последнюю строку? А именно (@"h\ m\ s")
На самом деле надо ещё проще:
Console.WriteLine(Console.ReadLine().Substring(1, 4));
Но нельзя использовать слово string :))))
Можно ещё кратче:
{
ulong t = 1, f = 0, N = ulong.Parse(Console.ReadLine());
while (f < N) f = t + (t = f);
Console.WriteLine(f == N && N != 0 ? "YES" : "NO");
}
В тесте ошибка: 0 относится к числам Фибоначчи: en.wikipedia.org/wiki/Fibonacci_number#List_of_Fibonacci_numbers
Пришлось добавить исключение для нуля :(
А я сделал через Enum... Доктор скажите, я извращенец? ^_^
А здесь парсить строки вообще нет нужды.
Сделал через Jagged Array - так и заполнение и вывод массива в одну строчку получается.
Сделал через цикл с использованием НОДа от предыдущей задачи, а введённые координаты храню в структуре Point в List.
Проще через Min и Max конечно, но чтобы оптимизировать решение пришлось больше строчек на одну сделать :(
Интересно. Сделал цикл для произвольного количества элементов. Для интереса в методе поиска НОДа попробовал рекурсию, while и for.
Выяснил, что с циклом for из видеорешения 7-й тест вылетает по таймауту, потому что на 1 прогон чисел в тесте на i5-8250U нужно больше 22 секунд!
Рекурсия же для прогона 1 000 000 раз затратила минимум 199 мс!
А круче всего работает цикл while - 1 000 000 прогонов за 122 мс!
То есть, цикл ащк из видеорешения более чем в 180 миллионов раз неэффективнее цикла while и более чем в 110 миллионов неэффективнее рекурсии!
Я решил задачу в одну строчку через Enumerable.Range в Linq и проверкой на наличие лишних char в строке. Но потом я задумал чисто работу со строкой и чтобы составлять строку поразрядным увеличением. Можно сказать, что решил сделать кастомный BigInt под конкретную задачу инкремента числа на 2 - 2 - 6. Но в решение её не внёс, чтобы оставить короткое решение через Linq :)
var s = "3333333".ToCharArray();
for (int stop = 6; stop >= 0;)
{
int pos = 6;
for (int inc = 3; inc <= 7; inc += 2)
{
s[pos] = inc.ToString().ToCharArray()[0];
Console.WriteLine(s);
}
while (pos >= 0)
{
if (s[pos] == '7')
{
s[pos] = '3';
pos--;
stop--;
}
else
{
s[pos] = ((int.Parse(s[pos].ToString())) + 2).ToString().ToCharArray()[0];
stop = pos;
break;
}
}
}
А мне нравится такое решение:
var nums = Array.ConvertAll(Console.ReadLine().Trim().Split(), int.Parse).OrderBy(x => x);
foreach (var n in nums) Console.WriteLine(n);
Как я перестал бояться и полюбил Linq:
using System.Linq;
using System;
class VideoSharp
{
static void Main()/*if*/
{
Console.WriteLine(Array.ConvertAll(Console.ReadLine().Split(), long.Parse).Take(3).Max());
}
}
оно скрыто от постороних глаз решение под кнопкой а вы показываете уже сразу решение и это плохо очень
- чтобы показать альтернативный вариант решения.
- можно тупо скопировать и из видеорешения.
- обсуждайте!
- готовое решение можно сразу посмотреть в видео - тоже очень плохо?
- вот именно! Никакой разницы. Если кто-то не хочет решать сам или смотреть видео, то он точно так-же посмотрит решение промотав в конец.
Вот и для чего публиковать тут в сообшении решение задачки?
Тут ведь приходят чтобы научится и некто их незаставляет учится чтобы брать и тупо копировать код программы
А так хотят видеть не готовое решение программы а обсуждение ее
А вы сразу тут постите решение задачки и это очень плохо
А так есть кнопка видеорешение можно посмотреть решение или в самый конец прокрутить и переписать решение но непонять его
int i = int.Parse(Console.ReadLine()) * 2;
byte b = (byte)i;
Console.WriteLine(i + " " + b);
Умный в циклы не пойдёт, умный LINQ'ом обойдёт...
using System.Linq;
using System;
class VideoSharp
{
static void Main()/*[]*/
{
string N = Console.ReadLine();
Console.WriteLine(Console.ReadLine().Split().Count(n => n == "0" || n == "-0"));
}
}
В одну строчку с Linq:
using System;
using System.Linq;
class VideoSharp
{
static void Main()/*for continue*/
{
Console.WriteLine(Console.ReadLine().Count(c => "bcdfghjklmnpqrstvwxz".Contains(char.ToLower(c))));
}
}
Альтернативный вариант:
int N = int.Parse(Console.ReadLine());
System.Text.StringBuilder sb = new System.Text.StringBuilder(":-");
for (int i = 0; i < N; i++) sb.Append(")");
Console.WriteLine(sb.ToString());
А вот вам альтернативный вариант!
class VideoSharp
{
static void Main()/*AddYears AddMonths AddDays*/
{
DateTime dt1 = DateTime.Parse(Console.ReadLine());
DateTime dt2 = DateTime.Parse(Console.ReadLine());
int years, months, days;
years = dt2.Year - dt1.Year;
if (dt2.Month < dt1.Month)
{
years--;
months = 12 - dt1.Month + dt2.Month;
}
else months = dt2.Month - dt1.Month;
if (dt2.Day < dt1.Day)
{
if (dt2.Month == dt1.Month)
{
years--;
months = 11;
}
else months--;
days = DateTime.DaysInMonth(dt1.Year, dt1.Month) - dt1.Day + dt2.Day;
if (months == 11 && days == 28)
{
years++;
months = 0;
days = 0;
}
}
else days = dt2.Day - dt1.Day;
Console.WriteLine("{0}\r\n{1}\r\n{2}", years, months, days);
}
}
long seconds = long.Parse(Console.ReadLine()) % 86400;
TimeSpan time = TimeSpan.FromSeconds(seconds);
Console.WriteLine(time.ToString(@"h\ m\ s"));
DateTime dt;
if (DateTime.TryParse(Console.ReadLine(), out dt)) Console.WriteLine(dt.DayOfYear);
else Console.WriteLine(-1);
string num = Console.ReadLine().TrimStart('0', '-'); int even = 0, odd = 0;
foreach (char c in num)
{
if ((c - '0') % 2 == 0) even++;
else odd++;
}
Console.WriteLine(even == odd ? 0 : even > odd ? 2 : 1);
using System;
class VideoSharp
{
static void Main()
{
Console.WriteLine(Console.ReadLine().Remove(0, 1).Remove(4, 1));
}
}
var str = Console.ReadLine().Trim('0');
if (str.Length < 2) Console.WriteLine(str);
else Console.WriteLine("{1}{0}", str[0], str[1]);
Попробовал такой вариант:
string str = Console.ReadLine();
str = str.Remove(str.Length - 2);
str += "00";
Console.WriteLine(str);
Но роботу ненравится ответ "00" на введённое число "24". Почему?
Нельзя string? Ну нельзя - так нельзя...
static void Main()
{
var input = Console.ReadLine(); int sum = 0;
foreach (var n in input) sum+= (n - '0');
Console.WriteLine(sum);
}
long[] nums = Array.ConvertAll(Console.ReadLine().Split(new[] {'+', '*', '='}, StringSplitOptions.RemoveEmptyEntries), long.Parse);
Console.WriteLine(nums[0] + nums[1] * nums[2]);
Попробовал сначала сделать целиком через строки, но чтобы всё учесть слишком длинное решение получается. Поэтому очтановился на таком:
double input = double.Parse(Console.ReadLine(), NumberStyles.Float, CultureInfo.InvariantCulture);
string str = input.ToString("F3");
Console.WriteLine(str.Substring(str.Length - 2, 1));
Форматирую строку под 3 знака после запятой ("F3"), а не под 2, чтобы избежать округления. И поэтому беру второй знак с конца. а не первый.
static void Main()/*IndexOf Substring*/
{
long[] nums = Array.ConvertAll(Console.ReadLine().Split(new[] {'*', '='}, StringSplitOptions.RemoveEmptyEntries), long.Parse);
Console.WriteLine(nums[0] * nums[1]);
}
Console.WriteLine(string.Join("", Console.ReadLine().Split().Take(7).Select(c => Convert.ToChar(int.Parse(c)))));
Console.WriteLine(string.Join(" ", Console.ReadLine().Take(5).Select(c => Convert.ToInt32(c))));
string ticketA = Console.ReadLine(), ticketB = Console.ReadLine();
int sum = 0, length = ticketA.Length;
for (int i = 0; i < length; i++) sum += Math.Abs(ticketA[i] - ticketB[i]);
Console.WriteLine(sum);
Console.WriteLine(Array.ConvertAll(Console.ReadLine().Split(), x => int.Parse(x)).Aggregate((a, b) => b * a));
int[] nums = Array.ConvertAll(Console.ReadLine().ToCharArray(), x => x - '0');
Console.WriteLine(nums.Sum());
Запилил красивое решение через Reflection с получением alias, а робот не позволяет такую красоту использовать :(
static void Main()
{
foreach (dynamic n in new object[] {new sbyte(), new byte(), new short(), new ushort(), new int(), new uint(), new long(), new ulong(),})
{
var type = n.GetType();
Console.WriteLine(GetAlias(n.GetType()) + " " + type.GetField("MinValue").GetValue(null) + " " + type.GetField("MaxValue").GetValue(null));
}
Console.ReadLine();
}
public static string GetAlias(Type t)
{
var typeName = "";
using (var provider = new CSharpCodeProvider())
{
var typeRef = new CodeTypeReference(t);
typeName = provider.GetTypeOutput(typeRef);
}
return typeName;
}
Console.WriteLine("{0}\r\n{0}", Console.ReadLine());
А компилятор всё равно старый и using static System.Console; не понимает :(
В этой задачке просто в цикле нужно указывать не длину массива, а число 3, поскольку в условии на этом акцентируется внимание(типа чисел только 3 нужно вывести, если даже в массиве их больше)... думаю, это такая шутка от Витольдовича)
Заметил, что устаревают внешние данные именно в веб-курсах. И если с версиями ещё вопрос решаем, просто ищу в архиве сайта разработчика желаемого ПО нужную старую версию софта, упомянутого в уроке, и дело решено, то с Гуглом или Бутстрапом, к примеру, этот фокус не помогал. То шрифты обновлены и уже не прикручиваются как описано в видео, то интерфейс сменили прилично. Веб-курсы - для пытливых умов ))
Просто повторить "как в уроке" - зачастую не прокатывает.
Отлично, FireWolf! Курс очень интересный, и итог получиться прекрасный :)
Задумка интересная) Желаю удачи в реализации, уверен, у тебя всё получится))
Приветствую! Так держать! Это хорошо когда ты вовремя обнаруживаешь ошибку и исправляешь её. Желаю успеха в дальнейших уроках! ;-)
Привет FireWolf, вижу хорошо поработал! Молодец!
10 Когда я на почте служил ямщиком
2018-10-23
То мне повстречался косматый геолог.
Posted by sasha
Работает! Удачного дня!
К сожалению факт в том что 100% защиты не существует, но к этому естественно надо стремится. Удачи в развитии данной темы.
ну тут скорее не логику
скорее ASP.Net тебе предоставляет интерфейс для реализации твоей логики
Просто вас помучать хотят
А так Евгений Волосатов привык в консоле все набирать ему быстрее все набирать в консоле чем использовать GUI
и поэтому в курсах такое присутствует да и не только в курсах а еще на вебинарах когда подводит итоги за какойто периюд
Надо вам по чаще на вебинарах быть поимете
Успехов вам в прохождении данного курса
Филёвский парк в Москве :) Там в начале нулевых была анимешная тусовка АиР (Аниме ин Раша), но потом туда влились толкиенисты (вот чего им в Нескучном саду или в Коломенском не сиделось?), вахафилы и прочие, и тусовка превратилась в обычную пьянствующую гоп-компанию :( Впрочем я там с начала нулевых и не был, - может возродилось всё.
Че за парк такой с Анимешниками)?
Поздравляю, желаю дальнейших успехов!!!
Да там и по коду не совсем понятно, что и как она заливает :) Но, теоретически, в данном уроке идея в том, что начиная с центра программа обходит все не закрашенные серым (пустые) области используя рекурсию и вызывая сама себя со смещением на 1 клетку во все стороны. Просто хитрость в том, что метод вызывает сам себя сразу четыре раза для смещений во все стороны.
Интересная работа программы, не много не понятно, что она заливает по скриншоту.
Молодец! Выглядит психоделично!
Я вначале абсолютно точно также решил, потом решил переписать на паскале.
Чем городить 5 вложенных циклов для вывода двоичных чисел до 32, можно обойтись одним циклом с конвертацией в строку по базе 2 и забиванием строки недостающими нулями встроенной в строку функцией. Вообще в 1 строчку умещается. Хотя, в идеале надо это делать через побитовое смещение - самый быстрый и правильный способ (ну и самый гиковый).
Да оно и не всегда нужно. Основное удобство в возможности обращаться как к коллекции к источнику данных, когда заранее неизвестно количество данных. Например, можно оформить программу, как будто мы в цикле foreach перебираем коллекцию простых чисел для поиска подходящего для деления имеющегося числа, но при этом самой коллекции со всеми заранее просчитанными простыми числами у нас нет, а мы их получаем только по мере надобности.
Впервые слышу про yield, лол
Подписка в Клуб формулистов обновлена.
Количество дней: +15
Количество байт: +365
Подписка КФ до: 2018-10-29
Остаток байтов: 478
Вы являетесь участником Клуба формулистов.
10 000-ое число через 3 секунды находит, а 100 000-ое через 3 минуты, так что робот подвиснет, когда начнёт полную проверку делать :)
Молодец, хорошо поработал. Да, данный урок давно просится, чтобы его порезали на части, но видимо пока руки не дошли, либо Игромистр хочет перезаписать его именно под стиль уроков курса, а не вебинара. В любом случае, это история, которая показывает, как у нас на вебинарах бывает и на сколько это весело и интересно. Продолжай заниматься в том же духе, в каждом уроке всегда есть что-то новое или давно забытое старое =)
Вот ссылка на мелкософт: docs.microsoft.com/ru-ru/dotnet/standard/events/observer-design-pattern Но у них там как обычно мутно описано, но если поискать по C# Rx Observer/Observable или по C# IObserver/IObservable много ещё выдаст. Ну и в учебниках всяких типа Гриффитса тема раскрыта.
не Rx, из java.util пакета базовая реализация) но Rx нужно будет глянуть, не слышал про такое O_O спасибо за наводку !з
Как мне кажется, перебирать все делители до N / 2 не рационально. Лучше в переборе в цикле for пройтись от 1 до, например N / 10, а потом в другом цикле проверять так if (N % (10...1) == 0) WriteLine(N / (10...1)).
В C# тоже сейчас лямбды вовсю используются. Это собственно и есть автогенерируемый делегат на анонимную функцию. Observable это имеется в виду Rx Observer/Observable? По описанию прекрасная штука, интересное развитие идеи событий (которые по сути те-же делегаты в удобной обёртке). Всё хочу их попробовать, но не знаю, куда их приспособить для эксперимента :)
Между зелени травы,
Меж листочков и грибочков,
Проползла, шипя, в кусты,
Змея — длинненький шнурочек.
Спинка пёстрая, бока,
Голова точёная,
Не обижу я тебя,
Змейка ультрамодная!
Змеи разные бывают,
Ядовитые и нет,
Кто в пустыне проживает,
Кто-то плавает в воде.
Змеи разные бывают,
И по цвету и длине,
Есть у них одно лишь сходство,
Нет конечностей уже!
Автор: Леонов В.А.
Вот это отчет, так отчет!
Хорошее дело! С завершением!
Об этом нас есть отдельный курс, называется без конкуренции
Подписка в Клуб формулистов обновлена.
Количество дней: +31
Количество байт: +257
Подписка КФ до: 2018-10-14
Остаток байтов: 257
Вы являетесь участником Клуба формулистов.
Да там тоже, в принципе, была практика. Урок в учебнике и состоял в том, чтобы с помощью EF сделать базу и доступ к ней из оконного приложения. Только я тогда вообще не понимал, что происходит :)))))
На практике всегда всё лучше понимаешь
Да отличные результаты ! Такой профессиональный подход к тестированию
Надо сначала в настройках консоли (правый клик по зпголовку окна) выбрать шрифт, имеющий знаки шахматных фигур (например MS Gothic), а для вывода я использовал следующий код (первый метод собирает строку из состояния шахматного поля, а второй её выводит в консоль):
static string ChessToAscii(Chess chess)
{
var sb = new StringBuilder();
sb.AppendLine(" a b c d e f g h ");
sb.AppendLine(" +----------------+");
for (int y = 7; y >= 0; y--)
{
sb.Append(" ");
sb.Append(y + 1);
sb.Append(" |");
for (int x = 0; x < 8; x++) sb.Append(chess.GetFigureAt(x, y));
sb.AppendLine("| " + (y + 1));
}
sb.AppendLine(" +----------------+");
sb.AppendLine(" A B C D E F G H ");
if (chess.IsCheck) sb.AppendLine("CHECK!");
if (chess.IsCheckmate) sb.AppendLine("CHECKMATE!");
if (chess.IsStalemate) sb.AppendLine("STALEMATE!");
return sb.ToString();
}
static void Print(string text)
{
OutputEncoding = Encoding.Unicode;
ConsoleColor fcOld = ForegroundColor;
ConsoleColor bcOld = BackgroundColor;
for (int i = 0; i < text.Length; i++)
{
if (text[i] >= 'a' && text[i] <= 'z' && i < 228)
{
ForegroundColor = ConsoleColor.DarkRed;
}
else if (text[i] >= 'A' && text[i] <= 'Z' && i < 228)
{
ForegroundColor = ConsoleColor.DarkYellow;
}
else ForegroundColor = ConsoleColor.Cyan;
PrintChar(text[i], i);
}
ForegroundColor = fcOld;
BackgroundColor = bcOld;
void PrintChar(char f, int i)
{
if (i > 49 && i < 209)
switch (f)
{
case 'K' : SetBGColor(); Write('\u2654'); break;
case 'Q' : SetBGColor(); Write('\u2655'); break;
case 'R' : SetBGColor(); Write('\u2656'); break;
case 'B' : SetBGColor(); Write('\u2657'); break;
case 'N' : SetBGColor(); Write('\u2658'); break;
case 'P' : SetBGColor(); Write('\u2659'); break;
case 'k' : SetBGColor(); Write('\u265A'); break;
case 'q' : SetBGColor(); Write('\u265B'); break;
case 'r' : SetBGColor(); Write('\u265C'); break;
case 'b' : SetBGColor(); Write('\u265D'); break;
case 'n' : SetBGColor(); Write('\u265E'); break;
case 'p' : SetBGColor(); Write('\u265F'); break;
case '.' : SetBGColor(); Write(" "); break;
default: Write(f); break;
}
else Write(f);
BackgroundColor = bcOld;
void SetBGColor() => BackgroundColor = (i % 2 == 0) ? ConsoleColor.Gray : ConsoleColor.DarkGray;
}
}
А как сделать такую же доску в консоли ? Удивительно красиво для консоли !
К сожалению, нет. Я вначале хотел откатить всё назад через CTRL+Z, но студия подвисла и пришлось её c Unity перезагрузить. Я завтра попробую по памяти восстановить предыдущую версию Board и если получится, пришлю вам проект.
У тебя есть версия проекта до начала выполнения этого урока?
Но если ззнаешь английский язык, то лучше всё-таки использовать английские версии Visual Studio, Unity и прочего, так как на английскойм языке ресурсов для программистов гораздо больше, а искать потом в русских менюшках, что там насоветовали на английском не очень удобно. Да и учебников на английском гораздо больше и не надо ждать, когда их переведут.
Да, в этом суть рефакторинга, вначале ты пишешь код, чтобы он работал, не важно как, главное ясный и понятный, не переживая за дубликаты кода. Когда задуманное реализовано, можно переходить к следующей фазе, рефакторингу, чтобы уменьшить код не меняя логики. после рефакторинга можно заняться оптимизацией алгоритмов, если таковое имеет место быть.