Pull to refresh

Comments 9

Даже интересно, как стыкуются контексты спортивного программирования, где задачи решаются "на время" и то, сколько этого ценного времени нужно угробить ради максимально тупого и быстрого ввода массива int'ов.

И после этого еще жалуются на C, что он "без батареек".

Нормально стыкуется, ввод массива заучивается наизусть и пишется при необходимости за минуту. А на финале ACM ICPC даже разрешают взять с собой N страниц текста с подобными заготовками (что на самом деле бесполезно поскольку на отборочных соревнованиях этого разрешения нет — а значит все участники и без того помнят свои заготовки наизусть).


Та же хеш-таблица или (упаси боже!) красно-чёрное дерево пишется куда дольше, а потому наличие в стандартной библиотеке их реализаций куда важнее на соревновании чем быстрый ввод целых чисел.

Отличная статья, побольше бы таких подробных на Хабре.

Никогда не сталкивался с массовым вводом массивов на с#.

Указанные проблемы не про консоль вовсе, а про любой парсинг текстовых данных и предложенные решения применимы не только в контексте спортивного програмирования. Сколько там уже итераций "мы ускорили JsonSerializer в сто миллионов раз"?

Ну, проблема автоматического Flush — как раз связана с консолью.

var result = Console.ReadLine()
    .Split(' ', StringSplitOptions.RemoveEmptyEntries)
    .Select(int.Parse)
    .Sum();

А почему бы не так:

var result = Console.ReadLine()
    .Split().Where(s => s != "")
    .Select(int.Parse)
    .Sum();

?

Зачем изобретать велосипед, если у функции split уже есть готовый параметр? Тем более первое, я уверен, работает быстрее и занимает меньше памяти, так как split возвращает массив сразу без пустых строк

Перегрузке с тем параметром нужно символ-разделитель передавать:

Неприятный нюанс, о котором надо помнить: если раньше код обрабатывал все пробельные символы как разделители, то теперь только пробелы.

Можно и так, и так.

Проблема в том, что нужно вспомнить в нужный момент об этой особенности функции .Split() и дописать либо параметр, либо .Where(...).

Также при использовании Console.ReadLine().Split() для формата ввода "в столбик" придётся полностью переписать код. А с поэлементным можно сделать универсальный метод, которому не важен ни тип разделителей, ни их количество:

int[] ReadIntArray()
{
  var array = new int[ReadInt()];
  for (int i = 0; i < array.Length; ++i)
    array[i] = ReadInt();
  return array;
}
Sign up to leave a comment.

Articles