2014-10-13 1 views
4

Возможно ли повторять вложенные операторы if с новым значением с каждой отдельной итерацией? Я пытаюсь построить 1-мерные клеточные автоматы (для домашней работы, я не могу это отрицать), и я совершенно не знаком с C#, поскольку следующий код, без сомнения, заверит. Я попытался создать эту программу, используя самые простые, базовые, доступные методы DIY и запустил себя в колею.C# Итерирование оператора If с новым значением каждый раз

У меня есть строка 1 и 0 длина 8, скажет

string y; 
y = "11110000"; 

Я хочу, чтобы разбить этот набор в 8 подстроке наборов 3 с каждым набором, состоящим из значения в годе вместе с одно значение по обе стороны от него. Таким образом, подсчет от 0, 3-й набор будет равен 110, 7-й будет 001. Однако подстроки будут обеспечивать только 1-й-6-й набор, так как я не могу их закодировать вокруг y по своему усмотрению, поэтому я определил следующее:

Использование y1 Я смог получить все необходимые подстроки. Они были определены довольно основном следующим образом-

string a0, a1, a2, a3, a4, a5, a6, a7; 
        a0 = y1.Substring(0, 3); 
        a1 = y1.Substring(1, 3); 
        a2 = y1.Substring(2, 3); 
        a3 = y1.Substring(3, 3); 
        a4 = y1.Substring(4, 3); 
        a5 = y1.Substring(5, 3); 
        a6 = y1.Substring(6, 3); 
        a7 = y1.Substring(7, 3); 

Правила для следующего поколения сотовых автоматов до пользователя в этом програмно, который должен сказать, что пользователь может выбрать или нет подстроки, скажем, 111- > 0 или 1 для всех итераций. Я использовал (очень много), если таблицы в следующем образе для каждой подстроки

     { 
         if (a0=="000") 
        { 
         Console.Write(a); 
         } 
         else if (a0=="001") 
         { 
          Console.Write(b); 
         } 
         else if (a0 =="010") 
         { 
          Console.Write(c); 
         } 
         else if (a0 == "011") 
         { 
          Console.Write(d); 
         } 
         else if (a0 == "100") 
         { 
          Console.Write(e); 
         } 
         else if (a0 == "101") 
         { 
          Console.Write(f); 
         } 
         else if (a0 == "110") 
         { 
          Console.Write(g); 
         } 
         else if (a0 == "111") 
         { 
          Console.Write(h); 
         } 
        } 

, где а, б, в, г, д, е, ж, з является Интсом и правила, выбранных пользователем. Так скажем, например, пользователь решает, что каждый набор 000 должен привести к 1 значению, затем a = 1. b соответствует {0,0,1}, c до {0,1,0} и т. д. Однако довольно очевидная проблема с этим методом заключается в том, что я получаю только 1 поколение в ints, к которому я не могу добраться. Я бы хотел заменить y1 этим новым поколением (преобразованным в строку). Если это невозможно, дайте мне знать!

This link might also clear things up a bit

+0

попробовать использовать int.Parse и чем позже .ToString и чем вы можете использовать какой-то запущен индекс – LordTitiKaka

+0

Это не ответ на ваш вопрос, но вы принимаете неправильный подход. Попытайтесь перечитать ссылку, которую вы опубликовали, и понять математику за клеточными автоматами. Честно говоря, гораздо проще, чем вы это делаете! –

+0

Я не сомневаюсь ни на секунду, что там нет более легкого подхода, но для меня это самый интуитивный. Я действительно, ДЕЙСТВИТЕЛЬНО не знаком с C# и программированием в целом, и если таблицы - это мой modus operandi (латинский?) Для момента (мексиканский). – HipPriest

ответ

0

и вот, как вы могли бы получить А +: D

private static int[,] HipPriestsHomework() 
    { 
     string y = "11110000"; 
     Console.WriteLine(y); 
     var rules = new[] 
     { 
      new {pattern = 0, result = 0}, 
      new {pattern = 1, result = 1}, 
      new {pattern = 2, result = 1}, 
      new {pattern = 3, result = 1}, 
      new {pattern = 4, result = 1}, 
      new {pattern = 5, result = 0}, 
      new {pattern = 6, result = 0}, 
      new {pattern = 7, result = 0}, 
     }; 
     Dictionary<int, int> rulesLookup = new Dictionary<int, int>(); 
     foreach(var rule in rules) 
     { 
      rulesLookup.Add(rule.pattern, rule.result); 
     } 

     int numGenerations = 10; 
     int inputSize = y.Length; 
     int[,] output = new int[numGenerations, inputSize]; 

     int[] items = new int[y.Length]; 
     for(int inputIndex = 0; inputIndex< y.Length; inputIndex++) 
     { 
      string token = y.Substring(inputIndex, 1); 
      int item = Convert.ToInt32(token); 
      items[inputIndex] = item; 
     } 

     int[] working = new int[items.Length]; 
     items.CopyTo(working, 0); 
     for (int generation = 0; generation < numGenerations; generation++) 
     { 
      for (uint y_scan = 0; y_scan < items.Length; y_scan++) 
      { 
       int a = items[(y_scan - 1) % items.Length]; 
       int b = items[y_scan % items.Length]; 
       int c = items[(y_scan + 1) % items.Length]; 
       int pattern = a << 2 | b << 1 | c; 
       var match = rules[pattern]; 
       output[generation, y_scan] = match.result; 
       working[y_scan] = match.result; 
       Console.Write(match.result); 
      } 
      working.CopyTo(items, 0); 
      Console.WriteLine(); 
     } 

     return output; 
    }