我正在学习Erlang解决Hackerrank问题。有一个叫做List Replication的问题。我完成了这样的解决方案:
-module(solution).
-export([main/0]).
process_input(Repeats)->
Line = io:get_line(""),
case string:len(Line) of
1 -> ok;
_ -> output(Line, Repeats), process_input(Repeats)
end.
output(_, 0)-> ok;
output(Line, Repeats)->
io:format(Line),
output(Line, Repeats - 1).
main()->
{ok, [Repeats]} = io:fread("", "~d"),
process_input(Repeats).
但是这个解决方案有一个问题:我希望最后一行是空的(实际上最后一行是一个没有\n
的数字)。有什么想法吗
6条答案
按热度按时间tvmytwxo1#
我认为在缺少最后一个换行符的情况下,从
io:get_line/1
处理eof
更容易,以及处理一个空行来指示输入结束:process_input/2
函数现在接受一个累加器,它最初是一个空列表。它递归地调用自己,直到检测到输入结束,然后打印输出。它调用io:get_line/1
并检查它是否返回eof
或只是一个换行符,对于这种情况,它反转其累加器并打印其输出。对于任何其他输入,它剥离最后一个换行符,通过lists:duplicate/2
重复输入,将结果存储在新的累加器中,并将其传递给递归调用。output/1
函数从process_input/2
获取累加器,用换行符连接重复的值,然后打印结果。请注意,此版本的solution
模块将结果的格式限制为output/1
函数,以防您希望将process_input/2
的原始结果用于其他目的。最后,我将您的
main/0
重命名为start/0
,因为通过erl -s
命令行选项运行函数时,如果没有给出任何函数,则会假定名称为start
的函数。我们可以在Unix shell中使用
printf
来创建一个没有最后一行换行符的输入文件:然后像这样运行我们编译好的
solution
模块,得到我们在本例中期望的三倍输出:在
in
文件中添加最后一个换行符也会得到相同的结果(尝试一下)。我们还可以创建每行包含多个字符的输入:对于这个
in2
文件,我们也得到了预期的双倍输出。bf1o4zei2#
您必须使用io:setopts/1关闭流的回显
ckx4rj1h3#
我刚刚更新了解决这个问题的代码,所以我的想法是,你把输入保存在一个累加器中(在这个例子中是一个列表),最后你处理这个列表,如果你想避免在任何时候输出屏幕上写的东西,你可以禁用echo,就像我在另一个答案中展示的例子一样。
测试:
toiithl64#
我自己的回答:
fcipmucu5#
这是我的想法(在上面答案的帮助下)。我添加我的解决方案是因为它也处理问题中陈述的约束:
我对Erlang还很陌生,所以如果这是混乱/低效的,请原谅我!
hrirmatl6#