将文本文件中绘制的线条解析为整数

时间:2015-03-06 18:23:39

标签: java c# vb.net algorithm

我有一个任务要解决它,我解决了它,但似乎我的算法有点复杂,所以我想听听解决这个问题的其他方法。

这是任务:

在文本文件中有绘制的线条|。 _, - ,/和\和它们以表示数字编号的方式绘制,例如线条|一个低于另一个代表数字1。

以下是文件内容:

---   ---    |  |   |   -----
  /   __|    |  |___|   |____
  \   |      |      |       |
---   ---    |      |   ____|

|  |   |   -----
|  |___|   |____
|      |       |
|      |   ____|

所以,我需要一种算法来读取这些行并识别数字并将它们作为整数返回。它不必是任何语言,编写的伪代码是可以的,但也欢迎使用C#,Java或VB.net编写的算法。

谢谢!

P.S。对不起我的英语。

2 个答案:

答案 0 :(得分:0)

我建议您将可能的数字列表存储为某种签名。这是一个代表该数字的字符串。

    Dim numbers As New List(Of String)

    numbers.Add("||||") ' 1
    numbers.Add("---__||  ---") ' 2
    numbers.Add("---  /  \---") ' 3
    numbers.Add("|   ||___|    |    |") ' 4
    numbers.Add("-----|____    |____|") ' 5

一次读取4行文件。确保跳过所有空行。我希望所有的线都有相同的宽度。

    Dim lines As New List(Of String)

    lines.add("---   ---    |  |   |   -----")
    lines.add("  /   __|    |  |___|   |____")
    lines.add("  \   |      |      |       |")
    lines.add("---   ---    |      |   ____|")

循环每列的所有列,循环所有可能的数字大小。在每个循环中,找到可能的签名。查看该签名是否属于您的初始列表。

    For column As Integer = 0 To lines(0).Length - 1
        If Not IsColumnEmpty(lines, column) Then
            For digitSize As Integer = 1 To 5
                ' Don't overflow
                If column + digitSize > lines(0).Length Then
                    Exit For
                End If

                Dim signature As String

                signature = GetSignature(lines, column, digitSize)

                If numbers.Contains(signature) Then
                    Console.Write(numbers.IndexOf(signature) + 1)
                    column += digitSize ' Skip all columns that are part of this number
                    Exit For
                End If
            Next
        End If
    Next

' We want to skip empty columns
Function IsColumnEmpty(ByVal lines As List(Of String), ByVal column As Integer) As Boolean

    Dim isEmpty As Boolean = True

    For Each line As String In lines
        If line(column) <> " " Then
            isEmpty = False
        End If
    Next

    Return isEmpty
End Function

' startingColumn and columnSize represent a square of data inside the 2d array. Convert that square into a 1d string
Function GetSignature(ByVal lines As List(Of String), ByVal startingColumn As Integer, ByVal columnSize As Integer)

    Dim signature As String = ""

    For Each line As String In lines
        signature &= line.Substring(startingColumn, columnSize)
    Next

    Return signature
End Function

答案 1 :(得分:0)

我对这个问题的处理方法是考虑每个数字如矩阵(例如:我们样本中的数字1是矩阵,维数为1x4),并且数字编号中的每一行都有自己的坐标。在该矩阵中,我想找到并计算所有方向变化的数量(方向变化意味着两条不同的线连接在一起,例如:对于数字2,我们有4个方向变化)并确定矩阵中的确切位置(左上,右-top,right-middle,left-down,...)所以当我有方向改变的数量时,有什么样的方向改变(例如:| _是左下角),以及它们的位置,我可以识别一个数字(例如,数字2有4个方向改变,它们是:右上角位于右上角位置,右上角位于中右位置,左上角位于中左位置和左下角左下角位置,1号没有方向变化,所有线都相等|等等)。我之所以选择这种算法是因为,只要它们连接正确并且每个数字都是正确分开的,那么绘制数字的行数并不重要。