## TITLE('The Structure of DNA')
## DESCRIPTION
## Select the statement that is TRUE or FALSE about the structure of DNA.
## ENDDESCRIPTION
## KEYWORDS('the structure of DNA','true/false','multiple choice')
## DBsubject('Molecular Biology')
## DBchapter('')
## DBsection('')
## Date('2026-07-12')
## Author('Neil R. Voss')
## Institution('Roosevelt University')

DOCUMENT();

loadMacros(
  "PGstandard.pl",
  "PGML.pl",
  "PGchoicemacros.pl",
  "parserRadioButtons.pl",
  "PGcourse.pl",
);

TEXT(beginproblem());
$showPartialCorrectAnswers = 1;

#==========================================================
# AUTO-GENERATED GROUPS FROM YAML
#==========================================================

@true_groups = (
  [
    'the backbone contains only phosphate and sugar',
  ],
  [
    'hydrogen bonds hold the two strands together',
  ],
  [
    'the helix is made of nucleotides',
  ],
  [
    'the two strands of DNA are anti-parallel',
    'DNA exists as an anti-parallel double helix',
    'DNA contains two strands, with each strand running in opposite directions',
  ],
  [
    'purine bases pair up with pyrimidine bases',
  ],
  [
    'the DNA bases for each strand face the inside of the helix',
  ],
  [
    'the phosphate groups are on the outside of the DNA double helix',
  ],
  [
    'the DNA strands are uniformly negatively charged',
  ],
  [
    'G-C base pairs have three hydrogen bonds, whereas A-T base pairs only have two hydrogen bonds',
    'G-C base pairs are stronger than A-T base pairs',
    'A-T base pairs are weaker than G-C base pairs',
  ],
  [
    'the DNA double helix has ten nucleotides between each turn',
  ],
  [
    'the DNA double helix has a consistent diameter',
  ],
);
@false_groups = (
  [
    'the backbone contains only phosphate and nucleobase',
    'the backbone contains only nucleobase and sugar',
  ],
  [
    'ionic bonds hold the two strands together',
    'covalent bonds hold the two strands together',
    'hydrophobic contacts hold the two strands together',
    'the van der Waals force holds the two strands together',
    'phosphodiester bonds hold the two strands together',
    'disulfide bonds hold the two strands together',
    'peptide bonds hold the two strands together',
  ],
  [
    'the helix is made of amino acids',
  ],
  [
    'DNA exists as a parallel double helix',
    'the two strands of DNA are parallel',
    'DNA contains two strands, with both strands running the same direction',
  ],
  [
    'purine bases pair up with like purine bases',
    'pyrimidine bases pair up with like pyrimidine bases',
  ],
  [
    'the DNA bases for each strand face the outside of the helix',
  ],
  [
    'the phosphate groups are on the inside of the DNA double helix',
  ],
  [
    'one strand is positively charged and the other is negatively charged',
    'the DNA strands are uniformly positively charged',
  ],
  [
    'A-T base pairs have three hydrogen bonds, whereas G-C base pairs only have two hydrogen bonds',
    'A-T base pairs are stronger than G-C base pairs',
    'G-C base pairs are weaker than A-T base pairs',
  ],
  [
    'base pairings create unequal spacing between the two DNA strands',
  ],
);

#==========================================================
# GLOBAL SETTINGS
#==========================================================

$topic = 'the structure of DNA';
my $local_random = PGrandom->new();
$local_random->srand($problemSeed);
my @mode_choices = ("TRUE", "FALSE");
$mode = $mode_choices[$local_random->random(0, $#mode_choices, 1)];
$num_distractors = 4;
#==========================================================
# SELECT GROUP
#==========================================================

my (@selected_group, @opposite_groups);

if ($mode eq "TRUE") {
  $group_index      = $local_random->random(0, scalar(@true_groups)-1, 1);
  @selected_group   = @{ $true_groups[$group_index] };
  @opposite_groups  = @false_groups;
} else {
  $group_index      = $local_random->random(0, scalar(@false_groups)-1, 1);
  @selected_group   = @{ $false_groups[$group_index] };
  @opposite_groups  = @true_groups;
}

#==========================================================
# PICK CORRECT + DISTRACTORS
#==========================================================

my $correct_index = $local_random->random(0, $#selected_group, 1);
$correct = $selected_group[$correct_index];

my @available_group_indices = (0 .. $#opposite_groups);
my @selected_distractor_indices = ();

while (@selected_distractor_indices < $num_distractors && @available_group_indices > 0) {
  my $random_index = $local_random->random(0, scalar(@available_group_indices)-1, 1);
  push @selected_distractor_indices, splice(@available_group_indices, $random_index, 1);
}

@distractors = ();
foreach my $group_idx (@selected_distractor_indices) {
  my @group = @{ $opposite_groups[$group_idx] };
  my $distractor_index = $local_random->random(0, $#group, 1);
  my $distractor = $group[$distractor_index];
  push @distractors, $distractor;
}

@choices = ($correct, @distractors);

#==========================================================
# SHUFFLE CHOICES (SEED-STABLE)
#==========================================================

my @choice_indices = (0 .. $#choices);
my @choice_shuffled = ();
while (@choice_indices) {
  my $pick = $local_random->random(0, $#choice_indices, 1);
  push @choice_shuffled, splice(@choice_indices, $pick, 1);
}
@choices = @choices[@choice_shuffled];

#==========================================================
# RADIO BUTTONS WITH A/B/C/D/E LABELS
#==========================================================

$rb = RadioButtons(
  [@choices],
  $correct,
  labels        => ['A','B','C','D','E'],
  displayLabels => 1,
  randomize     => 0,
  separator     => '<div style="margin-bottom: 0.7em;"></div>',
);

#==========================================================
# PGML
#==========================================================

BEGIN_PGML

[@ $mode eq "TRUE" ? "Which one of the following statements is <span style='color: #127663;'><strong>TRUE</strong></span> about $topic?" : "Which one of the following statements is <span style='color: #ba372a;'><strong>FALSE</strong></span> about $topic?" @]*

[_]{$rb}

END_PGML

ENDDOCUMENT();

