You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用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))

代码说明

  1. 字符分组:group_chars函数将连续的元音/辅音分为一组,方便后续插入分隔符
  2. 画布计算:calculate_canvas根据字符组计算画布的宽高,确保所有线条都能显示,同时预留人形符号的位置
  3. 图形绘制:draw_graph遍历每组字符,绘制对应线条,插入||分隔符,并记录所有峰值位置
  4. 人形放置:找到最高峰值后,在对应位置绘制人形符号◯\n/|\\\n< >,确保位置精准

内容的提问来源于stack exchange,提问作者Gopikanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:10:38