- Exact rule means that targets for draggable id's in user_answer are the same
that targets from correct answer. For example, for draggables 7 and 8 user must
drag 7 to target1 and 8 to target2 if correct_answer is::
.. such long lines are needed for sphinx to display lists correctly
- Exact rule means that targets for draggable id's in user_answer are the same that targets from correct answer. For example, for draggables 7 and 8 user must drag 7 to target1 and 8 to target2 if correct_answer is::
correct_answer = [
{
...
...
@@ -140,9 +141,7 @@ drag 7 to target1 and 8 to target2 if correct_answer is::
}]
- unordered_equal rule allows draggables be dragged to targets unordered. If one
want to allow for student to drag 7 to target1 or target2 and 8 to target2 or
target 1 and 7 and 8 must be in different targets, then correct answer must be::
- unordered_equal rule allows draggables be dragged to targets unordered. If one want to allow for student to drag 7 to target1 or target2 and 8 to target2 or target 1 and 7 and 8 must be in different targets, then correct answer must be::
correct_answer = [
{
...
...
@@ -151,10 +150,8 @@ target 1 and 7 and 8 must be in different targets, then correct answer must be::
'rule': 'unordered_equal'
}]
- Anyof rule allows draggables to be dragged to any of targets. If one want to
allow for student to drag 7 and 8 to target1 or target2, which means that if 7
is on target1 and 8 is on target1 or 7 on target2 and 8 on target2 or 7 on
target1 and 8 on target2. Any of theese are correct which anyof rule::
- Anyof rule allows draggables to be dragged to any of targets. If one want to allow for student to drag 7 and 8 to target1 or target2, which means that if 7 is on target1 and 8 is on target1 or 7 on target2 and 8 on target2 or 7 on target1 and 8 on target2. Any of theese are correct which anyof rule::
correct_answer = [
{
...
...
@@ -164,11 +161,7 @@ target1 and 8 on target2. Any of theese are correct which anyof rule::
}]
- If you have can_reuse true, then you, for example, have draggables a,b,c and 10
targets. These will allow you to drag 4 'a' draggables to
['target1', 'target4', 'target7', 'target10'] , you do not need to write 'a'
four times. Also this will allow you to drag 'b' draggable to target2 or target5
or target5 and target2 etc..::
- If you have can_reuse true, then you, for example, have draggables a,b,c and 10 targets. These will allow you to drag 4 'a' draggables to ['target1', 'target4', 'target7', 'target10'] , you do not need to write 'a' four times. Also this will allow you to drag 'b' draggable to target2 or target5 for target5 and target2 etc..::
correct_answer = [
{
...
...
@@ -187,8 +180,7 @@ or target5 and target2 etc..::
'rule': 'unordered_equal'
}]
And sometimes you want to allow drag only two 'b' draggables, in these case
you sould use 'anyof+number' of 'unordered_equal+number' rule::
- And sometimes you want to allow drag only two 'b' draggables, in these case you sould use 'anyof+number' of 'unordered_equal+number' rule::
correct_answer = [
{
...
...
@@ -216,30 +208,41 @@ If we have can_reuse=true, than one must use only long form of correct answer.
Grading logic
-------------
1. User answer and correct answer populated to the same form::
1. User answer (that comes from browser) and correct answer (from xml) are parsed to the same format::
Group_id is ordinal number, for every dict in correct answer incremental
group_id is assigned: 0, 1, 2, ...
Draggables from user answer are added to same group_id where identical draggables
from correct answer are::
from correct answer are, for example::
If correct_draggables[group_0] = [t1, t2] then
user_draggables[group_0] are all draggables t1 and t2 from user answer:
[t1] or [t1, t2] or [t1, t2, t2] etc..
2. For every group user_draggables, if 'number' not in rule, set() is applicated,
if 'number' not in rule, set is not applicated::
2. For every group from user answer, for that group draggables, if 'number' is in group rule, set() is applied,
if 'number' is not in rule, set is not applied::
set() : [t1, t2, t3, t3] -> [t1, t2, ,t3]
For every group, at this step, draggables lists are equal.
3. For every group, lists of targets are compared using rule for that group.
from [t1, t2, t3, t3] -> [t1, t2, ,t3]
Set and '+number' cases
.......................
Set() and 'number' are needed only for case of reusable draggables,
Set() and '+number' are needed only for case of reusable draggables,
for other cases there are no equal draggables in list, so set() does nothing.
Usege of set() operation allows easily create rule for case of
``any number of same draggable can be dragged to some targets``::
.. such long lines needed for sphinx to display nicely
* Usage of set() operation allows easily create rule for case of "any number of same draggable can be dragged to some targets"::
{
'draggables': ['draggable_1'],
...
...
@@ -247,9 +250,10 @@ Usege of set() operation allows easily create rule for case of
'rule': 'anyof'
}
'number' rule is used for the case of reusable draggables, when one want to
fix number of draggable to drag. In this example only two instances of
draggables_1 are allowed to be dragged::
* 'number' rule is used for the case of reusable draggables, when one want to fix number of draggable to drag. In this example only two instances of draggables_1 are allowed to be dragged::
{
'draggables': ['draggable_1', 'draggable_1'],
...
...
@@ -257,9 +261,8 @@ draggables_1 are allowed to be dragged::
'rule': 'anyof+number'
}
Note, that in using rule 'exact', one does not need 'number', because you can't
recognize from user interface which reusable draggable on which target.
Absurd example::
* Note, that in using rule 'exact', one does not need 'number', because you can't recognize from user interface which reusable draggable is on which target. Absurd example::
Correct handling of upper example is create different rule for draggable_1 and
draggable_2
Correct handling of this example is to create different rules for draggable_1 and
draggable_2
For 'unordered_equal' (or 'exact') we not need 'number' if you have only same
draggable in group, as targets length will provide contraing for the number of
draggables::
* For 'unordered_equal' (or 'exact' too) we don't need 'number' if you have only same draggable in group, as targets length will provide constraint for the number of draggables::
{
'draggables': ['draggable_1'],
...
...
@@ -281,10 +282,10 @@ draggables::
'rule': 'unordered_equal'
}
This means that only three draggaggables 'draggable_1' can be dragged.
But if you have more that one different reusable draggable in lis, you may use
'number' rule::
This means that only three draggaggables 'draggable_1' can be dragged.
* But if you have more that one different reusable draggable in list, you may use 'number' rule::