鱼C论坛

 找回密码
 立即注册
查看: 1666|回复: 14

[技术交流] Python:每日一题 214

[复制链接]
发表于 2018-11-28 20:45:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-12-2 21:33 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
编写函数,参数是一个字符串string和一个整数n。
生成一个n*n的二维列表,将string中每个字符从列表的左上角开始以顺时针的螺旋依次填在列表中。
如fun214('ABCDEFGHI', 3),则生成列表,
2.jpg
注意如果字符串长度富裕则填充最后一个列表元素后剩余的舍弃。如字符串长度不够,则重复使用字符串。
fun214('ABCDEFG', 4)
1.jpg


=================================================
希望大家能帮我想一些题目,具体的要求是:
1.难度适中
2.充分利用python的特性
3.最好是自己想出来的
如果有合适的题目,请给我发消息或直接发帖并@我对于出题的鱼油给予奖励。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-28 22:23:12 | 显示全部楼层
本帖最后由 塔利班 于 2018-11-30 11:27 编辑
  1. def fun214(s,n):
  2.     moveindex=0
  3.     move=[(0,1),(1,0),(0,-1),(-1,0)]
  4.     def go(i,j):
  5.         nonlocal N,moveindex
  6.         if not M[i][j]:
  7.             M[i][j]=s[(H-N)%(len(s))]
  8.             N-=1
  9.         if N:
  10.             a,b=move[moveindex]
  11.             if i+a in range(n) and j+b in range(n) and not M[i+a][j+b]:
  12.                 go(i+a,j+b)
  13.             else:
  14.                 moveindex=(moveindex+1)%4
  15.                 go(i,j)
  16.             
  17.     M=[]
  18.     for i in range(n):
  19.         t=[]
  20.         for j in range(n):
  21.             t.append('')
  22.         M.append(t)
  23.     N=H=n*n
  24.     go(0,0)
  25.     return M
复制代码


numpy版
  1. import numpy as np
  2. def fun214(s,n):
  3.     b=a=np.zeros((n,n),dtype=np.object)
  4.     N,I=n*n,0
  5.     while I<N:
  6.         for i in range(b.shape[1]):
  7.                 b[0][i]=s[I%len(s)]
  8.                 I+=1
  9.         b=b.T[::-1,:][:,1:]      
  10.     return a.tolist()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-28 23:35:49 | 显示全部楼层
本帖最后由 凌九霄 于 2018-11-30 01:18 编辑
  1. def fill(arr, x, y, chars, n):
  2.     if n <= 0: return 0
  3.     if n == 1:
  4.         arr[ x ][ y ] = chars[ 0 ]
  5.         return 0

  6.     for i in range(n):
  7.         arr[ x ][ y + i ] = chars.pop(0)

  8.     for i in range(n - 1):
  9.         arr[ x + 1 + i ][ y + n - 1 ] = chars.pop(0)

  10.     for i in range(n - 1):
  11.         arr[ x + n - 1 ][ y + n - 2 - i ] = chars.pop(0)

  12.     for i in range(n - 2):
  13.         arr[ x + n - 2 - i ][ y ] = chars.pop(0)

  14.     fill(arr, x + 1, y + 1, chars, n - 2)


  15. def func214(strings, n):
  16.     strings = strings * (n ** 2 // len(strings) + 1)
  17.     lstr = list(strings[ :n ** 2 ])
  18.     matrix = [ [ '#' for x in range(n) ] for i in range(n) ]

  19.     fill(matrix, 0, 0, lstr, n)

  20.     l = len(str(n * n)) + 1
  21.     format = ('%' + str(l) + 's') * n
  22.     for i in matrix:
  23.         print(format % tuple(i))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-29 01:23:49 | 显示全部楼层
  1. def move_E(x_and_y,result,S):
  2.     x,y= x_and_y[0],x_and_y[1]
  3.     result[x][y] = S
  4.     if result[x][y+1] != -1 and result[x][y+1] ==0:
  5.         S +=1
  6.         x_and_y = [x,y+1]
  7.         if S==(len(result)-1)**2:
  8.             result[x][y+1] = S
  9.             return result
  10.         return move_E(x_and_y,result,S)
  11.     else:return move_S(x_and_y,result,S)

  12. def move_S(x_and_y,result,S):
  13.     x,y= x_and_y[0],x_and_y[1]
  14.     result[x][y] = S
  15.     if result[x+1][y] != -1 and result[x+1][y] ==0:
  16.         S += 1
  17.         x_and_y = [x+1, y]
  18.         if S==(len(result)-1)**2:
  19.             result[x + 1][y] = S
  20.             return result
  21.         return move_S(x_and_y,result,S)
  22.     else:return move_W(x_and_y,result,S)

  23. def move_W(x_and_y,result,S):
  24.     x,y= x_and_y[0],x_and_y[1]
  25.     result[x][y] = S
  26.     if result[x][y-1] != -1 and result[x][y-1] ==0:
  27.         S += 1
  28.         x_and_y=[x,y-1]
  29.         if S==(len(result)-1)**2:
  30.             result[x][y-1] = S
  31.             return result
  32.         return move_W(x_and_y,result,S)
  33.     else:return move_N(x_and_y,result,S)

  34. def move_N(x_and_y,result,S):
  35.     x,y= x_and_y[0],x_and_y[1]
  36.     result[x][y] = S
  37.     if result[x-1][y] != -1 and result[x-1][y] ==0:
  38.         S += 1
  39.         x_and_y = [x-1,y]
  40.         if S==(len(result)-1)**2:
  41.             result[x-1][y]=S
  42.             return result
  43.         return move_W(x_and_y,result,S)
  44.     else:return move_E(x_and_y,result,S)

  45. def fun214(string,n):
  46.     if len(string)<n**2:string = (string*(n**2//len(string)+1))[:n**2]
  47.     dic = {}
  48.     for i in range(n**2):
  49.         dic[i+1]=string[i]
  50.     result = [[0 for i in range(n+2)] for i in range(n)]
  51.     result.append([-1 for i in range(n+2)])
  52.     for i in result:i[0],i[-1] = -1,-1
  53.     S=1
  54.     x_and_y=(0,1)
  55.     result=move_E(x_and_y,result,S)
  56.     for i in range(n):
  57.         for j in range(n+1):
  58.             if result[i][j]!=-1:
  59.                 print("{0: >3s}".format(dic[result[i][j]]), end='')
  60.         print("\n")

  61. fun214('ABCDEFG',5)

复制代码


  A  B  C  D  E

  B  C  D  E  F

  A  C  D  F  G

  G  B  A  G  A

  F  E  D  C  B

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-29 11:38:18 | 显示全部楼层
刚看到题目时,完全没有头绪。不擅长这类题目,参考了一个C++程序,才做出来。

  1. def fun214(string, n):
  2.     ln = len(string)
  3.     string = string * (n * n // ln) + string[:(n * n % ln)]
  4.     res = [['' for i in range(n)] for j in range(n)]
  5.     m = 0
  6.     for i in range(0, n // 2):
  7.         # right
  8.         for j in range(i, n - i):
  9.             if res[i][j] == '':
  10.                 res[i][j] = string[m]
  11.                 m += 1
  12.         # down
  13.         for j in range(i + 1, n - i):
  14.             if res[j][n - i - 1] == '':
  15.                 res[j][n - i - 1] = string[m]
  16.                 m += 1
  17.         # left
  18.         for j in range(n - i - 1, i, -1):
  19.             if res[n - i - 1][j] == '':
  20.                 res[n - i - 1][j] = string[m]
  21.                 m += 1
  22.         # up
  23.         for j in range(n - i - 1, i, -1):
  24.             if res[j][i] == '':
  25.                 res[j][i] = string[m]
  26.                 m += 1

  27.     if n % 2 == 1:
  28.         res[n // 2][n // 2] = string[m]

  29.     return res


  30. print(fun214('ABCDEFGHIJKLMN', 4))
复制代码


结果:
[['A', 'B', 'C', 'D'], ['L', 'M', 'N', 'E'], ['K', 'B', 'A', 'F'], ['J', 'I', 'H', 'G']]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-29 14:42:41 | 显示全部楼层
大概思路是这样子,那个二维列表是个什么玩意,不会画
  1. def main(string,num):
  2.         string = str(string)
  3.         num = int(num)
  4.         step = num*num
  5.         result = np.ones(())
  6.         if len(string)>step:
  7.                 string = string[0:step]
  8.         elif len(string)<step:
  9.                 string = string+string[0:(step-len(string))]
  10.         print(string)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-29 15:09:45 | 显示全部楼层
  1. def func214(data,n):

  2.     if n == 0:
  3.         return []
  4.     res = [[0 for x in range(n)] for x in range(n)]
  5.     cnt, choice = 1, 0
  6.     i, j = 0, 0
  7.     weight = 1
  8.     res[0][0] = data[0]
  9.     cout = 1
  10.     while cnt < n * n:
  11.         if choice == 0:
  12.             j += 1
  13.             if cout > (len(data) - 1):
  14.                 cout = 0
  15.             res[i][j] = data[cout]
  16.             if j == n - weight:
  17.                 choice = 1
  18.         elif choice == 1:
  19.             i += 1
  20.             if cout > (len(data) - 1):
  21.                 cout = 0
  22.             res[i][j] = data[cout]
  23.             if i == n - weight:
  24.                 choice = 2
  25.         elif choice == 2:
  26.             j -= 1
  27.             if cout > (len(data) - 1):
  28.                 cout = 0
  29.             res[i][j] = data[cout]
  30.             if j == weight - 1:
  31.                 choice = 3
  32.                 weight += 1
  33.         elif choice == 3:
  34.             i -= 1
  35.             if cout > (len(data) - 1):
  36.                 cout = 0
  37.             res[i][j] = data[cout]
  38.             if i == weight - 1:
  39.                 choice = 0
  40.         cnt += 1
  41.         cout += 1
  42.     return res

  43. print(func214('AB',3))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-11-29 20:42:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-30 15:05:56 | 显示全部楼层
def fun214(str1, length):
    list1 = [[0]*length for _ in range(length)]
    left = 0
    right = length-1
    up = 0
    down = length-1
    t = 0
    while left <= right:
        for i in range(left, right+1):
            list1[up][i] = str1[t]
            t += 1
            if t >= len(str1):
                t = 0
        for i in range(up+1, down+1):
            list1[i][right] = str1[t]
            t += 1
            if t >= len(str1):
                t = 0
        for i in range(right-1, left-1, -1):
            list1[down][i] = str1[t]
            t += 1
            if t >= len(str1):
                t = 0
        for i in range(down-1, up, -1):
            list1[i][left] = str1[t]
            t += 1
            if t >= len(str1):
                t = 0
        left += 1
        right -= 1
        up += 1
        down -= 1

    return list1


print(fun214('wangtianyuan', 4))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-14 20:36:44 | 显示全部楼层

你好,我有个问题想请教一下,代码中那b=a ,b改变了a也随着改变,但是后面b=b.T[::-1,:][:,1:],b不是被赋予新的矩阵了吗,为什么a还是随着b的改变而改变而且位置也是对应的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-14 20:40:31 | 显示全部楼层
九九八十一 发表于 2018-12-14 20:36
你好,我有个问题想请教一下,代码中那b=a ,b改变了a也随着改变,但是后面b=b.T[::-1,:][:,1:],b不是被 ...

浅拷贝
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-29 21:43:30 | 显示全部楼层
本帖最后由 sunrise085 于 2018-12-29 21:52 编辑

我自己写了一下。在写的过程中,学习到了一点浅拷贝。因为刚刚开始的时候,想创建一个二维列表,但是每次给一个元素赋值,都会修改一列的值。所以去查了一下,发现是浅拷贝的问题。这个问题还要在深挖一下。现在把我写的贴上来,供大家参考。相互交流。
  1. def fun214(string,n):
  2.     i,j,k,flag=0,0,0,1   #flag是填充元素的方向
  3.     result=[['' for i in range(n)]for i in range(n)] #创建一个空二维数组,注意浅拷贝问题
  4.     while k<n*n:
  5.         result[i][j]=string[k%len(string)]
  6.         k+=1
  7.         if flag==1:
  8.             j+=1
  9.             if i+j==n-1:     #向右走,走到头的时候,在对角线上,所以i+j=n-1
  10.                 flag=2
  11.                 continue
  12.         elif flag==2:
  13.             i+=1
  14.             if i==j:        #向下走,走到头的时候,在对角线上,所以i=j
  15.                 flag=3
  16.                 continue
  17.         elif flag==3:
  18.             j-=1
  19.             if i+j==n-1:     #向左走,走到头的时候,在对角线上,所以i+j=n-1
  20.                 flag=4
  21.                 continue
  22.         else:
  23.             i-=1
  24.             if i-j==1:      #向上走,走到头的时候,在对角线下面一个元素,所以i-j=1
  25.                 flag=1
  26.     return result

  27. print(fun214('ABCDEFG',0))
  28. mylist=fun214('ABCDEFGHIJKLMNOPQRSTUVWXYZ',5)
  29. for i in range(5):
  30.     print(mylist[i])
  31. print()
  32. mylist=fun214('ABCDE',7)
  33. for i in range(7):
  34.     print(mylist[i])
复制代码

写好程序之后,看了看鱼友们的回答,我的程序还算比较精简的,认真分析了塔利班的第一个版本程序,写的很巧妙,但是每次拐弯时都会多调用一次go()函数,会不会增加计算时间?还没有尝试运行时间,有机会试一下。第二个版本有些东西我还没有接触到,以后再来看吧~~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-2 19:19:22 | 显示全部楼层
  1. def fun214(string,n):
  2.     if len(string) >= n**2:
  3.         string = string[:(n**2)-1]
  4.     else:
  5.         string = string*((n**2)//len(string)) + string[:(n**2)%len(string)]
  6.     list_x = [['' for i in range(n)] for j in range(n)]
  7.     count = n//2
  8.     for i in range(count):
  9.         for a in range(i,n-i):
  10.             list_x[i][a] = string[0]
  11.             string = string[1:]
  12.         for b in range(i+1,n-i):
  13.             list_x[b][n-i-1] = string[0]
  14.             string = string[1:]
  15.         for c in range(i,n-i-1)[::-1]:
  16.             list_x[n-i-1][c] = string[0]
  17.             string = string[1:]
  18.         if i == count:
  19.             break
  20.         else:
  21.             for d in range(i+1,n-i-1)[::-1]:
  22.                 list_x[d][i] = string[0]
  23.                 string = string[1:]
  24.         if len(string) == 1:
  25.             list_x[len(list_x[0])//2][len(list_x[0])//2] = string[0]
  26.     return list_x

  27. if __name__ == '__main__':
  28.     for i in fun214('ABCDEFGHIJKLMNOP',10):
  29.         print(i)
复制代码
  1. ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
  2. ['D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'K']
  3. ['C', 'P', 'A', 'B', 'C', 'D', 'E', 'F', 'M', 'L']
  4. ['B', 'O', 'D', 'E', 'F', 'G', 'H', 'G', 'N', 'M']
  5. ['A', 'N', 'C', 'P', 'A', 'B', 'I', 'H', 'O', 'N']
  6. ['P', 'M', 'B', 'O', 'D', 'C', 'J', 'I', 'P', 'O']
  7. ['O', 'L', 'A', 'N', 'M', 'L', 'K', 'J', 'A', 'P']
  8. ['N', 'K', 'P', 'O', 'N', 'M', 'L', 'K', 'B', 'A']
  9. ['M', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B']
  10. ['L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C']
  11. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-6 15:40:37 | 显示全部楼层
  1. def test214(str1, n):
  2.     m = [[''] * n for i in range(n)]
  3.     index, turnindex = 0, 0
  4.     turn = [[0, 1], [1, 0], [0, -1], [-1, 0]]
  5.     now = [0, 0]
  6.     for j in range(n * n):
  7.         m[now[0]][now[1]] = str1[index]
  8.         left = [now[i] + turn[turnindex][i] for i in range(2)]
  9.         if left[0] == n or left[1] == n or m[left[0]][left[1]] != '':
  10.             turnindex = (turnindex + 1) % 4
  11.             left = [now[i] + turn[turnindex][i] for i in range(2)]
  12.         now = left
  13.         index = 0 if index == len(str1) - 1 else index + 1
  14.     for ii in m:
  15.         print(ii)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-18 18:50:50 | 显示全部楼层
我来提供点不一样的解答
用递归的角度看,f(n) = f(n-1) + n + n-1

接下来只要有指明方向的变量就可以了,为了更有意思,用海龟画下来了
  1. import itertools as its
  2. import turtle

  3. def fun4(string, n):
  4.     strings = its.cycle(string)
  5.     p = turtle.Pen()
  6.     for i in sorted(its.chain(range(n + 1), range(n)), reverse=True):
  7.         for j in range(i):
  8.             p.penup()
  9.             p.forward(50)
  10.             p.pendown()
  11.             p.write(next(strings))
  12.         p.right(90)
  13.     turtle.done()
复制代码


保存成gif的效果差不多是这样的
meiriyiti214.gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 23:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表