Помощь новичкам

  1. Считать все строки с обоих файлов (второй - аппендом в коллекцию первого), сделать Select -> ToWords
  2. GroupBy по первому слову в каждой строке
  3. Выкинуть все группы, в которых по одному элементу (Where)
  4. Select оставшихся в одну строку
  5. Записать в файл.

Класс не нужен, однострочненько вышло (реально ж одна строка :rofl:). Писать лень, к .NET уже лет 5 не прикасался =3 Во. Модно, молодежно, и бессмысленно. Скучно было. :rofl:

begin
  ReadLines('f1.txt')
    .Concat(ReadLines('f2.txt'))
    .Select(str->str.ToWords)
    .GroupBy(words->words[0])
    .Where(group->group.Count() > 1)
    .Select(group->String.Join('  ', group.First().Concat(group.Skip(1).First.Skip(1))))
    .WriteLines('f3.txt');
end.

Объявляю конкурс на самый короткий способ запилить эту чухню =3

Мой вариант расширяемый, я так понимаю что строчки это не просто несколько случайных слов. Если их значения что то значат - лучше описать класс для хранения этой строчки (только вместо array of string - надо поля определённых типов, но это к ТС).

Ну, если уж делать монстра:

begin
  ReadLines('1.txt')
  .Cartesian(ReadLines('2.txt'), (l1,l2)->(l1.ToWords,l2.ToWords))
  .Where(t->t[0][0]=t[1][0])
  .Select(t-> (t[0]+t[1].Skip(1)).JoinToString )
  .WriteLines('3.txt');
end.

Да спору нет :slight_smile: Первый вариант лучше. Просто захотелось немного упороться :rofl:

Таки да, поздравляю с победой в конкурсе :rofl:

Почему в разделе var или const нельзя задать для переменной очень большое число? Например, если попытаться выполнить программу, где написано

var
  x:BigInteger:=99999999999999999999;

то выйдет ошибка “Слишком большое целое”, хотя обычно в ReadBigInteger можно вписать число до 254 девяток включительно.

Потому что Вы пишете целочисленную константу в правой части. Она не может превышать int64.MaxValue. А Ваше значение больше.

BigInteger это не базовый тип как integer или int64. То есть, его не поддерживает процессор напрямую. А значит этот тип реализован как запись, которую надо инициализировать (то есть вызвать какой то метод).

Самый прямой способ сейчас - так:

begin
  var x := BigInteger.Parse('9999999999999999999999999999999999');
end.

Хотя, конечно, парсить из строки это не хорошо…


@Admin вообще есть довольно хороший способ добавить поддержку литералов типа BigInteger: Можно использовать метод .ToByteArray и соответствующий конструктор.

То есть такой код:

begin
  var x := 99999999999999999999999999999999999999;
end.

Разворачивать в:

begin
  var x := new BigInteger(new byte[](255, 255, 255, 255, 63, 34, 138, 9, 122, 196, 134, 90, 168, 76, 59, 75));
end.

Тут последовательность байт - это то, что вернёт BigInteger.Parse(...).ToByteArray, которое легко выполнить внутри компилятора.

Т.е. сейчас константа сначала примеряется на integer, потом на Int64, а Вы предлагаете и дальше этот процесс продлить? И смысл? Это так часто надо?

BigInteger уже давно позиционируется современным примитивом.

Вопрос не в “как часто надо”, а в том что сейчас альтернативы инициализации большого числа - не очень то.

Чем плох парсинг строки?

Представьте, что все сделали, как Вы описали. Я в программе вижу строку

var k := 9223372036864775807;

И? Какой тип имеет k? int64 или BigInteger? А не секрет, что большинство операций и функций для BigInteger или иначе выглядят, или отсутствуют. Получается трудночитаемый код. И ради чего?

1 лайк

Вы бы посмотрели что делает .Net-овский парсинг. Они в погоне за глобализацией сделали так что даже парсинг целых в несколько раз медленнее StrToInt из PABCSystem. Там куча лишних вызовов и проверок.

Я вот заметил, что у Вас прямо какое-то болезненное восприятие чужих кодов - они все такие неоптимальные, уродливые, тормозные, кривые, … Ну хорошо, парсинг “плохой”. Какое количество констант типа BigInteger должна получить программа, чтобы это было реально видно?

 По объявлению Бернарда Шоу, что мастер ищет хорошую стенографистку,
 пришла молодая барышня.
 - Сэр, я могу стенографировать со скоростью 200 слов в минуту.
 Шоу озадаченно почесал затылок:
 - Где же я вам возьму столько слов?

Вы бы сами подумали над этим вопросом, вместо того чтоб по привычно шаблонно отвечать “это не надо, это я не знаю где использовать”. Хотя бы взять подпрограмму вызываемую в цикле.

Да можно и десять циклов вложить друг в друга и вызывать, но зачем ??? Зачем в цикле что-то вызывать с множеством констант типа BigInteger? Вы оперируете чисто академическими понятиями, а я привык мыслить практически. Если это на практике не нужно (либо нужно редко и единично) - не нужно засорять этим язык. Да, в таких случаях я отвечаю “привычно и шаблонно”. Извините, бОльшую часть жизни в СССР прожил, привык прикидывать полезность каждой идеи, а не “чтобы было”.

Почему?

А как ещё можно писать?

По определению языка Паскаль. Нет в нем специальных “значков”, определяющих тип литерала, поэтому приняты определенные правила умолчания. См. выше

Вам ответили выше, как:

Начиная с какого числа числа отображаются в экспоненциальной записи? Как показать такое число в обычной записи?

Для этого есть форматирование вывода. А без него действуют принципы .NET, о которых Вы можете почитать в соответствующих документах.

Не могу найти ни как вывести число в обычной записи с помощью форматирования вывода, ни документы о принципах .NET.

А где вы искали? Особенно часть про документы про .Net .

В Google.