Kesetaraan osilasi

15

Kami memiliki objek yang berosilasi antara dua titik integer [l, r],, dengan kecepatan satu unit per unit waktu, mulai dari lpada t=0. Anda mungkin berasumsi l < r. Misalnya, jika suatu objek berosilasi [3, 6], maka kita memiliki:

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

Dll Tapi objek berosilasi terus menerus, jadi kami juga punya t=0.5 -> 3.5dan t=3.7 -> 5.3.

Dengan adanya dua objek yang berosilasi di antara [l1, r1],, [l2, r2]tentukan apakah ada waktu tsedemikian rupa sehingga kedua objek memiliki posisi yang sama. Anda mengambil l1, r1, l2, r2dalam format apa pun yang nyaman, dan menampilkan nilai kebenaran / kepalsuan apa pun.


Masukan yang benar:

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

Masukan palsu:

[[0, 3], [3, 5]] 
[[0, 2], [2, 4]]
[[5, 8], [9, 10]]
[[6, 9], [1, 2]]
[[1, 3], [2, 6]]
orlp
sumber
jadi itu gelombang runcing bukan sinusoid, kan?
HyperNeutrino
Untuk referensi tantangan ini merujuk ke game ini , di mana Anda harus mendeteksi apakah mungkin untuk melompat dari satu blok ke yang lain.
user202729
@HyperNeutrino Benar.
orlp
Dapatkah nilai palsu menjadi 0dan kebenaran bilangan bulat positif atau harus konsisten. Terlebih lagi, bisakah palsu menjadi daftar kosong dan benar-benar menjadi daftar kosong?
Tn. Xcoder
3
Tes kepalsuan yang baik adalah [[1,3],[2,6]]: ini memalsukan heuristik "intervalnya tumpang tindih dan tidak sama panjangnya".
Misha Lavrov

Jawaban:

6

Sekam , 13 byte

VEΣUẊeTmȯ…¢mD

Mengambil input dalam format [[l,r],[L,R]]. Pengembalian 0untuk instance palsu dan bilangan bulat positif untuk instance kebenaran. Cobalah online!

Penjelasan

Gagasan utamanya adalah

  1. Tabrakan hanya dapat terjadi pada koordinat bilangan bulat atau setengah bilangan bulat.
  2. Ini cukup untuk mensimulasikan sistem sampai pengulangan dua negara berturut-turut ditemui.

Berikut kode yang dianotasi.

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
sumber
Jawaban yang licin. Mengapa Anda perlu menggandakan masing-masing? Apakah itu untuk mengubah pernyataan "tumbukan hanya dapat terjadi pada bilangan bulat atau setengah bilangan bulat" menjadi "tumbukan hanya dapat terjadi pada bilangan bulat"?
Jonah
@ Jonah Ya, tepatnya.
Zgarb
2

JavaScript (ES6), 104 100 byte

Implementasi naif yang hanya menjalankan simulasi. Mengambil (a, b, c, d) sebagai 4 variabel berbeda.

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

Uji kasus

Arnauld
sumber
2

Bahasa Wolfram (Mathematica) , 77 69 61 byte

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

Fungsi murni mengambil empat argumen l1, r1, l2, r2sebagai input: misalnya, [0,3,2,4]ketika intervalnya adalah [0,3]dan [2,4].

Cobalah online!

Bagaimana itu bekerja

Untuk mendapatkan titik di [a,b]dekat titik di [c,d], dengan asumsi a<c<b<d, kita ingin beberapa aneh b-adalam b-csebuah beberapa bahkan d-c. Jika b-amemiliki lebih banyak faktor2 daripada d-c, kita dapat mewujudkannya dengan tepat: akan ada saat ketika titik pertama di bdan titik kedua di c, dan kemudian kita berada dalam kondisi yang baik. Jika tidak, maka yang terbaik yang bisa kita lakukan adalah GCD dari b-adan d-c.

Misha Lavrov
sumber
1

JavaScript (ES6), 89 byte

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

Dibawa l1,r1,l2,r2sebagai argumen terpisah. Penjelasan: Simulasi dijamin akan diulang setelah (r1-l1)*(r2-l2)*2unit waktu (atau faktornya); gmenghitung offset objek yang sesuai setelah i/2unit waktu, jadi iperlu berkisar hingga (r1-l1)*(r2-l2)*4.

Neil
sumber
1

05AB1E , 12 10 14 byte

+4 byte untuk menangani rentang negatif

Kembalikan 0 jika falsy, atau bilangan bulat positif sebaliknya

Gunakan ide Zgarb tentang menggandakan nilai untuk membuat deteksi posisi yang sama lebih mudah

Terima kasih kepada @ Zacharý karena menunjukkan kesalahan saya

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

Cobalah online!

Penjelasan:

Ä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
sumber
Saya tidak berpikir ini akan bekerja untuk rentang daftar besar, karena 100 tampaknya cukup arbitrer.
Zacharý
@ Zacharý Terima kasih! Saya sudah memperbaikinya dengan cara yang sangat tidak efektif, karena sekarang daftar terlalu sering diulang. :-)
scottinet
Sebenarnya, ini mungkin tidak bekerja lagi (saya tidak akan repot-repot untuk mencari tahu bagaimana, karena itu akan memakan waktu terlalu lama, dan sejujurnya, daftar tersebut harus berupa rentang kecil dan rentang BESAR dari apa yang saya pikir tidak akan berhasil) )
Zacharý
@ Zacharý Ini harus bekerja untuk bilangan bulat positif besar yang sewenang-wenang, karena kasus terburuk adalah [[0,n],[n-1, n]]dan bahkan dalam kasus itu, daftar kedua akan diulangi cukup banyak (dan lebih banyak) untuk yang pertama mencapai batas atasnya. Tapi saya lupa memperhitungkan angka negatif: [[-100, 1], [0, 1]]tidak berfungsi. Memperbaikinya dengan biaya 4 byte :-(
scottinet