求助:如何用Python完成基于字母映射的斜线/管道2D图形绘制
字符转折线图形实现方案
需求说明
- 用户输入单词
- 将a-z映射为1-26(a=1,b=2…z=26)
- 辅音用
/向上绘制至对应数值,元音用\向下绘制至对应数值 - 连续辅音或连续元音间用双
||分隔 - 最高峰值处添加人形符号
当前进度与问题
已完成字母转数字及元音辅音判断逻辑,但卡在三个核心问题:
- 图形排版的坐标与画布适配
- 连续同类型字符间
||分隔符的插入与绘制 - 最高峰值处人形符号的精准放置
已实现代码
# 获取用户输入并转换为数字 data=[] alpha=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] usr_input=str(input("Enter the strings: ")) usr_input=usr_input.lower() for l in usr_input: if l in alpha: num=(alpha.index(l)+1) data.append(num) # 判断元音并输出符号 for i in data: if i==1 or i==5 or i==9 or i==15 or i==21: print("\\"*i) else: print("/"*i) # 人形符号代码 print(' \u25cb',"\n/|\\\n< >") # 后续改进代码 #Getting words from users and coverting it to numbers data=[] alpha=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] usr_input=str(input("Enter the strings: ")) usr_input=usr_input.lower() for l in usr_input: if l in alpha: num=(alpha.index(l)+1) data.append(num) vow=[1, 5, 9, 15, 21] #operations final=[] max_column=sum(data) for i in range(max_column): final.append([" "] * (max_column*2)) final.append([" "] * (max_column*2)) def graph(data): x,y=0,0 tmp=[] for i,j in enumerate(data): tmp.append(j) if j not in vow: for _ in range(j): final[x][y]="\\" x+=1 y+=1 else: for _ in range(j): x-=1 final[x][y]="/" y+=1 graph(data) for res in final: print("".join(res))
完整解决方案代码
def get_char_num(c): # 字母转数字,a=1...z=26 return ord(c.lower()) - ord('a') + 1 def is_vowel(num): # 判断是否为元音对应的数字 return num in {1,5,9,15,21} def group_chars(data): # 将字符按元音/辅音分组,连续同类型为一组 if not data: return [] groups = [] current_group = [data[0]] current_is_vowel = is_vowel(data[0]) for num in data[1:]: if is_vowel(num) == current_is_vowel: current_group.append(num) else: groups.append(current_group) current_group = [num] current_is_vowel = is_vowel(num) groups.append(current_group) return groups def calculate_canvas(groups): # 计算画布的宽高 total_length = sum(len(group) for group in groups) + 2*(len(groups)-1) # 每个分隔符占2位 max_up = 0 # 向上最大高度(辅音) max_down = 0 # 向下最大深度(元音) current_y = 0 for group in groups: for num in group: if is_vowel(num): current_y += num if current_y > max_down: max_down = current_y else: current_y -= num if current_y < max_up: max_up = current_y # 跳过分隔符的位置,不影响y坐标 if groups.index(group) != len(groups)-1: pass # 画布高度为max_down - max_up + 1(包含上下边界),再加3行放人形 height = max_down - max_up + 4 width = total_length return height, width, abs(max_up), max_down def draw_graph(groups, height, width, offset_y): # 初始化画布 canvas = [[' ' for _ in range(width)] for _ in range(height)] current_x = 0 current_y = offset_y # 初始y坐标,对应中间位置 peak_positions = [] # 记录所有峰值的坐标 for idx, group in enumerate(groups): for num in group: if is_vowel(num): # 元音:向下画\,y递增,x递增 for _ in range(num): canvas[current_y][current_x] = '\\' current_y += 1 current_x += 1 else: # 辅音:向上画/,y递减,x递增 for _ in range(num): current_y -= 1 canvas[current_y][current_x] = '/' peak_positions.append((current_x, current_y)) current_x += 1 # 添加分隔符,除了最后一组 if idx != len(groups)-1: canvas[current_y][current_x] = '|' canvas[current_y][current_x+1] = '|' current_x += 2 # 找到最高峰值(y最小的位置) if peak_positions: peak_positions.sort(key=lambda p: p[1]) peak_x, peak_y = peak_positions[0] # 绘制人形符号,放在峰值上方 canvas[peak_y-1][peak_x] = '◯' canvas[peak_y][peak_x-1] = '/' canvas[peak_y][peak_x] = '|' canvas[peak_y][peak_x+1] = '\\' canvas[peak_y+1][peak_x-1] = '<' canvas[peak_y+1][peak_x+1] = '>' # 反转画布,因为我们是从下往上计算的,打印时要从上到下显示 canvas = canvas[::-1] return canvas # 主程序 usr_input = input("输入单词: ").strip() # 过滤非字母字符,转换为数字列表 data = [get_char_num(c) for c in usr_input if c.isalpha()] if not data: print("请输入有效字母") else: groups = group_chars(data) height, width, offset_y, max_down = calculate_canvas(groups) canvas = draw_graph(groups, height, width, offset_y) # 打印画布 for row in canvas: print(''.join(row))
代码说明
- 字符分组:
group_chars函数将连续的元音/辅音分为一组,方便后续插入分隔符 - 画布计算:
calculate_canvas根据字符组计算画布的宽高,确保所有线条都能显示,同时预留人形符号的位置 - 图形绘制:
draw_graph遍历每组字符,绘制对应线条,插入||分隔符,并记录所有峰值位置 - 人形放置:找到最高峰值后,在对应位置绘制人形符号
◯\n/|\\\n< >,确保位置精准
内容的提问来源于stack exchange,提问作者Gopikanna
相关产品推荐
相关产品推荐

