Równość oscylacji

15

Mamy obiekty, które oscylują między dwoma punktami całkowitymi, [l, r]z prędkością jednej jednostki na jednostkę czasu, zaczynając lod t=0. Możesz założyć l < r. Na przykład, jeśli obiekt oscyluje dalej [3, 6], mamy:

t=0 -> 3
t=1 -> 4
t=2 -> 5
t=3 -> 6
t=4 -> 5
t=6 -> 4
t=7 -> 3
t=8 -> 4

Itd. Ale obiekty oscylują w sposób ciągły, więc mamy również t=0.5 -> 3.5i t=3.7 -> 5.3.

Biorąc pod uwagę, że dwa obiekty oscylują między [l1, r1], [l2, r2]określ, czy kiedykolwiek istnieje ttaki czas , że oba obiekty mają tę samą pozycję. Ty sprawiają podjąć l1, r1, l2, r2w dowolnym, wygodnym formacie, a wyjście żadnych truthy / wartości falsy.


Prawdziwe dane wejściowe:

[[3, 6], [3, 6]]
[[3, 6], [4, 8]]
[[0, 2], [2, 3]]
[[0, 3], [2, 4]]
[[7, 9], [8, 9]]

Fałszywe dane wejściowe:

[[0, 3], [3, 5]] 
[[0, 2], [2, 4]]
[[5, 8], [9, 10]]
[[6, 9], [1, 2]]
[[1, 3], [2, 6]]
orlp
źródło
więc to spiczasta fala, a nie sinusoida, prawda?
HyperNeutrino,
Aby zapoznać się z tym wyzwaniem, zapoznaj się z tą grą , w której musisz sprawdzić, czy możliwe jest przeskakiwanie z jednego bloku do drugiego.
user202729,
@HyperNeutrino poprawnie.
orlp
Czy wartość fałsz może być 0i rzeczywiście dowolną liczbą całkowitą dodatnią, czy też musi być spójna. Co więcej, czy fałszem może być pusta lista, a tak naprawdę dowolna niepusta lista?
Pan Xcoder,
3
Dobry test [[1,3],[2,6]]fałszowania to: fałszuje heurystykę „odstępy nakładają się i nie są tej samej długości”.
Misza Ławrow

Odpowiedzi:

6

Łuska , 13 bajtów

VEΣUẊeTmȯ…¢mD

Pobiera dane wejściowe w formacie [[l,r],[L,R]]. Zwraca 0dla instancji fałszywych i dodatnia liczba całkowita dla instancji zgodnych z prawdą. Wypróbuj online!

Wyjaśnienie

Główne pomysły to

  1. Zderzenie może się zdarzyć tylko przy współrzędnej całkowitej lub pół-całkowitej.
  2. Wystarczy symulować system, aż napotkamy powtórzenie dwóch kolejnych stanów.

Oto kod z adnotacjami.

VEΣUẊeTmȯ…¢mD  Implicit input, say [[0,2],[2,3]]
       mȯ      For both pairs do:
           mD   Double each: [[0,4],[4,6]]
          ¢     Cycle: [[0,4,0,4..],[4,6,4,6..]]
         …      Rangify: [[0,1,2,3,4,3,2,1,0,1,2..],[4,5,6,5,4,5,6..]]
      T        Transpose: [[0,4],[1,5],[2,6],[3,5],[4,4],[3,5],[2,6]..
    Ẋe         Adjacent pairs: [[[0,4],[1,5]],[[1,5],[2,6]],[[2,6],[3,5]],[[3,5],[4,4]]..
   U           Prefix of unique elements: [[[0,4],[1,5]],[[1,5],[2,6]],[[2,6],[3,5]],[[3,5],[4,4]]..[[1,5],[0,4]]]
  Σ            Concatenate: [[0,4],[1,5],[1,5],[2,6],[2,6],[3,5],[3,5],[4,4]..[1,5],[0,4]]
VE             Index of first pair whose elements are equal (or 0 if not found): 8
Zgarb
źródło
Zręczna odpowiedź. Dlaczego musisz podwoić każdy z nich? Czy to zmienia zdanie „kolizje mogą wystąpić tylko przy liczbach całkowitych lub pół liczbach całkowitych” na „kolizje mogą się zdarzyć tylko przy liczbach całkowitych”?
Jonasz
@Jonah Tak, dokładnie.
Zgarb
2

JavaScript (ES6), 104 100 bajtów

Naiwna implementacja, która po prostu uruchamia symulację. Trwa (a, b, c, d) jako 4 różne zmienne.

(a,b,c,d)=>(g=(X,Y)=>x==y|x+X==y&(y+=Y)==x||(x+=X)-a|y-c&&g(x>a&x<b?X:-X,y>c&y<d?Y:-Y))(1,1,x=a,y=c)

Przypadki testowe

Arnauld
źródło
2

Wolfram Language (Mathematica) , 77 69 61 bajtów

If[#>#3,#0[##3,#,#2],(z=GCD[x=#-#2,#3-#4])Mod[x/z,2]<=#2-#3]&

Czysta funkcja przyjmująca cztery argumenty l1, r1, l2, r2jako dane wejściowe: np. [0,3,2,4]Kiedy przedziały są [0,3]i [2,4].

Wypróbuj online!

Jak to działa

Aby uzyskać punkt [a,b]bliski punktu [c,d], zakładając a<c<b<d, że chcemy uzyskać nieparzystą wielokrotność w b-aobrębie b-cparzystej wielokrotności d-c. Jeśli b-ama więcej czynników 2niż d-c, możemy sprawić, że stanie się to dokładnie: nadejdzie czas, kiedy pierwszy punkt będzie w, ba drugi punkt w c, a następnie będziemy w dobrej formie. Jeśli nie, to najlepsze, co możemy zrobić, to GCD z b-ai d-c.

Misza Ławrow
źródło
1

JavaScript (ES6), 89 bajtów

(a,b,c,d)=>[...Array((b-=a)*(d-=c)*4)].some((g=e=>i/e&2?e-i/2%e:i/2%e,i)=>a+g(b)==c+g(d))

Przyjmuje się l1,r1,l2,r2za osobne argumenty. Objaśnienie: Symulacja gwarantuje powtórzenie po (r1-l1)*(r2-l2)*2jednostkach czasu (lub ich współczynniku); goblicza przesunięcie odpowiedniego obiektu po i/2jednostkach czasu, więc imusi być w zakresie do (r1-l1)*(r2-l2)*4.

Neil
źródło
1

05AB1E , 12 10 14 bajtów

+4 bajty do obsługi ujemnych zakresów

Zwraca 0, jeśli fałsz, lub dodatnią liczbę całkowitą w przeciwnym razie

Wykorzystaj pomysł Zgarba na podwojenie wartości, aby ułatwić wykrywanie tej samej pozycji

Dzięki @ Zacharý za wskazanie moich błędów

ÄZU\·εXиŸ}øüQO

Wypróbuj online!

Objaśnienia:

ÄZU\·εXиŸ}øüQO 
ÄZU\            Store in X the largest absolute number in the lists
    ·           Double lists ([3,6],[4,8] => [6,12],[8,16])
     ε   }      For each...
      X             Push X
       и            List-repeat that much times ([6,12]*12 => [6,12,6,12,6,...])
        Ÿ           Rangify ([6,12,6,...] => [6,7,8,9,10,11,12,11,...])
          ø     Zip lists ([6,7,8,...],[8,9,10,...] => [6,8],[7,9],[8,10],...)
           üQ   1 if both elements of a pair are equal, 0 otherwise
             O  Sum result list (=0 if the same position is never shared)
                Implicit output
szkocki
źródło
Nie sądzę, że to zadziała dla dużych zakresów list, ponieważ 100 wydaje się dość arbitralne.
Zacharý
@ Zacharý Thanks! Naprawiłem to w bardzo nieskuteczny sposób, ponieważ teraz listy są powtarzane zbyt wiele razy. :-)
scottinet
W rzeczywistości może to nie zadziałać (nie będę się zastanawiać, jak to zrobić, ponieważ zajęłoby to zbyt długo i szczerze mówiąc, listy musiałyby być małym zasięgiem i OGROMNYM zasięgiem z tego, co moim zdaniem nie zadziała )
Zacharý
@ Zacharý Powinno to działać dla dowolnych dużych liczb całkowitych dodatnich, ponieważ najgorszy byłby to przypadek, [[0,n],[n-1, n]]a nawet w takim przypadku druga lista byłaby powtarzana wystarczająco długo (i więcej), aby pierwsza osiągnęła górną granicę. Ale zapomniałem wziąć pod uwagę liczby ujemne: [[-100, 1], [0, 1]]nie działa. Naprawienie go kosztem 4 bajtów :-(
scottinet