Crossin的编程教室

标题: 【每日一坑 5】 文字竖排 [打印本页]

作者: crossin先生    时间: 2013-12-22 23:38
标题: 【每日一坑 5】 文字竖排
前两天看到一道还蛮有意思的题目,今天就拿来挖坑吧:

把一段字符串用“右起竖排”的古文格式输出,并且拿竖线符号作为每一列的分割符。
比如这段文字:
"静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。"
输出结果:
低┊举┊疑┊床┊静
头┊头┊似┊前┊夜
思┊望┊地┊明┊思
故┊明┊上┊月┊
乡┊月┊霜┊光┊李
。┊,┊。┊,┊白




作者: fl0w    时间: 2013-12-23 09:08
本帖最后由 fl0w 于 2013-12-23 16:01 编辑

trans.py
  1. #! /usr/bin/env python
  2. # coding:utf-8

  3. import sys

  4. stops = ' !,。'
  5. stops = stops.decode('utf-8')

  6. def getLength(poe):
  7.     situation = [i for i in range(len(poe)) if poe[i] in stops]
  8.     situation.insert(0, -1)
  9.     #print situation
  10.     gaps = [situation[i] - situation[i - 1] for i in range(1, len(situation))]
  11.     #print gaps
  12.     if gaps:
  13.         return max(gaps)
  14.     else:
  15.         return None

  16. def transferPoetry(poe, sentLength):
  17.     NewPoe = []
  18.     tempSent = []
  19.     for i in poe:
  20.         if i not in stops:
  21.             tempSent.append(i)
  22.         elif len(tempSent) < sentLength:
  23.             tempSent.append(i)
  24.             tempSent += stops[0] * (sentLength - len(tempSent))
  25.             NewPoe.append(tempSent)
  26.             tempSent = []
  27.     RealPoe = []
  28.     for i in xrange(sentLength):
  29.         RealPoe.append([NewPoe[x][i] for x in xrange(len(NewPoe))])
  30.     for i in xrange(len(RealPoe)):
  31.         RealPoe[i].reverse()
  32.         RealPoe[i] = '|'.join(RealPoe[i])
  33.     return RealPoe
  34.    
  35. if __name__ == '__main__':
  36.     poe = raw_input('Please input your poetry:')
  37.     poe = poe.decode('utf-8')
  38.     #print('the poetry is: %s' % poe)
  39.     #print('the length is %d' % len(poe))
  40.     sentLength = getLength(poe)
  41.     if sentLength:
  42.         for i in transferPoetry(poe, sentLength):
  43.             print i
  44.     else:
  45.         print 'Are you sure this is a poetry???'
复制代码

作者: fl0w    时间: 2013-12-23 09:23
fl0w 发表于 2013-12-23 09:08
trans.py

等长与不等长诗的效果

Screenshot-1.png (21.59 KB, 下载次数: 627)

等长

等长

Screenshot-2.png (31.99 KB, 下载次数: 608)

不等长

不等长


作者: scz_000    时间: 2013-12-23 17:43
对自己有点难度啊,弄了一下午,还没考虑不能构成矩形的情况,这里有个问题就是每个中文字符是占两个字符的,而在中文输出下空格还是占一个字符的,所以要在输入时“思“和”李“之间打两个空格。
  1. # coding=gbk
  2. input=raw_input('中文:')#输入竖排中文,空格按两下
  3. rows=int(raw_input('rows:'))#输入要打印的行数
  4. t_l=len(input)
  5. cols=t_l/2/rows#默认可以除尽,得出列数
  6. lis=[]
  7. current=[]
  8. start=t_l#起始
  9. for i in range(0,rows):#遍历rows次,每次将正常顺序的打印存放进数组
  10.     for j in range(0,cols):#这里要打印5列,意思就是每次存放5个中文字符
  11.         start=start-rows*2#每个中文字符起始,因为有6行,所以每2*6普通字符的长度个得到一个中文字符,从头开始减
  12.         end=start+2#结尾
  13.         current.append(input[start:end])#加入临时数组
  14.     lis.append(current)
  15.     current=[]
  16.     start=t_l+2*(i+1)#初始往后移
  17.     end=start+2
  18. for i in lis:#按顺序打印,每个字符用“|”隔开
  19.     line='|'.join(i)
  20.     print line
复制代码

作者: crossin先生    时间: 2013-12-26 17:17
scz_000 发表于 2013-12-23 17:43
对自己有点难度啊,弄了一下午,还没考虑不能构成矩形的情况,这里有个问题就是每个中文字符是占两个字符的 ...

最好别用input这种系统方法名来做变量名
作者: fptxyy    时间: 2014-5-19 12:07
本帖最后由 fptxyy 于 2014-5-19 12:14 编辑

采用fl0w的代码,运行后是这样,
>>>
Traceback (most recent call last):
  File "D:\Python27\exercises\mryk05.py", line 12, in <module>
    stops = stops.decode('utf-8')
  File "D:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa3 in position 1: invalid start byte
>>>
采用scz_00的代码,保存时提示要用coding:936,我就点了ok,然后再运行,成这样,
>>>
中文:静思语 床前明月光 疑是地上霜 举头望明月 低头思故乡
rows:5
低|偻|是|懊|静
头|吠|地|髟|思
˼|ûÃ|ÉÏ|¹|Óï
ᄍÊ|÷Ô|˪|â | ᄡ
Ïç|Â | ᄒ|ÒÉ|ᄇÇ
>>>
怎么修改呢?请求指导,谢谢~

作者: crossin先生    时间: 2014-5-19 17:44
fptxyy 发表于 2014-5-19 12:07
采用fl0w的代码,运行后是这样,
>>>
Traceback (most recent call last):

都是编码设置的问题

你试试在命令行下面运行
作者: creek    时间: 2014-6-23 16:03
  1. #!/usr/bin/env python
  2. #coding:utf-8

  3. poem=unicode('静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。','utf8')
  4. formatPoem=[[0 for col in range(5)] for row in range(6)]
  5. i=0
  6. j=4
  7. num=0
  8. for char in poem:
  9.     while i<6 and j>=0:
  10.         formatPoem[i][j]=char
  11.         i=i+1
  12.         num=num+1
  13.         break
  14.     if num%6==0:
  15.         j=j-1
  16.         i=0
  17. for list in formatPoem:
  18.     for char in list:
  19.         if char is not list[-1]:
  20.             print char+'|',
  21.         else:
  22.             print char,
  23.     print '\n',
  24. raw_input()
  25.    
复制代码

作者: manhong2112    时间: 2016-1-16 14:11
本帖最后由 manhong2112 于 2016-1-16 14:24 编辑
  1. poem = "\
  2. 静夜思 李白\n\
  3. 床前明月光,\n\
  4. 疑似地上霜。\n\
  5. 举头望明月,\n\
  6. 低头思故乡。".split('\n')

  7. poem = poem[::-1]

  8. poemLength = 0
  9. for i in poem: poemLength = len(i) if poemLength < len(i) else poemLength
  10. poemSize = len(poem) if len(poem) > poemLength else poemLength

  11. for i in range(0,poemSize):
  12.   for j in range(0,poemSize):
  13.     try:
  14.       print(poem[j][i] if poem[j][i] != " " else "  " ,end="|")
  15.     except IndexError:
  16.       print(end="  ")
  17.   print()
复制代码
弄了兩個小時,總算寫出來了
作者: manhong2112    时间: 2016-1-16 14:21
效果

螢幕擷取畫面 (15).png (41.86 KB, 下载次数: 523)

螢幕擷取畫面 (15).png


作者: crossin先生    时间: 2016-1-16 15:12
manhong2112 发表于 2016-1-16 14:21
效果

good,不错啊
作者: manhong2112    时间: 2016-1-16 15:58
  1. poem = "\
  2. 静夜思 李白\n\
  3. 床前明月光,\n\
  4. 疑似地上霜。\n\
  5. 举头望明月,\n\
  6. 低头思故乡。".split('\n')

  7. poem = poem[::-1]

  8. poemLength = 0
  9. for i in poem: poemLength = len(i) if poemLength < len(i) else poemLength
  10. poemWidth = len(poem)

  11. for i in range(0,poemLength):
  12.   for j in range(0,poemWidth):
  13.     try:
  14.       print(poem[j][i] if poem[j][i] != " " else "  " ,end="|")
  15.     except IndexError:
  16.       print(end="  |")
  17.   print()
复制代码
修改了一下,把正方形排版改成長方形,讓try except不會印一大堆沒用的空白排版造成的延遲
作者: Julian_y    时间: 2016-10-30 21:08
#coding=utf-8
str1 = u"静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。"
for i in range(6):
    temstr = '|'.join([str1[j] for j in range(0,len(str1)) if j%6 ==i][::-1])
    print temstr

不具有普适性哈哈
作者: z19960202    时间: 2016-12-9 14:39
  1. #coding:utf-8

  2. str1 = u'静夜思 李白床前明月光,疑似地上霜,举头望明月,低头思故乡。'
  3. start = 0 #取出诗句的起始点
  4. poem = [] #诗句存放列表

  5. for i in range(5):
  6.     poem_list = [] #取每一句诗句之前 都清空的临时列表
  7.    
  8.     for j in str1[start:start+6]: #取 第一句的六个字符
  9.         poem_list.append(j)
  10.     poem.append(poem_list) #追加进诗句列表
  11.     start += 6   #增加计数起点




  12. for i in range(6): #打印诗句
  13.     print poem[4][i] + "|" + poem [3][i] + "|" + poem [2][i] + "|" + poem [1][i]+ "|" + poem [0][i]

复制代码
想问一下 如果 我直接 print :poem  打出来的就是乱码  完全不知道该怎么办! 希望有人能解答一下
作者: crossin先生    时间: 2016-12-9 22:31
z19960202 发表于 2016-12-9 14:39
想问一下 如果 我直接 print :poem  打出来的就是乱码  完全不知道该怎么办! 希望有人能解答一下  ...

直接print 一个 list 对象,显示的就是未解码的字符。一般就是遍历,然后输出每一项

在python3里,会自动解码
作者: z19960202    时间: 2016-12-10 09:50
crossin先生 发表于 2016-12-9 22:31
直接print 一个 list 对象,显示的就是未解码的字符。一般就是遍历,然后输出每一项

在python3里,会自 ...

好的谢谢,我会努力学习的
作者: morpheus2222    时间: 2017-1-22 07:33
words = input("words:")
n = int(input("how many characters for a line:"))
text_list = [words[i:i+n] for i in range(0,len(words),n)]
print(text_list)
for a in range(0,n):
    for b in range(0,len(text_list)):
        if b == len(text_list)-1:
            print (text_list[-(b+1)].ljust(n)[a],end = "")
        else:
            print(text_list[-(b+1)].ljust(n)[a],end = "|")
    print()
作者: xpfdsg    时间: 2017-1-29 21:51
  1. text="静夜思  李白床前明月光,疑似地上霜。举头望明月,低头思故乡。"
  2. s=[]
  3. for i in range(30):
  4.     s.append(text[i*2:(i+1)*2])

  5. for i in range(6):
  6.     row1=[]
  7.     for j in range(5):
  8.         row1.append(s[i+j*6])
  9.     print '┊'.join(reversed(row1))
复制代码

作者: jssngz    时间: 2017-3-12 21:46
简单的写了一下
  1. poem = ['静夜思 李白', '床前明月光,', '疑是地上霜。', '举头望明月,', '低头思故乡。']
  2. poem.reverse()
  3. for i in range(len(poem[0])):
  4.     outstr = ''
  5.     for j in range(len(poem)):
  6.         outstr += poem[j][i] + '|'
  7.     outstr = outstr[:-1]
  8.     print(outstr)
复制代码

作者: wolfog    时间: 2017-8-21 14:23
好难呀!!!
作者: wolfog    时间: 2017-8-21 18:44
text = "静夜思 李白床前明月光,疑似地下霜。举头望明月,低头思故乡。"
listSpace = text.split(" ")
textNoSpace = "¥".join(listSpace)
listO = []
for i in range(6):  # 行
    listI = []
    l = 3 * i  # 每次增加3个
    for j in range(5):  # 列
        m = j * 18  # 每循环一次,就跳转6个字
        n = l + m
        listI.append(textNoSpace[n: n + 3])
        if j != 4:
            listI.append("|")
    listO.append(listI)
for i in listO:
    if "¥" in i:
        i[i.index("¥")] = " "
    print "".join(i[::-1])
作者: wolfog    时间: 2017-8-21 18:47
wolfog 发表于 2017-8-21 18:44
text = "静夜思 李白床前明月光,疑似地下霜。举头望明月,低头思故乡。"
listSpace = text.split(" ")
tex ...

整整一天终于整出来了。看到这道题的时候总是想着如何旋转,其实在字符串中可以将列表标准化,然后像列表取元素一样,跳转拿取元素组合成一个列表,最后将列表反转就ok。
作者: coolqing    时间: 2018-5-15 18:45
#-*- coding: gbk -*-

print '输入一段文字:'
a=input()
print a
lines=6   #行
lens=len(a)//lines  #列

def printN(cur):
    s='|'
    for j in range(0,lens):
        s +=a[cur+lines*j]+'|'
        #print s
    return s

for i in range(0,lines):
    print printN(i)


感觉才过没几天之前学过的东西就模糊了,好沮丧。。

1526381061(1).jpg (6.62 KB, 下载次数: 373)

1526381061(1).jpg


作者: crossin先生    时间: 2018-5-16 09:42
coolqing 发表于 2018-5-15 18:45
#-*- coding: gbk -*-

print '输入一段文字:'

所以要勤练习
作者: lzt0810    时间: 2018-7-3 13:39
本帖最后由 lzt0810 于 2018-7-3 13:59 编辑
  1. import re
  2. data = input("请输入你的诗句:\n")
  3. lst=list(re.findall(r"[\w’]+", data))
  4. c_lst = []
  5. for sen in lst:
  6.     c_lst.append(list(sen))
  7. row = len(c_lst)
  8. column = len(c_lst[0])
  9. for i in range(column):
  10.     for j in range(row):
  11.         print(c_lst[row-j-1][i]+'|',end='')
  12.     print(' ')
  13. k=0
  14. while k < row/2:
  15.     print("。|,|",end='')
  16.     k+=1

复制代码
写了一个简陋版的,输入的诗句,要去掉诗名和作者,并且不能有换行,不知道按照这个思路能不能完善下去,还是要重新写才能做出完美满足要求的。


刚刚想了一下,这个坑很大,以后再改吧。。。



作者: highhig    时间: 2018-8-24 15:51

text = "静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。"
text.encode('utf-8')
print(text)
num = len(text)
print(num)
s = []
# l = [2,3,1]
# l.reverse()
# print(l)
for i in range(6):
    l = []
    for j in range(int(num/6)):
        l.append(text[i+j*6])
        # l.reverse()
    l.reverse()
    s.append(l)
# print(s)
for tx in s:
    tx = '|'.join(tx)
    print(tx)

output:
低|举|疑|床|静
头|头|似|前|夜
思|望|地|明|思
故|明|上|月|
乡|月|霜|光|李
。|,|。|,|白

作者: py_st    时间: 2018-10-5 21:15
#/usr/bin/python3

p = "静夜思 李白床前明月光,疑是地上霜。举头望明月,低头思故乡。"
for i in range(6):
    print(p[i-6],'|',p[i-12],'|',p[i-18],'|',p[i-24],'|',p[i-30])  

低 | 举 | 疑 | 床 | 静
头 | 头 | 是 | 前 | 夜
思 | 望 | 地 | 明 | 思
故 | 明 | 上 | 月 |  
乡 | 月 | 霜 | 光 | 李
。 | , | 。 | , | 白
作者: py_st    时间: 2018-10-5 21:19
我是新手,为什么大家要弄得那么复杂?

作者: xling    时间: 2019-9-30 14:28
本帖最后由 xling 于 2019-9-30 14:29 编辑

a = "静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。"

for i in range(0,6):
    for j in range(0,5):
        c = '|' + a[(4-j)*6+i]

        if(j==4):
            c += '\n'
        print(c,end='')

{8CBB7E4D-F40D-43E6-A5A8-5778B8841109}_20190930142913.jpg (8.27 KB, 下载次数: 391)

{8CBB7E4D-F40D-43E6-A5A8-5778B8841109}_20190930142913.jpg


作者: ac522706972    时间: 2020-8-23 17:02
text = "静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。"
for j in range(0,6):
    for i in range(0,30)[::-1]:
        if i % 6 == j and i >5 :
            print(text[i] + "|",end = '')
        elif i % 6 == j and i <=5 :
            print(text[i],end = '')
    print('\n')
作者: jodie    时间: 2020-10-14 14:58
本帖最后由 jodie 于 2020-10-14 15:01 编辑
  1. def change_pattern(poem):
  2.     # 分离出 题目,诗人+诗句
  3.     title,poet_n_poem  = poem.split()
  4.     title = title.strip()
  5.     poet_n_poem = poet_n_poem.strip()

  6.     # 存放诗句的列表
  7.     all_lines = []
  8.     # 分离句号
  9.     for one in poet_n_poem.split("。"):
  10.         if ',' in one:
  11.             # 分离逗号
  12.             lines = one.split(",")
  13.             # print(lines)
  14.             # 判断是否是 诗人+诗句,且给每个诗句后面加逗号
  15.             if len(lines[0]) != len(lines[1]):
  16.                 line_len = len(lines[1])
  17.                 poet = lines[0][:len(lines[0])-line_len]
  18.                 lines[0] = lines[0].strip(poet) + ","
  19.                 lines[1] = lines[1] + "。"
  20.                 line_len = line_len + 1
  21.                 all_lines = all_lines + lines
  22.             else:
  23.                 lines[0] = lines[0] + ","
  24.                 lines[1] = lines[1] + "。"
  25.                 all_lines = all_lines + lines


  26.     title_n_poet = title + " " + poet
  27.     title_n_poet_len = len(title_n_poet)
  28.     all_lines.insert(0,title_n_poet)
  29.     all_lines.reverse()

  30.     # 补全空格,使长度一致
  31.     delta = line_len - title_n_poet_len
  32.     # 诗句长度短
  33.     if delta < 0:
  34.         for i in range(0,len(all_lines)-1):
  35.             all_lines[i] = all_lines[i] + abs(delta) * " "
  36.     # 题目+空格+诗人 长度短
  37.     elif delta > 0:
  38.         all_lines[-1] = all_lines[-1] + abs(delta) * " "
  39.     else:
  40.         pass


  41.     # 把诗句的每个字单独出来
  42.     for i in range(0,len(all_lines)):
  43.         all_lines[i] = list(all_lines[i])


  44.     result_list = []
  45.     j = 0
  46.     while j < len(all_lines[0]):
  47.         i = 0
  48.         result_list.append([])
  49.         # for i in range(0,len(all_lines)):
  50.         #     result_list[j].append(all_lines[i][j])
  51.         while i < len(all_lines):
  52.             result_list[j].append(all_lines[i][j])
  53.             i = i + 1
  54.         j=j+1
  55.     # print(result_list)

  56.     for one in result_list:
  57.         string = "|".join(one)
  58.         print(string)



  59. if __name__ == "__main__":
  60.     poem = "锦瑟 李商隐锦瑟无端五十弦,一弦一柱思华年。庄生晓梦迷蝴蝶,望帝春心托杜鹃。沧海月明珠有泪,蓝田日暖玉生烟。此情可待成追忆," \
  61.        "只是当时已惘然。"
  62.     change_pattern(poem)
复制代码

result.jpg (23.73 KB, 下载次数: 430)

result.jpg


作者: crossin先生    时间: 2020-10-14 16:36
jodie 发表于 2020-10-14 14:58

不错啊
作者: jodie    时间: 2020-10-14 23:40
crossin先生 发表于 2020-10-14 16:36
不错啊

谢谢老师
作者: FERRYMAN    时间: 2021-2-10 11:36
呼!整了一上午,终于弄出来了
  1. import re

  2. def hs_hang(text_):
  3.     text = re.findall(r'\b.*? .*? |\b\S*?[。,?!]{1}',text_)
  4.     text[0] = text[0].strip()  #为了使最右边一列不会多出一个空格、影响美观
  5.     #print(text)
  6.     hangshu = []
  7.     hang_dic = {}
  8.     keynum = 0
  9.     for a in text:
  10.         b = re.findall(r'.',a)
  11.         hangshu.append(len(b))
  12.         hang = max(hangshu)
  13.     while text:
  14.         keynum += 1
  15.         hang_dic[keynum] = re.findall(r'.',text.pop(-1))
  16.     #print(hang_dic)
  17.     #print(hang)
  18.     return hang,hang_dic,text

  19. #下面这个函数可以使每列诗句和它们之间的分隔符全都等长,避免错位的情况
  20. def hs_buquan(hang_dic,hang):
  21.     global key
  22.     for key in hang_dic.keys():
  23.         if len(hang_dic[key]) < hang:
  24.             for i in range(hang - len(hang_dic[key])):
  25.                 hang_dic[key] += ' '
  26.                 #这个空格很关键,因为中英文标点大小的不同,这个空格要用全角
  27.     #print(hang_dic)
  28.     return hang_dic

  29. def hs_paixu(hang_dic,hang):
  30.     global e
  31.     for e in range(hang):
  32.         line = []
  33.         for value in hang_dic.values():
  34.             line.append(value[e])
  35.         print('|'.join(line))

  36. #用的时候用函数guwen就彳亍了
  37. def guwen(shuru):  #输入参数时请不要用英文的字母和标点
  38.     hang,hang_dic,text = hs_hang(shuru)
  39.     hang_dic = hs_buquan(hang_dic,hang)
  40.     hs_paixu(hang_dic,hang)

复制代码
写这程序最让我惊喜的就是,用全角输入空格能解决评论区里很常见的错位问题,不管是句句字数一样还是不一样都能整齐打印

老师能帮我看看吗?

暂时学到的知识还不是很多,掌握得也不是很熟练,其他人的程序看得不是很懂

老师有什么建议的话尽管提,谢谢啦


作者: crossin先生    时间: 2021-2-10 16:59
global key
global e
这个是没有必要的

写得挺好的,继续多做练习
作者: FERRYMAN    时间: 2021-2-10 17:17
crossin先生 发表于 2021-2-10 16:59
global key
global e
这个是没有必要的

谢谢老师,我会更加努力的,还望老师继续指导
作者: chinaso1111    时间: 2021-7-6 21:25
没有头绪,感觉太难了,完全没有头绪




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5