厄运的钟针


9

您被拴在椅子上。您的下方是一座巨大的火山。旁边的12小时时钟不祥的滴答作响,您会看到它的导线从背面一直延伸到一条链,这将使您掉入地球的中心。记录到时钟上是一个注释:

每个钟针都有一个电极。当两个时钟指针位于相同的位置时,电源流动并且您死亡。也就是说,除非您能告诉我确切的发生时间,否则要精确到分钟。

您有一台知道所有编程语言的计算机。您需要创建最短的(这是,并且禁止标准漏洞)程序,并告诉邪恶的科学家现在几点了。您的程序应输入(以任何方式)由小时和分钟组成的输入。它应返回发生的下一个小时和分钟(以任何方法)。

根据OEIS页面,十一个重叠时间是:

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.

下一次将是12:00:00。此挑战不需要秒及其小数部分。只需四舍五入到最近的分钟。

测试用例:

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)

该程序可以是函数,也可以是完整程序。我不在乎您选择0:00还是12:00,两者都是可以接受的。祝好运!


评论不作进一步讨论;此对话已转移至聊天
Mego

Answers:


6

JavaScript(Node.js)54 47字节(四舍五入到最接近的整数)

-7个字节。谢谢@ user202729

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

在线尝试!


JavaScript(Node.js)40 33 44字节(向0舍入)

-3个字节,感谢@Arnauld

-4个字节,感谢@Kevin Cruijssen

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

说明

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

旁注:我很确定这可以被数学知识更强的人打败。我几乎不知道如何相加和相乘

在线尝试!


这看起来不正确的,如果你把一个真实的时钟是如何工作的付诸行动:datagenetics.com/blog/november12016/index.html
夜间2

您有一些舍入错误。05:00应该输出05:27但输出05:25,而06:45应该输出07:38但输出07:35以下是有用的oeis序列:A178181
Kevin Cruijssen

1
@LuisfelipeDejesusMunoz我给出的两个测试用例现在确实正确,但是您11:56似乎输出00:05而不是00:00(或12:00)。
凯文·克鲁伊森

@KevinCruijssen完成。我认为a=(a+=b>=a*5)%12可以稍微缩短一点,但是我不太擅长
Luis felipe De jesus Munoz '18

1
是不是Math.round(x)0|x+.5
user202729

5

J,31个字节

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

在线尝试!

在J中对数字进行四舍五入的方法是加0.5和减(<.)。占用太多字节...


说明

12 60&#. (混合基准转换)从[小时,分钟]数组转换为从0:00开始经过的分钟。

请注意,从0:00开始,每12/11小时(即720/11分钟),两只手重叠一次。

因此,给定分钟值,将其四舍五入至最接近的720/11倍数(与自身不同)。可以*用11/720(J有理数字面量11r720)来实现,取下<.,递增>:,然后乘以720/11。

请注意,“乘以11/720”和“乘以720/11”是2个反向操作,以及“从[小时,分钟]转换为经过的分钟数”,反之亦然。幸运的是,J已内置&.(在下面),在应用转换后它可以反转某些动作。

之后,只需进行四舍五入:0.5 +然后<.


5

R,68字节

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

在线尝试!

  • -2个字节,感谢Giuseppe
  • +7个字节,因为缺少舍入:(

利用等式:

same_position_minutes = 720/11 * index

其中index第一个重叠位置(00:00)为0,第二个重叠位置为1,依此类推...


1
我认为您周围有一组多余的括号(a[...]...c(60,1))
朱塞佩

@Giuseppe:是的,你是对的...谢谢!
digEmAll

@digEmAll这为给出了错误的答案6:30 > 6:33
mbomb007 '18

@ mbomb007:您说得对,已解决;)
digEmAll

4

R,88字节

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)

在线尝试!

将时间增加一分钟。检查角度。如果距离不够近,则循环播放直至找到解决方案。


1
呵呵,这是很酷的方法。我从未想过要模拟实际的时钟!
Redwolf Programs '18


2

Java 8,89 82字节

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

固定。稍后再查看是否可以打高尔夫球(可能通过移植另一个答案)。

在线尝试。

说明:

去做


与您提出的答案相同的问题(显然)-例如:f.apply(56).apply(10)收益11 59
乔纳森·艾伦

@JonathanAllan固定。会看看我是否可以删除后一些字节..
凯文Cruijssen

@KevinCruijssen这为给出了错误的答案6:30 > 6:33
mbomb007 '18

@ mbomb007我知道。在解决此问题之前,我正在等待OP的响应。是否允许地板,圆形,天花板或两者都允许(如果我要发布挑战,我将使用第四个选项,但让我们先等待OP)。
凯文·克鲁伊森

@KevinCruijssen由于OP评论,测试用例已被编辑为问题。使用round的最常见定义,OP的意图很明确。
mbomb007 '18

2

Apl(Dyalog Unicode),28字节

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

在线尝试!


说明

((⍳11),⍪0,+\∊5/⊂5 6)是指针重叠的时间矩阵(打印在tio链接的末尾),
(⍸⌷1⊖⊣)⎕找到输入在矩阵中的时间间隔,并在该矩阵下方的索引回绕。


2

C#(.NET Core),70字节

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

在线尝试!

我认为它可以通过所有测试用例。尽管h = 11的情况有点丑陋

说明:

(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
}

这为给出了错误的答案6:30 > 6:33
mbomb007 '18

@ mbomb007谢谢,我将对此进行看看。在添加重叠时间的完整列表之前,我做了第一次尝试。
F.Carette

现在应该可以了。由于我们没有关于currentTime == overlayTime情况下如何处理的明确说明,因此在这些情况下我返回当前时间(给定(1,5)返回“ 1:5”而不是“ 2:11”) 。
F.Carette

1

JavaScript,41个字节

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


1

果冻,25个字节

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

在线尝试!

单声道链接,该链接将时间作为两个整数列表,并返回与下一次触摸手指的时间对应的两个整数列表。


0

Perl 6、43字节

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

在线尝试!

一个匿名的无论如何的lambda,它接受两个表示小时和分钟的整数,并以相反的顺序返回小时和分钟。现在,当您输入对齐时间时,它是输出下一个对齐时间还是保持在同一时间,并不一致。我正在等待OP对此事做出回应,但现在我将其视为未定义。

说明

(* *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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.