Saatleri 90 derecede çıkar


26

Bugün çocuklarımla oynarken parkta görünüşte basit bir oyuncağın zorlandığını fark ettim.

Saat

Tekerleğin bir sayıya işaret eden bir üçgeni vardır, ancak aynı zamanda ilk olandan her 90 derecede bir sayıyı gösteren üç dairesi vardır. Yani:

Zorluk (gerçekten basit)

Herhangi bir kabul edilebilir biçimde 1 ila 12 (üçgenin işaret ettiği rakam) arasında bir tamsayı verilirse, kabul edilebilir bir formda da çıktı verin ve dairelerin işaret ettiği üç sayıyı (her 90 derecede bir) sıralayın.

Test durumları

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

Bu , bu yüzden her dil için en kısa kod kazanabilir!


Girdiyi 0 indeksli olarak alabilir miyiz? Gibi 0 -> 4, 7, 10mi?
Bay Xcoder

8
@ Mr.Xcoder üzgünüm, bu sefer hayır diyeceğim.
Charlie,

3
Bu şimdi dördüncü zorluk, çocuklarınızı içeren bir faaliyete dayanıyor mu? : P
FlipTack

3
@FlipTack Belki bir ilham veren çocuk etiketine ihtiyacımız var;)
Steadybox

6
@FlipTack Sayımı kaybettim. :-) Ama boş zamanımın çoğunu çocuklarımla geçirdiğim için ilham kaynağım nereden geliyor sanırım ...
Charlie

Yanıtlar:



9

Jöle , 8 bayt

12Rṙ’m3Ḋ

Bir sayı alan ve bir sayı listesi döndüren tek yönlü bir bağlantı.

Çevrimiçi deneyin! veya tüm davaları görün .

Nasıl?

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]

Alternatif çözüm: 12Rṙm-3Ḋ(ters sırayla çıktı)
user202729


6

MATL , 9 bayt

I:I*+12X\

Çevrimiçi deneyin!

açıklama

Girişi örnek 4olarak düşünün .

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 bayt

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

Açıklama:

⎕ 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.

Oldukça temiz. Bu endeksli rotasyon yaklaşımını seviyorum
Uriel


4

JavaScript (ES6), 29 bayt

Xnor'ın cevabına benzer .

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

gösteri


Daha n=>[3,6,9].map(v=>(v+n)%12)sonra 12 değil, 0 döndürdüğünü fark ettim ...
ericw31415

@ ericw31415 Aslında, ilk yaklaşımım n=>[3,6,9].map(v=>(v+n)%12||12)(ancak 31 bayt).
Arnauld,

4

Octave , 25 bayt

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

Çevrimiçi deneyin!

Oldukça basit anonim işlev.

Önce bir dizi oluştururuz [1:12 1:12]- yani tam sayı setinin iki kopyası. Sonra dizini giriyoruz , sayı girişi x+3, x+6, x+9nerede x?

Octave 1 indekslidir, bu yüzden girişi temel alan dizi elemanlarını seçebiliriz (dürüst olmak gerekirse, 0 indeksli olması durumunda burada aynı sayıda bayt kullanırdı).

Bu, dizinin iki kopyasını alarak, dizileri modulo kullanarak sarmamız gerekmediği için diğer cevaplara özgü bir yöntem kullanıyor gibi görünüyor.


Çok hoş, ama "sıkıcı" mod yaklaşımı daha kısa! Çevrimiçi deneyin!
Giuseppe

@Giuseppe lol, kullanmaya çalıştığımdan modve onu daha kısa hale getiremediğimden eminim . Aferin! Cevap olarak göndermekten çekinmeyin.
Tom Carpenter

3

Befunge-93, 20 19 18 bayt

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

Çevrimiçi deneyin!

açıklama

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. 

Bu, başvuru yorumlayıcısına özel davranışa dayanır: dosya sonunda, &işleç son okunan değeri döndürür. Bu nedenle, döngünün her yinelemesinde stdin'den gelen saati güvenle tekrar okuyabiliriz.


Temiz. Ben biliyorum vermedi &yaptım
Jo Kral

3
@JoKing Teknik olarak tercümandaki bir hatadır, bir başka bir defaya mahsus rasgele sayı üreteci& olarak da kullanılabilecek bir başka yan etkidir . Bu daha az güvenilirdir, çünkü onu oluşturmak için kullanılan derleyiciye bağlıdır. Şu anda TIO üzerinde çalışıyor, ancak Dennis'in farklı bir gcc sürümüne geçtiği bir zaman vardı ve bu işlevi bir süre kaybettik.
James Holderness


2

Japt, 11 bayt

3ÆU±3 uC ªC

Dene


açıklama

Tamsayının örtük girişi U. Bir 3 element array ( ) oluşturun ve her eleman için U3 ( U±3), modulo tarafından 12 ( uC) artırın 12%12=0ve sonuç olarak OR 12 ( ªC) değerini döndürün .






1

Pushy , 12 bayt

258s{K+12%h_

Çevrimiçi deneyin!

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 bayt

Aynı bayt sayısı için bir alternatif:

12R{:{;$...#

Çevrimiçi deneyin!

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 bayt

Çözüm:

1+12!2 5 8+

Çevrimiçi deneyin!

Örnekler:

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

Açıklama:

Aklıma ilk gelen çözüm buydu. En iyi ya da en kısa olmayabilir.

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 bayt

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

İlk defa kod golfü yapıyorum, bu yüzden deneyim eksikliği ile muhtemelen en iyi çözümü bulamadım, ancak bir yerden başlamam gerekiyor, değil mi?

Çevrimiçi deneyin ya da tüm vakaları deneyin


Merhaba, siteye hoşgeldiniz! Bu güzel bir ilk cevap gibi görünüyor :) Ne yazık ki, golf komut dosyası hakkında hiçbir şey bilmiyorum, ama burada
DJMcMayhem



1

yüz , 96 94 bayt

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

Bu sadece iki, 12'ye kadar mod ekler, bir tane daha ekler ve yazdırır. O zaman bunu iki kere daha yapar.

Yorumlanan sürüm:

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

Çevrimiçi deneyin! (Takip eden yeni satır, yüzün daha yeni bir sürümünde düzeltilen bir hata nedeniyle TIO'da gereklidir.)


Değeri 3 duraklatma bir değişken oluşturma m3*33üç değiştirmesini sağlar +nn1tek olan s +nn3 tio.run/...
Kritixi Lithos

@Cowsquack Bağlantınızdaki çıkışın yanlış olduğuna dikkat edin.
Doorknob

1

İleri (gforth) , 39 bayt

Giriş yığından alınır ve çıktı yığına yerleştirilir

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

Çevrimiçi deneyin!

açıklama

 : 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 Dili (Mathematica) 35 bayt

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

Yukarıdakiler, ek gösterimde, daha açık bir şekilde ne ifade edilebileceğini ileri sürer

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

RotateLeftdöner Range[12], sayı 1,2, ... 12, giriş numarasına göre sola doğru döner . Slot[1]veya #giriş numarasını tutar, n.

Örneğin, n = 4 ile

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

listeyi döndürür

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

Take...{3,9,3} bu listedeki her üçüncü öğeyi 3. konumdan 9. konuma, yani

{7, 10, 1}


0

Windows Toplu İşi, 137 125 111 68 bayt

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

Limanı add value to input and mod 12 + 1



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.