[Haskell on HackerEarth] Toggle String

来源:互联网 发布:阿里云国际版试用 编辑:程序博客网 时间:2024/05/29 02:47

题目链接
输入:一个英文字符串
输出:转换所有字母大小写后的字符串,即小写转为大写,大写转为小写
Tips:
1. isUpper, isLower, toLower 和 toUpper 在模块 Data.Char 里
2. interact 函数的签名为 interact :: (String -> String) -> IO (),使用它的一般方法通俗的讲就是写一个从输入字符串到输出字符串的函数,作为它的参数
3. 注意缩进问题,现在我还没弄明白Haskell具体的缩进规则是什么,但是这里where块的缩进很重要

import Data.Charmain = interact myConvert  where myConvert = map f        f ch           | isUpper ch = toLower ch          | isLower ch = toUpper ch          | otherwise  = ch




Java8加入了对函数式编程更多的支持,这道题目也可以用Java8中的函数式方法来写,其中最【麻烦】的点在于外部和stream的交互。在Haskell中,主体是纯函数,因此有副作用的Monad是其中的难点,与之相对应的在Java中加入【非土著】的stream也是其中的难点。

import java.io.IOException;import java.io.PrintWriter;import java.io.InputStream;import java.io.OutputStream;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.List;import java.util.ArrayList;class ToggleString {  public static void main(String[] args) throws IOException {    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));    PrintWriter writer = new PrintWriter(System.out);    reader.lines()          .flatMap((String s) -> {            List<Character> result = new ArrayList<>();            for (char c : s.toCharArray()) result.add(c);            return result.stream();        }).map(ch -> {          if (Character.isUpperCase(ch))            return Character.toLowerCase(ch);          else return Character.toUpperCase(ch);         }).forEach(writer::print);    writer.close();    reader.close();  }}
1 0
原创粉丝点击