Temukan waktu "menarik" berikutnya

9

Saya kebetulan melirik arloji saya hari ini tepat jam 11:11:11 (dan hari ini 1/11; sayangnya ini bukan tahun 2011), dan itu membuat saya berpikir: Saya tahu! Saya harus membuat pertanyaan kode golf dari ini! Saya seorang dork.

Bagaimanapun, tantangan Anda adalah mengambil satu jam, menit, dan detik sebagai input, dan menghasilkan waktu "menarik" berikutnya. Di sini, saya akan mendefinisikan menarik sebagai langkah-langkah ini:

  1. Gabungkan jam, menit, dan detik. (Misalnya, pada 4:14:14, ini akan menjadi 41414.)
  2. Periksa grup berurutan satu, dua, atau tiga yang merentang panjang seluruh string. Sebagai contoh, saya dapat menemukan [41][41][4]dalam contoh waktu (jika grup tidak dapat mencapai melalui string, cukup potong seperti yang saya lakukan dalam contoh ini). Contoh lain: dalam waktu dalam contoh pertama saya di awal pertanyaan, akan [1][1][1][1][1][1], [11][11][11]atau [111][111].
  3. Apakah ada grup yang berurutan melewati string? Jika demikian, waktunya "menarik!" Kalau tidak, tidak.

Input dapat dalam format apa pun yang masuk akal , tetapi itu tidak boleh di-hardcode. Outputnya juga bisa dalam format yang masuk akal , dan tidak perlu dalam format yang sama dengan input.

Jika Anda menggunakan akses jaringan karena suatu alasan, semua byte yang diunduh dari jaringan dihitung dengan skor Anda.

Ini adalah ; kode terpendek dalam byte menang.

Gagang pintu
sumber
1
Ini Januari, bukan November: P
Volatilitas
@Volatility Whoops, :-P typo tetap
Doorknob
1
Saya suka pembatasan akses jaringan.
Kyle Kanos
1
Haruskah kode hanya mempertimbangkan waktu pada jam 12 jam? Sebagai contoh, pada jam 24 jam 14:14:14 akan menjadi waktu yang menarik tetapi tidak begitu menarik pada jam 12 jam (2:14:14)
Kevin Anderson

Jawaban:

2

J, 113 99 90

Mungkin masih cukup golf.

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

Mengambil vektor (h m s)sebagai input, dan mengembalikan vektor dalam format yang sama dengan output.

Contoh:

   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
Keriangan
sumber
1

Haskell - 227223

Itu salah satu cara melakukannya.

    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]

Contohnya

λ: i [11,11,11]
[11,21,1]
λ: i [4,14,14]
[4,14,41]
desir
sumber
Bisakah Anda memposting contoh lari? Saya tidak mengerti tentang Haskell jadi saya tidak tahu bagaimana cara kerja input / output, dll :-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}]&

Ini mengembalikan pola waktu menarik berikutnya:

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

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

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

a_ menandai akhir waktu.

ybeltukov
sumber
1

Lua

Saya punya empat solusi berbeda, karena saya tidak yakin tentang beberapa persyaratan.

Versi 1: penghapusan 0s, input baris perintah serta cadangan os.time () (315)

Diperkecil:

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

Versi lengkap dengan komentar:

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

Versi lain sangat mirip, jadi saya hanya akan memposting versi yang diperkecil:

Versi 2: tidak ada input baris perintah (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

Versi 3: tanpa penghapusan 0, dengan input baris perintah (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

Versi 4: tidak ada barang mewah (tidak ada 0 penghapusan atau input baris perintah) (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

Instruksi penggunaan

Di terminal, jalankan (versi 1 dan 3)

lua interesting.lua HOURS MINUTES SECONDS

atau hanya

lua interesting.lua

Jika Anda ingin mematikan jam sistem.

Apakah ada hadiah untuk kelengkapan fitur? : P

finnbar
sumber