Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 21, 2020 15:17:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9843
Репутация: +  853  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

xam1816
В этой строке первая цифра 1,далее ищем первую букву после цифры:
!#@ $,первая буква попавшаяся после цифры j,вторая k
В том-то и дело, что мы ищем первую букву строки, после неё ищем вторую букву строки такую, перед которой есть цифра.
Изначально указано (и было указано, я ничего не менял в этом плане), что правильный ответ там - буква j, а у тебя вывелась буква k.

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

Видишь, можно написать много чего красивого, потратить на это кучу времени, сидеть, выдумывать имена красивые, а работает оно в итоге неправильно.



Офлайн

#2 Дек. 21, 2020 17:17:34

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

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

Офлайн

#3 Дек. 21, 2020 18:33:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9843
Репутация: +  853  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

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


Остальные, бросайте свои варианты. Ждём день-два, потом открываем карты.



Отредактировано py.user.next (Дек. 21, 2020 19:13:13)

Офлайн

#4 Дек. 21, 2020 21:24:35

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

я один пришел на викторину

 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 (Дек. 21, 2020 21:27:22)

Офлайн

#5 Дек. 21, 2020 22:01:41

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

с двумя флагами

 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'

Офлайн

#6 Дек. 22, 2020 00:46:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9843
Репутация: +  853  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Функция 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

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

Теперь у тебя функции правильные, можешь теперь их оптимизировать. В один проход можно обработать строку как с двумя флагами, так и с одной переменной. Что значит “в один проход”? Это значит, что каждый символ строки за весь период работы с ней читается из неё только один раз. То есть никаких срезов там не должно быть, подсчёта длины строки не должно быть. Это всё повторные чтения из строки. Соответственно, на миллионе символов оно будет по миллиону раз повторно читаться и даже больше.



Отредактировано py.user.next (Дек. 22, 2020 00:51:27)

Офлайн

#7 Дек. 22, 2020 11:20:06

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

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'

Офлайн

#8 Дек. 22, 2020 11:46:12

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

через переменную

 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'

Офлайн

#9 Дек. 22, 2020 18:13:12

0ppa
Зарегистрирован: 2020-08-12
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

У меня есть вопрос, но пока не могу его сформулировать. Постараюсь на выходных. Но я совсем новичок, я только робота прошел, и черепашку начал, со списками даже ещё не работал …

Офлайн

#10 Дек. 22, 2020 22:30:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9843
Репутация: +  853  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Функция 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'ом функции приблизились к конечным. Мелкие помарки не считаем; главное - верный алгоритм.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version