Равновесие колебаний

15

У нас есть объекты, которые колеблются между двумя целочисленными точками [l, r]со скоростью одна единица за единицу времени, начиная с lon t=0. Вы можете предположить l < r. Например, если объект колеблется [3, 6], тогда мы имеем:

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

И т.д. Но объекты колеблются непрерывно, поэтому у нас также есть t=0.5 -> 3.5и t=3.7 -> 5.3.

Учитывая, что два объекта колеблются между [l1, r1], [l2, r2]определяют, существует ли когда-либо такое время t, когда два объекта занимают одну и ту же позицию. Вы берете взятие l1, r1, l2, r2в любом удобном формате и выводите любые истинные / ложные значения.


Истинные входы:

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

Ложные входы:

[[0, 3], [3, 5]] 
[[0, 2], [2, 4]]
[[5, 8], [9, 10]]
[[6, 9], [1, 2]]
[[1, 3], [2, 6]]
orlp
источник
так что это заостренная волна, а не синусоида, верно?
HyperNeutrino
Для справки это испытание обратитесь к этой игре , где вы должны определить, можно ли перепрыгнуть с одного блока на другой.
user202729
@HyperNeutrino Правильно.
17
Может ли ложное значение быть 0правдивым целым положительным числом или оно должно быть последовательным. Более того, может ли ложь быть пустым списком, а правдивым - непустым списком?
мистер Xcoder
3
Хороший ложный тест [[1,3],[2,6]]: это искажает эвристику «интервалы перекрываются и имеют разную длину».
Миша Лавров

Ответы:

6

Шелуха , 13 байт

VEΣUẊeTmȯ…¢mD

Принимает ввод в формате [[l,r],[L,R]]. Возвращает 0для ложных случаев и положительное целое для истинных случаев. Попробуйте онлайн!

объяснение

Основные идеи

  1. Столкновение может происходить только по целочисленной или полуцелой координате.
  2. Достаточно смоделировать систему, пока не встретится повторение двух последовательных состояний.

Вот аннотированный код.

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
источник
Гладкий ответ. Почему вам нужно удвоить каждый? Разве это означает, что выражение «столкновения могут происходить только с целыми или половинными числами» в «столкновения могут происходить только с целыми числами»?
Иона
@ Джона Да, именно так.
Згарб
2

JavaScript (ES6), 104 100 байт

Наивная реализация, которая просто запускает симуляцию. Принимает (a, b, c, d) в качестве 4 различных переменных.

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

Контрольные примеры

Arnauld
источник
2

Wolfram Language (Mathematica) , 77 69 61 байт

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

Чистая функция, принимающая четыре аргумента в l1, r1, l2, r2качестве входных данных: например, [0,3,2,4]когда интервалы [0,3]и [2,4].

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

Как это устроено

Чтобы получить точку, [a,b]близкую к точке, в [c,d]предположении a<c<b<d, что мы хотим иметь нечетное кратное в b-aпределах b-cчетного кратного d-c. Если b-aесть больше факторов, 2чем d-c, мы можем сделать это точно: будет время, когда первая точка находится на, bа вторая точка на c, и тогда мы в хорошей форме. Если нет, то лучшее, что мы можем сделать, это GCD b-aи d-c.

Миша лавров
источник
1

JavaScript (ES6), 89 байт

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

Принимает в l1,r1,l2,r2качестве отдельных аргументов. Пояснение: симуляция гарантированно будет повторяться через (r1-l1)*(r2-l2)*2единицу времени (или ее коэффициент); gвычисляет смещение соответствующего объекта через i/2единицу времени, поэтому iнеобходимо увеличить до (r1-l1)*(r2-l2)*4.

Нил
источник
1

05AB1E , 12 10 14 байтов

+4 байта для обработки отрицательных диапазонов

Возвращает 0, если ложь, или положительное целое число в противном случае

Используйте идею Згарба об удвоении значений, чтобы упростить обнаружение одной и той же позиции

Спасибо @ Zacharý за указание на мои ошибки

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

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

Пояснения:

Ä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
scottinet
источник
Я не думаю, что это будет работать для больших диапазонов списков, потому что 100 кажется довольно произвольным.
Захари
@ Zacharý Спасибо! Я исправил это очень неэффективно, так как теперь списки повторяются слишком много раз. :-)
scottinet
На самом деле, это может не работать до сих пор (я не буду пытаться понять, как, потому что это займет слишком много времени, и, честно говоря, списки должны быть крошечным диапазоном и ОГРОМНЫМ диапазоном из того, что я думаю, не будет работать )
Захари
@ Zacharý Это должно работать для произвольных больших положительных целых чисел, поскольку наихудший случай будет, [[0,n],[n-1, n]]и даже в этом случае второй список будет повторяться достаточно много раз (и более), чтобы первый достиг своей верхней границы. Но я забыл учесть отрицательные числа: [[-100, 1], [0, 1]]не работает. Исправление это стоило 4 байта :-(
scottinet