## WeBWorK Problems

### How to remove repeated entries from a list

by Tim Alderson -
Number of replies: 3
In the following code, the correct answer will always be listed twice within the multiple choice options. (I am sure student's wouldn't mind this:-)

Is there a way of including the "set" of all (distinct) elements in the list $L3 as options for the multiple choice, without repeats? Any help appreciated. Thank you. DOCUMENT(); loadMacros( "PGstandard.pl", "PGchoicemacros.pl", "MathObjects.pl", "contextFraction.pl", ); TEXT(beginproblem()); Context("Numeric");$a = random(0,5,1);

Context("Fraction-NoDecimals");
Context()->flags->set(
reduceConstants => 0,
reduceConstantFunctions => 0,
);
$a1 = Formula("(1+sqrt(3))/2");$a2 = Formula("sqrt(2)");
$a3 =$a1;
$a4 = Formula("(sqrt(3)-1)/2");$a5 = Formula("0");
$a6 = Formula("(1-sqrt(3))/2"); @L1 = (30,45,60,120, 135, 150,); @L2 = (150,135,120,60, 45, 30); @L3 = ($a1,$a2,$a3,$a4,$a5, $a6); Context()->texStrings;$radio=new_multiple_choice();
$radio->qa("$$\displaystyle \cos(L1[a]^\circ)+ \sin(L2[a]^\circ) =$$$BR ", "$$\displaystyle L3[a]$$$BR");$radio->extra("$$\displaystyle L3[0]$$ $BR", "$$\displaystyle L3[1]$$$BR","$$\displaystyle L3[3]$$$BR","$$\displaystyle L3[4]$$$BR","$$\displaystyle L3[5]$$$BR");$radio->makeLast("None of the above.");

BEGIN_TEXT
$BR \{$radio->print_q()\}
\{$radio->print_a()\} END_TEXT Context()->normalStrings; ANS(radio_cmp($radio->correct_ans()));

BEGIN_SOLUTION
$PAR Solution$PAR
END_SOLUTION

COMMENT('MathObject version');
ENDDOCUMENT();

### Re: How to remove repeated entries from a list

by Christopher Heckman -
(I am sure student's wouldn't mind this

I am actually of the opposite mind; I think they will get annoyed. If the question is

1.  2+2 =
a. 4
b. 3
c. 4
d. 5

what if they select (a) and are told their answer is wrong, because the correct answer is (c)? I know I'd be upset.

It's also bad design because a might not be 2.

You can redesign your problem along the following lines:

$a = random (0,4,1);$d = random ([30, 60]);

Context("Fraction-NoDecimals");
Context()->flags->set(
reduceConstants => 0,
reduceConstantFunctions => 0,
);
$a1 = Formula("(1+sqrt(3))/2");$a2 = Formula("sqrt(2)");
$a4 = Formula("(sqrt(3)-1)/2");$a5 = Formula("0");
$a6 = Formula("(1-sqrt(3))/2"); @L1 = ($d, 45, 120, 135, 150);
@L2 = (180 - $d,135,120,60, 45, 30); @L3 = ($a1, $a2,$a4, $a5,$a6);

@wrong = ("") x 5;
for ($i = 0;$i < 5; $i++) {$wrong[$i] = "$$\displaystyle L3[i]$$$BR"; }
splice (@wrong, $a);$radio->extra (@wrong);

### Re: How to remove repeated entries from a list

by Tim Alderson -
Thank you for your prompt response.

I will try your suggested approach tomorrow. I certainly would not have come up with that solution myself.  Thank you very much.

(BTW My comment regarding students not minding was intended to be facetious.)
Update: I also found grep" to be useful:
$radio=new_multiple_choice();$radio->qa(" ", "$$L3[a]$$$BR"); #the following removes the correct answer from the array L3 @L3 = grep {$_ != $L3[$a] } @L3;
$radio->extra ("$$\displaystyle L3[0]$$$BR", "$$\displaystyle L3[1]$$$BR", "$$\displaystyle L3[2]$$$BR","$$\displaystyle L3[3]$$$BR"); #And for good measure...$radio->makeLast("None of the above.");