我正在创建一个能够读取字符串并将其转换为乐谱的应用程序。
我们说我在这里有一个输入:
[0 [[5 6]]]
字符之间原来没有空格。只是为了可读性。
这是我想要实现的输出:
所以,这意味着我必须检测(简单的算法/程序流程):
所以, 摘要:
如何执行步骤1和3(检测字符串上的括号),因为我已经知道如何在画布上绘制线条。
顺便说一下,如果你有另一个更有效的而不是我的算法(1-4),请详细说明。
感谢。请随时澄清任何事情。
更新:删除[0 [5 6]]示例,因为它不正确。
更新2 :
更多例子
[1 2 3]
[[[2 3]] 1]
[[3 4]]
[1 2]
如果您需要更多样品,请随时询问。
答案 0 :(得分:0)
这对你的两个例子都是正确的,但我不知道在一般情况下是否正确。它也不会执行任何检查以确定输入是否格式正确。
var input = Console.ReadLine();
var digits = new List<Char>();
var numberBars = new List<Int32>();
var currentNumberBars = 0;
var newScope = true;
foreach (var symbol in input)
{
if (symbol == '[')
{
currentNumberBars = newScope ? 1 : currentNumberBars + 1;
newScope = false;
}
else if ((symbol >= '0') && (symbol <= '9'))
{
digits.Add(symbol);
numberBars.Add(currentNumberBars);
newScope = true;
}
}
var maximumNumberBars = numberBars.Max();
Console.WriteLine();
for (var i = 0; i < digits.Count; i++)
{
Console.WriteLine(digits[i] + new String('|', numberBars[i]).PadLeft(maximumNumberBars));
}
示例输出
[ 0 [ [ 5 6 ] ] ]
0 |
5||
6||
[ 0 5 6 ]
0|
5|
6|
[ 1 [[ 2 3 ]] 4 [[[ 5 [[ 6 ]] 7 ]]]]
1 |
2 ||
3 ||
4 ||
5|||
6 ||
7 ||
我刚认识到它可能是错误的,因为它没有正确地关闭示波器,但很难从你对问题的描述中看出来,我不知道背景是什么。这个用于音乐的符号是什么?
答案 1 :(得分:0)
这是一种不同的算法,它使当前的嵌套级别为条形数。它适用于除[ 0 [ [ 5 6 ] ] ]
之外的所有示例,它会在5 6
上获得3个小节,但对我而言,这似乎比我的第一个答案更直观。
var input = Console.ReadLine();
var digits = new List<Char>();
var numberBars = new List<Int32>();
var currentNumberBars = 0;
foreach (var symbol in input)
{
if (symbol == '[')
{
currentNumberBars++;
}
else if (symbol == ']')
{
if (currentNumberBars == 0)
{
throw new InvalidOperationException();
}
currentNumberBars--;
}
else if ((symbol >= '0') && (symbol <= '9'))
{
digits.Add(symbol);
numberBars.Add(currentNumberBars);
}
}
if (currentNumberBars != 0)
{
throw new InvalidOperationException();
}
var maximumNumberBars = numberBars.Max();
Console.WriteLine();
for (var i = 0; i < digits.Count; i++)
{
Console.WriteLine(digits[i] + new String('|', numberBars[i]).PadLeft(maximumNumberBars));
}