2015-04-25 2 views
0

Я строю сильную логику и рандомизированный кейген с базой «проверка частичного ключа». Мне нужно добавить еще одну случайную функцию, вращая массив, но все образцы, найденные здесь в Stack Overflow, имеют разные потребности как мои.Вращающийся массив с одним фиксированным значением

Я начинаю с массивом:

int[] q = new int[5]; 
    for (int i = 0; i < q.Length; i++) 
    { 
     q[i] = i; 
    } 

Теперь у меня есть:

q[0] = 0; 
q[1] = 1; 
q[2] = 2; 
q[3] = 3; 
q[4] = 4; 

мне нужно по часовой стрелке, но я должен поддерживать значение неизменны, как, например, д [2 ] = 2;

Тогда первый шаг должен привести (путем добавления + 1 по часовой стрелке):

q[0] = 1; 
q[1] = 3; //bypassed 2nd value 
q[2] = 2; 
q[3] = 4; 
q[4] = 0; //come back to 0 

Второй шаг должен быть (путем добавления снова + 1 по часовой стрелке):

q[0] = 3; //bypassed 2nd value 
q[1] = 4; 
q[2] = 2; 
q[3] = 0; //come back to 0 
q[4] = 1; 

Если возможно мне нужно также функция отката ... большое спасибо

Спасибо и за помощь: Между тем я создал свое решение:

 for (int i = 0; i < q.Length; i++) 
     { 
      if (i == fixed_int) { } //donothing 
      else if ((q[i] + 1) == fixed_int) { q[i] = q[i] + 2; } 
      else if ((q[i] + 1) == (q.Length + 1)) { q[i] = 0; } 
      else { q[i] = q[i] + 1; } 
     } 

это не удастся, если значение Fix не имеет еще 2 int forward, но это не мое дело. Не используйте этот код, так как он не работает в определенных ситуациях. Используйте принятый ответ, потому что он качается!

ответ

0

Предполагая, что массив имеет по крайней мере 2 элемента, вы можете попробовать что-то вроде этого (набор step к +1 и -1 для различных вращений):

void Rotate(int[] a, int fix, int step) 
{ 
    int i = (fix + step + a.Length) % a.Length; 
    int n = (fix - step + a.Length) % a.Length; 
    int t = a[i]; 
    while(i != n) 
    { 
     int j = (i + step + a.Length) % a.Length; 
     a[i] = a[j]; 
     i = j; 
    } 
    a[n] = t; 
} 
0

Вот общая функция, которую вы можете использовать для достижения Вашего результат:

public static T[] Rotate<T>(T[] array, int fix) 
{ 
    // check for errors 
    if (array == null) throw new ArgumentNullException("array"); 
    if (fix < 0 || fix > array.Length - 1) throw new IndexOutOfRangeException(); 

    T[] result = new T[array.Length]; 

    // copy the input into the results 
    Array.Copy(array, 1, result, 0, array.Length - 1); 
    result[array.Length - 1] = array[0]; 

    // restore the location of the fixed item 
    int j = ((fix - 1) + array.Length) % array.Length; // index of "fix - 1" 
    result[j] = result[fix]; 
    result[fix] = array[fix]; 

    return result; 
} 

А вот сопроводительный откат функция:

public static T[] Rollback<T>(T[] array, int fix) 
{ 
    // check for errors 
    if (array == null) throw new ArgumentNullException("array"); 
    if (fix < 0 || fix > array.Length - 1) throw new IndexOutOfRangeException(); 

    T[] result = new T[array.Length]; 

    // copy the input into the results 
    Array.Copy(array, 0, result, 1, array.Length - 1); 
    result[0] = array[array.Length - 1]; 

    // restore the location of the fixed item 
    int skp = ((fix + 1) + array.Length) % array.Length; 
    result[skp] = result[fix]; 
    result[fix] = array[fix]; 

    return result; 
} 

Он может быть использован следующим образом:

var input = new[] {0, 1, 2, 3, 4}; 
var result = Rotate(input, 2);  // yields {1, 3, 2, 4, 0} 
var rollback = Rollback(result, 2); // yields {0, 1, 2, 3, 4} 

Помните также, что эта функция является общим, поэтому он может работать с массивами любого типа (как это показано с char массива ниже).

var charArr = "abcdef".ToCharArray(); 
var charRslt = Rotate(charArr, 3); // {'b', 'c', 'e', 'd', 'f', 'a'} 
var charRlbk = Rollback(charRslt, 3); // {'a', 'b', 'c', 'd', 'e', 'f'} 
+0

Очень интересный поворот колес, очень спасибо! –

Смежные вопросы