以90度输出小时


26

今天,当我和孩子们玩耍时,我注意到公园里一个看似简单的玩具隐藏了一个挑战。

时钟

砂轮有一个三角形,指向一个数字,但也有三个圆,它们指向与第一个数字成90度角的数字。所以:

挑战(真的很简单)

给定任意可接受形式的1到12之间的一个整数(三角形所指向的那个),也可以按照可接受的形式输出并按圆圈所指示的三个数字(每90度对一个数字)进行排序。

测试用例

In       Out
1        4, 7, 10
2        5, 8, 11
3        6, 9, 12
4        7, 10, 1
5        8, 11, 2
6        9, 12, 3
7        10, 1, 4
8        11, 2, 5
9        12, 3, 6
10       1, 4, 7
11       2, 5, 8
12       3, 6, 9

这是,因此每种语言的最短代码可能会成功!


我们可以将输入作为0索引吗?喜欢0 -> 4, 7, 10吗?
Xcoder先生17年

8
@ Mr.Xcoder抱歉,这次我要说不。
查理

3
根据您孩子的一些活动,这是第四项挑战吗?:P
FlipTack

3
@FlipTack也许我们需要一个鼓舞
人心的

6
@FlipTack我记不清了。:-)但是,鉴于我大部分的业余时间都花在了我的孩子身上,所以我的灵感来自哪里?
Charlie

Answers:



9

果冻,8 字节

12Rṙ’m3Ḋ

单数链接,获取一个数字并返回一个数字列表。

在线尝试!或查看所有情况

怎么样?

12Rṙ’m3Ḋ - Link: number, n   e.g. 5
12       - literal twelve         12
  R      - range                  [1,2,3,4,5,6,7,8,9,10,11,12]
    ’    - decrement n            4
   ṙ     - rotate left            [5,6,7,8,9,10,11,12,1,2,3,4]
      3  - literal three          3
     m   - modulo slice           [5,8,11,2]
       Ḋ - dequeue                [8,11,2]

替代解决方案:(12Rṙm-3Ḋ输出顺序相反)
user202729 '17


6

MATL,9个字节

I:I*+12X\

在线尝试!

说明

以输入4为例。

I:     % Push [1 2 3]
       % STACK: [1 2 3]
I      % Push 3
       % STACK: [1 2 3], 3
*      % Multiply, element-wise
       % STACK: [3 6 9]
+      % Add implicit input, element-wise
       % STACK: [7 10 13]
12     % Push 12
X\     % 1-based modulus. Implicit display
       % STACK: [7 10 1]


5

APL + WIN,13字节

(⎕⌽⍳12)[3×⍳3]

说明:

⎕ Prompt for screen input of indicated time t

⍳12 Create a vector of integers from 1 to 12

⌽ Rotate the vector by t elements front to back

[3×⍳3] Select 3rd, 6th and 9th elements.

相当整洁。我喜欢这种分度轮换方法
Uriel


4

JavaScript(ES6),29个字节

xnor的答案类似。

n=>[2,5,8].map(k=>(n+k)%12+1)

演示版


n=>[3,6,9].map(v=>(v+n)%12)然后我意识到它返回0,而不是12 ...
ericw31415

@ ericw31415实际上,我的第一种方法是n=>[3,6,9].map(v=>(v+n)%12||12)(但这是31个字节)。
Arnauld

4

八度,25字节

@(x)[a=1:12 a](3+x:3:9+x)

在线尝试!

相当简单的匿名函数。

我们首先创建一个[1:12 1:12]- 的数组,以便完整数字集的两个副本。然后我们索引选择的值x+3, x+6, x+9,其中x数字输入。

八度是1索引的,因此我们可以根据输入简单地选择数组元素(尽管老实说0索引将在此处使用相同数量的字节)。

这似乎使用了其他答案所独有的方法,因为有了数组的两个副本,我们不必使用模来包装索引。


很好,但是“无聊”的mod方法更短!在线尝试!
朱塞佩

@Giuseppe大声笑,我敢肯定我尝试过使用mod并且不能使其更短。做得好!随意发布作为答案。
汤姆·卡彭特

3

Befunge-93,20个 19 18字节

852<_@#:.+1%+66+&p

在线尝试!

说明

852                   Push 8, 5 and 2 onto the stack - the offsets we're going to add.
   <                  Reverse direction, and start the main loop.
852                   Push 2, 5, and 8 onto the stack, but we don't actually want these.
                 p    So we use a "put" operation to drop the top three values.
                &     Read the hour from stdin.
               +      Add it to the topmost offset.
         +1%+66       Mod 12 and add 1 to get it in the range 1 to 12.
        .             Then output the result to stdout.
    _@#:              Exit if the next offset is zero (i.e. nothing more on the stack).
   <                  Otherwise start the main loop again. 

这取决于特定于引用解释器的行为:在文件结束时,&操作员返回最后读取的值。这就是为什么我们可以在循环的每次迭代中安全地从stdin重新读取小时的原因。


整齐。我不知道&
件事

3
@JoKing从技术上讲,这是解释器中的一个错误,另一个相关的副作用是,&它也可以用作一种一次性的随机数生成器。但是,这不太可靠,因为它取决于用来构建它的编译器。目前,它正在TIO上运行,但是有一段时间Dennis更改为其他版本的gcc,我们暂时失去了该功能。
James Holderness


2

Japt,11个字节

3ÆU±3 uC ªC

试试吧


说明

整数的隐式输入U。生成一个3元素数组(),并为每个元素增加U3(U±3),以12为模()取模,uC并且由于12%12=0返回结果OR 12(ªC)。


2

Brain-Flak,84字节

(()()()){({}<(()(){})(((()()()){}){}<>){(({})){({}[()])<>}{}}<>(([{}]{})<>)>[()])}<>

在线尝试!

至少我击败了Doorknob的面部解决方案 ...

说明:

LOOP 3 TIMES: (()()()){({}<

  n += 2:
   (()(){})
  push 12:
   (((()()()){}){}<>)
  n mod 12 + 1; pushing to both stacks:
   {(({})){({}[()])<>}{}}<>(([{}]{})<>)

END LOOP: >[()])}<>




1

Pushy,12个字节

258s{K+12%h_

在线尝试!

258            \ Push 258                            
   s           \ Split into digits, yielding [2, 5, 8]
    {K+        \ Add input to each
       12%     \ Modulo each by 12
          h    \ Increment each
           _   \ Print (space separated)

12字节

相同字节数的替代方法:

12R{:{;$...#

在线尝试!

12R            \ Push range(1, 12), inclusive
   {: ;        \ Input times do:
     {         \   Rotate left
       $       \ While there are items on stack:
        ...    \   Pop the top three
           #   \   Print top item


1

K(oK),11个字节

解:

1+12!2 5 8+

在线尝试!

例子:

1+12!2 5 8+1
4 7 10
1+12!2 5 8+2
5 8 11
1+12!2 5 8+3
6 9 12
1+12!2 5 8+4
7 10 1

说明:

这是我想到的第一个解决方案。可能不是最好的还是最短的。

1+12!2 5 8+ / the solution
     2 5 8+ / add 2, 5 and 8 to the input
  12!       / apply modulo 12 to the results
1+          / add 1

1

GolfScript,46个字节

~13,1>:x?:y;0:i;x y 3+12%=x y 6+12%=x y 9+12%=

这是我第一次进行代码高尔夫,所以由于缺乏经验,我可能找不到最佳的解决方案,但是我需要从某个地方入手,对吗?

在线尝试尝试所有情况


您好,欢迎光临本站!这看起来像是一个不错的第一答案:)不幸的是,我对golfscript一无所知,但您可能可以在这里
DJMcMayhem



1

96 94字节

(%d
@)\$*,c'$ooiim%*m1*6%+%%%11m!*mn*m~*3!m&!r!&!is!&$pn3!:L+nn1+nn1%nn%+nn1p~>$inw~>~o-!!1?!L

只需添加两个,mod乘12,再添加一个,然后打印即可。然后再执行两次。

评论版本:

(%d
@)

\$*,c'$ooii     ( store format string in $, ip in *, get stdin/out )
m%*m1*6%+%%%11  ( initialize constants, %=12, 1=1 )
m!*mn*m~*       ( malloc space for a counter, input var, and length )
3!m&!r!&!i      ( read into & )
s!&$pn          ( scan into n )
3!:L            ( start of main loop, executed thrice )
  +nn1+nn1      ( add 2 to n )
  %nn%+nn1      ( mod by 12 and add 1 more )
  p~>$in        ( sprintf n into > )
  w~>~o         ( output to stdout )
  -!!1          ( decrement counter )
?!L             ( conditional jump back to loop start )

在线尝试!(由于在较新版本的face中已修复了一个错误,因此在TIO上需要尾随换行符。)


创建一个包含值3的变量,m3*33您可以+nn1用一个+nn3 tio.run/…
Kritixi Lithos

@Cowsquack请注意,链接中的输出错误。
门把手

1

第四(gforth),39个字节

输入是从堆栈中取出的,输出是放在堆栈中的

: a 2 + 12 mod 1+ ; : f a dup a dup a ;

在线尝试!

说明

 : a 2 + 12 mod 1+ ; \ helper word to handle adding the hours
    2 +              \ Add 2 to the input
    12 mod           \ get the result modulo 12
    1+               \ add 1

 : f a dup a dup a ; \ word that calculates and outputs the result
    a dup            \ add 3 hours to the input and then duplicate the result
    a dup            \ add 3 hours to the duplicate then duplicate the result
    a                \ add 3 hours to the duplicate 



0

Wolfram语言(Mathematica)35字节

Range@12~RotateLeft~#~Take~{3,9,3}&

以上以中缀表示法断言可以更清楚地表示为

Function[Take[RotateLeft[Range[12],Slot[1]],List[3,9,3]]]

RotateLeftRange[12]将输入数字向左旋转1,2,... 12序列。 Slot[1]#保存输入数字n。

例如,当n = 4时

Function[RotateLeft[Range[12],4]]]

返回列表

{5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4}

Take...{3,9,3} 从位置3到位置9返回该列表中的每个第三个元素,即

{7, 10, 1}


0

Windows Batch,137125111 68字节

@set/ab=(%1+2)%%12+1,c=(%1+5)%%12+1,d=(%1+8)%%12+1
@echo %b% %c% %d%

的港口 add value to input and mod 12 + 1



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.