Kıyamet Saati


9

Bir sandalyeye zincirlenmişsin. Altında büyük bir volkan var. Yanınızda 12 saatlik bir saat uğursuzca keneler ve görüyorsunuz, arkadan bir zincire kadar uzanan ve sizi dünyanın ortasına bırakacak tellere sahip. Saate bantlanmış bir not:

Her saat ibresinin bir elektrotu vardır. Her iki saat ibresi aynı konumda olduğunda, güç akar ve ölürsünüz. Yani, bana bunun gerçekleşeceği kesin zamanı en yakın dakikaya söyleyemezseniz.

Her programlama dilini bilen bir bilgisayarınız var. En kısaını oluşturmanız gerekir (buve standart boşluklar yasaktır) program yapabilirsiniz ve kötü bilim insanına zamanın ne olacağını söyleyin. Programınız saat ve dakikadan oluşan herhangi bir yöntemle girdi almalıdır. Bunun gerçekleştiği bir sonraki saat ve dakikayı (herhangi bir yöntemde) döndürmelidir.

OEIS sayfasına göre , on bir çakışma süresi:

00:00:00 plus 0/11 s, 01:05:27 plus 3/11 s,
02:10:54 plus 6/11 s, 03:16:21 plus 9/11 s,
04:21:49 plus 1/11 s, 05:27:16 plus 4/11 s,
06:32:43 plus 7/11 s, 07:38:10 plus 10/11 s,
08:43:38 plus 2/11 s, 09:49:05 plus 5/11 s,
10:54:32 plus 8/11 s.

Bir dahaki sefere 12:00:00 olur. Bu meydan okuma için saniyeler ve bunların kesirli kısımlarına gerek yoktur. En yakın dakikaya yuvarlayın.

Test senaryoları:

0:00 (Or 12:00) > 1:05
1:00 > 1:05
11:56 > 12:00 (Or 0:00)
6:45 > 7:38
5:00 > 5:27
6:30 > 6:33 (round up)

Program bir işlev veya tam program olabilir. 0:00Veya seçerseniz umrumda değil 12:00ve her ikisi de kabul edilebilir. İyi şanslar!


Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
Mego

Yanıtlar:


6

JavaScript (Node.js) , 54 47 bayt (en yakın yuvarlanır)

-7 bayt. Teşekkürler @ user202729

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60+.5|0]

Çevrimiçi deneyin!


JavaScript (Node.js) , 40 33 44 bayt (0'a yuvarlar)

@Arnauld sayesinde -3 bayt

@Kevin Cruijssen sayesinde -4 bayt

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]

açıklama

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]    Full Code
a                                               Hours
   b                                            Minutes
    =>[                    ,               ]    return array with
       (a+=        )                            add to the current hour
           b>5.46*a                             1 if the minute's clock hand has 
                                                passed the hour's clock hand. Here we use
                                                equation 60*a/11 which is the same as 5.46*a
                    +a/11                       and add 1 when hour is 11
                         |0                     floor the result

                            a%12*65.46%60|0     Here we do equation ((720/11)*a) (mod 60)
                            a%12                In case of hour 12 we take 0
                                *65.46          multiply hour by 720/11 which can be shortened to
                                                65.46 to save 1 byte.
                                      %60       mod 60
                                         |0     floor the result

Yan not: Bunun matematikte daha fazla bilgiye sahip biri tarafından golf oynayabileceğinden eminim. Nasıl toplanacağını ve çarpılacağını zar zor biliyorum

Çevrimiçi deneyin!


Gerçek bir saatin nasıl işlediğini görürseniz bu doğru görünmüyor: datagenetics.com/blog/november12016/index.html
Night2

Bazı yuvarlama hatalarınız var. 05:00çıktılayacaktır 05:27ama çıkışlar 05:25yerine ve 06:45gerektiği çıkış 07:38ama çıkışlar 07:35yerine. İşte belki de yararlı bir oeis dizisi: A178181
Kevin Cruijssen

1
@LuisfelipeDejesusMunoz Verdiğim iki test vakası şu an gerçekten doğrudur, ancak (veya ) yerine 11:56çıktınız . 00:0500:0012:00
Kevin Cruijssen

@KevinCruijssen Tamamlandı. Bence a=(a+=b>=a*5)%12biraz kısaltmak olabilir ama ben bu konuda çok iyi değilim
Luis felipe De jesus Munoz

1
Math.round(x)Sadece değil 0|x+.5mi?
user202729

5

J , 31 bayt

0.5<.@+>:@<.&.(11r720*12 60&#.)

Çevrimiçi deneyin!

J'de bir sayıyı yuvarlamanın yolu 0.5zemini ( <.) eklemek ve almaktır . Çok fazla bayt alır ...


açıklama

12 60&#. (karma temel dönüşüm) [saat, dakika] dizisinden 0: 00'dan bu yana geçen dakikaya dönüştürür.

0: 00'dan başlayarak, her 12/11 saatte bir (yani 720/11 dakika), iki elin bir kez üst üste geldiğini unutmayın.

Bu nedenle, dakika değeri verildiğinde, sadece 720/11 (kendisinden farklı) en yakın katına yuvarlayın. Bu, *11/720 ile elde edilebilir (J rasyonel sayı değişmezine sahiptir 11r720), zemini alın <., >:artırın, sonra 720/11 ile çarpın.

"11/720 ile çarp" ve "720/11 ile çarp" ifadelerinin 2 ters işlem olduğunu ve "[saat, dakika] 'dan geçen dakika sayısına dönüştür" ve bunun tersi olduğunu unutmayın. Neyse ki J yerleşik&. bir dönüşüm uyguladıktan sonra bazı eylemleri tersine çeviren (altında).

Bundan sonra yuvarlamayı yapın: 0.5 +o zaman <..


5

R , 68 bayt

a=round(1:30*720/11);a[a>sum(scan()*c(60,1))][1]%/%c(60,1)%%c(12,60)

Çevrimiçi deneyin!

  • Giuseppe sayesinde -2 bayt
  • Eksik yuvarlama nedeniyle +7 bayt :(

Denklemin kullanılması:

same_position_minutes = 720/11 * index

nerede indexbirinci üst üste binme pozisyonu (00:00) için 0, ikincisi için 1 vb.


1
Sanırım etrafında çok sayıda parantez var(a[...]...c(60,1))
Giuseppe

@Giuseppe: evet, haklısın ... teşekkürler!
digEmAll

@digEmAll Bu yanlış cevap verir 6:30 > 6:33.
mbomb007

@ mbomb007: haklısın, düzeltildi;)
digEmAll

4

R , 88 bayt

i=scan();d=1+60*i[1]+i[2];while(abs(60*(h=d%/%60%%12)-11*(m=d%%60))>5){d=d+1};paste(h,m)

Çevrimiçi deneyin!

Süreyi bir dakika artır. Açıyı kontrol eder. Yeterince yakın değilse, bir çözüm bulunana kadar döngüler.


1
Ha, bunu yapmanın harika bir yolu. Asla gerçek bir saati simüle etmeyi düşünmemiştim!
Redwolf Programları


2

Java 8, 89 82 bayt

(h,m)->(m=m<(m=(int)(h%12*720d/11%60))?m:(int)(++h%12*720d/11%60))*0+h%12%11+" "+m

Sabit. Daha sonra golf (eğer başka bir cevap taşıyarak) olup olmadığını göreceksiniz ..

Çevrimiçi deneyin.

Açıklama:

YAPMAK


Aldığınız yanıtla aynı sorun (açıkçası) - örneğin: f.apply(56).apply(10)verimler11 59
Jonathan Allan

@JonathanAllan Düzeltildi. Bazı baytları daha sonra kaldırabilir miyim göreceksiniz ..
Kevin Cruijssen

@KevinCruijssen Bu yanlış cevap veriyor 6:30 > 6:33.
mbomb007

@ mbomb007 biliyorum. Bunu düzeltmeden önce OP'nin yanıtını bekliyorum. Zemin, yuvarlak, tavan veya her ikisine de izin verilmeli (ister meydan okumaydım, dördüncü seçeneği kullanırdım, ama önce OP'yi bekleyelim).
Kevin Cruijssen

@KevinCruijssen Test davası OP'nin bir yorumu nedeniyle soruya düzenlendi . Turun en yaygın tanımını kullanan OP'nin amacı açıktır.
mbomb007

2

Apl (Dyalog Unicode) , 28 bayt

((⍳11),⍪0,+\∊5/⊂5 6)(⍸⌷1⊖⊣)⎕

Çevrimiçi deneyin!


açıklama

((⍳11),⍪0,+\∊5/⊂5 6)ellerin üst üste bindirilmesinin (tio bağlantının sonunda basılmış olan)
(⍸⌷1⊖⊣)⎕girişin matriste bulunduğu aralığı ve altına sarılan endeksleri bulduğu zamanların bir matrisidir.


2

C # (.NET Core) , 70 bayt

(h,m)=>{h%=12;int n=(5*h+h/2)%60;return (m>n||h>10)?f(h+1,0):h+":"+n;}

Çevrimiçi deneyin!

Tüm test senaryolarını geçtiğini düşünüyorum. H = 11 olgusu çirkin olmasına rağmen

Açıklama:

(h,m)=>{ // Lambda receiving 2 integers
    h%=12; // Just to get rid of the 0/12 case
    int n=(5*h+h/2)%60; // get the minute at which the hands overlap 
                        //for current hour.
    return 
    (m>n||h>10)? // if current minute > n or h=11
        f(h+1,0) // it will happen next hour
    :
        h+":"+n; // return result
}

Bu yanlış cevap verir 6:30 > 6:33.
mbomb007

@ mbomb007 Teşekkürler, buna bir göz atacağım. Çakışma sürelerinin tam listesi eklenmeden önce ilk denemeyi yaptım.
F.Carette

Şimdi iyi olmalı. CurrentTime == overlapTime olduğu durumlarda ne yapacağımız hakkında net bir talimatımız olmadığından, bu durumlarda geçerli saati döndürdüm (verilen (1,5) "1: 5" döndürür, "2:11" döndürür) .
F.Carette

1

JavaScript, 41 bayt

p=>q=>(p+=q>=(5.5*p|0),p%=11,[p,5.5*p|0])


1

Jöle , 25 bayt

‘2¦ɓ;W}Ṣi¹ịḷø5,6ẋ5ÄĖØ0W¤;

Çevrimiçi deneyin!

İki tamsayı listesi olarak zaman alan ve ellerin bir sonraki dokunuşuna karşılık gelen iki tamsayı listesini döndüren monadik bir bağlantı.


0

Perl 6 , 43 bayt

(* *60+*+33).round(65.45).round.polymod(60)

Çevrimiçi deneyin!

Anonim Saat ve dakikayı temsil eden iki tamsayı alan ve saat ve dakikayı ters sırada döndüren her ne olursa olsun lambda. Şu anda, hizalanmış bir zaman girdiğinizde, bir sonraki hizalanmış zamanın çıktısını alması veya aynı saatte kalması tutarlı değildir. OP'yi bu konuya cevap vermesini bekliyorum, ama şu anda bunu tanımsız olarak görüyorum.

açıklama

(* *60+*+33)   # Converts the two inputs to number of minutes
            .round(65.45)   # Round to the nearest multiple of 65.45
                         .round  # Round to the nearest integer
                               .polymod(60) # Repeatedly modulo by 60 and return the list of results
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.