首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >柏林时钟卡塔在药剂

柏林时钟卡塔在药剂
EN

Code Review用户
提问于 2014-07-31 20:14:59
回答 1查看 551关注 0票数 9

我从灵丹妙药开始,作为练习,我编写了柏林钟卡塔

  • 这个钟由五排组成。
  • 在钟的最顶端是一盏灯,它闪烁以显示秒数。它打开一秒钟,然后关闭一秒钟,以此类推。
  • 接下来的2行表示小时。上面的大部分行代表5个小时的积木,由4盏红灯组成。第二排代表1小时的积木,并由4盏红灯组成。
  • 最后两行表示分钟数。上面最亮的一排是5分钟的积木,由11盏灯组成--每3盏灯就有一盏红色,其余的则是黄色。第二排代表1分钟的积木,由4盏黄灯组成。

这是一张照片:

完整的代码是可用的这里

代码语言:javascript
运行
复制
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
EN

回答 1

Code Review用户

发布于 2014-08-01 16:56:36

首先:我不得不承认,我不知道一句药方。

但另一方面,我想我明白密码的作用。我不能给你建议,如何实施改进,但我希望能帮助你无论如何。

在描述中,您有以下定义:

单分钟:

当时间过了1分钟,YOOO就会被退回。

当时间已过2分钟时,YYOO将被返回。

当时间已过5分钟时,OOOO将被返回。

单小时:

当已经过了1小时时,ROOO就会被返回。

当它是2小时后,RROO将被返回。

当它是5个小时后,OOOO将被返回。

两者的共同点是模式1,2,5和结果*000, **00, 0000

这将导致一个函数,它接受以下参数:数字、符号并产生相应的输出。

您的代码有:

代码语言:javascript
运行
复制
def get_single_minutes(m) do
    number_of_y = rem(m, 5)
    String.ljust(String.duplicate("Y", number_of_y), 4, ?O)
end

代码语言:javascript
运行
复制
def get_single_hours(h) do
    number_of_r = rem(h, 5)
    String.ljust(String.duplicate("R", number_of_r), 4, ?O)
end

应该重构成一个函数。

如果你看一下

代码语言:javascript
运行
复制
def get_fives_hours(h) do
    number_of_r = div(h, 5)
    String.ljust(String.duplicate("R", number_of_r), 4, ?O)
end

上面的函数(S)你可以看到另一个共同的模式:

代码语言:javascript
运行
复制
number_of_whatsoever = X

其中X是函数的结果: div(h,5)或rem(h,5)。所以下一步是重构数字,符号=>输出到数字,符号,fn =>输出。你得到3行而不是9行。

唯一棘手的部分是5分钟的排行

您可以再走一步抽象之路,为每一行创建一个函数:

F(空线,functionToFillLines)=>output

1)秒,

f('O',fillSeconds)=>output

2)一分钟,一小时,五小时

f('OOOO',fillFunction)=>output

3) 5分钟

F(‘OOOOOOOOOOO,fill5minutes)=>output

其中填充X-函数是闭包,以一个参数作为输入。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/58690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档