Jam Tangan Kiamat

9

Anda dirantai ke kursi. Di bawah Anda adalah gunung berapi besar. Jam 12 jam di sebelah Anda berdetak dengan sangat buruk, dan Anda melihat bahwa jam itu memiliki kabel yang mengarah dari belakang ke rantai, yang akan menjatuhkan Anda ke pusat bumi. Ditempel ke jam adalah catatan:

Setiap jarum jam memiliki elektroda. Ketika kedua jarum jam berada di posisi yang sama, daya mengalir dan Anda mati. Yaitu, kecuali jika Anda dapat memberi tahu saya waktu yang tepat bahwa ini akan terjadi, hingga menit terdekat.

Anda memiliki komputer yang tahu setiap bahasa pemrograman. Anda harus membuat program terpendek (ini adalah , dan celah standar dilarang) yang Anda bisa, dan beri tahu ilmuwan jahat berapa waktu yang akan datang. Program Anda harus mengambil input (dalam metode apa pun), yang terdiri dari jam dan menit. Seharusnya mengembalikan jam dan menit berikutnya (dalam metode apa pun) bahwa ini terjadi.

Menurut halaman OEIS , sebelas kali tumpang tindih adalah:

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.

Waktu berikutnya adalah 12:00:00. Detik dan bagian fraksinya tidak diperlukan untuk tantangan ini. Cukup bulat ke menit terdekat.

Kasus uji:

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 dapat berupa fungsi, atau program penuh. Saya tidak peduli jika Anda memilih 0:00atau 12:00, dan keduanya dapat diterima. Semoga berhasil!

Program Redwolf
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Mego

Jawaban:

6

JavaScript (Node.js) , 54 47 bytes (bulat ke terdekat)

-7 byte. Terima kasih @ user202729

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

Cobalah online!


JavaScript (Node.js) , 40 33 44 byte (putaran menuju 0)

-3 byte terima kasih kepada @Arnauld

-4 byte terima kasih kepada @Kevin Cruijssen

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

Penjelasan

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

Catatan: Saya cukup yakin ini bisa diturunkan oleh seseorang dengan pengetahuan lebih dalam matematika. Saya hampir tidak tahu bagaimana menjumlahkan dan memperbanyak

Cobalah online!

Luis felipe De jesus Munoz
sumber
Ini tidak beres jika Anda mempertimbangkan bagaimana jam nyata bekerja: datagenetics.com/blog/november12016/index.html
Night2
Anda memiliki beberapa kesalahan pembulatan. 05:00seharusnya output 05:27tetapi output 05:25, dan 06:45output 07:38tetapi output 07:35sebagai gantinya. Di sini barangkali urutan oeis yang berguna: A178181
Kevin Cruijssen
1
@LuisfelipeDejesusMunoz Dua test case yang saya berikan memang benar sekarang, tetapi 11:56sepertinya Anda akan menampilkan 00:05bukan 00:00(atau 12:00).
Kevin Cruijssen
@KevinCruijssen Selesai. Saya pikir a=(a+=b>=a*5)%12dapat dipersingkat sedikit tetapi saya tidak terlalu pandai dalam hal ini
Luis felipe De jesus Munoz
1
Tidak Math.round(x)hanya 0|x+.5?
user202729
5

J , 31 byte

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

Cobalah online!

Cara untuk membulatkan angka dalam J adalah menambahkan 0.5dan mengambil lantai ( <.). Terlalu banyak byte ...


Penjelasan

12 60&#. (konversi basis campuran) mengkonversi dari berbagai [jam, menit] ke menit yang berlalu sejak 0:00.

Perhatikan bahwa mulai dari 0:00, setiap 12/11 jam (yaitu, 720/11 menit), kedua tangan saling tumpang tindih satu kali.

Oleh karena itu, mengingat nilai menit, hanya membulatkannya ke kelipatan terdekat 720/11 (berbeda dari itu sendiri). Hal ini dapat dicapai dengan *dengan 11/720 (J memiliki bilangan rasional literal 11r720), mengambil lantai <., kenaikan >:, kemudian kalikan dengan 720/11.

Perhatikan bahwa "gandakan dengan 11/720" dan "gandakan dengan 720/11" adalah 2 tindakan terbalik, serta "konversi dari [jam, menit] ke jumlah menit yang dilalui" dan sebaliknya. Untungnya J memiliki built-in &.(bawah), yang membalikkan beberapa tindakan setelah menerapkan transformasi.

Setelah itu lakukan saja pembulatan: 0.5 +lalu <..

pengguna202729
sumber
5

R , 68 byte

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

Cobalah online!

  • -2 byte terima kasih kepada Giuseppe
  • +7 byte karena pembulatan yang hilang :(

Memanfaatkan persamaan:

same_position_minutes = 720/11 * index

di mana index0 untuk posisi tumpang tindih pertama (00:00), 1 untuk ke-2 dan seterusnya ...

menggali semua
sumber
1
Saya pikir Anda memiliki seperangkat tanda kurung di luar sana(a[...]...c(60,1))
Giuseppe
@ Giuseppe: ya, Anda benar ... terima kasih!
digEmAll
@digEmAll Ini memberikan jawaban yang salah untuk 6:30 > 6:33.
mbomb007
@ mbomb007: Anda benar, tetap;)
digEmAll
4

R , 88 byte

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)

Cobalah online!

Tambah waktu satu menit. Periksa sudutnya. Jika tidak cukup dekat, loop sampai solusi ditemukan.

JayCe
sumber
1
Huh, itu cara yang keren untuk melakukannya. Saya tidak pernah berpikir untuk mensimulasikan jam yang sebenarnya!
Program Redwolf
3

Python 3 , 80 78 byte

Ini adalah karya pertama saya, jadi kritik konstruktif disambut :)

-2 byte terima kasih kepada @ Jo King

def f(h,m):n=65.45;r=round(((60*h+m)//n%11+1)*n);print('%i:%02i'%(r//60,r%60))

Cobalah online! (78) Cobalah secara online! (80)

Black Owl Kai
sumber
2
Selamat datang di PPCG! Jawaban pertama yang bagus!
mbomb007
2

Java 8, 89 82 byte

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

Tetap. Akan melihat apakah saya bisa golf nanti (mungkin dengan memasukkan jawaban lain) ..

Cobalah online.

Penjelasan:

MELAKUKAN

Kevin Cruijssen
sumber
Masalah yang sama (jelas) sebagai jawaban yang Anda porting - misalnya: f.apply(56).apply(10)hasil11 59
Jonathan Allan
@ Jonathan Allan Diperbaiki. Akan lihat apakah saya dapat menghapus beberapa byte nanti ..
Kevin Cruijssen
@KevinCruijssen Ini memberikan jawaban yang salah 6:30 > 6:33.
mbomb007
@ mbomb007 saya tahu. Saya menunggu tanggapan OP sebelum memperbaikinya. Apakah kita harus lantai, putaran, langit-langit, atau keduanya diizinkan (jika saya akan memposting tantangan saya akan menggunakan opsi keempat, tapi mari kita tunggu OP dulu).
Kevin Cruijssen
@KevinCruijssen Kasus uji diedit menjadi pertanyaan karena komentar oleh OP . Menggunakan definisi putaran yang paling umum , maksud OP jelas.
mbomb007
2

Apl (Dyalog Unicode) , 28 byte

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

Cobalah online!


Penjelasan

((⍳11),⍪0,+\∊5/⊂5 6)adalah matriks waktu di mana tangan tumpang tindih (dicetak pada akhir tautan tio)
(⍸⌷1⊖⊣)⎕menemukan interval di mana input berada dalam matriks dan indeks di bawahnya membungkus.

jslip
sumber
2

C # (.NET Core) , 70 byte

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

Cobalah online!

Saya pikir itu melewati semua kasus uji. Meskipun kasus h = 11 agak jelek

Penjelasan:

(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
}
F.Carette
sumber
Ini memberikan jawaban yang salah untuk 6:30 > 6:33.
mbomb007
@ mbomb007 Terima kasih, saya akan melihat ini. Saya melakukan percobaan pertama sebelum daftar lengkap waktu yang tumpang tindih ditambahkan.
F.Carette
Seharusnya tidak apa-apa sekarang. Karena kami tidak memiliki instruksi yang jelas tentang apa yang harus dilakukan dalam kasus di mana currentTime == overlapTime, saya mengembalikan waktu saat ini dalam kasus-kasus ini (diberikan (1,5) pengembalian "1: 5" dan bukan "2:11") .
F.Carette
1

JavaScript, 41 byte

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

tsh
sumber
1

Jelly , 25 byte

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

Cobalah online!

Tautan monadik yang menggunakan waktu sebagai daftar bilangan bulat dua dan mengembalikan daftar bilangan bulat yang sesuai dengan waktu berikutnya tangan akan menyentuh.

Nick Kennedy
sumber
0

Perl 6 , 43 byte

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

Cobalah online!

Anonim Apapun lambda yang mengambil dua bilangan bulat mewakili jam dan menit dan mengembalikan jam dan menit dalam urutan terbalik. Saat ini tidak konsisten ketika Anda memasukkan waktu yang selaras, apakah itu menghasilkan waktu yang selaras berikutnya atau tetap pada waktu yang sama. Saya menunggu OP untuk menanggapi masalah itu, tetapi sekarang saya memperlakukannya sebagai tidak terdefinisi.

Penjelasan

(* *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
Jo King
sumber