我正在尝试解决这个编程难题:
给你一个正整数 N (0 < N < 10). Your task is to print a palindromic triangle of size N.
例如,大小为 5 的回文三角形是:
1 121 12321 1234321 123454321
您不能使用超过两行。您必须完成代码 仅使用一个打印语句。
注意:使用任何与字符串相关的内容都会得到 0 分。 超过 1 个 for 语句将给出 0 分。
我只能想到“愚蠢”的方法来做到这一点:
for i in range(1, N+1):
print([0, 1, 121, 12321, 1234321, 123454321, 12345654321, 1234567654321, 123456787654321, 12345678987654321][i])
有更优雅的解决方案吗?
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
我最终做了以下事情(感谢@raina77ow的想法):
for i in range(1, N+1):
print((111111111//(10**(9-i)))**2)
for i in range(1,6):
print (((10 ** i - 1) // 9) ** 2)
这是一个wtf单衬:
f=lambda n:n and[f(n-1),print((10**n//9)**2),range(1,n+1)];f(5)
def palindrome(N):
for i in range(1, N + 1):
print(int('1' * i)**2)
palindrome(int(input()))
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:]))))))
这是一个简单的无字符串版本:
for i in range(1, int(input()) + 1):
print(sum(list(map(lambda x: 10 ** x, range(i)))) ** 2)
我知道不久前就有人问过这个问题,但我只是偶然发现了这个练习,并找到了一个替代且优雅的解决方案。
根据@raina77ow的建议,我们知道
11 * 11 = 121
,111 * 111 = 12321
等等。
但我们也知道:
2**1 - 1 = 1 (is 1 in binary)
2**2 - 1 = 3 (is 11 in binary)
2**3 - 1 = 7 (is 111 in binary)
2**4 - 1 = 15 (is 1111 in binary)
etc.
现在,通过执行
bin(15)
,你会得到0b1111
,我讨厌我必须使用切片将其转换为整数,但我没有找到其他方法。
因此,使用上述内容,这就是我的解决方案:
for i in range(1,int(input())+1): # given line
print(int(bin(2**i - 1)[2:])**2)
for i in range(1, N + 1):
print(*list(range(1, i + 1)) + list(range(i - 1, 0, -1)), sep = None)
编程高尔夫并听取 simon 和 rain 的建议:
set(map(lambda x:print((10**x//9)**2),range(1,N+1)))
因为到目前为止提供的每个解决方案都涉及 range(),我觉得它在 Python 代码中被过度使用了:
from math import log10
i = 1
while (N > log10(i)): print(i**2); i = i * 10 + 1
我认为下面的代码应该可以工作。我用了最基本的方法,这样大多数人就能明白了:
N = int(input())
arr = []
for i in range(1,N+1):
arr.append(i)
print(arr+arr[-2: :-1])
我可以使用以下方式以列表格式打印:
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]
我可能会这样做。
对于范围 (1,6) 内的 i: 增加 = ''.join(str(x) for x in range(1, i + 1)) print(增加 + 增加[::-1][1:])
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)))
希望对你有帮助。
使用此代码:
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))
for i in range(1,int(input())+1):
print(int(str('1'*i))**2)
基本上在每次迭代中,字符串中的数字“1”都会乘以 i 次,然后转换为整数,然后平方。所以例如
在第三次迭代时 --> 输出 = 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))
投入我的两分钱,使用范围拆包
for i in range(1, int(input()) + 1):
print (*range(1, i+1), *range(i-1, 0, -1))
刚刚注意到Keith Hall有一个非常相似的解决方案。 他应该为此获得最初的荣誉。
简单的方法
if __name__ == '__main__':
n = int(input())
st = ''
st2 = ''
for i in range(1,n+1):
st += str(i)
if i==0:
print(st)
else:
st2 = str(i-1) + st2
print(st+st2.rstrip('0'))