Чудовий сайт replit.com ми з учнями активно використовуємо як середовище програмування. Можливість збереження власних проєктів, можливість поділитися своїм розв’язком, чудова робота з бібліотеками, інструмент форматування коду — все це відомо і дуже зручно.
Наразі replit.com має в своєму арсеналі безкоштовний штучний інтелект (AI). Можна запостити умову задачі отримати код. AI вже розуміє умови і українською мовою. Просто умови, написані людською мовою, без адаптації.
І це серйозно змінює правила проведення олімпіад і конкурсів. Тепер мало не дозволяти учням користуватися під час олімпіад і конкурсів системами штучного інтелекту, тепер треба жорстко контролювати неможливість використання смартфонів, бо іноді невеличкий шматок коду, легко отриманий учасником від штучного інтелекту може серйозно деформувати принцип справедливості змагань.
Давайте подивимся як працює AI сайту replit.com на прикладі двох задач.
https://www.eolymp.com/uk/problems/5337
Умова:
Задано n чисел. Вияснити, скільки серед них різних.
Вхідні дані
У першому рядку задано кількість чисел n (1 ≤ n ≤ 10^6). У другому рядку задано n чисел, кожне з яких не перевищує 2 ·10^9 за модулем.
Вихідні дані
Виведіть кількість різних чисел серед заданих.
Приклад
Вхідні дані #1:
1
3
Вихідні дані #1:
1
Вхідні дані #2:
5
9 15 22 15 22
Вихідні дані #2:
3
Мій розв’язок:
input()
n = [int(x) for x in input().split()]
print(len(set(n)))
Розв’язок, запропонований AI:
n = int(input())
numbers = list(map(int, input().split()))
unique_numbers = set(numbers)
count = len(unique_numbers)
print(count)
Погодьтесь, зовсім непогано.
Друга задача — «Світлофори»
https://www.eolymp.com/uk/problems/993
Умова:
У підземеллі m тунелів і n перехресть, кожен тунель з'єднує якісь два перехрестя. Мишиний король вирішив поставити по світлофору у кожному тунелі перед кожним перехрестям. Напишіть програму, яка порахує, скільки світлофорів повинно бути встановлено на кожному з перехресть. Перехрестя пронумеровані числами від 1 до n.
Вхідні дані
У першому рядку записано два числа n і m (0 < n ≤ 100, 0 ≤ m ≤ n · (n - 1) / 2). У наступних m рядках записано по два числа i та j (1 ≤ i, j ≤ n), які означають, що перехресткя i та j з'єднані тунелем.
Вихідні дані
Вивести n чисел: k-те число означає кількість світлофорів на k-му перехресті.
Можна вважати, що довільні два перехрестя з'єднані не більше, ніж одним тунелем. Немає тунелів від перехрестя i до нього самого.
(зображеня з сайту eolymp.com)
Приклад
Вхідні дані:
7 10
5 1
3 2
7 1
5 2
7 4
6 5
6 4
7 5
2 1
5 3
Вихідні дані:
3 3 2 2 5 2 3
На сайті eolymp.com задачу по класифікації віднесено до групи «теорія графів». І це певною мірою може злякати учнів. Бо чули про алгоритми Дейкстри, про різні обходи графів і все це не такі вже прості задачі. Але тут задача проста, незважаючи на лякаючу картинку.
З умови нам відома кількість перехресть. Можна створити список на таку саму кількість елементів і заповнити цей список нулями. І коли будемо аналізуватися кожен тунель, то він починається з перехрестя і завершується перехрестям. Відповідно біля перехрестя де починається тунель ставиться один світлофор і біля перехрестя, де завершується тунель ставиться так само один світлофор. Відповідно, при опрацюванні кожного тунелю будемо збільшувати на одиничку значення двох перехресть — перехрестя початку і перехрестя завершення тунелю. Після опрацювання всіх тунелів у нас буде відома кількість світлофорів біля кожного перехрестя.
Це мій давній розв’язок цієї задачі. Чому у мене перехрестя (crossing) названі змінною s – не знаю, вибачайте:
n, m = map(int, input().split())
s = [0 for i in range(n)]
for _ in range(m):
i, j = map(int, input().split())
s[i - 1] += 1
s[j - 1] += 1
print(' '.join(map(str, s)))
А тепер передамо умову цієї задачі AI сайту replit.com
Без адаптації, методом copy-paste:
Ось перший варіант, запропонований AI:
n, m = map(int, input().split())
traffic_lights = [0] * n
for _ in range(m):
i, j = map(int, input().split())
traffic_lights[i-1] += 1
traffic_lights[j-1] += 1
print(" ".join(map(str, traffic_lights)))
Ще один варіант, запропонований AI:
def calculate_traffic_lights(n, m, tunnels):
intersections = [0] * n
for i, j in tunnels:
intersections[i - 1] += 1
intersections[j - 1] += 1
return ' '.join(map(str, intersections))
n, m = map(int, input().split())
tunnels = [list(map(int, input().split())) for _ in range(m)]
calculate_traffic_lights(n, m, tunnels)
print(calculate_traffic_lights(n, m, tunnels))
В останньому рядку я лише додав print, щоб вивести результат. Погодьтесь, все зрозуміло.
Звичайно, наразі не все ідеально на ниві AI. Але учень-програміст вже може достатньо ефективно консультуватися з AI в питаннях саморозвитку. Для вчителя це також цікавий інструмент, якість якого вже дозволяє серйозно його розглядати.
ps. Дякую Захару Зінчуку, який звернув увагу на якість запропонованих AI рішень.
Анатолій Анатолійович