寻找下一个“有趣的”时间


9

我今天恰好在11:11:11瞥了一眼手表(今天是1/11;可惜不是2011年),这让我开始思考:我知道!我应该对此提出一个编码问题!我是一个白痴。

无论如何,您面临的挑战是花费一个小时,一分钟和一秒作为输入,并输出下一个“有趣的”时间。在这里,我将定义有趣的步骤如下:

  1. 连接小时,分钟和秒。(例如,在4:14:14,则为41414。)
  2. 检查覆盖整个字符串长度的一组连续的1、2或3组。例如,我可以[41][41][4]在示例时间中找到(如果组无法通过字符串到达​​,请像在本示例中那样将其切断)。又如:在我的问题开始第一个例子的时候,这将是[1][1][1][1][1][1][11][11][11][111][111]
  3. 是否有一个连续的组贯穿整个字符串?如果是这样,那么时间是“有趣的!” 否则,不是。

输入可以采用任何合理的格式,但不得进行硬编码。输出也可以采用任何合理的格式,并且不必与输入采用相同的格式。

如果出于某种原因使用网络访问,则从网络下载的所有字节都将计入得分。

这是 ; 以字节为单位的最短代码获胜。


1
现在是一月,而不是十一月:P
波动性

@波动率高,错别字:-P固定
门把手

1
我喜欢网络访问限制。
Kyle Kanos 2014年

1
代码应该只考虑12小时制的时间吗?例如,在24小时制的14:14:14上会是一个有趣的时间,但在12小时制的2:14:14上却不是那么有趣
Kevin Anderson

Answers:


2

J,113 99 90

大概还是可以打高尔夫球的。

f=:t#:[:(>:^:([:(3&g+:2&g=.[:*/]=(]$)${.)@(":@{.,3}.7":100#.1,])t#:])^:_)1+(t=.24,2$60)#.]

将向量(h m s)作为输入,并以与输出相同的格式返回向量。

例子:

   f 0 0 0
0 1 0
   f 4 14 14
4 14 41
   f 23 59 59
0 0 0
   f 3 14 15
3 14 31

1

哈斯克尔- 227223

那是做到这一点的一种方式。

    import Data.List
e _ []=False
e f s=let (h,t)=f s in t`isPrefixOf`h||h`isPrefixOf`t&&e f t
i [a,b,s]=head[t|s<-[s+1..],f<-map splitAt[1..3],let m=b+s`div`60;h=a+m`div`60;t=[h`mod`24,m`mod`60,s`mod`60],e f$concatMap show t]

例子

λ: i [11,11,11]
[11,21,1]
λ: i [4,14,14]
[4,14,41]

您可以发布样品运行吗?我对Haskell一无所知,所以我不知道输入/输出的工作原理,等等:-P
Doorknob

1

Mathematica 125

F=Do[#~MatchQ~{#〚-1〛..,_}&&Break@#&@Partition[(i=IntegerDigits)@f[n~i~60,100],m,m,1,a_],
{n,#~(f=FromDigits)~60+1,7^6},{m,3}]&

它返回下一个有趣时间的模式:

F@{11, 11, 11}
F@{4, 14, 14}

{{1,1,2},{1,1,2}}

{{4,1,4},{4,1,a_}}

a_ 标志着时间的结束。


1

a

我不确定四种需求,因此我有四种不同的解决方案。

版本1:删除0,命令行输入以及os.time()备份(315)

最小化:

z=arg if z[1] then y={hour=z[1],min=z[2],sec=z[3],day=1,month=1,year=1}end h,g,e,u=os.date,os.time(y),":",tonumber while 1 do g=g+1 b,c,d=u(h("%H",g)),u(h("%M",g)),u(h("%S",g)) a=b..c..d for x=1,#a/2 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>math.ceil(#a/x) then print(b..e..c..e..d)return 1 end end end end

完整版带注释:

z=arg if z[1] then y={hour=z[1],min=z[2],sec=z[3],day=1,month=1,year=1}end --get command line arguments
h,g,e,u=os.date,os.time(y),":",tonumber --set up references, if command line arguments accepted use y else use current time
while 1 do
    g=g+1
    b,c,d=u(h("%H",g)),u(h("%M",g)),u(h("%S",g)) --get HH:MM:SS seperately (which allows removal of the zeroes with tonumber())
    a=b..c..d  --concat
    for x=1,#a/2 do  --check up to half of the string
        p=1
        for _ in a:gmatch(a:sub(1,x))do --for each match
            p=p+1  --count number of matches
            if p>math.ceil(#a/x) then print(b..e..c..e..d)return 1 end --if matches span entire string, cheer (and print in a pretty format)
        end
    end
end

其他版本非常相似,因此我将仅发布最小化版本:

版本2:无命令行输入(239)

h,g,e,u=os.date,os.time(),":",tonumber while 1 do g=g+1 b,c,d=u(h("%H",g)),u(h("%M",g)),u(h("%S",g)) a=b..c..d for x=1,#a/2 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>math.ceil(#a/x) then print(b..e..c..e..d)return 1 end end end end

版本3:不删除0,带有命令行输入(240)

z=arg if z[1] then y={hour=z[1],min=z[2],sec=z[3],day=1,month=1,year=1}end h,g=os.date,os.time(y) while 1 do g=g+1 a=h("%H%M%S",g) for x=1,3 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>6/x then print(h("%T",g))return 1 end end end end

版本4:没什么花哨的东西(没有0删除或命令行输入)(164)

h,g=os.date,os.time() while 1 do g=g+1 a=h("%H%M%S",g) for x=1,3 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>6/x then print(h("%T",g))return 1 end end end end

使用说明

在终端中运行(版本1和3)

lua interesting.lua HOURS MINUTES SECONDS

要不就

lua interesting.lua

如果您希望它关闭系统时钟。

功能完善有奖吗?:P

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.