Ręce zegara zagłady

9

Jesteś przykuty do krzesła. Pod tobą jest ogromny wulkan. 12-godzinny zegar obok ciebie tyka złowieszczo i widzisz, że ma druty prowadzące od tyłu do łańcucha, który zrzuci cię na środek ziemi. Taśma do zegara jest notatką:

Każda wskazówka zegara ma elektrodę. Kiedy obie wskazówki zegara są w tej samej pozycji, moc płynie i umierasz. To znaczy, chyba że możesz mi powiedzieć dokładny czas, że to nastąpi, do najbliższej minuty.

Masz komputer, który zna każdy język programowania. Musisz stworzyć najkrótszy (to jest, a standardowe luki są zabronione) program, który możesz, i powiedz złemu naukowcowi, która będzie godzina. Twój program powinien pobierać dane wejściowe (dowolną metodą), składające się z godziny i minuty. Powinien zwrócić następną godzinę i minutę (dowolną metodą), że tak się stanie.

Według strony OEIS jedenaście czasów nakładania się wynosi:

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.

Następnym razem będzie 12:00:00. Sekundy i ich ułamkowe części nie są potrzebne do tego wyzwania. Po prostu zaokrąglij do najbliższej minuty.

Przypadki testowe:

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)

Program może być funkcją lub pełnym programem. Nie obchodzi mnie, czy wybierzesz, 0:00czy 12:00i oba są dopuszczalne. Powodzenia!

Programy Redwolf
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Mego,

Odpowiedzi:

6

JavaScript (Node.js) , 54 47 bajtów (zaokrąglić do najbliższego)

-7 bajtów. Dzięki @ user202729

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

Wypróbuj online!


JavaScript (Node.js) , 40 33 44 bajty (zaokrągla w kierunku 0)

-3 bajty dzięki @Arnauld

-4 bajty dzięki @Kevin Cruijssen

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

Wyjaśnienie

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

Uwaga dodatkowa: Jestem prawie pewien, że może to być golf dla kogoś o większej wiedzy z matematyki. Ledwo wiem, jak sumować i pomnażać

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
Nie wygląda to dobrze, jeśli weźmiesz pod uwagę działanie prawdziwego zegara: datagenetics.com/blog/november12016/index.html
Noc
Wystąpiły błędy w zaokrąglaniu. 05:00powinny zamiast tego generować dane 05:27wyjściowe 05:25, a zamiast tego 06:45powinny generować dane 07:38wyjściowe 07:35. Oto może przydatna sekwencja oeis: A178181
Kevin Cruijssen
1
@LuisfelipeDejesusMunoz Dwa podane przeze mnie przypadki testowe są rzeczywiście poprawne, ale 11:56wydaje się, że dane wyjściowe 00:05zamiast 00:00(lub 12:00).
Kevin Cruijssen
@KevinCruijssen Gotowe. Myślę, że a=(a+=b>=a*5)%12można to trochę skrócić, ale nie jestem w tym zbyt dobry
Luis Felipe De Jesus Munoz
1
Nie jest Math.round(x)tak 0|x+.5?
user202729,
5

J , 31 bajtów

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

Wypróbuj online!

Sposób na zaokrąglenie liczby w J polega na dodaniu 0.5i zabraniu głosu ( <.). Zajmuje zbyt wiele bajtów ...


Wyjaśnienie

12 60&#. (konwersja mieszanej zasady) konwertuje z tablicy [godzina, minuta] na minutę minioną od 0:00.

Zauważ, że od 0:00, co 12/11 godzin (czyli 720/11 minut), obie ręce nakładają się jeden raz.

Dlatego, biorąc pod uwagę wartość minuty, po prostu zaokrągl ją w górę do najbliższej wielokrotności 720/11 (różnej od siebie). Można to osiągnąć przez *11/720 (J ma literę wymierną 11r720), zabiera głos <., zwiększa >:, a następnie pomnoża przez 720/11.

Zauważ, że „pomnóż przez 11/720” i „pomnóż przez 720/11” to 2 działania odwrotne, a także „przelicz z [godziny, minuty] na liczbę minionych minut” i odwrotnie. Na szczęście J ma wbudowaną &.funkcję (under), która odwraca niektóre działania po zastosowaniu transformacji.

Następnie wykonaj zaokrąglenie: 0.5 +wtedy <..

użytkownik202729
źródło
5

R , 68 bajtów

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

Wypróbuj online!

  • -2 bajty dzięki Giuseppe
  • +7 bajtów z powodu brakującego zaokrąglenia :(

Wykorzystanie równania:

same_position_minutes = 720/11 * index

gdzie index0 dla pierwszej nakładającej się pozycji (00:00), 1 dla drugiej i tak dalej ...

digEmAll
źródło
1
Myślę, że masz wokół siebie obcy zestaw nawiasów(a[...]...c(60,1))
Giuseppe
@Giuseppe: tak, masz rację ... dzięki!
digEmAll
@digEmAll To daje złą odpowiedź na 6:30 > 6:33.
mbomb007,
@ mbomb007: masz rację, naprawiono;)
digEmAll
4

R , 88 bajtów

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)

Wypróbuj online!

Zwiększ czas o jedną minutę. Sprawdza kąt. Jeśli nie jest wystarczająco blisko, pętle aż do znalezienia rozwiązania.

JayCe
źródło
1
To fajny sposób na zrobienie tego. Nigdy nie myślałem o symulowaniu rzeczywistego zegara!
Programy Redwolf
3

Python 3 , 80 78 bajtów

To moje pierwsze zgłoszenie, więc konstruktywna krytyka jest mile widziana :)

-2 bajty dzięki @Jo King

def f(h,m):n=65.45;r=round(((60*h+m)//n%11+1)*n);print('%i:%02i'%(r//60,r%60))

Wypróbuj online! (78) Wypróbuj online! (80)

Czarna sowa Kai
źródło
2
Witamy w PPCG! Dobra pierwsza odpowiedź!
mbomb007,
2

Java 8, 89 82 bajtów

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

Naprawiony. Zobaczę, czy mogę później zagrać w golfa (prawdopodobnie przesyłając inną odpowiedź) ..

Wypróbuj online.

Wyjaśnienie:

DO ZROBIENIA

Kevin Cruijssen
źródło
Ten sam problem (oczywiście) jak przesłana przez Ciebie odpowiedź - np .: f.apply(56).apply(10)dochody11 59
Jonathan Allan
@JonathanAllan Naprawiono.
Zobaczę,
@KevinCruijssen To jest zła odpowiedź na pytanie 6:30 > 6:33.
mbomb007,
@ mbomb007 Wiem. Przed naprawieniem czekam na odpowiedź OP. Czy powinniśmy mieć podłogę, okrągły, sufit, czy oba są dozwolone (gdybym wysłał wyzwanie, użyłbym czwartej opcji, ale najpierw poczekajmy na OP).
Kevin Cruijssen
@KevinCruijssen Przypadek testowy został edytowany w pytaniu z powodu komentarza OP . Używając najczęstszej definicji rundy , intencja PO jest jasna.
mbomb007,
2

Apl (Dyalog Unicode) , 28 bajtów

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

Wypróbuj online!


Wyjaśnienie

((⍳11),⍪0,+\∊5/⊂5 6)to macierz czasów, w których dłonie zachodzą na siebie (wydrukowane na końcu łącza tio),
(⍸⌷1⊖⊣)⎕znajduje przedział, w którym dane wejściowe znajdują się w macierzy, i indeksy pod nimi zawijają się wokół.

jslip
źródło
2

C # (.NET Core) , 70 bajtów

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

Wypróbuj online!

Myślę, że przechodzi wszystkie testy. Chociaż przypadek h = 11 jest trochę brzydki

Wyjaśnienie:

(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
}
F. papieros
źródło
To daje złą odpowiedź na pytanie 6:30 > 6:33.
mbomb007,
@ mbomb007 Dzięki, zamierzam rzucić na to okiem. Zrobiłem pierwszą próbę przed dodaniem pełnej listy czasów nakładania się.
F.Carette
Teraz powinno być dobrze. Ponieważ nie mamy jasnej instrukcji, co robić w przypadkach, gdy currentTime == overlapTime, zwracam bieżący czas w tych przypadkach (dane (1,5) zwracają „1: 5”, a nie „2:11”) .
F.Cigarette
1

JavaScript, 41 bajtów

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

tsh
źródło
1

Galaretka , 25 bajtów

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

Wypróbuj online!

Łącze monadyczne, które zajmuje czas jako listę dwóch liczb całkowitych i zwraca listę dwóch liczb całkowitych odpowiadającą następnemu dotknięciu rąk.

Nick Kennedy
źródło
0

Perl 6 , 43 bajtów

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

Wypróbuj online!

Anonimowa cokolwiek lambda, która bierze dwie liczby całkowite reprezentujące godziny i minuty i zwraca godziny i minuty w odwrotnej kolejności. W tej chwili nie jest spójne, gdy wprowadzasz wyrównany czas, niezależnie od tego, czy wyświetla następny wyrównany czas, czy pozostaje na tym samym. Czekam na OP, aby odpowiedzieć na tę sprawę, ale teraz traktuję to jako niezdefiniowane.

Wyjaśnienie

(* *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
Jo King
źródło