Я скопировал (и не процитировал) две строки кода из исходного кода OpenJDK для студенческого проекта Data Structures. Тем не менее, сравнение кодов показывает тревожное количество (40%) сходства. Вот параллельное сравнение с моим файлом.
Основываясь на этих основаниях, мой профессор хочет дать мне -100% за задание, что снизит мою общую оценку на 15%, что, вероятно, заставит меня не пройти C-wall (в зависимости от того, насколько хорошо я справлюсь с заданием). итоговый экзамен). По этой причине (и моей сознательной) я решил обратиться.
Однако я полагаю, что большая часть сходства в отчете связана с тем, что я скопировал строки 142-152:
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
Я не цитировал эти две строчки, но собирался их потом вычеркнуть.
На самом деле всю эту функцию можно удалить, вообще не затрагивая программу, что и приводит к такому сравнению файлов.
Тогда только строки 114-126 являются проблемой:
MyEntry<K, V>[] newArr = new MyEntry[newSize];
// Copy
for (int i = 0; i < data.length; i++) {
MyEntry<K, V> e = data[i];
if (e != null) {
data[i] = null;
do {
MyEntry<K, V> next = e.next;
int j = e.hash % newSize;
e.next = newArr[j];
newArr[j] = e;
e = next;
} while (e != null);
Тем не менее, этот фрагмент принадлежит мне. Я написал эти строки, не ссылаясь на HashMap.java , и это общий алгоритм создания цепочек, который я могу подробно объяснить и о котором знаю уже много лет.
Да, я знаю, что тот факт, что я скопировал две другие строки, ставит под угрозу мою честность и превратил 20% в 40% для начала, так как я могу это доказать?
Я не знаю, как защитить все это дело перед Советом по студенческому поведению, который очень мало знает о программировании. Мое слушание совета состоится через месяц. Являются ли эти два фрагмента кода плагиатом всего моего проекта? Справедливы ли -15% к моей общей оценке?
Примечания:
java.util.*
(например, более 1000 строк для каждого проекта за 8 дней), и я не копировал какой-либо другой код. Я бы сказал, что фактическая реализация структуры данных должна занимать около 1/5 нашего времени, затрачиваемого на проект.Весьма вероятно, что вы занимались плагиатом, и в этом случае вам лучше признать свою ошибку, чем продолжать спорить.
Глядя на ваш код, вы видите, что многое было взято из файла HashMap.java. Я сильно подозреваю, что вы начали с этого кода, а затем модифицировали его для создания своего кода или тщательно следовали ему как шаблону при написании собственного. Выделенные разделы кода содержат часть этого, но другие разделы также очень похожи на другой файл, хотя и с немного измененными комментариями и порядком.
Если это так, то код, который вы нам показали, не является вашей собственной оригинальной работой, а на самом деле является плагиатом версии HashMap.java. Если оставить две несоединенные линии, то это дымящийся пистолет связи, которая, вероятно, будет решающей для панели. Ваше замечание о том, что они не нужны, на самом деле будет считаться против вас, потому что вы не сможете объяснить, почему они вообще существуют. И независимо от того, было ли это вашим намерением или нет, вполне вероятно, что комиссия (и ваш профессор) увидит ваши измененные комментарии и порядок как попытку замести следы и скрыть ваш плагиат от автоматизированных инструментов.
Комиссия с большей вероятностью проявит снисходительность к учащемуся, который, по крайней мере, кажется раскаивающимся и признает, что совершил ошибку, чем к учащемуся, который отрицает неправомерность перед лицом явно очень веских доказательств.
На мой взгляд, заголовок вашего вопроса «составляют ли две строки скопированного кода плагиат» не совсем точен.
Я думаю, что вам будет очень трудно утверждать, что это не/не было плагиатом. Сходство между вашим кодом и HashMap.java не ограничивается двумя строками или одним «общим алгоритмом».
1) Вы выбрали точно такую же емкость и коэффициент загрузки по умолчанию:
/** Has to be a power of 2 */
private static final int DEFAULT_CAPACITY = 16;
/** The load factor */
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
против
// The default initial capacity - MUST be a power of two.
static final int DEFAULT_INITIAL_CAPACITY = 16;
// The load factor used when none specified in constructor.
static final float DEFAULT_LOAD_FACTOR = 0.75f;
Фактически, комментарий «Должна быть степень двойки» уже означает, что вас поймали с поличным, потому что на самом деле нет веских причин требовать, чтобы емкость была степенью двойки в вашем коде. Тот факт, что размер является степенью двойки, используется только для оптимизации в версии кода HashMap.java, и эта оптимизация не используется в вашем коде. Вам, вероятно, повезло, что совет по поведению студентов мало что знает о программировании.
2) Эти два get
метода очень похожи:
public V get(K key) {
if (key == null)
return null;
int hash = key.hashCode() % data.length;
// System.out.printf("Getting %d %d %s\n", key.hashCode(), hash,
// key.toString());
for (MyEntry<K, V> e = data[hash]; e != null; e = e.next) {
if (e.hash == hash && (e.getKey() == key || key.equals(e.getKey())))
return e.getValue();
}
return null;
}
против
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
Кажется странным, что вы оба выбрали один и тот же, очень специфический способ сравнения ключей (сначала сравнение хэшей, затем указателей ключей и, наконец, использование key.equals).
3) ... как метод put
:
public MyEntry<K, V> put(K key, V value) {
int hash = key.hashCode();
// System.out.printf("Adding %d %d %s\n", key.hashCode(), hash, key.toString());
int i = hash % data.length;
// Collisions
for (MyEntry<K, V> e = data[i]; e != null; e = e.next) {
if (e.hash == hash && (e.getKey() == key || key.equals(e.getKey()))) {
MyEntry<K, V> old = e;
e.setValue(value);
return old;
}
}
addEntry(hash, key, value, i);
return null;
}
против
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
4) ... как add
и grow
-методы:
void addEntry(int hash, K key, V value, int bucketIndex) {
MyEntry<K, V> e = data[bucketIndex];
data[bucketIndex] = new MyEntry<>(hash, key, value, e);
keyList.add(key);
if (size++ >= threshold)
grow();
}
/**
* Grows the array 2x current size
*/
private void grow() {
int newSize = 2 * data.length;
@SuppressWarnings("unchecked")
MyEntry<K, V>[] newArr = new MyEntry[newSize];
// Copy
for (int i = 0; i < data.length; i++) {
MyEntry<K, V> e = data[i];
if (e != null) {
data[i] = null;
do {
MyEntry<K, V> next = e.next;
int j = e.hash % newSize;
e.next = newArr[j];
newArr[j] = e;
e = next;
} while (e != null);
}
}
data = newArr;
threshold = (int) (newSize * DEFAULT_LOAD_FACTOR);
}
против
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
Конечно, HashTable — довольно распространенная структура данных, и существует ограниченное количество способов реализации данного алгоритма. Однако две скопированные строки показывают, что вы определенно использовали HashTable.java в качестве отправной точки для своей собственной реализации, а дальнейшее сходство в дизайне, нелогичных комментариях и структуре кода наводит на мысль, что вы действительно использовали нечто большее, чем просто немного «вдохновения» от HashTable.java.
Обратите внимание, что и ваш, и их методы put и get используют цикл for для перебора связанного списка, в то время как методы роста/передачи используют цикл while для выполнения того же самого. Кажется странным, что оба фрагмента кода принимают одно и то же решение независимо друг от друга.
Наши проекты довольно обширны, так как нам не разрешено использовать java.util.* (например, 1000+ строк для каждого проекта за 8 дней), и я не копировал никакой другой код. Я бы сказал, что фактическая реализация структуры данных должна занимать около 1/5 нашего времени, затрачиваемого на проект.
Кажется очевидным, что вам не разрешалось использовать HashMap.java, и что, если вы хотели использовать хеш-таблицу, вам нужно было реализовать свою собственную. Копируя большие части HashMap.java, вы пытались обойти это ограничение. «Это лишь малая часть проекта» не отменяет того факта, что вы взяли код, который не был вашей собственной работой, и попытались выдать его за свой собственный (хотя ожидалось, что вы напишете это часть задания самостоятельно).
Если бы задания были действительно нереалистичными с учетом выделенного промежутка времени, было бы лучше сдать неудачное решение. Если бы многие студенты сдали неудачное решение, профессор мог бы подумать, что задание слишком сложное. Если бы плагиат остался незамеченным, профессор мог бы (ошибочно) сделать вывод, что задание имеет соответствующую сложность, и наказать студентов, которые (попытались) выполнить задание честно и в соответствии с правилами.
Наказания за плагиат могут сильно различаться в зависимости от учреждения. -100% по вашему заданию может быть жестким, но в нашем учреждении штраф мог быть где угодно от 0% по заданию, автоматической неудачи для рассматриваемого курса до исключения из учебы на 12 месяцев. В большинстве учреждений к плагиату относятся так же, как к списыванию на экзамене, и наказания могут быть строгими. Если бы единственным наказанием было получение 0% за плагиатное задание, тогда не было бы никакого вреда в «попытке» плагиата, если вы все равно провалите задание, не прибегая к плагиату.
size()
точного «Возвращает количество сопоставлений ключ-значение на этой карте». к неоднозначному «Возвращает размер массива»?Плагиат - это выдача чужой работы за свою. Насколько я вижу, вы выдали чужую работу за свою. В свою защиту вы приводите список утверждений:
Я не вижу, как любой из них имеет отношение к рассматриваемому вопросу. Центральный вопрос: использовали ли вы чужую работу в своей собственной без ссылок. Если вы это сделали, вы занимаетесь плагиатом, и вам грозят последствия. Усвойте урок и больше не повторяйте ошибку.
i++;
будет плагиатом, за исключением самого первого исторического использования этой строки. Надеюсь, понятно, насколько нелепо было бы, если бы с этим обращались вот так. Должна быть четко определенная граница, но я не слышал ни о какой...Вопросы, которые вам нужно задать себе:
Хотя тема плагиата затрагивает разные области, не все области одинаковы. Написать программу — это не то же самое, что написать эссе. Хотя оба имеют схожие компоненты мышления, грамматика = табуляции/пробелы, существительные = объекты, предлоги = указатели и т. д. Функционально они разные. Как часть вашего задания, вы упомянули, что вы получили разделы кода из библиотеки с открытым исходным кодом? Даже если это не было формальной цитатой, то, возможно, в комментариях, ссылающихся на библиотеку?
Если задача состояла в том, чтобы суммировать список целых чисел. Было бы плагиатом, если бы код 10 программистов использовал сумму (объект)?
общий алгоритм цепочки, который я могу подробно объяснить
Здесь вам нужно доказать, что есть момент, когда данный фрагмент кода стал общей информацией, но вам нужно продемонстрировать, что он на самом деле является общим. У неспециалиста не будет достаточных знаний, чтобы предположить, что то, что вы говорите, верно. Вы должны были бы привести примеры. (Вспомните Hello World, кто на самом деле «владеет» им?)
IANAL, но может показаться, что сам фактический закон сложен.
Более 30% класса были замечены в нарушениях академической честности в проектах в течение семестра, и только что получивший диплом профессор, похоже, не считает себя или свои задания проблемой.
Профессор компьютерных наук не является юристом, но он или она, безусловно, способны разбираться в вопросах компьютерных наук и задавать себе вопросы о наличии злого умысла. Если заявления о плагиате могут быть рассмотрены с помощью простого документа, в котором вы цитируете свои источники (библиотеки, проекты с открытым исходным кодом, репозитории github), то претензии должны быть отклонены.
Знания и обучение не возникают в вакууме.
Спасибо за это. Как я уже говорил, цитирование кода мне чуждо (а я программирую с 8 лет), и я НЕ цитировал (но ДОЛЖЕН) цитировать эти строки. Однако забыть процитировать две строчки и совершить плагиат по всему проекту — это две разные вещи, особенно в проекте такого масштаба. Как бы вы поступили с этим?
Вы приводите аргумент, что текущие тесты для определения плагиата (например, на английском языке) плохо работают, когда дело доходит до программирования и написания сценариев, цитирование и документирование ваших источников функционально отличается. В эссе цитирование должно продемонстрировать, откуда вы взяли идею. В программе это документирование того, как фрагмент кода поможет вам достичь ваших целей. Цель меняется с «воздать должное там, где это необходимо» на «как это поможет и что это даст».
Имея это в виду, посмотрите на «hello world». Это общеизвестное введение в языки программирования. Но опытному программисту не нужно «цитировать», чтобы понять. Он стал «общим» для всех языков. Однако конкретный компилятор на C, который позволит ему управлять манипулятором, недостаточно распространен, чтобы опытный (независимо от языка) программист мог легко его распознать, поэтому необходима документация. Однако в мире Java от вас будет зависеть, продемонстрируете ли вы, что ваш код будет достаточно «общим», чтобы не считаться требующим цитирования.
Что касается самого дела, вы можете аргументировать, что ваши действия не соответствуют традиционным определениям и тесту на плагиат. Но не ожидайте, что ваша аудитория (коллеги по работе) поймет, учитывая суровость и полномочия истца (вашего профессора). Другим способом было бы возразить, что суровость наказания -100% не соответствует масштабам предполагаемого плагиата. Утверждается, а не доказано. Пока не будет вынесено окончательное решение, оно открыто для обсуждения.
В случае отказа студента в одностороннем порядке на основании плагиата следует и следует обратиться к «высшему авторитету» или, по крайней мере, к рассмотрению группой знающих людей (а не непрофессионалов). Вы заявили, что этот класс имеет (на мой взгляд, огромный) процент заявлений о плагиате. Хотя у меня нет статистики для подтверждения моего заявления, 30% смехотворно много. В моей академической карьере плагиат был РЕДКИМ явлением. Таким образом, еще один момент, который вы можете сделать, заключается в том, неправильно ли профессор применяет концепцию традиционного плагиата к области, в которой она принципиально отличается.
Еще один аргумент, который вы можете привести, заключается в том, что цитирование кода никогда не преподавалось/не подчеркивалось/не ожидалось профессором в классе. Раньше вас учили, что такое плагиат, скорее всего, когда дело доходило до написания эссе, но никогда не учили, как его применять в кодировании. Хотя в этом аргументе может отсутствовать одна или две ноги (особенно в сфере того, что вы уже должны знать), но как было бы разумно привлечь вас к ответственности за то, на что вас никогда не учили обращать внимание?
Спасибо, хороший повод поднять. Он просто использует MOSS из Стэнфорда, как я упоминал в ОП. Я не знаю его предела процентного сходства, прежде чем он обвиняет людей.
Детектор плагиата, подобный этому, является Инструментом для подтверждения того, что X был плагиатом, одним из многих инструментов. Это ни в коем случае не окончательный тест для определения плагиата.
Например, сделайте анализ дыхания на вождение в нетрезвом состоянии, если я съел семена мака и дал положительный результат, были бы смягчающие факторы ? Если все, что ваш профессор использует для определения плагиата, — это инструмент, спросите, могут ли инструменты быть ошибочными.
Хотя это больше риторика и логика, чем программирование, я уверен, что никто никогда не может утверждать, что программа идеальна. (Кроме COBOL, потому что он на 100% идеален). Итак, если это действительно единственная метрика, которую использует ваш профессор, какова вероятность ложных срабатываний ? Будет ли несправедливо наказывать студентов, если программа определит, что они жульничали?
С учетом сказанного, прочитайте свой справочник для студентов, если у вас есть возможность иметь научного консультанта в процессе. Также обратитесь в службу омбудсмена, если она есть в вашей школе. Этот офис может рассматривать подобные вопросы в качестве арбитра, если это разрешено учреждением.
На мой взгляд, группа однокурсников (без юридического образования или образования в области программирования) не лучше всего подходит для определения того, имел ли место программный плагиат.
Уточните, а -100% на самом деле 0%? Или ваш профессор не только дает вам 0% за задание, но и дополнительно штрафует вас на дополнительную сумму? Т.е. A+B+C=100 (A=20,B=20,C=60), 0% на A будет означать всего 80%, -100% на A будет означать всего 40%. - Синяя птица
Кроме того, он штрафует меня на дополнительную сумму. Я не получил бы ноль за проект (что могла позволить моя оценка), но на самом деле моя общая оценка пострадала БОЛЬШЕ, чем 7% стоимости проекта. –TheSmartWon
Коварная вещь здесь... (учитывая обновление), если совет примет решение в вашу пользу, это не означает, что профессор будет относиться к вам так же, как к другим студентам, продвигающимся вперед. Вы можете оказаться под еще более пристальным вниманием.
@user2264247 user2264247 Сегодня он смотрел со мной на MOSS около 5 минут (именно то, что я разместил в OP), и он сосредоточился только на этой хеш-функции. Он даже не знал, что делает эта функция до того, как мы поговорили, так что я не думаю, что он предварительно просматривал ее. Он и его коллега (не знаю, почему она была в комнате) заявили, что из-за того, что я скопировал две строки, вся моя программа виновна в плагиате, и что они обвинят меня. Они действительно, казалось, не думали дважды или не заботились об этом, вероятно, из-за большого количества дел, через которые они проходят. – TheSmartWon
@FrankFYC Этот коллега и он также вместе публикуют статьи и проводят сопутствующие курсы. Они хорошие друзья. Это просто его имя обвиняет меня в "отчете о нарушении честности", но я обязательно подниму этот вопрос. Я понятия не имею, что она делала в комнате, все, что она сделала, это быстро отклонила все мои аргументы, которые в противном случае мой профессор мог бы выслушать . Ей доставляло удовольствие доказывать мою неправоту по каждому пункту, который я поднимал, это было своего рода садизмом. Я был как очередное насекомое, запутавшееся в их паутине! – TheSmartWon
Если бы это были Соединенные Штаты. Почитайте о ФЕРПА . Я не эксперт, но полагаю, что если бы ваш профессор позволил другому преподавателю увидеть ваши оценки, это было бы нарушением. Это может быть актом, который взорвется им в лицо. Если вы находитесь в США, убедитесь, что оба профессора находились в одной комнате с вами, когда вы обсуждали доклад.
См. ответ aeismail на вопрос .
Учитывая количество других дел, предположили бы вы, что другой профессор тоже участвовал в этих делах? Например, другой профессор был посвящен в оценку другого студента?
Они могут сколько угодно отрицать это, но если более одного студента заявят, что оба профессора были в комнате, это будет фактически групповым иском (ха, простите за каламбур).
Задокументируйте все и назначьте встречу с координатором FERPA вашего университета (например, отдел, созданный для приема жалоб FERPA).
На первый взгляд ваш аргумент выглядит вполне разумным. То есть, если вы скопировали две строки кода (при условии, что это разрешено), но просто не включили цитату или забыли удалить ее (как вы утверждали), то это можно было бы списать на честную ошибку, на -par с опечаткой. Такая ошибка была бы досадной, но вряд ли заслуживала серьезного наказания.
Однако, как отмечали другие, при более внимательном рассмотрении кода создается впечатление, что вы полностью скопировали исходный код, а затем изо всех сил пытались скрыть этот факт. Это заставляет всякое сочувствие исчезнуть; во всяком случае, вы можете слишком легко отделаться.
Но тогда есть ваша апелляция. Сама апелляция, похоже, основана на нечестной предпосылке, как и этот вопрос. Похоже, вы лжете совету чести!
Такая ложь, казалось бы, является основанием для дальнейшего наказания. То есть, сначала был обман, на серьезность которого вы сейчас обратили внимание, а потом еще явно мошенническая защита.
Я не знаю, что тебе сказать. С одной стороны, это довольно грубо, и было бы лучше, если бы вы усвоили урок сейчас. Но в качестве ответа на этот вопрос, предполагая, что вы пытаетесь свести к минимуму наказание, может показаться, что вы можете отказаться от апелляции и оставить все в покое, а не рисковать сделать их хуже.
В американской правовой системе иногда считается, что подсудимые могут заявить о своей невиновности без дальнейшего наказания, если это утверждение впоследствии окажется ложным. Это следует из Пятой поправки к Конституции США , которая гарантирует защиту от самообвинения.
Самое забавное в этом то, что если вы смотрите много сериалов типа «Закон и порядок» (как это делают многие американцы), вы можете привыкнуть к мысли, что подсудимые могут лгать о своей невиновности без наказания, что может быть быть склонным обращаться к другим судебным инстанциям, например, к пересмотру совета чести.
Дело в том, что советы чести — это не суды; право не свидетельствовать против себя не применяется. Так что, если вы лжете в свою защиту совету чести, вы все равно лжете тем людям, которые будут судить вас именно за этот проступок.
Редактировать: Пошел проверить себя по этому вопросу, и, похоже, Верховный суд постановил, что ложь в свою защиту может увеличить приговор:
Сегодня Верховный суд единогласно постановил, что обвиняемые по уголовным делам, которые отстаивают свою позицию и дают ложные показания в свою защиту, могут по конституции быть подвергнуты дополнительному тюремному заключению за воспрепятствование правосудию.
Это решение отменило решение федерального апелляционного суда в Ричмонде, который в 1991 году постановил, что Конституция запрещает судьям выносить дополнительный приговор в соответствии с федеральными правилами в качестве наказания за «неверное отрицание вины под присягой».
- «Суд говорит, что ложные показания могут привести к более длительному приговору» , NYTimes (1993).
Таким образом, судя по всему, подсудимые могут быть наказаны за ложь в свою защиту даже в американских судах.
Может быть не так много разумных алгоритмов, которые реализуют цепочку, но есть буквально миллиарды возможных 32-битных алгоритмов хеширования. Нет смысла утверждать, что один из них является «общеизвестным», или что он выпущен под лицензией GPL, или что вы собирались его удалить. Если бы вы удалили его, ваше дело выглядело бы совершенно по-другому, и я бы сказал, что вы должны заявлять о независимом дублировании. В вашем нынешнем положении я не думаю, что вы сможете убедить кого-либо, что вы выбрали один и тот же алгоритм хеширования независимо от OpenJDK.
Так что я считаю, что лучший вариант для вас — признать правонарушение, а затем заявить, что объем действительно плагиатного кода относительно невелик, а наказание, которое хочет назначить ваш профессор, несоразмерно.
У меня есть опыт преподавания (и борьбы с плагиатом) и патентования программного обеспечения/судебных разбирательств.
Я оценивал группы домашних заданий, показывая одну и ту же ошибку или одно и то же несовершенство. Я видел студентов, которые не могли запустить свою IDE, придумывая краткие и опытные решения домашних заданий, где все переменные имели такие имена, как «theCounter», «variableA» и «myself», но в остальном их автор выглядел так, будто уже имел 10 лет опыта работы в этой области, и явно не нуждается в степени бакалавра.
Дело о патенте на программное обеспечение может быть сведено к доказательству того, что одна строка, например «x = 0», была плагиатом. Это включает в себя доказательство мотива, людей (тот факт, что компания А привлекла людей из компании Б) и состояние дел на момент предполагаемого плагиата (а не сейчас, когда предлагаемый подход очевиден для всех). Испытания патентов на программы — это не бесплодные дискуссии о том, как алгоритм Смита-Уотермана работает с кодом истца и ответчика.
В вашем случае кажется, что вы хотя бы «просмотрели» код OpenJDK, прежде чем запускать свой. Неопровержимым доказательством является хеш-функция: вероятность ее случайного воспроизведения, согласно г-ну Дейте и C-3PO, составляет один к 67 триллионам миллиардов. Далее ясно, что вы искали не хэш-функцию, а реализацию хэш-карты. Поиск «хеш-функции для строк» или «хеш-функции для строк java» не дает результата из OpenJDK.
Как только вы увидели реализацию hashMap в OpenJDK, проблема сразу же стала очевидной. Из всех возможных способов приблизиться к hashMap, сознательному или нет, вы выбрали тот, что от OpenJDK, потому что вы были ужасно предвзяты.
Ваши комментарии к коду бесполезны. Комментарий «длина» как «длина» доказывает, что вы не поняли проблему, и комментарий здесь был предназначен просто для выполнения требования оценки. Вы тратите время классника. Правильным будет: "хэш = хэш искомого элемента", "Длина: размер хеш-таблицы", "возвращает позицию в хеш-таблице указанной длины для элемента хеша h. Он никогда не превышает длину минус один". Кроме того, вы говорите, что «get возвращает значение по индексу», что в корне неверно для хэш-карты. Get вернет значение ключа. Смешивание ключа и индекса является "тяжким преступлением", если вы создаете структуры данных.
Мое суждение здесь было бы «виновен по обвинению». Вы не тратили время на обдумывание решения, а взяли существующее решение и, вероятно, внедрили его самостоятельно. Это разрушило цель домашнего задания, которое должно было заставить вас думать о структурах данных. Ссылка на источник OpenJDK только сделает вашу вину более очевидной (классический случай самооговора во время защиты). Это как если бы вам дали математическую задачу, и в итоге вы цитируете книгу и страницу, показывающую решение задачи. Вы проделали хорошую работу по поиску, но цель проблемы состояла в том, чтобы заставить вас решить ее.
Другие ответы касались философских / моральных вопросов, таких как «Это плагиат?» "Это неправильно?" и т. д. Но - я бы сказал, что вы должны сосредоточиться на практической проблеме, а именно:
Я не знаю, как защитить все это дело перед Советом по поведению студентов.
Так что есть с чем спорить...
Во-первых, ознакомьтесь с юридически значимыми документами:
Затем определите, разрешено ли вам, и хорошо ли это, чтобы вас представлял кто-то: Юрист; студент юридического факультета; член факультета; член студенческого совета и т. д. Если это доступно для вас, вы должны по крайней мере проконсультироваться с одним (даже если вы в конечном итоге не приведете их с собой) - у них наверняка больше опыта, чем у вас.
Теперь определите, действительно ли вы хотите утверждать, что «эта часть того, что я скопировал, не является плагиатом». Может быть, вы могли бы привести этот аргумент, я не знаю. Даже неспециалистам - если у вас есть достаточно времени (которого у вас может не быть), вы можете объяснить, как программы компилируются из исходного кода и как какой-то код на самом деле не используется. Вы могли бы привести примеры того, что кажется плагиатом, но на самом деле это почти идентичный код, написанный независимо друг от друга разными людьми.
Честно говоря, я сомневаюсь, что это продвинет вас далеко вперед, учитывая обстоятельства. Даже если вы теоретически правы (вопрос, который я не комментирую), и даже если бы вы могли объяснить это правлению - оно может не захотеть услышать такой аргумент.
С другой стороны, я бы предположил (безосновательно!), что более убедительным аргументом могло бы быть что-то вроде (краткое резюме):
Я очень сожалею о содеянном и не отрицаю, что это было недопустимо, неуместно и аморально.
У меня возник соблазн заняться плагиатом из-за ABC, который, не оправдывая моего поведения, также привел к тому, что 30% класса поддались искушению заняться плагиатом, предполагая объективную проблему в дополнение к моей личной неудаче.
Я загладил свою вину способами XYZ.
В случаях C1 и C2, которые, как я утверждаю, сопоставимы, штраф был намного меньше.
Наконец, я хотел бы, чтобы правление приняло во внимание мои личные обстоятельства DEF при рассмотрении этого дела.
Я буду соблюдать любое решение правления.
и оставьте это на этом.
Вы обязательно должны опротестовать предлагаемое наказание, потому что многие учреждения не допускают такого наказания, какое хочет назначить ваш профессор. (Другими словами, ваш преподаватель не может поставить вам оценку -100 % или оценку ниже нуля за определенную часть вашей оценки.)
Что касается копирования кода как плагиата, то это гораздо более острое утверждение. Использование чужого кода — это проблема, но если действительно нет другого способа что-то сделать, то как вы заявляете о плагиате? Плагиат не распространяется на «очевидные» утверждения. Например, это не плагиат, если два учебника по математическому анализу решают интеграл, используя ряд уравнений одним и тем же способом, потому что, по сути, это единственный способ, которым вы можете это сделать. С другой стороны, если вы напишете вокруг него кучу одинакового текста, то вы совершили плагиат.
Плагиат — сложная тема в компьютерных науках, так как существует лишь ограниченное количество фрагментов кода, приводящих к одному и тому же результату, и только один из них можно считать оптимальным решением.
На самом деле вы скопировали код из библиотек Java, и сам код, и имена переменных предполагают это. Поэтому вашим долгом было процитировать это должным образом. В этой строгой точке зрения ваш профессор прав, и, вероятно, он прав и в других упомянутых вами случаях. Если многие люди делают ошибки, это все равно проблема того, кто делает ошибку, а не тот, кто ее исправляет.
Если это этично, то это совсем другая тема.
При программировании сложных функций рекомендуется не изобретать велосипед заново , а вместо этого использовать существующий, хорошо протестированный код других разработчиков. Однако, как следует из связанной статьи, «часто необходимо заново изобретать колесо, чтобы обойти несовместимости лицензирования программного обеспечения».
Если у вас был конкретный приказ не копировать существующий код, и вы не выполнили этот приказ, проблема на вашей стороне. Патентование программного обеспечения является серьезной проблемой в Соединенных Штатах, несколько небольших компаний обанкротились из-за этого, более крупные компании владеют определенными патентами только для того, чтобы использовать их для подачи встречного иска в случае подачи иска (см. Apple против Samsung). По сути, патенты на программы превратились в своего рода оружие, которое можно использовать для устранения нежелательной конкуренции с рынка. Поэтому для любого разработчика программного обеспечения (в вашей стране) важно уметь обнаруживать и устранять такие проблемы с лицензированием.
Я не знаю намерений вашего профессора, но вполне возможно, что он добавил этот пункт специально, потому что он знает о последствиях «кражи кода», и его резкая реакция — это способ научить вас избегать этих проблем. в ситуациях, когда это было бы действительно больно.
В других, не столь ограниченных частях мира, патенты на программы или «плагиат», как в вашем случае, представляют гораздо меньшую проблему. Это означает, что в других странах вашу работу могли расценить по-другому, возможно, вам даже снизили баллы за то, что вы не копируете существующий код (ненужное изобретение велосипеда). Но вы не живете в «других странах», так что с этической точки зрения ваш профессор может быть резким, но он все же прав.
ff524
Т. Сар
Гриф
Патрисия Шанахан
Нат
Азор Ахай -его-