Рейтинг:
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.
Но я думаю, что с моим описанием вы сможете создать код самостоятельно - попробуйте ...
Если нет, вам придется подождать несколько часов ...