Блог пользователя Andronnix

Автор Andronnix, 12 лет назад, По-русски

Я тут недавно решил пересесть на си шарп, в связи с тем что пробовал писать что-то под свой Windows Phone, а заодно решил попробовать писать контесты на нём. Это забавно, но возникают проблемы с чтением данных. Я читаю вот так, но мне кажется это совсем неправильно, нагуглить как правльно я не смог, сканера как в Яве я так понял в c# нету.

  String s = Console.ReadLine();
  String[] p = s.Split(' ');
  int[] a = new int[n];
  for (int i = 0; i < n; i++)
  {
      a[i] = int.Parse(p[i]);
  }

Это если нужно прочитать массив чисел из строки. Может кто подскажет, вроде Egor пишет иногда на С#, но я что-то не смог найти его посылок на нём. И ещё вопрос, кто-нибудь знает можно ли отсортировать решения по языку, или хотя бы найти решения на определённом языке?

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Можно либо читать вот так, либо написать себе свой Scanner

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Отсортировать по языку можно. В посылках/статусе справа внизу можно выбрать язык

»
12 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Где-то уже писал. Считать массив можно вот так:

Int32[] a = Array.ConvertAll<String, Int32>(Console.ReadLine().Split(' '), Int32.Parse);
»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

лучше так не делать, потому что это долго (где-то была задача, где такое чтение падало по TL). Я вот такое написал

static int nextInt()
        {
            int t = input.Read();
            while ((t < '0' || t > '9') && t != '-') t = input.Read();
            int sign = 1;
            if (t == '-')
            {
                sign = -1;
                t = input.Read();
            }
            int x = 0;
            while (t >= '0' && t <= '9')
            {
                x *= 10;
                x += t - '0';
                t = input.Read();
            }
            return x * sign;
        }

Соответственно читать теперь вот так:

for (int i = 0; i < n; i++)
  {
      a[i] = nextInt();
  }

удобно еще и тем, что числа в инпуте необязательно должны быть в одну строку и через один пробел (на CF с этим пока проблем не видел, но на других ресурсах бывает часто). Если числа могут быть только неотрицательными, этот метод можно еще немного ускорить (в мои посылках nextPositive(), там еще пару полезных есть методов чтения)

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Ну свой сканер я смогу написать) Просто хотелось не заморачиваться, но видно придётся

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Можно вот так еще написать int[] arr = s.Split(' ').Select(x=>int.Parse(x)).ToArray(); В любом случае, есть (крайне популярная на всех ресурсах) проблема с размером стека, из-за которой приходится писать какие-то немыслимые извращения вместо обычного DFS, так что C# в данный момент похоже не самый лучший вариант