summaryrefslogtreecommitdiff
path: root/ziglings
blob: e94141150689d7c4ff7f404fbe58563c353d9110 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/bash

# ziglings takes one parameter: the exercise number to jump to
jump_to=${1:-0}

echo
echo "         _       _ _ "
echo "     ___(_) __ _| (_)_ __   __ _ ___ "
echo "    |_  | |/ _' | | | '_ \ / _' / __| "
echo "     / /| | (_| | | | | | | (_| \__ \ "
echo "    /___|_|\__, |_|_|_| |_|\__, |___/ "
echo "           |___/           |___/ "
echo

# Capture terminal escape sequences (ANSI) for formatting
fmt_err=$( tput setaf 1 ) # red foreground
fmt_yay=$( tput setaf 2 ) # green foreground
fmt_off=$( tput sgr0 )    # reset colors/effects

zig_cmd=zig
zig_version_required=( 0 8 0 )
zig_version=$($zig_cmd version)
zig_version=(${zig_version//./ })

if [[ ${zig_version[0]} -ne ${zig_version_required[0]} || ${zig_version[1]} -lt ${zig_version_required[1]} ]]
then
    echo "Your current zig version is $(IFS=$'.'; echo "${zig_version[*]}")."
    echo "Please update your zig compiler to a version >=$(IFS=$'.'; echo "${zig_version_required[*]}") "`
        `"or change zig_cmd in ./ziglings to the appropriate path."
    exit 1
fi

exercise_num=0

function check_it {
    source_file="exercises/$1"
    correct_output=$2
    hint=$3

    # If the current exercise is less than the requested one, skip it
    let exercise_num+=1
    if [[ $exercise_num -lt $jump_to ]]
    then
        return
    fi

    # Compile/run the source and capture the result and exit value
    cmd="$zig_cmd run $source_file"
    echo "$ $cmd"
    result=$($cmd 2>&1)
    result_status=$?

    # Echo the result to the screen so user can see what their program does
    echo "$result"
    if [[ $result_status -ne 0 ]]
    then
        echo
        printf "${fmt_err}Uh oh! Looks like there was an error.${fmt_off}\n"
        if [[ ! -z "$hint" ]]
        then
            echo "$hint"
        fi
        echo
        echo "Edit '$source_file' and run me again."
        echo
        exit 1
    fi

    # Wildcards to be lenient with anything AROUND the correct output
    if [[ "$result" == *"$correct_output"* ]]
    then
        printf "${fmt_yay}** PASSED **${fmt_off}\n"
    else
        printf "${fmt_err}It seems to compile, but I wanted to see '$correct_output'.${fmt_off}\n"
        if [[ ! -z "$hint" ]]
        then
            echo "$hint"
        fi
        echo
        exit 1
    fi
}

# I've chosen to explicitly number AND list each exercise rather than rely
# on sorting. Though it does mean manually renaming things to remove/insert,
# it's worked out well so far.

check_it 01_hello.zig "Hello world" "Note the error: the source file has a hint for fixing 'main'."
check_it 02_std.zig "Standard Library"
check_it 03_assignment.zig "55 314159 -11" "There are three mistakes in this one!"
check_it 04_arrays.zig "Fourth: 7, Length: 8" "There are two things to complete here."
check_it 05_arrays2.zig "LEET: 1337, Bits: 100110011001" "Fill in the two arrays."
check_it 06_strings.zig "d=d ha ha ha Major Tom" "Each '???' needs something filled in."
check_it 07_strings2.zig "Ziggy" "Please fix the lyrics!"
check_it 08_quiz.zig "Program in Zig" "See if you can fix the program!"
check_it 09_if.zig "Foo is 1!"
check_it 10_if2.zig "price is \$17"
check_it 11_while.zig "n=1024" "You probably want a 'less than' condition."
check_it 12_while2.zig "n=1024" "It might help to look back at the previous exercise."
check_it 13_while3.zig "1 2 4 7 8 11 13 14 16 17 19"
check_it 14_while4.zig "n=4"
check_it 15_for.zig "A Dramatic Story: :-)  :-)  :-(  :-|  :-)  The End."
check_it 16_for2.zig "13"
check_it 17_quiz2.zig "8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16" "This is a famous game!"
check_it 18_functions.zig "Question: 42" "Can you help write the function?"
check_it 19_functions2.zig "2 4 8 16"
check_it 20_quiz3.zig "32 64 128 256" "Unexpected pop quiz! Help!"
check_it 21_errors.zig "2<4. 3<4. 4=4. 5>4. 6>4." "What's the deal with fours?"
check_it 22_errors2.zig "I compiled" "Get the error union type right to allow this to compile."
check_it 23_errors3.zig "a=64, b=22"
check_it 24_errors4.zig "a=20, b=14, c=10"
check_it 25_errors5.zig "a=0, b=19, c=0"
check_it 26_hello2.zig "Hello world" "Try using a try!"
check_it 27_defer.zig "One Two"
check_it 28_defer2.zig "(Goat) (Cat) (Dog) (Dog) (Goat) (Unknown) done."
check_it 29_errdefer.zig "Getting number...got 5. Getting number...failed!"
check_it 30_switch.zig "ZIG?"
check_it 31_switch2.zig "ZIG!"
check_it 32_unreachable.zig "1 2 3 9 8 7"
check_it 33_iferror.zig "2<4. 3<4. 4=4. 5>4. 6>4." "Seriously, what's the deal with fours?"
check_it 34_quiz4.zig "my_num=42" "Can you make this work?"
check_it 35_enums.zig "1 2 3 9 8 7" "This problem seems familiar..."
check_it 36_enums2.zig "#0000ff" "I'm feeling blue about this."
check_it 37_structs.zig "Your wizard has 90 health and 25 gold."
check_it 38_structs2.zig "Character 2 - G:10 H:100 XP:20"
check_it 39_pointers.zig "num1: 5, num2: 5" "Pointers aren't so bad."
check_it 40_pointers2.zig "a: 12, b: 12"
check_it 41_pointers3.zig "foo=6, bar=11"
check_it 42_pointers4.zig "num: 5, more_nums: 1 1 5 1"
check_it 43_pointers5.zig "Wizard (G:10 H:100 XP:20)"
check_it 44_quiz5.zig "Elephant A. Elephant B. Elephant C." "Oh no! We forgot Elephant B!"
# optional vals (simple scalar)
# optional fields (elephant tail - no longer need circular)
# super-simple struct method
# use struct method for elephant tails
# quiz: add elephant trunk (like tail)!

echo
echo "    __   __          _ "
echo "    \ \ / __ _ _   _| | "
echo "     \ V / _' | | | | | "
echo "      | | (_| | |_| |_| "
echo "      |_|\__,_|\__, (_) "
echo "               |___/ "
echo
echo "You've completed all of the Ziglings exercises!"
echo "       (That have been written so far.)"
echo