@Student2002

Как генерировать/перебирать строку в пределах диапазона?

Всем примет , нужна помощь с генерацией в пределах диапазона
допустим есть строк "1abc3" нужно получить
1abc2
1abc1
1abc0
1abb9
1abb8
1abb7

Что имею сейчас . 2 массива с алфавитом и цифрами 0-9
циклом беру первый с конца символ , и в зависимости от индекса в массиве делаю генерацию но так он проходит только 1 символ , пробовал написать цикл в котором бы всё это считалось но не выходит . На данный момент только вижу способ делать столько циклов сколько символов в строке Но это уже лапша получается ... сутки не спал , возможно ответ банален но я его не вижу .
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
@cicatrix
было бы большой ошибкой думать
А алфавит-то какой? 0-9A-Z, 0-9A-z, 0-9A-F или ещё какой?
Может 4-й разряд принимать буквенные значения? Для каждого разряда разные алфавиты?

class ComplexValue
    {
        const string m_Alphabet = "abcdefghijklmnopqrstuvwxyz";
        int First { get; set; }
        char[] Middle { get; set; };
        int Last { get; set; }
        public ComplexValue(string input)
        {
            First = int.Parse(input.Substring(0, 1));
            Middle = input.Substring(1, 3).ToCharArray();
            Last = int.Parse(input.Substring(input.Length - 1, 1));
        }

        public string Value() => $"{First}{new string(Middle)}{Last}";

        private int IncrementLast()
        {
            Last++;
            if (Last > 9) { Last = 0; return 1; }
            return 0;
        }

        private int DecrementLast()
        {
            Last--;
            if (Last < 0) { Last = 9; return 1 }
            return 0;
        }

        private char IncrementChar(char c, out bool carry)
        {
            carry = false;
            c++;
            if (c > m_Alphabet[m_Alphabet.Length -1] )
            {
                c = m_Alphabet[0];
                carry = true;
            }
            return c;
        }

        private char DecrementChar(char c, out bool borrow)
        {
            borrow = false;
            c--;
            if (c < m_Alphabet[0])
            {
                c = m_Alphabet[m_Alphabet.Length - 1];
                borrow = true;
            }
            return c;
        }
        
        private int IncrementMiddle()
        {
            int pos = Middle.Length - 1;
            while (pos > 0)
            {
                Middle[pos] = IncrementChar(Middle[pos], out bool carry);
                if (!carry) return 0;
                pos--;
            }
            return 1;
        }

        private int DecrementMiddle()
        {
            int pos = Middle.Length - 1;
            while (pos > 0)
            {
                Middle[pos] = DecrementChar(Middle[pos], out bool borrow);
                if (!borrow) return 0;
                pos--;
            }
            return 1;
        }

        public void Increment()
        {
            if (IncrementLast() > 0)
            {
                if (IncrementMiddle() > 0) First++;
            }
        }

        public void Decrement()
        {
            if (DecrementLast() > 0)
            {
                if (DecrementMiddle() > 0) First--;
            }
        }
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Senior .NET developer
лично я вижу либо систему либо несоответствие

допустим есть строк "1abc3" нужно получить

Ну например GetSequence(1abc3 , 6);
result

1abc2
1abc1
1abc0
1abb9
1abb8
1abb7

То есть эта последовательность от 0 до 9 в младшем разряде и возможно от 0 до F в старших.
Какая то головоломка.
Простейший вариант если это 0-F то преобразование со счетчиком, но тут это не пройдет. Может вы задачу не поняли? Таких извращенных заданий думаю не должно быть в реальной жизни.

возможно что так

static void Main(string[] args)
        {
            var start = "1abc3";
            GetCascading(start, 6);
        }

        static string[] GetCascading(string val, int count)
        {
            var result = new List<string>();
            var intVal = int.Parse(val, System.Globalization.NumberStyles.HexNumber);
            for (var i = 1; i < count + 1; i++) result.Add((intVal - i).ToString("X"));
            return result.ToArray();
        }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы