хочу удалить последний напечатанный символ и правильно найти интервал
В самом внизу сам код.
Хотел бы, чтобы не выводил последний | и правильное количество раз выводил -.
Вот примеры:
ввод:
2
10
вывод:
x|p|x|p|x|p|x|p|x
-----------------
p|x|p|p|x|p|p|x|p
-----------------
x|p|x|p|x|p|x| |x
-----------------
p|p|p|x|p|p|p|p|x
-----------------
x|x|x|p|x|p|x|x|x
-----------------
p|p|p|p|p|x|p|p|p
-----------------
x|p|x|p|x|p|x| |x
-----------------
p|x| |p|x|p| |x|
-----------------
x|p|x|x|x|p|x| |x
Вот еще один пример -
ввод:
11
10
вывод:
x|p
---
p|x
Тут пример как работает мой код
ввод:
2
10
вывод:
x|p|x|p|x|p|x|p|x|
--------
p|x|p|p|x|p|p|x|p|
--------
x|p|x|p|x|p|x| |x|
--------
p|p|p|x|p|p|p|p|x|
--------
x|x|x|p|x|p|x|x|x|
--------
p|p|p|p|p|x|p|p|p|
--------
x|p|x|p|x|p|x| |x|
--------
p|x| |p|x|p| |x| |
--------
x|p|x|x|x|p|x| |x|
--------
пример второй
ввод:
11
10
вывод:
x|p|
-
p|x|
-
Вот сам код:
import math
a = int(input())
b = int(input())
if a<2 or b<2 or a==b:
print('ERROR')
def gcd(x,y):
if y==0:
return x
else:
return gcd(y, x%y)
def task(x,y):
return gcd(x,y)==1
def isPrime(n):
if n == 2:
return True
if n % 2 == 0 or n <= 1:
return False
sqr = int(math.sqrt(n)+1)
for k in range(3, sqr, 2):
if n % k == 0:
return False
return True
for i in range(a, b+1):
for j in range(a, b+1):
if task(i,j)==True and (isPrime(i) == True or isPrime(j) == True):
print("p", end="")
elif task(i,j)==False:
print("x", end="")
else:
print(" ", end="")
print("|" , end='')
print("")
for k in range(a, b):
print("-", end="")
print("")
if a > b:
for i in range(b, a+1):
for j in range(b, a+1):
if task(i,j)==True and (isPrime(i) == True or isPrime(j) == True):
print("p", end="")
elif task(i,j)==False:
print("x", end="")
else:
print(" ", end="")
print("|" ,end='')
print("")
for k in range(b, a):
print("-", end="")
print("")
Ответы (1 шт):
Автор решения: Adam Bright
→ Ссылка
Пара советов, но можно игнорировать:
- исполняемый код пишите в main функции и вызывайте через
if __name__ == '__main__': main() - названия пишите функций в snake_case
- сравнивайте
TrueилиFalseчерезis, однако если вам нужна правдивость, то просто опустите сравнение, или укажитеnot
Собственно решение (немного подчистил, не обессудьте)
from functools import lru_cache
import math
@lru_cache()
def gcd(x, y):
return x if y == 0 else gcd(y, x % y)
@lru_cache()
def task(x, y):
return gcd(x, y) == 1
@lru_cache()
def is_prime(n):
if n == 2:
return True
if n % 2 == 0 or n <= 1:
return False
sqr = int(math.sqrt(n) + 1)
for k in range(3, sqr, 2):
if n % k == 0:
return False
return True
def print_table(x, y):
line = '\n' + '--' * abs(y - x) + '-\n'
print(line.join([
'|'.join([
'x' if not task(i, j) else 'p' if is_prime(i) or is_prime(j) else ' '
for j in range(x, y + 1)
])
for i in range(x, y + 1)
]))
def main():
a = int(input())
b = int(input())
if a < 2 or b < 2 or a == b:
print('ERROR')
print_table(a, b)
if a > b:
print_table(b, a)
if __name__ == '__main__':
main()
ОБНОВЛЕНО:
- Вместо for -> if -> append использовано list comprehension
- Добавлен декоратор
@lru_cacheдля ускорения работы