2013-04-09 3 views
1

У меня есть ряд некорректно закодированных значений base36 - они были закодированы из целых чисел, используя строку букв, пропускающую «i» и «o». Теперь их нужно преобразовать обратно в целые числа (с использованием C#)Вычислить вариации строки

Существует множество перестановок из-за эффекта опрокидывания.

«0» может либо равно 0 или 34 «1» может либо равен 1 или 35.

Так, например, если у меня есть строка «a110», это имеет шесть возможных значений.

Мне тяжело пытаться понять, как это кодировать. Все примеры, которые я рассмотрел, имеют варианты набора элементов: например.

символ [] = {а, Ь, с}

ИНТ [] = {1, 2, 3}

однако в моем случае есть условные, участвующие тоже, и это делает меня разболелась голова , может ли кто-нибудь помочь?

+3

преобразование не является уникальным, и преобразование обратно может связаны с двусмысленностями, поэтому я сомневаюсь, что это практически можно использовать. – David

+1

'a110' на самом деле имеет 8 возможных значений:' 10,1,1,0', '10,1,1,34',' 10,1,35,0', '10,1,35,34' , '10,35,1,0',' 10,35,1,34', '10,35,35,0',' 10,35,35,34'. Конечно, можно кодировать, чтобы дать вам все возможные результаты, но, как сказал @David, это, вероятно, не даст вам * полезный * результат. – Bobson

+0

@ David Это может быть не очень полезно, но это может быть просто использовано для составления списка для инспекции человека, посредством которого кто-то выбирает тот, который, как они знают, является правильным. – Brad

ответ

0

Мне удалось сделать это со следующим кодом. Это было на самом деле немного проще, чем я ожидал, поскольку у меня было только два условия и два варианта. Он использует рекурсию и шаги через каждый символ в строке. Если этот символ равен 0 или 1, он затем расходится и продолжает строить строку.

Он фактически генерирует несколько дубликатов, поэтому мне пришлось добавить условие, чтобы добавить его в список строк, если он еще не существует. Если кто-то может указывать мне немного лучше логики я ценю это

public string st = "101"; // hardcoded for now 
public char[] cs; 
public List<string> variations; 

static void Main() 
{ 
    cs = st.ToCharArray(); 
    variations = new List<string>(); 
    vary("",0); 
} 

static void vary(string m, int n) 
{  
    for (int i = n; i < cs.Count(); i++) 
    { 
     if (cs[i] == '0' || cs[i] == '1') 
     { 
      // recurse 
      combo(m + (cs[i] == '0' ? "0" : "1"), i + 1); 
      combo(m + (cs[i] == '0' ? "Y" : "Z"), i + 1); 
     } 
     m += cs[i]; 
    } 
    if(!variations.Contains(m)) 
     variations.Add(m); 
} 

для строки «101» я получаю следующие комбинации

101 
10Z 
1Y1 
1YZ 
Z01 
Z0Z 
ZY1 
ZYZ 
0

Вы можете вычислить список всех возможных входных строк. Сначала прочитайте ввод в список int. Теперь вы знаете, что каждый из них (если он имеет достаточно низкое значение) может быть одной из двух вещей. Итак, вы можете создать перечислитель, который возвращает все возможные входы через рекурсивный спуск.

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

  • Нет связанных вопросов^_^