Égalité d'oscillation


15

Nous avons des objets qui oscillent entre deux points entiers [l, r], à la vitesse d'une unité par unité de temps, à partir lde t=0. Vous pouvez supposer l < r. Par exemple, si un objet oscille [3, 6], alors nous avons:

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

Etc. Mais les objets oscillent continuellement, nous avons donc aussi t=0.5 -> 3.5et t=3.7 -> 5.3.

Compte tenu de deux objets oscillant entre [l1, r1], [l2, r2], déterminer si jamais il y a un temps ttel que les deux objets partagent la même position. Vous faites des prises l1, r1, l2, r2dans n'importe quel format pratique, et sortez toutes les valeurs véridiques / fausses.


Entrées véridiques:

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

Entrées fausses:

[[0, 3], [3, 5]] 
[[0, 2], [2, 4]]
[[5, 8], [9, 10]]
[[6, 9], [1, 2]]
[[1, 3], [2, 6]]
code-golf  array-manipulation  decision-problem  code-golf  math  number-theory  palindrome  integer-partitions  code-golf  math  decision-problem  geometry  code-golf  string  random  code-golf  ascii-art  code-golf  kolmogorov-complexity  primes  code-golf  kolmogorov-complexity  code-golf  graphical-output  code-golf  number-theory  primes  integer  factoring  code-golf  sequence  array-manipulation  integer  code-golf  array-manipulation  matrix  code-golf  sequence  binary  code-golf  game  cellular-automata  game-of-life  binary-matrix  code-golf  string  ascii-art  code-golf  random  generation  logic  code-golf  string  code-golf  code-golf  sequence  array-manipulation  random  apl  code-golf  code-golf  sequence  primes  code-golf  math  sequence  integer  code-golf  number  arithmetic  array-manipulation  decision-problem  code-golf  ascii-art  number  code-golf  restricted-source  quine  code-golf  chess  board-game  code-golf  math  sequence  code-golf  number  sequence  kolmogorov-complexity  code-golf  number  sequence  arithmetic  code-golf  math  number  alphabet  code-golf  ascii-art  classification  statistics  apl  code-golf  array-manipulation  matrix  code-golf  string  kolmogorov-complexity  code-golf  sequence  binary  base-conversion  binary-matrix  code-golf  string  classification  code-golf  tips  python  code-golf  combinatorics  binary  subsequence  restricted-time  code-golf  number  number-theory  code-golf  math  number  complex-numbers  code-golf  string  code-golf  string  code-golf  string  random  game  king-of-the-hill  python  code-golf  number  sequence  code-golf  number  sequence  code-golf  code-golf  math  number  array-manipulation  code-golf  array-manipulation  decision-problem  code-golf  string  code-golf  sequence  integer 

c'est donc une onde pointue pas une sinusoïde, non?
HyperNeutrino

Pour référence, ce défi se réfère à ce jeu , où vous devez détecter s'il est possible de sauter d'un bloc à l'autre.
user202729

@HyperNeutrino Correct.
orlp

La valeur de la falsification peut- 0elle être vraie et tout entier positif ou doit-elle être cohérente? Plus encore, la falsification peut-elle être la liste vide et la vérité peut-elle être une liste non vide?
M. Xcoder

3
Un bon test de falsification est [[1,3],[2,6]]: cela falsifie l'heuristique "les intervalles se chevauchent et ne sont pas de la même longueur".
Misha Lavrov

Réponses:



6

Husk , 13 octets

VEΣUẊeTmȯ…¢mD

Prend l'entrée au format [[l,r],[L,R]]. Renvoie 0pour les instances fausses et un entier positif pour les instances véridiques. Essayez-le en ligne!

Explication

Les principales idées sont

  1. Une collision ne peut se produire qu'à une coordonnée entière ou demi-entière.
  2. Il suffit de simuler le système jusqu'à ce qu'une répétition de deux états consécutifs soit rencontrée.

Voici le code annoté.

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

Réponse lisse. Pourquoi avez-vous besoin de doubler chacun? Est-ce pour transformer l'énoncé «les collisions ne peuvent se produire qu'à des nombres entiers ou demi-entiers» en «des collisions ne peuvent se produire qu'à des nombres entiers»?
Jonah

@Jonah Oui, exactement.
Zgarb

2

JavaScript (ES6), 104 100 octets

Une implémentation naïve qui exécute simplement la simulation. Prend (a, b, c, d) comme 4 variables distinctes.

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

Cas de test


2

Wolfram Language (Mathematica) , 77 69 61 octets

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

Une fonction pure prenant les quatre arguments l1, r1, l2, r2en entrée: par exemple, [0,3,2,4]lorsque les intervalles sont [0,3]et [2,4].

Essayez-le en ligne!

Comment ça fonctionne

Pour obtenir un point [a,b]près d'un point [c,d], en supposant a<c<b<d, nous voulons un multiple impair de l' b-aintérieur b-cd'un multiple pair de d-c. Si b-aa plus de facteurs 2que d-c, nous pouvons faire en sorte que cela se produise exactement: il y aura un moment où le premier point est au bet le deuxième point est c, et ensuite nous sommes en bonne forme. Sinon, le mieux que nous puissions faire est le GCD de b-aet d-c.


1

JavaScript (ES6), 89 octets

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

Prend l1,r1,l2,r2comme arguments séparés. Explication: La simulation est garantie de se répéter après les (r1-l1)*(r2-l2)*2unités de temps (ou un facteur correspondant); gcalcule le décalage de l'objet approprié après les i/2unités de temps, il idoit donc aller jusqu'à (r1-l1)*(r2-l2)*4.


1

05AB1E , 12 10 14 octets

+4 octets pour gérer les plages négatives

Retourne 0 si faux, ou un entier positif sinon

Utilisez l'idée de Zgarb de doubler les valeurs pour faciliter la détection de la même position

Merci à @ Zacharý d'avoir signalé mes erreurs

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

Essayez-le en ligne!

Explications:

Ä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

Je ne pense pas que cela fonctionnera pour de grandes plages de liste, car 100 semble assez arbitraire.
Zacharý

@ Zacharý Merci! Je l'ai corrigé de manière très inefficace, car maintenant les listes sont répétées beaucoup trop de fois. :-)
scottinet

En fait, cela pourrait ne pas fonctionner encore (je ne serai pas dérangé pour comprendre comment, car cela prendrait trop de temps, et honnêtement, les listes devraient être une gamme minuscule et une gamme ÉNORME de ce que je pense ne fonctionnera pas )
Zacharý

@ Zacharý Cela devrait fonctionner pour des entiers positifs arbitraires, car le pire des cas serait [[0,n],[n-1, n]]et même dans ce cas, la deuxième liste serait répétée suffisamment de fois (et plus) pour que la première atteigne sa limite supérieure. Mais j'ai oublié de prendre en compte les nombres négatifs: [[-100, 1], [0, 1]]ça ne marche pas. Le réparer au coût de 4 octets :-(
scottinet

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.