Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 None 22 23 24 25 26 27 28 29 30 31
py.user.next
xam1816
В этой строке первая цифра 1,далее ищем первую букву после цифры:
!#@ $,первая буква попавшаяся после цифры j,вторая k
В том-то и дело, что мы ищем первую букву строки, после неё ищем вторую букву строки такую, перед которой есть цифра.
Изначально указано (и было указано, я ничего не менял в этом плане), что правильный ответ там - буква j, а у тебя вывелась буква k.

Так что давай, делай правильно; потом посмотрим, правильно ли оно работает для любых последовательностей. Только после этого её можно будет оптимизировать (сокращать количество флагов, делать яснее и тому подобное). Не наоборот это делается.

Видишь, можно написать много чего красивого, потратить на это кучу времени, сидеть, выдумывать имена красивые, а работает оно в итоге неправильно.
xam1816
py.user.next
ищем первую букву строки, после неё ищем вторую букву строки такую, перед которой есть цифра.
 def f(string):
	flag_alpha = False
	flag_digit = False
	second_alpha = None
	for s in string:
		if flag_alpha and flag_digit:
			if s.isalpha():
				second_alpha = s
				break
			else:
				continue
		if s.isalpha() and not flag_alpha:
			flag_alpha = True
			continue
		elif s.isdigit() and not flag_digit:
			flag_digit = True
			continue
	return second_alpha
s1 = 'aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa'
print(s1)
print(f(s1))
s2 = ',;1abc bbb ccclkj!@# $lll kkk'
print(s2)
print(f(s2))
s3 ='bbb ccclkj!@# $lll kkk123::@'
print(s3)
print(f(s3))

вывод

 aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa
j
,;1abc bbb ccclkj!@# $lll kkk
b
bbb ccclkj!@# $lll kkk123::@
None
Process finished with exit code 0
py.user.next
xam1816
вывод
...
bbb ccclkj!@# $lll kkk123::@
None
None - неправильный ответ, строка none должна выводиться. Это указано в задании.


Итак, я сделал две функции: одна - с двумя флагами, вторая - с одной переменной. Функция с двумя флагами у меня заняла 13 строк. Функция с одной переменной у меня заняла 24 строки.

Мои две функции проходят все тесты из 20 тестов
20 passed in 0.05s
20 passed in 0.05s

Функция xam1816 link
xam1816
  
def f(string):
	flag_alpha = False
	flag_digit = False
	second_alpha = None
	for s in string:
		if flag_alpha and flag_digit:
			if s.isalpha():
				second_alpha = s
				break
			else:
				continue
		if s.isalpha() and not flag_alpha:
			flag_alpha = True
			continue
		elif s.isdigit() and not flag_digit:
			flag_digit = True
			continue
	return second_alpha
не проходит 8 тестов из 20 тестов из-за none
8 failed, 12 passed in 0.25s


Остальные, бросайте свои варианты. Ждём день-два, потом открываем карты.
xam1816
я один пришел на викторину
 def f(string):
	n = 0
	for s in string:
		n += 1
		if s.isalpha():
			for i in string[n:]:
				n += 1
				if i.isdigit():
					for j in string[n:]:
						if j.isalpha():
							return j
		elif s.isdigit():
			for i in string[n:]:
				n += 1
				if i.isalpha():
					for j in string[n:]:
						if j.isalpha():
							return j
	return 'none'
xam1816
с двумя флагами
 def f(string):
	flag_alpha = False
	flag_digit = False
	l = len(string)
	n = 0
	while n!=l:
		if flag_alpha and flag_digit:
			if string[n].isalpha():
				return string[n]
		elif string[n].isalpha():
			flag_alpha = True
		elif string[n].isdigit():
			flag_digit = True
		n+=1
	return 'none'
py.user.next
Функция xam1816 link
xam1816
  
def f(string):
	n = 0
	for s in string:
		n += 1
		if s.isalpha():
			for i in string[n:]:
				n += 1
				if i.isdigit():
					for j in string[n:]:
						if j.isalpha():
							return j
		elif s.isdigit():
			for i in string[n:]:
				n += 1
				if i.isalpha():
					for j in string[n:]:
						if j.isalpha():
							return j
	return 'none'
Проходит все тесты из 20 тестов.
20 passed in 0.05s

Функция xam1816 link
xam1816
  
def f(string):
	flag_alpha = False
	flag_digit = False
	l = len(string)
	n = 0
	while n!=l:
		if flag_alpha and flag_digit:
			if string[n].isalpha():
				return string[n]
		elif string[n].isalpha():
			flag_alpha = True
		elif string[n].isdigit():
			flag_digit = True
		n+=1
	return 'none'
Проходит все тесты из 20 тестов.
20 passed in 0.05s

А если символов миллион? Нужно же один раз по этому миллиону символов пройти, а не проходить по нему много-много раз. У меня функции однопроходные - то есть каждый символ строки читается только по одному разу за всю обработку. К тому же прочитанные символы и обработанные можно выбрасывать сразу из памяти, а не держать их там. У тебя же нужно строку всю в памяти держать всё время, чтобы в ней правильно индексы брались.

Теперь у тебя функции правильные, можешь теперь их оптимизировать. В один проход можно обработать строку как с двумя флагами, так и с одной переменной. Что значит “в один проход”? Это значит, что каждый символ строки за весь период работы с ней читается из неё только один раз. То есть никаких срезов там не должно быть, подсчёта длины строки не должно быть. Это всё повторные чтения из строки. Соответственно, на миллионе символов оно будет по миллиону раз повторно читаться и даже больше.
xam1816
py.user.next
можешь теперь их оптимизировать
 def f(string):
	flag_alpha = False
	flag_digit = False
	while string:
		if flag_alpha and flag_digit:
			if string[0].isalpha():
				return string[0]
		elif string[0].isalpha():
			flag_alpha = True
		elif string[0].isdigit():
			flag_digit = True
		string =string.replace(string[0],"",1)
	return 'none'
xam1816
через переменную
 def f(string):
	found = 'not'
	while string:
		if found == 'alpha and digit':
			if string[0].isalpha():
				return string[0]
		elif found == 'not':
			if string[0].isdigit():
				found = 'digit'
			elif string[0].isalpha():
				found = 'alpha'
		elif found == 'alpha':
			if string[0].isdigit():
				found = 'alpha and digit'
		elif found == 'digit':
			if string[0].isalpha():
				found = 'alpha and digit'
		string = string.replace(string[0],'',1)
	return 'none'
0ppa
У меня есть вопрос, но пока не могу его сформулировать. Постараюсь на выходных. Но я совсем новичок, я только робота прошел, и черепашку начал, со списками даже ещё не работал …
py.user.next
Функция xam1816 link
xam1816
  
def f(string):
	flag_alpha = False
	flag_digit = False
	while string:
		if flag_alpha and flag_digit:
			if string[0].isalpha():
				return string[0]
		elif string[0].isalpha():
			flag_alpha = True
		elif string[0].isdigit():
			flag_digit = True
		string =string.replace(string[0],"",1)
	return 'none'
Проходит все тесты из 24 тестов.
24 passed in 0.06s

Функция xam1816 link
xam1816
  
def f(string):
	found = 'not'
	while string:
		if found == 'alpha and digit':
			if string[0].isalpha():
				return string[0]
		elif found == 'not':
			if string[0].isdigit():
				found = 'digit'
			elif string[0].isalpha():
				found = 'alpha'
		elif found == 'alpha':
			if string[0].isdigit():
				found = 'alpha and digit'
		elif found == 'digit':
			if string[0].isalpha():
				found = 'alpha and digit'
		string = string.replace(string[0],'',1)
	return 'none'
Проходит все тесты из 24 тестов.
24 passed in 0.06s

Видимо, больше никто не будет выкладывать. Да и опубликованные xam1816'ом функции приблизились к конечным. Мелкие помарки не считаем; главное - верный алгоритм.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB