Bir sonraki “ilginç” zamanı bulun


9

Bugün saatime tam olarak 11:11:11'de baktım (ve bugün 1/11; 2011 değil çok kötü) ve bu beni düşündürdü: Biliyorum! Ben bundan bir kod golf soru yapmak gerekir! Ben bir salakım.

Her neyse, göreviniz girdi olarak bir saat, dakika ve saniye almak ve bir sonraki "ilginç" zamanı çıkarmaktır. Burada ilginç olanları şu adımlar olarak tanımlayacağım:

  1. Saati, dakikayı ve saniyeyi birleştirin. (Örneğin, 4:14:14'te, bu 41414 olurdu.)
  2. Tüm dizenin uzunluğunu kapsayan bir, iki veya üç kişilik ardışık gruplar olup olmadığını kontrol edin. Örneğin [41][41][4], örnek zaman içinde bulabilirim (grup dizeden erişemezse, sadece bu örnekte yaptığım gibi kesin). Başka bir örnek: Söz başında ilk örnekte zamanında, öyle olurdu [1][1][1][1][1][1], [11][11][11]ya da [111][111].
  3. Dizeden sonuna kadar devam eden ardışık bir grup var mı? Eğer öyleyse, zaman "ilginç!" Aksi halde değil.

Giriş herhangi bir makul biçimde olabilir, ancak sabit olarak kodlanmamalıdır. Çıktı ayrıca makul bir formatta olabilir ve girişle aynı formatta olması gerekmez.

Herhangi bir nedenle ağ erişimini kullanırsanız, ağdan indirilen tüm baytlar puanınıza dahil edilir.

Bu ; bayt cinsinden en kısa kod kazanır.


1
Kasım değil, Ocak: P
Volatilite

@Volatility Whoops, yazım hatası :-P sabit
Kapı tokmağı

1
Ağ erişim kısıtlamasını seviyorum.
Kyle Kanos

1
Kod, yalnızca 12 saatlik bir saati dikkate almalı mıdır? Örneğin, 24 saatlik bir saatte 14:14:14 ilginç bir zaman olurdu ama 12 saatlik bir saatte o kadar da ilginç olmaz (2:14:14)
Kevin Anderson

Yanıtlar:


2

J, 113 99 90

Muhtemelen hala oldukça golf edilebilir.

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

Bir vektörü (h m s)girdi olarak alır ve vektörü çıktıyla aynı biçimde döndürür.

Örnekler:

   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

Bunu yapmanın bir yolu bu.

    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]

Örnekler

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

Örnek bir çalışma yayınlayabilir misiniz? Haskell hakkında clueless var, bu yüzden giriş / çıkış nasıl çalışır, vb hiçbir fikrim yok :-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}]&

Bir sonraki ilginç zamanın desenini döndürür:

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

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

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

a_ zamanın sonunu gösterir.


1

Lua

Bazı gereksinimlerden emin olmadığım için dört farklı çözümüm var.

Sürüm 1: 0'ların kaldırılması, komut satırı girişi ve os.time () yedeklemesi (315)

Minimize edilmiş:

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

Yorumlarla birlikte tam sürüm:

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

Diğer sürümler çok benzer, bu yüzden sadece küçültülmüş sürümleri göndereceğim:

Sürüm 2: komut satırı girişi yok (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

Sürüm 3: 0 kaldırma yok, komut satırı girişi ile (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

Sürüm 4: süslü şeylerden hiçbiri (0 kaldırma veya komut satırı girişi yok) (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

Kullanım talimatları

Bir terminalde çalıştırın (sürüm 1 ve 3)

lua interesting.lua HOURS MINUTES SECONDS

ya da sadece

lua interesting.lua

Sistem saatinin kapanmasını istiyorsanız.

Özellik eksiksizliği için bir ödül var mı? : P

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.