【问题标题】:Solving palindromic 'Triangle Quest' puzzle in Python用 Python 解决回文“三角任务”难题
【发布时间】:2015-12-28 13:16:23
【问题描述】:

我正在尝试解决这个编程难题:

给你一个正整数 N (0

例如,一个大小为 5 的回文三角形是:

1
121
12321
1234321
123454321

你不能超过两行。您必须完成代码 只使用一个打印语句。

注意:使用与字符串相关的任何内容都会得到 0 分。使用 多于一个 for 语句将给出 0 分。

我只能想到'愚蠢'的方式来做到这一点:

for i in range(1, N+1):
    print([0, 1, 121, 12321, 1234321, 123454321, 12345654321, 1234567654321, 123456787654321, 12345678987654321][i])

有没有更优雅的解决方案?

【问题讨论】:

  • 不知何故,现在有办法获得非零分数,因为打印与字符串有关。
  • 请注意,121 = 11 * 11、12321 = 111 * 111 等

标签: python python-3.x palindrome


【解决方案1】:

我最终做了以下事情(感谢@raina77ow 的想法):

for i in range(1, N+1):
    print((111111111//(10**(9-i)))**2)

【讨论】:

  • 稍微好一点的方法:print((10**i//9)**2).
【解决方案2】:
for i in range(1,int(input())+1):
   print(int((10**i-1)/9)**2)

1 -> (   10 - 1) / 9 =    1,    1 *    1 = 1
2 -> (  100 - 1) / 9 =   11,   11 *   11 = 121
3 -> ( 1000 - 1) / 9 =  111,  111 *  111 = 12321
4 -> (10000 - 1) / 9 = 1111, 1111 * 1111 = 1234321

【讨论】:

    【解决方案3】:
    def palindrome(N):
        for i in range(1, N + 1):
            print(int('1' * i)**2)
    
    palindrome(int(input()))
    
    • 1 * 1 = 1
    • 11 * 11 = 121
    • 111 * 111 = 12321

    【讨论】:

    • 如果编码挑战规则排除了字符串,那么这个解决方案将失败。
    【解决方案4】:
    for i in range(1,6):
        print (((10 ** i - 1) // 9) ** 2)
    

    这是一个 wtf one 班轮:

    f=lambda n:n and[f(n-1),print((10**n//9)**2),range(1,n+1)];f(5)
    

    【讨论】:

      【解决方案5】:

      我认为下面的代码应该可以工作。我已经用了最基本的方法,所以大多数人都会理解它:

        N = int(input())
        arr = []
        for i in range(1,N+1):
               arr.append(i)
               print(arr+arr[-2: :-1])
      

      【讨论】:

        【解决方案6】:
          for i in range(1,int(input())+1): #More than 2 lines will result in 0 score. Do not leave a blank line also
            print(''.join(list(map(lambda x:str(x),list(range(i+1))[1:]))+list(map(lambda x:str(x),list(reversed(list(range(i))[1:]))))))
        

        【讨论】:

          【解决方案7】:

          这是一个简单的无字符串版本:

          for i in range(1, int(input()) + 1):
              print(sum(list(map(lambda x: 10 ** x, range(i)))) ** 2)
          

          【讨论】:

            【解决方案8】:
            for i in range(1, N + 1):
                print(*list(range(1, i + 1)) + list(range(i - 1, 0, -1)), sep = None)
            

            【讨论】:

            • 这用空格分隔数字(不允许使用sep=""
            • @planetp,你是对的,它用空格分隔数字,但 OP 没有指定不允许用空格分隔数字 - 毕竟,答案仍然是一个回文三角形, 只是有空格:) 然而,即使它无效,我认为它值得包括,因为它可能比数学答案更容易理解:)
            • 派对迟到了,但是...python reduce(lambda x, y: x*10 + y, list(range(1, i + 1)) + list(range(i - 1, 0, -1)))
            【解决方案9】:

            打高尔夫球并听取 simon 和 Rain 的建议:

            set(map(lambda x:print((10**x//9)**2),range(1,N+1)))
            

            【讨论】:

              【解决方案10】:

              仅仅因为目前提供的每个解决方案都涉及 range(),我觉得它在 Python 代码中被过度使用:

              from math import log10
              
              i = 1
              while (N > log10(i)): print(i**2); i = i * 10 + 1
              

              【讨论】:

                【解决方案11】:
                    for i in range(2,int(raw_input())+2): 
                        print ''.join(([unicode(k) for k in range(1,i)]))+""+''.join(([unicode(k) for k in range(i-2,0,-1)]))
                        print ''.join(map(unicode,range(1,i)))+""+''.join(map(unicode,range(i-2,0,-1)))
                

                我希望它会有所帮助。

                【讨论】:

                  【解决方案12】:

                  使用此代码:

                  prefix = ''
                  suffix = ''
                  
                  for i in range(1,n):
                      middle = str(i)
                      string = prefix + middle + suffix
                      print(string)
                  
                      prefix = prefix + str(i)
                      suffix = ''.join(reversed(prefix)) 
                  
                  

                  【讨论】:

                  • @jkdev 我的代码出了什么问题,为什么投反对票
                  • 我只在代码块前添加了“使用此代码:”。不对代码块本身进行任何编辑。
                  【解决方案13】:
                  for i in range(1,int(input())+1):
                      print(int(str('1'*i))**2)
                  

                  基本上在每次迭代中,字符串中的数字“1”乘以 i 次,然后转换为整数,然后平方。所以例如

                  第 3 次迭代 --> 输出 = 111^2 = 12321

                  编辑:注意约束是用 str() 函数回答

                  所以我们有一个序列 1, 11, 111, 1111 nth = an + (a(r^(n-1) - 1)) / (r - 1) 其中|r > 1|

                  因此,解决方案;

                  for i in range(1,int(input())+1):
                      print(pow((((10**i - 10))//9) + 1, 2))
                  

                  【讨论】:

                    【解决方案14】:

                    我可以使用以下列表格式打印:

                        for i in range(1,5):
                            print [j for j in range(1,i+1) ], [j for j in range(i-1,0,-1) ]
                    

                    结果:

                    [1] []
                    [1, 2] [1]
                    [1, 2, 3] [2, 1]
                    [1, 2, 3, 4] [3, 2, 1]
                    [1, 2, 3, 4, 5] [4, 3, 2, 1]
                    

                    【讨论】:

                      猜你喜欢
                      • 2012-05-10
                      • 1970-01-01
                      • 2023-02-02
                      • 1970-01-01
                      • 2013-08-19
                      • 1970-01-01
                      • 2020-04-12
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多