Hi,
würde es spontan so machen:
array1 = [1, 2, 2, 3, 4, 5, 2]
array2 = [2, 3, 4]
|
Ruby Source code
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
check = array1 & array2
return false unless check == array2
check = array2[0]
array1.each_with_index do |e, i|
next unless check == e
check2 = array1.slice(i, i + array2.size - 1)
next unless check2 == array2
return true
end
return false |
Ungetestet, aber sollte von der Grundidee gehen. Kurze Erklärung:
Zunächst wird per
|
Ruby Source code
|
1
|
& |
Methode festgestellt, ob überhaupt jeder Wert aus Array2 in Array1 vorhanden ist.
Die doppelten Einträge werden dabei gefiltert, ist hier aber uninteressant.
Es soll ja gar nicht geprüft werden, wenn nicht alle Werte aus dem Array vorkommen.
Anschließend wird der Wert von Index 0 aus dem Array2 in die Variable check geschrieben.
Danach wird durch das Array1 mit der
|
Ruby Source code
|
1
|
each_with_index |
Methode iteriert mit Rückgabe von Wert und dazugehörigen Index.
Ist der Wert nicht = der Variable check, geht es mit next weiter zum nächsten Wert in Array1.
Ist ein Wert = der check Variable, schneidet er mit der
|
Ruby Source code
|
1
|
slice |
Methode einen Bereich ab dem Treffer aus Array1 aus und
fügt die Werte in ein neues Array, hier Check2. Der Bereich startet ab dem Treffer und ist so groß, wie das Array2.
Jetzt wird verglichen, ob das Array2 dem ausgeschnittenen Bereich gleicht. Wenn nicht, geht es wieder mit den nächsten Wert in Array1 weiter.
Das geht so weiter bis er entweder die exakte Zahlenfolge gefunden hat und dann true zurückgibt, oder eben ein false zurückgibt.
Mit den zwei Array Beispielen würde er true liefern, da er den bereich ab dem zweiten Index in Array 1 ausschneidet.
Also im Array1 schneidet er die fett markierten aus [1, 2,
2, 3, 4, 5, 2] und packt diese in das neue check2 Array.
Dann gleicht er Array2 mit check2 ab und gibt true weil Array2[2, 3, 4] = check2[2, 3, 4].