Доброго дня!
Розв'язував задачу "Пошук не парного елементу в масиві" і натрапив на такий розв'язок:
def solution(A):
result = 0
for number in A:
result ^= number
return result
Хтось може пояснити як ЦЕ працює "result ^= number"?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Повідомлення користувача vitek_z
Доброго дня!
Розв'язував задачу "Пошук не парного елементу в масиві" і натрапив на такий розв'язок:
def solution(A):
result = 0
for number in A:
result ^= number
return result
Хтось може пояснити як ЦЕ працює "result ^= number"?
Виправив відображення (ім'я залишив).
І трохи змінив тест. Спробуйте запустити свій код на цьому тесті.
Дякую!
Просто супер. Все працює і без масиву та складних вибірок.
Поки існує об'єкт ми можемо його змінювати та отримувати значення.
Дякую за красивий і простіший код.
В своєму коді я реалізував відображення результату роботи як в поясненні до завдання "#labs: 1 0 0 0 0 0 0 0 0 0, exam: 0"
Судячи з умови, ці параметри мають бути власними у кожного студента, а ви їх зробили спільними. Тому вони зайві в тому місці і мають бути внесені у конструктор.
Так. Ви скидаєте дані в спільний масив, потім перебором там шукаєте потрібного студента (причому випадково це у вас спрацьовує, бо студент лише один) і туди зберігається оцінки? Ну дуже логічно. Цікаво подивитися, як ви свої книжки шукаєте в портфелі. Хоча ні, брешу, не цікаво.
Виправив свій код:
def is_certified(self):
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
return (sum(i.get("labs"))+i.get("exam"), ((sum(i.get("labs"))+i.get("exam"))/100)>=self.k,)
return None
Тепер студент не один.
Ну, наприклад, рядки 2-8 зайві.
Після видалення попереднього визначення змінних випадає помилка:
>>> oleg = Student('Oleg', conf)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
oleg = Student('Oleg', conf)
File "<pyshell#1>", line 6, in __init__
self.students.append({"name":self.name, "labs":[], "exam":0})
AttributeError: Student instance has no attribute 'students'
>>>
Працює при попередньому визначенні масиву:
students=[]
Наприклад, так. Там ще купа проблем, як на мене, але ви питали саме про цю.
Буду вдячний, якщо відкриєте мені очі на ту купу проблем.
Чудес не буває. Такий ланцюжок можливий тільки якщо make_lab повертає об'єкт, який має метод make_lab - наприклад, self. А ви повертаєте рядок.
Я так зрозумів, що замість мого:
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
labs=i.get("labs")
exam=i.get("exam")
return "labs: {}, exam: {}".format(" ".join(str(v) for v in labs), str(exam))
достатнього повернути посилання на поточний об'єкт таким чином:
return self
?
Доброго всім дня!
Є таке завдання:
"""
Розробити класс Student для представлення відомостей про успішність слухача курсу Prometheus. Об'єкт класу має містити поля для збереження імені студента та балів, отриманих ним за виконання практичних завдань і фінального екзамена.
Забезпечити наступні методи класу:
конструктор, який приймає рядок -- ім'я студента -- та словник, що містить налаштування курсу у наступному форматі:
conf = {
'exam_max': 30, # кількість балів, доступна за здачу екзамена
'lab_max': 7, # кількість балів, доступна за виконання 1 практичної роботи
'lab_num': 10, # кількість практичних робіт в курсі
'k': 0.61, # частка балів від максимума, яку необхідно набрати для отримання сертифікату
}.
метод make_lab(m,n), який приймає 2 аргументи та повертає посилання на поточний об'єкт. Тут m -- кількість балів набрана за виконання завдання (ціле або дійсне число), а n -- ціле невід'ємне число, порядковий номер завдання (лаби нумеруються від 0 до lab_num-1). При повторній здачі завдання зараховується остання оцінка. Якщо n не задане, мається на увазі здача першого невиконаного практичного завдання. Врахувати, що під час тестування система іноді дає збої, тому за виконання завдання може бути нараховано більше балів ніж це можливо за правилами курсу, що не повинно впливати на рейтинг студента. Крім того в системі можуть міститися додаткові завдання, чиї номери виходять за межі 0..lab_num -- звичайно, бали за них не повинні зараховуватися для отримання сертифікату.
метод make_exam(m), який приймає 1 аргумент -- ціле або дійсне число, оцінку за фінальний екзамен, та повертає посилання на поточний об'єкт. Як і у випадку з практичними завданнями, оцінка за екзамен в результаті помилки іноді може перевищувати максимально допустиму.
метод is_certified(), який повертає тьюпл, що містить дійсне число (суму балів студента за проходження курсу), та логічне значення True або False в залежності від того, чи достатньо цих балів для отримання сертифікату.
Так як курс є доступним онлайн і не має дедлайнів на здачу робіт, студент може виконувати роботи в довільному порядку. Вважати, що кількість спроб на виконання кожного з завдань необмежена.
Приклад послідовності дій для тестування класу:
conf = {
'exam_max': 30,
'lab_max': 7,
'lab_num': 10,
'k': 0.61,
}
oleg = Student('Oleg', conf)
oleg.make_lab(1) \ # labs: 1 0 0 0 0 0 0 0 0 0, exam: 0
.make_lab(8,0) \ # labs: 7 0 0 0 0 0 0 0 0 0, exam: 0
.make_lab(1) \ # labs: 7 1 0 0 0 0 0 0 0 0, exam: 0
.make_lab(10,7) \ # labs: 7 1 0 0 0 0 0 7 0 0, exam: 0
.make_lab(4,1) \ # labs: 7 4 0 0 0 0 0 7 0 0, exam: 0
.make_lab(5) \ # labs: 7 4 5 0 0 0 0 7 0 0, exam: 0
.make_lab(6.5) \ # labs: 7 4 5 6.5 0 0 0 7 0 0, exam: 0
.make_exam(32) # labs: 7 4 5 6.5 0 0 0 7 0 0, exam: 30
print oleg.is_certified() # (59.5, False)
oleg.make_lab(7,1) # labs: 7 7 5 6.5 0 0 0 7 0 0, exam: 30
print oleg.is_certified() # (62.5, True)
"""
Мій код:
class Student():
exam_max=None
lab_max=None
lab_num=None
k=None
students=[]
labs=None
exam=None
def __init__(self, name=None, conf=None):
keys = conf.keys()
self.name=name
self.students.append({"name":self.name, "labs":[], "exam":0})
if 'exam_max' in keys:
self.exam_max = conf['exam_max']
if 'lab_max' in keys:
self.lab_max = conf['lab_max']
if 'lab_num' in keys:
self.lab_num = conf['lab_num']
if 'k' in keys:
self.k = conf['k']
def make_lab(self, m=None, n=None):
self.m = m
self.n = n
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
if len(i.get("labs"))<self.lab_num:
while len(i.get("labs"))<self.lab_num:
i.get("labs").append(0)
if self.n==None:
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
for b in range(len(i.get("labs"))):
if i.get("labs")[b]==0:
if self.m>=self.lab_max:
i.get("labs")[b]=self.lab_max
break
else:
i.get("labs")[b]=self.m
break
elif self.n>=0 and self.n<=self.lab_num-1:
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
for b in range(len(i.get("labs"))):
if b==self.n:
if self.m>=self.lab_max:
i.get("labs")[b]=self.lab_max
else:
i.get("labs")[b]=self.m
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
labs=i.get("labs")
exam=i.get("exam")
return "labs: {}, exam: {}".format(" ".join(str(v) for v in labs), str(exam))
def make_exam(self, m=0):
self.m_e=m
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
if self.m_e>=self.exam_max:
i["exam"]=self.exam_max
else:
i["exam"]=self.m_e
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
labs=i.get("labs")
exam=i.get("exam")
return "labs: {}, exam: {}".format(" ".join(str(v) for v in labs), str(exam))
def is_certified(self):
for i in self.students:
for k,v in i.iteritems():
if v == self.name:
rez=sum(i.get("labs"))+i.get("exam")
return (rez, (rez/100)>=self.k,)
return None
Якщо виклик методів здійснюється по одному, то все працює:
>>> oleg.make_lab(1)
'labs: 1 0 0 0 0 0 0 0 0 0, exam: 0'
>>>
Але під час перевірки на сервері є запити рядком, наприклад як цей:
>>> oleg.make_lab(1).make_lab(8,0).make_lab(1).make_lab(10,7).make_lab(4,1).make_lab(5).make_lab(6.5).make_exam(32)
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
oleg.make_lab(1).make_lab(8,0).make_lab(1).make_lab(10,7).make_lab(4,1).make_lab(5).make_lab(6.5).make_exam(32)
AttributeError: 'str' object has no attribute 'make_lab'
>>>
тоді виникає помилка.
Підкажіть, будь ласка, як виправити помилку.
Доброго всім дня!
Є таке завдання:
Розробити функцію clean_list(list_to_clean),
яка приймає 1 аргумент -- список будь-яких значень (рядків, цілих та дійсних чисел) довільної довжини,
та повертає список, який складається з тих самих значень, але не містить повторів елементів. Це значить, що у випадку наявності значення в початковому списку в кількох екземплярах перший "екземпляр" значення залишається на своєму місці, а другий, третій та ін. видаляються.
Написав такий код:
def clean_list(list_to_clean):
a=list_to_clean
b=[]
for i in a:
if i not in b:
b.append(i)
return b
Підкажіть, будь ласка, чи є засіб розділи елементи "1" та "1.0" щоб система не вважала що вони однакові і дорівнюють "1" під час перевірки наявності в другому списку?
Дякую всім! Тема закрита. Нарешті сьогодні мій код спрацював. Отримав максимум балів. Після фіксації моєї оцінки став доступний варіант від викладача. Все дуже просто: він використовував .reverse() і цикл for для перебору елементів.
Читаємо уважно умову:
vitek_z написав:Значеннями-аргументами можуть бути числа або рядки, які складаються з цифр та літер латинського алфавіту без пробілів
Рядок '[hello, word]' містить, крім цифр та літер латинського алфавіту, ще символи '[', ']', ',', і, таким чином, не є коректним аргументом для вашої програми. Правильне рішення - додавайте перевірку, що кожне слово дійсно відповідає умові; для навчальної задачі прийнятна страусяча тактика - ігнорувати невідповідність вхідних даних, мовляв, самі ввели помилкову інформацію - самі винні в неправильному результаті, яким би він не був.
В завданні є підказка:
"""
Приклад виклику: python lab4_3.py qwe asd zxc 123
Результат: 123 zxc asd qwe
"""
А це один із результатів перевірки:
"""
Неправильно обрахований результат. Для набору вхідних параметрів ['force', 'the', 'Feel'] очікуваний результат: Feel the force. Ваш результат: 'force'
"""
import sys print(' '.join(reversed(sys.argv[1:])))
import sys print(' '.join(sys.argv[1::-1]))
ps: користуйтесь дегаром, коли щось не працює
Нажаль в резутаті [] не відокремлюють від елементів списку і виводяться як складові першого і останнього елементів списку.
vitek_z написав:Якщо аргументом є рядок, то все працює. Проблема виникає, коли аргументом є список.
Підкажіть, будь ласка, як правильно переробляти список?
Що значить "аргументом є список"? Типу "(1,3,4,5)"?
Якщо програма передбачає, що аргументи можуть бути списками - треба задекларувати десь правила подання списків (синтаксис). А на базовому рівні згідно такого синтаксису потім можна перевіряти аргументи на відповідність синтаксису і у разі співпадіння парсити.
Списки типу [1,2,3]
Нажаль в умові не визначені правила подання списків "Вхідні дані: довільна, відмінна від нуля, кількість значень - аргументів командного рядка. Значеннями-аргументами можуть бути числа або рядки, які складаються з цифр та літер латинського алфавіту без пробілів."
Але при перевірці мого коду в аргументах з'являється список вище вказаного формату і відповідно результат перевірки не правильний.
2. Яка саме проблема у вас виникає, ви так і не написали.
При виконанні: python py_test.py "hello word"
Отримуємо: word hello
Що є правильним.
При виконанні: python py_test.py [hello, word]
Отримуємо: word] [hello,
Що є НЕ правильним.
При виконанні: python py_test.py "[hello, word]"
Отримуємо: word] [hello,
Що є НЕ правильним.
Вітаю всіх!
Є завдання:
Вхідні дані: довільна, відмінна від нуля, кількість значень - аргументів командного рядка. Значеннями-аргументами можуть бути числа або рядки, які складаються з цифр та літер латинського алфавіту без пробілів.
Результат роботи: рядок, що складається з отриманих значень в зворотньому порядку, записаних через пробіл. Пробіл в кінці рядка відсутній.
Наприклад
Вхідні дані: 1
Приклад виклику: python lab4_3.py 1
Результат: 1
Вхідні дані: qwe asd zxc 123
Приклад виклику: python lab4_3.py qwe asd zxc 123
Результат: 123 zxc asd qwe
Написав такий код:
import sys
print sys.argv
if len(sys.argv)==2:
s = sys.argv[1]
else:
s=sys.argv[1:]
print s
print type(s)
if type(s) == str:
s_list = s.split(' ')
a = s_list[::-1]
print " ".join(a)
elif type(s) == list:
a = s[::-1]
print " ".join(a)
Якщо аргументом є рядок, то все працює. Проблема виникає, коли аргументом є список.
Підкажіть, будь ласка, як правильно переробляти список?
Завдання виконав.
Мій робочий варіант:
#!/bin/bash
while [ "$PWD" != "/" ]
do
pwd
ls -l . | awk '/^[d]/ {print $9} '
cd ..
done
echo /
ls -l / | awk '/^[d]/ {print $9} '
Всім дякую!
Тема закрита.
Використав варіант Chemist-i, кількість помилок збільшилася (див. файл)
Початкове завдання описано в файлі що додаю
Доброго всім дня!
Постала задача пройтися від поточного каталогу до кореневого / і показати всі каталоги які є в пройдених на шляху каталогах.
Написав скрипт:
#!/bin/bash
p=$1
k=/
while [ $p != $k ]
do
pwd
ls -l . | awk '/^[d]/ {print $9} '
cd ..
done
Чи може хто підказати як виправити умову while щоб цикл зупинявся після перегляду кореневого каталогу /?
Дякую?
Доброго дня!
Програмування на С++ в середовищі Ubuntu SDK
Система Ubuntu 14.04
Умова задачі: Створити клас Вектор.
Складові Полярні координати (довжина і кут),
конструктор з параметрами, деструктор,
методи обчислення координат кінця вектора,
метод виведення даних.
Необхідно: Описати клас, об’єкт; вивести
дані об’єкту; обчислити і
вивести координати кінця
вектора.
Чомусь не працює формула розрахунку координат. Що я неправильно написав в коді?
Дякую за допомогу.