[edit] Question 1 (HTML/CSS Interpretation)
 
20 points total
-  7 two floating sections
- 2 float to right
- 2 correct L/R order
- 2 border and background color
- 1 width (approximate), vertical alignment
 
-  4 Emperor quote
- 1 text wraps around floating paragraphs
- 2 deflector shield dotted border
- 1 deflector shield left padding
 
-  3 Luke quote
- 2 has solid border
- 1 border goes under/past the floating content
 
-  5 May the Force be with you
- 1 centered
- 2 underneath floating stuff (clear)
- 2 background color
 
-  1 misc. point for any other random shit they fuck up
- -1 point each for any other misc. stuff they do wrong that isn't listed above
 
.
[edit] Question 2 (PHP)
<?php
if (isset($_REQUEST["student"])) {
    $student = $_REQUEST["student"];
    $filename = "students/$student/asciimation.txt";
    if (file_exists($filename)) {
        $text = file_get_contents($filename);
        $frames = explode("=====\n", $text);
        $frame = 0;
        if (isset($_REQUEST["frame"])) {
            $frame = (int) $_REQUEST["frame"];
        }
        
        if ($frame < count($frames)) {
            header("Content-type: text/plain");
            print $frames[$frame];
        }
    }
}
?>
20 points total
-  6 student
- 2 grabs from REQUEST
- 2 checks whether student is set
- 2 creates proper file name from student name
 
-  6 frame
- 2 grabs from REQUEST
- 2 default of 0 if not set
- 2 no output if frame >= array length
 
-  5 file/frames
- 2 checks whether file exists
- 1 reads entire file properly
- 2 splits properly on =====\n
 
-  3 output
- 1 header content-type text/plain
- 1 prints frame
- 1 <?php ?> surrounding tags
 
.
[edit] Question 3 (JS/DOM)
var answer;
var guesses = 0;
document.observe("dom:loaded", function() {
    $("makeguess").observe("click", makeGuessClick);
    answer = parseInt(Math.random() * 100) + 1;
});
function makeGuessClick() {
    guesses++;
    var guess = $("number").value;
    var li = document.createElement("li");
    li.innerHTML = guess;
    if (guess > answer) {
        $("result").innerHTML = "Too high!";
        li.addClassName("high");
    } else if (guess < answer) {
        $("result").innerHTML = "Too low!";
        li.addClassName("low");
    } else {
        $("result").innerHTML = "You got it right in " + guesses + " tries!";
        $("makeguess").disabled = true;
    }
    $("guesses").appendChild(li);
}
20 points total
-  3 window onload
- 1 window.onload or document.observe handler declared properly
- 2 onclick handler attached to 'makeguess' button properly
 
-  4 picks a random answer from 1-100
- 2 attempt
- 2 correct (correct range, scales up properly, etc.)
 
-  3 game play
- 1 grabs user's guess properly out of 'number' field
- 2 too high/low clues in 'result' span
 
-  5 end of game
- 2 counts guesses properly
- 1 puts correct message into 'result' (you got it right!)
- 2 disables 'makeguess' button
 
-  5 li for each guess
- 1 creates/puts proper text in it
- 2 CSS class
- 2 puts onto page (appendChild)
 
.
[edit] Question 4 (Ajax/XML)
document.observe("dom:loaded", function() {
    new Ajax.Request("q5.xml", {
        method: "get",
        onSuccess: ajaxSuccess
    });
});
function ajaxSuccess(ajax) {
    var moves = ajax.responseXML.getElementsByTagName("move");
    for (var i = 0; i < moves.length; i++) {
        var animal = moves[i].getAttribute("animal");
        var move = moves[i].firstChild.nodeValue;
        var critters = $$("." + animal);
        for (var j = 0; j < critters.length; j++) {
            var x = parseInt(critters[j].getStyle("left"));
            var y = parseInt(critters[j].getStyle("top"));
            if (move == "N")      { y -= 20; }
            else if (move == "S") { y += 20; }
            else if (move == "W") { x -= 20; }
            else if (move == "E") { x += 20; }
            critters[j].style.left = x + "px";
            critters[j].style.top = y + "px";
        }
    }
}
20 points total
-  3 window onload
- 1 window.onload handler attached properly
- 1 Ajax request attempt
- 1 method "get"; attaches onSuccess handler properly
 
- 1 Ajax onSuccess handler header (including ajax parameter)
-  6 XML parsing
- 2 grabs all "move" elements and loops over them
- 2 grabs attributes e.g. "animal"
- 2 grabs .firstChild.nodeValue inside each move
 
-  4 grabs all proper animal spans using $$, and loops over them
- 1 attempt
- 3 correct (remembers '.', understands that $$ returns an array, etc.)
 
-  6 moves each animal
- 1 attempt: if/else involving N/S/E/W and x/y +- 20px
- 2 gets old position correctly (getStyle left/top)
- 1 sets new position correctly, attempt
- 2 sets new position correctly, correct (appends 'px', no setStyle, etc.)
 
.
[edit] Question 5 (SQL)
SELECT DISTINCT a.first_name, a.last_name
FROM actors a
     JOIN roles r1 ON r1.actor_id = a.id
     JOIN movies m ON m.id = r1.movie_id
     JOIN movies_genres mg ON mg.movie_id = m.id
     JOIN roles r2 ON r2.actor_id = a.id
     JOIN roles r3 ON r3.actor_id = a.id
WHERE r1.movie_id <> r2.movie_id
     AND r1.movie_id <> r3.movie_id
     AND r2.movie_id <> r3.movie_id 
     AND mg.genre = 'Action'
ORDER BY a.last_name, a.first_name;
25 points total
-  4 SELECT
- 2 columns first_name, last_name (probably requires the student to give names to their tables in the query)
- 2 DISTINCT (no duplicates)
 
-  6 FROM/JOIN (choice of tables)
- 2 has at least 3 'roles' records
- 2 has at least 1 'movies' record
-  2 has at least 1 'movies_genres' record
- -2 for each extra record added unnecessarily if it screws up the query; -0 if it doesn't
 
 
-  8  WHERE/ON (constraints)
- 2 actor <-> roles by id/actor_id
- 1 role <-> movie by movie_id/id
- 1 movie <-> genre by id/movie_id
- 2 three roles are different
- 2 at least one role has genre of 'Action'
- -2 for each extra incorrect constraint if it screws up the query; -0 if it doesn't
 
-  2 ORDER BY
- 1 last_name
- 1 first_name and order