次の「興味深い」時間を見つける


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
11月ではなく1月です:P
ボラティリティ

@ボラティリティおっと、タイプミス:-P修正
ドアノブ

1
ネットワークアクセス制限が好きです。
カイルカノス2014年

1
コードは12時間制の時間のみを考慮すべきですか?たとえば、24時間制の場合、14:14:14は興味深い時間ですが、12時間制の場合はそれほど興味深いものではありません(2:14:14)
Kevin Anderson

回答:


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

Haskell- 227223

それはそれを行う1つの方法です。

    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
ドアノブ

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

ルア

いくつかの要件について確信が持てなかったため、4つの異なるソリューションを用意しています。

バージョン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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.