fork download
  1. """
  2. プログラミングのお題スレ Part17
  3. https://m...content-available-to-author-only...h.net/test/read.cgi/tech/1584031367/
  4.  
  5. 586:
  6. お題: テキトーに木構造を描画せよ。
  7.  
  8. 入力例)
  9. 動物→鳥類、哺乳類
  10. 鳥類→ペンギン、アヒル、スズメ
  11. 哺乳類→ニワトリ、リス
  12. """
  13. import sys
  14.  
  15.  
  16. class Node:
  17. def __init__(self):
  18. self.name = ''
  19. self.childs = []
  20.  
  21. def parse(self, tokens, tok):
  22. self.name = tok.name
  23.  
  24. for name in tok.names:
  25. t = self.find_tok(tokens, name)
  26. if t is None:
  27. child = Node()
  28. child.name = name
  29. self.childs.append(child)
  30. else:
  31. child = Node()
  32. child.parse(tokens, t)
  33. self.childs.append(child)
  34.  
  35. return self
  36.  
  37. def find_tok(self, tokens, name):
  38. for t in tokens:
  39. if t.name == name:
  40. return t
  41. return None
  42.  
  43. def build_dump_nodes(self, dump_nodes, node, dep, parent, last, parent_last):
  44. dnode = DumpNode()
  45. dnode.name = node.name
  46. dnode.dep = dep
  47. dnode.parent = parent
  48. dnode.last = last
  49. dnode.parent_last = parent_last
  50. dump_nodes.append(dnode)
  51.  
  52. for i, child in enumerate(node.childs):
  53. self.build_dump_nodes(
  54. dump_nodes=dump_nodes,
  55. node=child,
  56. dep=dep + 1,
  57. parent=True,
  58. last=i == len(node.childs) - 1,
  59. parent_last=last,
  60. )
  61.  
  62. def dump(self):
  63. dump_nodes = []
  64. self.build_dump_nodes(
  65. dump_nodes=dump_nodes,
  66. node=self,
  67. dep=0,
  68. parent=False,
  69. last=True,
  70. parent_last=True,
  71. )
  72. for dn in dump_nodes:
  73. if dn.parent and dn.last:
  74. if dn.parent_last:
  75. print((dn.dep - 1) * ' ' + '└' + dn.name)
  76. else:
  77. print((dn.dep - 1) * '│' + '└' + dn.name)
  78. elif dn.parent and not dn.last:
  79. if dn.parent_last:
  80. print((dn.dep - 1) * ' ' + '├' + dn.name)
  81. else:
  82. print((dn.dep - 1) * '│' + '├' + dn.name)
  83. elif not dn.parent:
  84. print(dn.name)
  85.  
  86.  
  87. class DumpNode:
  88. def __init__(self):
  89. self.name = ''
  90. self.dep = 0
  91. self.parent = False
  92. self.last = False
  93. self.parent_last = False
  94.  
  95.  
  96. class Token:
  97. def __init__(self, name, names):
  98. self.name = name
  99. self.names = names
  100.  
  101.  
  102. def tokenize():
  103. tokens = []
  104. for line in sys.stdin.readlines():
  105. toks = line.split('→')
  106. name = toks[0]
  107. names = [c.strip() for c in toks[1].split('、')]
  108. tokens.append(Token(name, names))
  109. return tokens
  110.  
  111.  
  112. def parse(tokens):
  113. root = Node()
  114. root.parse(tokens, tokens[0])
  115. return root
  116.  
  117.  
  118. def main():
  119. tokens = tokenize()
  120. root = parse(tokens)
  121. root.dump()
  122. return 0
  123.  
  124.  
  125. if __name__ == '__main__':
  126. sys.exit(main())
  127.  
Success #stdin #stdout 0.03s 63264KB
stdin
動物→鳥類、鳥類、哺乳類
鳥類→ペンギン、アヒル、スズメ
哺乳類→ニワトリ、リス
stdout
動物
├鳥類
│├ペンギン
│├アヒル
│└スズメ
├鳥類
│├ペンギン
│├アヒル
│└スズメ
└哺乳類
 ├ニワトリ
 └リス