Keluarkan jam pada 90 derajat

26

Hari ini ketika bermain dengan anak-anak saya, saya memperhatikan bahwa mainan yang tampaknya sederhana di taman menyembunyikan tantangan.

Jam

Roda memiliki segitiga yang mengarah ke angka, tetapi juga memiliki tiga lingkaran yang mengarah ke angka setiap 90 derajat dari yang pertama. Begitu:

Tantangan (sangat sederhana)

Diberikan bilangan bulat antara 1 dan 12 (yang ditunjukkan oleh segitiga) dalam bentuk apa pun yang dapat diterima, menghasilkan juga dalam bentuk apa pun yang dapat diterima dan memesan tiga angka yang ditunjukkan oleh lingkaran (yang setiap 90 derajat).

Uji kasus

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

Ini adalah , jadi semoga kode terpendek untuk setiap bahasa menang!

Charlie
sumber
Bisakah kita mengambil input sebagai 0-diindeks? Seperti 0 -> 4, 7, 10,?
Tn. Xcoder
8
@ Mr.Xcoder maaf, kali ini saya akan mengatakan tidak.
Charlie
3
Apakah ini tantangan keempat sekarang berdasarkan pada beberapa kegiatan yang melibatkan anak-anak Anda? : P
FlipTack
3
@FlipTack Mungkin kita perlu tag yang terinspirasi oleh anak-anak;)
Steadybox
6
@FlipTack Saya kehilangan hitungan. :-) Tetapi mengingat bahwa saya menghabiskan sebagian besar waktu luang saya dengan anak-anak saya, tebak dari mana inspirasi saya berasal ...
Charlie

Jawaban:

9

Jelly , 8 byte

12Rṙ’m3Ḋ

Tautan monadik yang mengambil nomor dan mengembalikan daftar nomor.

Cobalah online! atau lihat semua kasing .

Bagaimana?

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]
Jonathan Allan
sumber
Solusi alternatif: 12Rṙm-3Ḋ(output dalam urutan terbalik)
user202729
6

MATL , 9 byte

I:I*+12X\

Cobalah online!

Penjelasan

Pertimbangkan input 4sebagai exmaple.

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]
Luis Mendo
sumber
6

R ,  29  28 byte

Terima kasih kepada @Giuseppe karena menghemat satu byte!

function(n)(n+1:3*3-1)%%12+1

Cobalah online!

Steadybox
sumber
5

APL + MENANG, 13 byte

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

Penjelasan:

⎕ 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.
Graham
sumber
Cukup rapi. Saya suka pendekatan rotasi yang diindeks
Uriel
4

JavaScript (ES6), 29 byte

Mirip dengan jawaban xnor .

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

Demo

Arnauld
sumber
Saya n=>[3,6,9].map(v=>(v+n)%12)kemudian menyadari bahwa ia mengembalikan 0, bukan 12 ...
ericw31415
@ ericw31415 Sebenarnya, pendekatan pertama saya adalah n=>[3,6,9].map(v=>(v+n)%12||12)(tapi itu 31 byte).
Arnauld
4

Oktaf , 25 byte

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

Cobalah online!

Fungsi anonim yang cukup sederhana.

Kami pertama kali membuat array [1:12 1:12]- jadi dua salinan dari set angka lengkap. Kemudian kita indeks untuk memilih nilai x+3, x+6, x+9, di mana xinput angka.

Oktaf adalah 1-diindeks, jadi kita cukup memilih elemen array berdasarkan input (meskipun jujur ​​0-diindeks akan menggunakan jumlah byte yang sama di sini)

Ini tampaknya menggunakan metode yang unik untuk jawaban lain karena dengan memiliki dua salinan array, kita tidak harus membungkus indeks menggunakan modulo.

Tom Carpenter
sumber
Sangat bagus, tetapi pendekatan mod "membosankan" lebih pendek! Cobalah online!
Giuseppe
@ Giuseppe lol, saya yakin saya mencoba menggunakan moddan tidak bisa membuatnya lebih pendek. Sudah selesai dilakukan dengan baik! Jangan ragu untuk memposting sebagai jawaban.
Tom Carpenter
3

Befunge-93, 20 19 18 bytes

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

Cobalah online!

Penjelasan

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. 

Ini bergantung pada perilaku khusus untuk penerjemah referensi: pada akhir file, &operator mengembalikan nilai terakhir yang dibaca. Itu sebabnya kita dapat dengan aman membaca kembali jam dari stdin pada setiap iterasi dari loop.

James Holderness
sumber
Rapi. Saya tidak tahu &melakukan itu
Jo King
3
@JoKing Secara teknis ini adalah bug pada interpreter, efek samping terkait lainnya yang &juga dapat digunakan sebagai jenis penghasil angka acak satu kali . Itu kurang dapat diandalkan, karena tergantung pada kompiler yang digunakan untuk membangunnya. Saat ini sedang bekerja pada TIO, tetapi ada saat ketika Dennis berubah ke versi gcc yang berbeda dan kami kehilangan fungsi itu untuk sementara waktu.
James Holderness
2

Japt, 11 byte

3ÆU±3 uC ªC

Cobalah


Penjelasan

Input bilangan bulat implisit U. Hasilkan 3 elemen array ( ) dan, untuk setiap elemen, bertambah U3 ( U±3), modulo oleh 12 ( uC) dan, karena 12%12=0, kembalikan hasilnya ATAU 12 ( ªC).

Shaggy
sumber
2

Brain-Flak , 84 byte

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

Cobalah online!

Setidaknya saya mengalahkan solusi wajah Doorknob ...

Penjelasan:

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

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

END LOOP: >[()])}<>
MegaTom
sumber
2

Pyth , 12 byte

%R12+LQ*R3S3    

Cobalah online!

Dave
sumber
1
Selamat datang di situs ini! :)
DJMcMayhem
1

Bersih , 44 byte

import StdEnv
@n=[(n+i)rem 12+1\\i<-[2,5,8]]

Cobalah online!

Suram
sumber
1

Pushy , 12 byte

258s{K+12%h_

Cobalah online!

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 byte

Alternatif untuk jumlah byte yang sama:

12R{:{;$...#

Cobalah online!

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
sumber
1

C # (.NET Core) , 42 byte

h=>new[]{(2+h)%12+1,(5+h)%12+1,(8+h)%12+1}

Cobalah online!

Pada dasarnya hanya sebagian dari banyak jawaban lain untuk C #.

Ayb4btu
sumber
1

K (oK) , 11 byte

Larutan:

1+12!2 5 8+

Cobalah online!

Contoh:

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

Penjelasan:

Ini adalah solusi pertama yang muncul di benak saya. Mungkin bukan yang terbaik atau terpendek.

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
sumber
1

GolfScript, 46 byte

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

Ini adalah pertama kalinya saya melakukan golf kode, jadi dengan kurangnya pengalaman saya, saya mungkin tidak menemukan solusi terbaik, tetapi saya harus memulai suatu tempat, kan?

Cobalah online atau coba semua kasing

QunSyBer
sumber
Halo, selamat datang di situs ini! Ini sepertinya jawaban pertama yang bagus :) Sayangnya, saya tidak tahu apa-apa tentang skrip golf, tetapi Anda mungkin bisa mendapatkan beberapa tips di sini
DJMcMayhem
1

PHP, 37 +1 byte

while($i++<3)echo(~-$argn+=3)%12+1,_;

Jalankan sebagai pipa dengan -nRatau coba online .

Titus
sumber
1

wajah , 96 94 byte

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

Ini hanya menambah dua, mod dengan 12, menambahkan satu lagi, dan mencetak. Kemudian ia melakukannya dua kali lagi.

Versi yang dikomentari:

(%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 )

Cobalah online! (Baris baru tambahan diperlukan di TIO karena bug yang telah diperbaiki di versi wajah yang lebih baru.)

Gagang pintu
sumber
Membuat variabel yang memegang nilai 3 m3*33memungkinkan Anda untuk mengganti tiga +nn1dengan satu +nn3 tio.run/...
Kritixi Lithos
@Cowsquack Perhatikan bahwa output di tautan Anda salah.
Gagang Pintu
1

Keempat (gforth) , 39 byte

Input diambil dari stack dan output ditempatkan di stack

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

Cobalah online!

Penjelasan

 : 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
sumber
0

Haskell , 29 byte

-2 byte terima kasih kepada Laikoni.

f n=[mod(n+i)12+1|i<-[2,5,8]]

Cobalah online!

Tidak terlalu asli, tidak ...

benar-benar manusiawi
sumber
0

Bahasa Wolfram (Mathematica) 35 byte

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

Di atas menegaskan, dalam notasi infiks, apa yang dapat dinyatakan lebih jelas sebagai

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

RotateLeftberputar Range[12], urutan 1,2, ... 12, ke kiri dengan nomor input. Slot[1]atau #memegang nomor input, n.

Misalnya, dengan n = 4,

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

mengembalikan daftar

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

Take...{3,9,3} mengembalikan setiap elemen ketiga dalam daftar itu dari posisi 3 hingga posisi 9, yaitu

{7, 10, 1}
DavidC
sumber
34 byte
user202729
0

Windows Batch, 137 125 111 68 byte

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

Pelabuhan add value to input and mod 12 + 1

stevefestl
sumber