编程:呼叫转移系统[erlang]

[size=medium]呼叫转移服务是一个把呼叫号码A转移到号码B的服务。举个例子:当你正在度假时,这样的系统非常有帮助。A君度假去了,那么,A君的工作电话可以通过呼叫转移至B君。更进一步讲,当B君也正好在度假,还可以继续通过呼叫转移到C君,依次类推。也就是说,当一个客户打电话到A君,通过呼叫转移系统,最后转接到了C君。

本期的编程挑战是要实现一个和呼叫转移系统相关的逻辑。根据个人的度假时间安排和呼叫转移设置,返回呼叫转移的个数和“深度”。[/size]

[b][size=large]输入[/size][/b]

[size=medium]第一行给出一个整数N,代表从第二行开始有多少个度假安排。

每个度假安排为单独一行,其中包括4个数字:第一个数字是被叫人的4位数电话号码,第二个数字是呼叫转移至的4位数电话号码, 第三个数字是起始时间 ( 用天数计算),最后一个数字是度假时间的有效期(用天数计算)。

最后一行是开始日期。

请注意:
1) 这里的时间日期是基于天数顺序。1代表第一天,2代表第二天,依次类推。这里没有月份和年这样的时间单位,统一用天数来作为度假的日期安排。(天数最高是32位无符号整数的最大值)

2) 输入的呼叫转移不会出现环路。如描述中所举例, A君转到B君,B君再转到C君。但C君不会转到A君。对于有环路的输入,检测并提示输入环路错误,这点不作要求。当然,如果你的程序可以检测这种环路,并提示错误, 当然更好。

3)不能同时从一个号码转移到多个号码。如描述中所举例, A君转到B君,A君不能同时又转移到C君。[/size]

[b][size=large]输出[/size][/b]

[size=medium]基于开始度假的日期 (输入数据的最后一行), 你的程序必须打印输出2行信息。
[/size]

1)当天设置了多少个呼叫转移
2)当天最长的呼叫转移是多长次 ( A君转到B君,B君再转到C君。这个是2次呼叫转移)


[size=medium]示例

(请注意:这个仅仅是示例数据,它们是为了方便大家理解题目而添加的,你的代码不能仅解析这5行示例数据)[/size]

[b][size=large]1. 输入示例[/size][/b]

3
0000 0001 1 3
0001 4964 2 1
4964 0005 2 3
2


[size=large][b]2. 输出示例[/b][/size]


第 2 天共有 3 个呼叫转移设置
第 2 天最长的呼叫转移是 3 次



[size=medium]//第 2 天为什么有 3 个呼叫转移?
如果你没有看懂,这里解释一下: “ 0000 0001 1 3 ” 这个是3天有效,所以,第二天这个呼叫转移还有效。“0001 4964 2 1” 和 “4964 0005 2 3“ 都是第二天设置的,有效期分别是1和3天。所以,第 2 天共有 3 个呼叫转移设置。


------------------------------------------------------------------------
[color=darkred]今天暂时先做到能输出基本结果,回路的情况明天再加![/color][/size]



-module(call_sys).
-author('NoDurex<nodurex.zhang@gmail.com>').

-compile(export_all).

init() ->
{ok, IODevice} = file:open('b.dat', [read]),
{ok, Content} = io:read(IODevice, ''),
Content.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Main method %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
extract_data() ->
[Inters, Changes, AfterTime] = init(),
NotBus = case erlang:length(Changes) == Inters of
true ->
[{Key, TurnKey} ||
{Key, TurnKey, FromDay, Days} <- Changes,
FromDay + Days - AfterTime >= 0];
false ->
error
end,
loop(NotBus, NotBus, 0).

%% get Name from List
get(Name, NotBus) ->
%% not very good
A = [{K, T} || {K, T} <- NotBus, Name =:= K],
case erlang:length(A) > 0 of
true ->
[{X, Y}] = A,
{X, Y};
false ->
{}
end.


%% iterator
loop(LinkNotBus, NotBus, Numbers) ->
Lis = [Res || {_, T} <- LinkNotBus,(Res = get(T, NotBus)) /= {}],
ResultNumber = Numbers + 1,
case erlang:length(Lis) > 0 of
true ->
loop(Lis, NotBus, ResultNumber);
false ->
io:format('most times of change call is ~p ~n', [ResultNumber])
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值