プログラムでセグメントを生成しようとしないでください。手動で入力しますが、通常はエンコードされた方法で入力してください。このエンコーディングにより、さまざまな出力を生成できるはずです。 これらをプログラムしてください。
次のコードを検討してください
class SSDigit(object):
"""A 7-segment digit"""
def __init__(self):
self.lines= []
ssdig0= SSDigit()
ssdig1.lines.append(" ")
ssdig0.lines.append(" - ")
ssdig0.lines.append(" | | ")
ssdig0.lines.append(" ")
ssdig0.lines.append(" | | ")
ssdig0.lines.append(" - ")
ssdig1.lines.append(" ")
ssdig1= SSDigit()
ssdig1.lines.append(" ")
ssdig1.lines.append(" ")
ssdig1.lines.append(" | ")
ssdig1.lines.append(" ")
ssdig1.lines.append(" | ")
ssdig1.lines.append(" ")
ssdig1.lines.append(" ")
.....
class LineType(object):
"""Each of the 2 line types (1 horizontal segment or 2 vertical),
with their possible representations and segment positions"""
def __init__(self):
self.valueForRepr= {}
self.segmentPos= []
class Line(object):
"""Each of the 5 lines a SSDigit has, with its LineType"""
def __init__(self):
self.type= None
digits= [ ssdig0, ssdig1, ssdig2, ssdig3, ssdig4, ssdig5, ssdig6, ssdig7, ssdig8, ssdig9 ]
linetype1= LineType()
linetype1.valueForRepr[" "]= [0]
linetype1.valueForRepr[" - "]= [1]
linetype1.segmentPos= [3]
linetype2= LineType()
linetype2.valueForRepr[" "]= [0,0]
linetype2.valueForRepr[" | "]= [0,1]
linetype2.valueForRepr[" | "]= [1,0]
linetype2.valueForRepr[" | | "]= [1,1]
linetype2.segmentPos= [2,4]
typeforline= [ linetype1, linetype2, linetype1, linetype2, linetype1 ]
# Validate error-prone typing !!!
for digit in digits :
for linenum, linetype in enumerate(typeforline) :
if digit.lines[linenum] not in linetype.valueForRepr :
print("Error in digit {:d}, line {:d}".format(digit,linenum))
def printNumber(num):
num= str(num)
for linenum, linetype in enumerate(typeforline) :
line= ""
for d in num :
line+= digits[int(d)].lines[linenum]
print( line )
printNumber(3475649560458)
それぞれに入力された文字列は、SSDigit
単なる正規表現です。その構造は、開発者を簡単に視覚化するためだけのものです。さまざまなサイズとフォームを生成するために必要な情報は、これらの表現やその他の構造を通じてエンコードされます。
例えば、
def printNumberDoubleSize(num):
num= str(num)
for linenum, linetype in enumerate(typeforline) :
line= ""
for d in num :
line+= digits[int(d)].lines[linenum]
print( line )
printNumberDoubleSize(3475649560458)
次のステップは、間隔を考慮して、ディスプレイが 7x5 マトリックスで構成されていることを認識することです。
01234
0
1 -
2 | |
3 -
4 | |
5 -
6
また、マトリックスの各行と列は論理的なものです。つまり、次のように、複数の物理的な行や列で構成できます。
012 34
00012300
00
10 ----
20 | |
1 | |
30 ----
40 | |
1 | |
50 ----
60
ここで、ほとんどの論理行と論理列は、それぞれ 1 つの物理行と 1 列だけで構成されます。ただし、論理行 2 と 4 (それぞれ 2 つの物理行) と、4 つの物理列を持つ論理列 2 は除きます。
これは、一連の文字列として表すことができます。また、各要素について、オフ状態とオン状態でどのように表示したいかを表現すると非常に便利です。以下の定義では、例として、芸術的な自由にふけっています。
phyLineN= []
phyLineN.append([])
phyLineN[0]= []
phyLineN[0].append([ "....", ".", "....",".", "...." ])
phyLineN.append([])
phyLineN[1]= []
phyLineN[1].append([ ". ", " ", ". . "," ", " " ])
phyLineN.append([])
phyLineN[2]= []
phyLineN[2].append([ ". ", ".", " ",".", " " ])
phyLineN[2].append([ ". ", " ", " "," ", " " ])
phyLineN.append([])
phyLineN[3]= []
phyLineN[3].append([ ". ", " ", ". . "," ", " " ])
phyLineN.append([])
phyLineN[4]= []
phyLineN[4].append([ ". ", ".", " ",".", " " ])
phyLineN[4].append([ ". ", " ", " "," ", " " ])
phyLineN.append([])
phyLineN[5]= []
phyLineN[5].append([ ". ", " ", ". . "," ", " " ])
phyLineN.append([])
phyLineN[6]= []
phyLineN[6].append([ "....", ".", "....",".", "...." ])
phyLineY= []
phyLineY.append([])
phyLineY[0]= []
phyLineY[0].append([ " ", " ", " "," ", " " ])
phyLineY.append([])
phyLineY[1]= []
phyLineY[1].append([ " ", " ", "===="," ", " " ])
phyLineY.append([])
phyLineY[2]= []
phyLineY[2].append([ " ", "H", " ","H", " " ])
phyLineY[2].append([ " ", "H", " ","H", " " ])
phyLineY.append([])
phyLineY[3]= []
phyLineY[3].append([ " ", " ", "===="," ", " " ])
phyLineY.append([])
phyLineY[4]= []
phyLineY[4].append([ " ", "H", " ","H", " " ])
phyLineY[4].append([ " ", "H", " ","H", " " ])
phyLineY.append([])
phyLineY[5]= []
phyLineY[5].append([ " ", " ", "===="," ", " " ])
phyLineY.append([])
phyLineY[6]= []
phyLineY[6].append([ " ", " ", " "," ", " " ])
def printNumberNY(num,structN,structY):
phyRowH= [ len(structN[0]), len(structN[1]), len(structN[2]), len(structN[3]), len(structN[4]), len(structN[5]), len(structN[6]) ]
# Validate structure and compute phyColW
# This could be moved to an object constructor so is computed only once
first= 1
for line in structN :
for phyLine in line :
if first :
phyColW= [ len(phyLine[0]), len(phyLine[1]), len(phyLine[2]), len(phyLine[3]), len(phyLine[4]) ]
first= 0
else:
for i, _ in enumerate(phyLine) :
if len(phyLine[i]) != phyColW[i] : raise "Inconsistent physical column width"
# Real rendering of the (full) number in 7-segment form
num= str(num)
for linenum, linetype in enumerate(typeforline) :
for phyLine in range(phyRowH[linenum]) :
line= ""
for d in num :
for col, qq in enumerate(phyColW) :
if digits[int(d)].lines[linenum][col] != " " :
line+= structY[linenum][phyLine][col]
else:
line+= structN[linenum][phyLine][col]
print( line )
printNumberNY(3475649560458,phyLineN,phyLineY)
のコードprintNumberNY
は、単純な width*n の場合よりもそれほど難しくありません。
width*n の場合は、実際には、このセットアップの特定のケースであり、次のように構築できます。
def sizeVH(vSegHeight,hSegWidth,vSep,hSep):
hSepStr= " " *hSep
hSegN= " "* hSegWidth
hSegY= "-"* hSegWidth
phyLineN= []
phyLineN.append([])
phyLineN[0]= []
phyLineN.append([])
phyLineN[1]= []
phyLineN[1].append([ "", " ", hSegN," ", hSepStr ])
phyLineN.append([])
phyLineN[2]= []
for i in range(vSegHeight) :
phyLineN[2].append([ "", " ", hSegN," ", hSepStr ])
phyLineN.append([])
phyLineN[3]= []
phyLineN[3].append([ "", " ", hSegN," ", hSepStr ])
phyLineN.append([])
phyLineN[4]= []
for i in range(vSegHeight) :
phyLineN[4].append([ "", " ", hSegN," ", hSepStr ])
phyLineN.append([])
phyLineN[5]= []
phyLineN[5].append([ "", " ", hSegN," ", hSepStr ])
phyLineN.append([])
phyLineN[6]= []
for i in range(vSep) :
phyLineN[6].append([ "", " ", hSegN," ", hSepStr ])
phyLineY= []
phyLineY.append([])
phyLineY[0]= []
phyLineY.append([])
phyLineY[1]= []
phyLineY[1].append([ "", " ", hSegY," ", hSepStr ])
phyLineY.append([])
phyLineY[2]= []
for i in range(vSegHeight) :
phyLineY[2].append([ "", "|", hSegN,"|", hSepStr ])
phyLineY.append([])
phyLineY[3]= []
phyLineY[3].append([ "", " ", hSegY," ", hSepStr ])
phyLineY.append([])
phyLineY[4]= []
for i in range(vSegHeight) :
phyLineY[4].append([ "", "|", hSegN,"|", hSepStr ])
phyLineY.append([])
phyLineY[5]= []
phyLineY[5].append([ "", " ", hSegY," ", hSepStr ])
phyLineY.append([])
phyLineY[6]= []
for i in range(vSep) :
phyLineY[6].append([ "", " ", hSegN," ", hSepStr ])
return (phyLineN,phyLineY)
phyLineN, phyLineY= sizeVH(4,6,1,3)
printNumberNY(3475649560458,phyLineN,phyLineY)
最初に定義した要素の一部を使用していないことはわかっていますが、これがモデル化する方法です。ソリューションを拡張し続ける場合、それらは役立つ可能性があります。