Простая сумма двух числовых файлов ввода / вывода в F #, Haskell, Scala и Visual Basic или других функциональных языках программирования - PullRequest
2 голосов
/ 22 ноября 2010

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

Я хочу эквивалент этого кода:

#include <stdio.h>

int main () {
    int a, b;

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    scanf("%d%d", &a, &b);
    printf("%d", a + b);

    return 0;
}

В этих языках программирования.

Я хочу прочитать из файла input.txt два числа, каждое в строке, и записать их сумму в выходной файл output.txt

Спасибо.

РЕДАКТИРОВАТЬ Пожалуйста, не говорите мне, что Visual Basic .NET не является функциональным языком. Я это знаю.

Ответы [ 9 ]

9 голосов
/ 22 ноября 2010

Haskell:

main = do
    [astr, bstr] <- fmap lines (readFile "input.txt")
    writeFile "output.txt" $ show (read astr + read bstr)

Или для суммирования всех строк:

main = writeFile "output.txt" . show . sum . map read . lines =<< readFile "input.txt"
5 голосов
/ 22 ноября 2010

В F #:

System.IO.File.ReadAllLines "input.txt" |> Seq.sumBy int |> string
|> fun s -> System.IO.File.WriteAllText("output.txt", s)
4 голосов
/ 22 ноября 2010

Некоторые ответы здесь смущены тем, что делает C-код. Код C не особенно полезен. Требуется файл типа

42
1776
this is any sort of random junk
because the program never reads this far

и создает файл, содержащий

1818

и это все. IMO, это паршивый пример для демонстрации силы функциональных языков, потому что он делает так мало - один экземпляр одной операции, в основном. Yawn . Приблизительно с одинаковым объемом работы вы можете взять файл с двумя столбцами чисел и создать файл, сумма которого в одном столбце будет выведена в качестве выходного. Приложив немного больше работы, вы можете справиться с любой возможной ошибкой ввода.

Но, честно говоря, если эта работа под рукой, один из способов выполнить это в Scala:

val pw = new java.io.PrintWriter("output.txt")
val num = scala.io.Source.fromFile("input.txt").getLines().map(_.toInt)
pw.print(num.next+num.next)
pw.close  // Only use this line if execution continues (e.g. in REPL)
4 голосов
/ 22 ноября 2010

Версия F #, предполагающая, что входной файл содержит всего две строки (с цифрами):

open System.IO

let [| astr; bstr |] = File.ReadAllLines "input.txt" 
File.WriteAllText("output.txt", string (int astr + int bstr))

Это немного проще, чем версия Джона, но это более прямое решение (и ведет себя так же, как решение Haskell, опубликованное другими). ​​

4 голосов
/ 22 ноября 2010

Существует множество способов сделать это в Scala .

val f = (as : Array[String]) => as(0).toInt + as(1).toInt
io.Source.fromFile("C:/myfile.xtx").getLines().toStream match {
  case line1 #:: _ => println(f(line1.split(","))
}

Вы могли бы также сделать ...

val splitLine = (_ : String).split(",")
val printSum = (as : Array[String]) => println(as(0).toInt + as(1).toInt)
val sums = io.Source.fromFile("C:/f.xtx").getLines() map (splitLine andThen printSum)
sums.head //start printing as Iterator is lazy

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

val sumLine = (as : Array[String]) => as(0).toInt + as(1).toInt
val sums = io.Source.fromFile("C:/f.xtx").getLines() map (splitLine andThen sumLine)
println(sums.head)
3 голосов
/ 22 ноября 2010

Схема ракетки:

(define (simpleSum)
  (let* ((input (map string->number (file->lines "input.txt")))
         (a (first input)) (b (second input)))
    (write-to-file (number->string (+ a b)) "output.txt")))
1 голос
/ 22 ноября 2010

Вот реализация VB.NET:

Dim FileLines() as string = system.io.file.readalllines("input.txt")
system.io.file.WriteAllText("output.txt", ctype(FileLines(0), integer) + ctype(FileLines(1), integer))
1 голос
/ 22 ноября 2010

Я не думаю, что у scala есть преимущество в таком простом сценарии, включая все его причудливые функции и API.Лучше использовать библиотеку Java.java.util.Scanner предоставил полезную функцию nextInt (), которая может работать во многих случаях, и PrintWriter - самый быстрый выходной механизм в java.

val in = new Scanner(new FileInputStream("input.txt"))

val out = new PrintWriter("output.txt")

out.println((in.nextInt + in.nextInt))

out.close

in.close

А еще мне интересно, над каким онлайн-судьей вы работаете:)

0 голосов
/ 22 ноября 2010

Visual Basic не является функциональным языком, если вы не используете некоторые функции LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...