Форум программистов, компьютерный форум, киберфорум
Leshakk
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

C# Красивые решения задач.

Запись от Leshakk размещена 03.05.2022 в 23:13
Обновил(-а) Leshakk 03.06.2022 в 10:45 (Дополнение)

Шифровка-дешифровка. Не решена.
Кликните здесь для просмотра всего текста

О, боги C#, помогите мне, прошу вас!
Мюллер много раз пытался поймать Штирлица с поличным, но тот всё время выкручивался. Как-то раз Штирлиц просматривал электронную почту. В это время незаметно вошел Мюллер и увидел, как у Штирлица на экране появился бессмысленный набор символов. — Шифровка, — подумал Мюллер. —UTF-8, — подумал Штирлиц.

Известно, что Штирлиц шифрует текст следующим образом:
1.Убирает все символы, отличные от букв, включая пробелы. Буквы приводятся к одному регистру.
2.Заменяет все подряд идущие одинаковые буквы на одну такую букву.
3.Многократно вставляет в произвольное место текста две случайные одинаковых буквы.

Напишите метод шифрования.
Количество вставок — случайно число от n до 3n, где n— длина строки.
Место каждой вставки выбирается случайно.
Напишите метод дешифровки с использованием подходящей структуры данных (в результате получится текст, каким он был после второго этапа).
Напишите модульные тесты методов.
Напишите основную программу, которая запрашивает текст и выдает зашифрованное и расшифрованные сообщения.

Примеры:
stierlitz - wwstdaadierfflitzzz - stierlitz
A little bee - rrasspplzzitlqqeeebyyggeccbb - alitlebe


Дележ яблок
Кликните здесь для просмотра всего текста

n школьников делят k яблок “поровну”, то есть так, чтобы количество яблок, доставшихся любым двум школьникам, отличалось бы не более, чем на 1.
Программа получает на вход числа n и k.
Программа должна вывести количество школьников, которым достанется яблок меньше, чем некоторым из их товарищей.
При решении этой задачи нельзя пользоваться условной инструкцией if и циклами.

C#
1
2
3
 int n = Convert.ToInt32(Console.ReadLine());
            int k = Convert.ToInt32(Console.ReadLine());
            Console.Write((n - (k % n)) % n);



За день машина проезжает n километров. Сколько дней нужно, чтобы проехать маршрут длиной m километров?
Кликните здесь для просмотра всего текста

При решении этой задачи нельзя пользоваться условной инструкцией if и циклами.
Программа получает на вход натуральные числа n и m, не превосходящие 10000.
C#
1
2
3
4
5
6
7
8
9
//формула округления вверх: (m + n - 1) / n)
 
static void Main(string[] args)
 
        {
            int n = Convert.ToInt32(Console.ReadLine());
            int m = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine((m + n - 1) / n);
        }


Промежуток времени
Кликните здесь для просмотра всего текста
Даны значения двух моментов времени, принадлежащих одним и тем же суткам: часы, минуты и секунды для каждого из моментов времени. Известно, что второй момент времени наступил не раньше первого. Определите, сколько секунд прошло между двумя моментами времени.
Программа на вход получает три целых числа — часы, минуты, секунды, задающие первый момент времени и три целых числа, задающих второй момент времени.
Выведите число секунд между этими моментами времени.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Мое решение
            int hh = Convert.ToInt32(Console.ReadLine());
            int mm = Convert.ToInt32(Console.ReadLine());
            int ss = Convert.ToInt32(Console.ReadLine());
 
            int hh1 = Convert.ToInt32(Console.ReadLine());
            int mm1 = Convert.ToInt32(Console.ReadLine());
            int ss1 = Convert.ToInt32(Console.ReadLine());
 
            int x = hh * 3600 + mm * 60 + ss;
            int y = hh1 * 3600 + mm1 * 60 + ss1;
            int z = y - x;
 
            Console.WriteLine(z);
 
//v2
public static void Main()
    {
        int firstMoment = int.Parse(Console.ReadLine()) * 60 * 60 +
                          int.Parse(Console.ReadLine()) * 60 +
                          int.Parse(Console.ReadLine());
        int secondMoment = int.Parse(Console.ReadLine()) * 60 * 60 +
                          int.Parse(Console.ReadLine()) * 60 +
                          int.Parse(Console.ReadLine());
        Console.WriteLine(secondMoment - firstMoment);


Длина кольцевой дороги — 109 километров. Байкер Вася стартует с нулевого километра и едет со скоростью v километров в час. На какой отметке он остановится через t часов?
Кликните здесь для просмотра всего текста

Входные данные
Программа получает на вход значения v и t. Если v>0, то Вася движется в положительном направлении по кольцу, если же значение v<0, то в отрицательном.
Выходные данные
Программа должна вывести целое число от 0 до 108 — номер отметки, на которой остановится Вася.

C#
1
2
3
4
5
6
public static void Main()
    {
            int v = Convert.ToInt16(Console.ReadLine());
            int t = Convert.ToInt16(Console.ReadLine());
            Console.WriteLine((109 + (v * t % 109))%109);   
    }


Дано натуральное число. Выведите его последнюю цифру.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
//1v.
           string a = Console.ReadLine();
           char[] b = a.ToCharArray();
           Console.WriteLine(b[b.Length - 1]);
 
//2v.
            int a = int.Parse(Console.ReadLine());
            Console.WriteLine(a % 10);
 
//3v.
            string line = Console.ReadLine();
            string[] splitString = line.Split(' ');
            Console.WriteLine(line[^1]);


Дано двузначное положительное или отрицательное число. Найдите число десятков в нем. Ответ положительное число
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//v1 топовый
public static void Main()
    {
        Console.WriteLine(Math.Abs(int.Parse(Console.ReadLine()) / 10));
    }
 
//v2 нубский
public static void Main()
    {
       int x = Convert.ToInt32(Console.ReadLine());
        if (x < 0) x = x * (-1);
        int y = x / 10;
        Console.WriteLine(y);
    }


Дано трехзначное число (оно может быть отрицательным). Найдите сумму его цифр.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//Подвох был еще в том, что результат должен быть положительным. Типа цифры это цифры. И сумма цифр, отрицательного числа, есть сумма по модулю. ХЗ насколько это верно. Но бот не принимал отицательный ответ.
//Блестящее решение
public static void Main()
    {
         int input = int.Parse(Console.ReadLine());
         Console.WriteLine(Math.Abs((input / 100 % 10) + (input / 10 % 10) + (input % 10)));
    }
 
//Мое решения. Треш  и угар
public static void Main()
    {
        int x = Convert.ToInt32(Console.ReadLine());
        
        int c = x % 10;
 
        int b = x % 100 / 10;
 
        int a = x % 1000 / 100;
        
        int y = a +b + c;
        if (y < 0)
            y = (y * -1);
 
            
            Console.WriteLine(y);
    }
 
//Еще какое то. 
 public static void Main()
    {
        int x = Convert.ToInt32(Console.ReadLine());
        int sum = 0;
        while(x > 0)
        {
            sum += x % 10;
            x /= 10;
        }
        Console.WriteLine(sum);
    }


Электронные часы
Кликните здесь для просмотра всего текста
Электронные часы показывают время в формате h:mm:ss, то есть сначала записывается количество часов, потом обязательно двузначное количество минут, затем обязательно двузначное количество секунд. Количество минут и секунд при необходимости дополняются до двузначного числа нулями.
С начала суток прошло n секунд. Выведите, что покажут часы.
Вводится целое число n.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Мое решение
            int sec = (a >= 60) ? a % 60 : a;
            int min = (a >= 60) ? (a / 60) % 60 : 0;
            int hours = (a >= 3600) ? (a / 3600) % 24 : 0;
 
            Console.WriteLine("{0}:{1}:{2}", hours, (min < 10) ? $"0{min}" : $"{min}", (sec < 10) ? $"0{sec}" : $"{sec}");
 
//Еще какое-то
public static void Main()
    {
         int allSeconds = int.Parse(Console.ReadLine());
         DateTime date1 = new DateTime();
         DateTime clock = date1.AddSeconds(allSeconds);
         Console.WriteLine($"{clock.Hour}:{clock.Minute:d2}:{clock.Second:d2}");
    }


Расписание уроков.
Кликните здесь для просмотра всего текста
В некоторой школе занятия начинаются в 9:00. Продолжительность урока — 45 минут, после 1-го, 3-го, 5-го и т.д. уроков перемена 5 минут, а после 2-го, 4-го, 6-го и т.д. — 15 минут. Определите, когда заканчивается указанный урок.
Дан номер урока (число от 1 до 10).
Выведите два целых числа: время окончания урока в часах и минутах. При решении этой задачи нельзя пользоваться циклами и условными инструкциями. В минута ведущий ноль не нужен.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//мое решение. Как бы честолюбие подсказывает, что нужна математическая формула, алгоритм, а не ручная подстановка....Ой да и пофиг, умение тупо и просто решить задачу, без заморочек-тоже умение.
 
public static void Main()
    {
        int x = Convert.ToInt32(Console.ReadLine());
 
            string[] ur = {" " ,"9 45", "10 35", "11 35", "12 25", "13 25", "14 15", "15 15", "16 5", "17 5", "17 55" };
            Console.WriteLine(ur[x]);
    }
 
 
//Такое же как у меня, ручной вбив массива, но вывод, красивый. 
public static void Main()
    {
      Console.WriteLine(new string[]
      {
       "9 45",
       "10 35",
       "11 35",
       "12 25",
       "13 25",
       "14 15",
       "15 15",
       "16 05",
       "17 05",
       "17 55",
      }[int.Parse(Console.ReadLine()) - 1]);    
    }
 
//Ну очень крутое решение. 
public static void Main()
    {
        // put your c# code here
        int n=Convert.ToInt32(Console.ReadLine());
        Console.WriteLine((55*n+(n%2)*5+525)/60 + " " + (55*n+(n%2)*5+525)%60);
    }


Пирожок в столовой стоит a рублей и b копеек. Определите, сколько рублей и копеек нужно заплатить за n пирожков.
Кликните здесь для просмотра всего текста
Программа получает на вход три числа: a, b, n.
Программа должна вывести два числа: стоимость покупки в рублях и копейках.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Мое
static void Main(string[] args)
 
        {
            int a_Rub = Convert.ToInt32(Console.ReadLine());
            int b_cop = Convert.ToInt32(Console.ReadLine());
            int n_count = Convert.ToInt32(Console.ReadLine());
 
            int res_a = (a_Rub * n_count) + ((b_cop * n_count) / 100);
            int res_b = (b_cop * n_count) % 100;
 
            Console.WriteLine("{0} {1}", res_a, res_b);
        }
 
//красивое
public static void Main()
    {
        int a = Convert.ToInt32(Console.ReadLine());
        int b = Convert.ToInt32(Console.ReadLine());
        int n = Convert.ToInt32(Console.ReadLine());
        int c = (a*100+b)*n;
        Console.WriteLine(c/100+" "+c%100);
    }
Размещено в Без категории
Показов 1474 Комментарии 6
Всего комментариев 6
Комментарии
  1. Старый комментарий
    Аватар для Tavashi
    Красота.
    Запись от Tavashi размещена 04.05.2022 в 16:18 Tavashi вне форума
  2. Старый комментарий
    > (109 + (v * t % 109))%109

    тройное упоминание "109" и два деления.
    A есть ли в C/C++ встроенный или библиотечный "правильный" модуль, а не остаток?

    > Дано трехзначное число (оно может быть отрицательным). Найдите сумму его цифр.
    C++
    1
    
    abs(n+n/10+n/100)%10
    Запись от QueryMonkey размещена 04.05.2022 в 20:05 QueryMonkey вне форума
  3. Старый комментарий
    Спасибо.
    Красота условная. Для профи-поржать. Ну а для нубаса, все что короче страницы текста, да еще и с незнакомыми словами-все красиииивое )) Бложик для себя, просто не разобрался, как его скрыть чтобы людей не пугать. Да и зачем, может забредет кто, и поделится красивым.
    Запись от Leshakk размещена 04.05.2022 в 21:49 Leshakk вне форума
  4. Старый комментарий
    Аватар для _lunar_
    Цитата:
    Сообщение от Leshakk Просмотреть комментарий
    Бложик для себя, просто не разобрался, как его скрыть чтобы людей не пугать.
    оставить его в черновиках.
    в таком случае прямой ссылки на блог не будет, т.е. для юзеров ссылки не будет, но id с url адресом будет занята.
    Запись от _lunar_ размещена 09.05.2022 в 20:15 _lunar_ вне форума
  5. Старый комментарий
    А, тогда лови: вычисляет вес числа (количество бит)

    C++
    1
    2
    3
    4
    
      int n = 35, i = 0;
      while( n && ++i )
        n &= n-1;
      printf( "%d\n", i );
    Работает даже с отрицательными
    Запись от QueryMonkey размещена 09.05.2022 в 21:46 QueryMonkey вне форума
  6. Старый комментарий
    Цитата:
    Сообщение от QueryMonkey Просмотреть комментарий
    А, тогда лови: вычисляет вес числа (количество бит)

    C++
    1
    2
    3
    4
    
      int n = 35, i = 0;
      while( n && ++i )
        n &= n-1;
      printf( "%d\n", i );
    Работает даже с отрицательными
    Спасибо!
    Запись от Leshakk размещена 09.05.2022 в 21:51 Leshakk вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru