Teoh Chia Wei Ответов: 4

Как сгенерировать сериализованный alphebet в VB.NET или с#


Я ищу скрипт, способный генерировать сериализованный Бегущий символ, который выглядит следующим образом

AAAA,AAAB,AAAC,AAAD и когда он достигнет AAAZ, он автоматически округлится до AABA и продолжит инкрементальное движение.

Что я уже пробовал:

До сих пор я понятия не имею, с чего начать

4 Ответов

Рейтинг:
34

OriginalGriff

Я бы сделал это так, чтобы сохранить его в виде числа - от 0 до (26^4 - 1) : 456975 и написать метод преобразования:

First char is (value divided by 26^3) + 'A'
Second is     (value divided by 26^2 Modulus 26) + 'A'
Third is      (value divided by 26 Modulus 26) + 'A'
Fourth is     (value Modulus 26) + 'A'
Затем все, что вам нужно сделать, это увеличить целое число и преобразовать его в строку, когда вы хотите представить его пользователю. Это также делает его намного легче справиться, когда вы достигаете ZZZZ и должны перейти к схеме из пяти символов: это одно изменение одного метода вместо изменения множества мест.


Maciej Los

Гениальная идея!
Вопрос в том, почему ниже запрос linq возвращает неправильные результаты:

int constval = 26;
List<int> values = Enumerable.Range(0,255).ToList();

var aphabet = values
	.Select(x=>new {
		Init = x,
		Key = string.Concat((char)((x/constval^3) + 'A'),
			(char)((x/constval^2 % constval) + 'A'),
			(char)((x/constval % constval) + 'A'),
			(char)((x % constval) + 'A'))
		})
	.ToList();

Ферт и четвертый чактер-это нормально, но все остальное неправильно...
Неужели я сделал что-то не так?

OriginalGriff

Приоритет оператора и забывчивость? "^"- это XOR в C#, а не "сила". Это "сила" в VB.
Попробовать это:

            var alphabet = values
                .Select(x => new {
                    Init = x, 
                    Key = string.Concat((char)((x / (constval * constval * constval)) + 'A'),
                        (char)(((x / (constval * constval)) % constval) + 'A'),
                        (char)(((x / constval) % constval) + 'A'),
                        (char)((x % constval) + 'A'))
                    })
                .ToList();

Maciej Los

Какая глупая ошибка! Спасибо, Оригиналгрифф.

OriginalGriff

Мы все это сделали!

Maciej Los

Кажется, мы забыли о математике.Метод Pow ;)

            var alphabet = values
                .Select(x => new {
                    Init = x, 
                    Key = string.Concat((char)((x / Math.Pow(constval, 3)) + 'A'),
                        (char)(((x / Math.Pow(constval, 2) % constval) + 'A'),
                        (char)(((x / constval) % constval) + 'A'),
                        (char)((x % constval) + 'A'))
                    })
                .ToList();

OriginalGriff

Я этого не сделал - скорее всего, компилятор будет оптимизировать
constval * constval * constval
к постоянному выражению (или, по крайней мере, вне цикла), чем вызов метода.

Рейтинг:
2

Patrice T

Цитата:
До сих пор я понятия не имею, с чего начать

Похоже, вам нужно научиться программированию, потому что даже с очень базовыми знаниями вы должны быть в состоянии начать работу.

- когда что-то имеет сходство снаружи, есть вероятность, что оно также работает аналогично изнутри.
Цитата:
AAAA,AAAB,AAAC,AAAD и когда он достигнет AAAZ, он автоматически округлится до AABA и продолжит инкрементальное движение.

Это счет буквами вместо цифр.
For Counter = 0 to 27
    MyString= ConvertToString(Counter)
    // do something
Next


При преобразовании чисел по модулю можно извлечь единицу измерения числа
MyUnit = MyValue Mod 10
MyRemainder = MyValue \ 10

Повторите 4 раза, чтобы получить 4 цифры/буквы

Скажем, 0-это "а", 1-это "Б" ...
вам нужно преобразовать каждую единицу в букву.

Теперь переключитесь на базу 26


Рейтинг:
1

CPallini

Вы можете создать класс для этого, предоставив next метод (аналогичный тому, что предоставляет Random). Вы можете даже перейти к рекурсии.

class Seq
  {
    char[] c;
    public Seq()
    {
      c = new char[] { 'A', 'A', 'A', 'A' };
    }
    public string next()
    {
      string result = new string(c);
      go_next(c.Count() -1 );
      return result;
    }

    private void go_next(int index)
    {
      if (index < 0) return;
      if (c[index] < 'Z')
        ++c[index];
      else
      {
        c[index] = 'A';
        go_next(index - 1);
      }
    }
  }


Maciej Los

Карло, вероятно, ваш класс недействителен, потому что вызов next() метод ничего не меняет.
Ты можешь проверить свой класс?

[РЕДАКТИРОВАТЬ]
Прости, мой плохой (второй раз за этот день).
Очень хорошая идея!

CPallini

:-) Спасибо, Мацей!

Рейтинг:
0

Ralf Meier

Я бы предпочел другой способ как OriginalGriff :
Ваш источник-это строка, содержащая 4 символа.
Теперь вы можете получить ASCII-код от каждого символа этой строки.
'A' имеет ASCII-код 65 (это байтовое значение), а 'Z' имеет код 90.
Теперь вы увеличиваете байтовое значение самого низкого символа-если оно становится значением больше 90, вы устанавливаете его обратно на 65 и увеличиваете следующее значение символа. Здесь вы должны сделать ту же проверку (и так далее с другими символами).
В конце вы снова перестраиваете строку из 4-х символов-кодов.

ASC дает вам Char-код
CHR создает символ из Char-кода


Teoh Chia Wei

как вы думаете, вы можете предоставить исходный код?

Ralf Meier

на самом деле не потому, что у меня сейчас нет доступа к Visual Studio.
Но я думаю, что с моим описанием вы сможете создать код самостоятельно - попробуйте ...
Если нет, вам придется подождать несколько часов ...