我从灵丹妙药开始,作为练习,我编写了柏林钟卡塔:
这是一张照片:
完整的代码是可用的这里。
import Integer, only: :macros
defmodule BerlinClock do
def parse (time) do
[h, m, s] = String.split(time, ":")
|> Enum.map fn n -> Integer.parse(n)
|> elem(0) end
seconds = get_seconds(s)
single_minutes = get_single_minutes(m)
fives_minutes = get_fives_minutes(m)
single_hours = get_single_hours(h)
fives_hours = get_fives_hours(h)
[seconds, fives_hours, single_hours, fives_minutes, single_minutes]
end
def get_fives_hours(h) do
number_of_r = div(h, 5)
String.ljust(String.duplicate("R", number_of_r), 4, ?O)
end
def get_single_hours(h) do
number_of_r = rem(h, 5)
String.ljust(String.duplicate("R", number_of_r), 4, ?O)
end
def get_fives_minutes(m) do
number_of_y = div(m, 5)
String.ljust(create_fives_minutes(number_of_y), 11, ?O)
end
def create_fives_minutes(1) do
"Y"
end
def create_fives_minutes(n) when n < 1 do
""
end
def create_fives_minutes(n) when n > 1 do
if rem(n,3) == 0 do
light = "R"
else
light = "Y"
end
[create_fives_minutes(n-1), light ] |> Enum.join
end
def get_single_minutes(m) do
number_of_y = rem(m, 5)
String.ljust(String.duplicate("Y", number_of_y), 4, ?O)
end
def get_seconds(s) do
cond do
s |> even? -> "Y"
s |> odd? -> "O"
end
end
end
发布于 2014-08-01 16:56:36
首先:我不得不承认,我不知道一句药方。
但另一方面,我想我明白密码的作用。我不能给你建议,如何实施改进,但我希望能帮助你无论如何。
在描述中,您有以下定义:
单分钟:
当时间过了1分钟,YOOO就会被退回。
当时间已过2分钟时,YYOO将被返回。
当时间已过5分钟时,OOOO将被返回。
单小时:
当已经过了1小时时,ROOO就会被返回。
当它是2小时后,RROO将被返回。
当它是5个小时后,OOOO将被返回。
两者的共同点是模式1,2,5
和结果*000, **00, 0000
。
这将导致一个函数,它接受以下参数:数字、符号并产生相应的输出。
您的代码有:
def get_single_minutes(m) do
number_of_y = rem(m, 5)
String.ljust(String.duplicate("Y", number_of_y), 4, ?O)
end
和
def get_single_hours(h) do
number_of_r = rem(h, 5)
String.ljust(String.duplicate("R", number_of_r), 4, ?O)
end
应该重构成一个函数。
如果你看一下
def get_fives_hours(h) do
number_of_r = div(h, 5)
String.ljust(String.duplicate("R", number_of_r), 4, ?O)
end
上面的函数(S)你可以看到另一个共同的模式:
number_of_whatsoever = X
其中X是函数的结果: div(h,5)或rem(h,5)。所以下一步是重构数字,符号=>输出到数字,符号,fn =>输出。你得到3行而不是9行。
唯一棘手的部分是5分钟的排行
您可以再走一步抽象之路,为每一行创建一个函数:
F(空线,functionToFillLines)=>output
f('O',fillSeconds)=>output
f('OOOO',fillFunction)=>output
F(‘OOOOOOOOOOO,fill5minutes)=>output
其中填充X-函数是闭包,以一个参数作为输入。
https://codereview.stackexchange.com/questions/58690
复制相似问题