Вывести часы на 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-indexed? Нравится 0 -> 4, 7, 10?
г-н Xcoder
8
@ Mr.Xcoder извини, на этот раз я скажу нет.
Чарли
3
Является ли это четвертой задачей, основанной на некоторых действиях с участием ваших детей? : P
FlipTack
3
@FlipTack Возможно, нам нужен тег, вдохновленный детьми;)
Steadybox
6
@FlipTack Я потерял счет. :-) Но, учитывая, что я проводил большую часть своего свободного времени со своими детьми, угадайте, откуда у меня вдохновение ...
Чарли

Ответы:

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
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.
Грэхем
источник
Довольно аккуратно. Мне нравится этот подход с индексированным вращением
Уриэль
4

JavaScript (ES6), 29 байт

Похоже на ответ xnor .

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

демонстрация

Arnauld
источник
Я n=>[3,6,9].map(v=>(v+n)%12)тогда понял , что она возвращает 0, а не 12 ...
ericw31415
@ ericw31415 На самом деле мой первый подход был n=>[3,6,9].map(v=>(v+n)%12||12)(но это 31 байт).
Арно
4

Октава , 25 байт

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

Попробуйте онлайн!

Довольно простая анонимная функция.

Сначала мы создаем массив [1:12 1:12]- так две копии полного набора номера. Затем мы индексируем, чтобы выбрать значения x+3, x+6, x+9, где xвводится число.

Octave индексируется 1, так что мы можем просто выбирать элементы массива на основе входных данных (хотя, если честно, 0-индексированный использовал бы такое же количество байтов здесь).

Похоже, что для этого используется метод, который уникален для других ответов в том смысле, что, имея две копии массива, нам не нужно переносить индексы по модулю.

Том Карпентер
источник
Очень хорошо, но подход "скучный" мод короче! Попробуйте онлайн!
Джузеппе
@ Giuseppe LOL, я уверен, что пытался использовать 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, но было время, когда Деннис перешел на другую версию gcc, и мы на некоторое время потеряли эту функциональность.
Джеймс Холдернесс
2

Japt, 11 байт

3ÆU±3 uC ªC

Попытайся


объяснение

Неявный ввод целого числа U. Создайте 3 элемента array ( ) и, для каждого элемента, увеличьте Uна 3 ( U±3), по модулю на 12 ( uC) и, следовательно 12%12=0, верните результат ИЛИ 12 ( ªC).

мохнатый
источник
1

Напористый , 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
FlipTack
источник
1

K (ок) , 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
streetster
источник
1

GolfScript, 46 байт

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

Это первый раз, когда я занимаюсь гольфом кода, поэтому из-за недостатка опыта я, вероятно, не нашел лучшего решения, но мне нужно с чего-то начать, верно?

Попробуйте онлайн или попробуйте все случаи

QunSyBer
источник
Здравствуйте, добро пожаловать на сайт! Это выглядит как хороший первый ответ :) К сожалению, я ничего не знаю о 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

Это просто добавляет два, моды на 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 )

Попробуйте онлайн! (Конечный символ новой строки требуется на TIO из-за ошибки, исправленной в более новой версии face.)

Дверная ручка
источник
Создание переменной, которая содержит значение 3, m3*33позволяет заменить три +nn1s одним +nn3 tio.run/…
Kritixi Lithos
@ Cowsquack Обратите внимание, что вывод в вашей ссылке неправильный.
Ручка двери
1

Forth (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 
reffu
источник
0

Wolfram Language (Mathematica) 35 байтов

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

Вышесказанное утверждает, в инфиксной записи, что может быть выражено более четко как

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

RotateLeftвращается Range[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}
DavidC
источник
34 байта
user202729
0

Пакет Windows, 137 125 111 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

stevefestl
источник