Sounds good. It may be a couple of days before I got something ready. I got sidetrack looking at the PRs and building some tools to go through the problem specification.
Youâre at the prototyping stage, and can draw on what 78 other tracks did or didnât do for inspiration. Nowâs the perfect time for âside questsâ on what makes your life easier in the future before you get locked into anything.
Test generators are fairly common but not ubiquitous so that can be interesting to look through. For the tracks with test generators, pre-authored templates for each exercise seem common and the tooling fills out the template using the problem-specifications data. Another approach Iâve seen is the test generator makes a first draft of the test suite using the problem specifications data and then a human tweaks that.
@glennj can you let me know which machine you are developing the Odin track on? I am developing on a Mac (M2) but can also run on linux (Ubuntu) or Windows. I donât want to duplicate efforts but I would like to make sure the scripts in the bin directory work on the three platforms.
not windows ![]()
I use a Mac primarily but Linux as well. Iâm very cognisant about writing scripts that work across both, assuming that Mac users will do the sensible thing and install a modern bash with homebrew. (sed is particularly vexing)
For CI, we can use a matrix of containers to test example solutions in multiple platforms, if we want.
@BNAndras the current generator script (that was already written) takes the latter approach. I find that, once we nail down the format of the test suite, hand crafting the tests from the canonical data is quite efficient.
@glennj, I do have a (secondary) windows machine. Iâll check that the scripts in the bin repo work there too.
When reviewing your PR47, I had a problem (on my Mac) with the location of the configlet cache. Since your script uses the same location for Mac and Linux, I was assuming you were not on a Mac. But now I wonder what is the difference of configuration between your Mac and mine (see my comment on configlet cache in Improve scripts by glennj ¡ Pull Request #47 ¡ exercism/odin ¡ GitHub). I use homebrew heavily for most of everything.
@glennj, No need to respond to my XDG question above, I just read your comments on PR47 and it makes perfect sense now.
Iâm on Windows as primary btw, without WSL / WSL 2 (on purpose). If you want a windows user to test / help / debug when it doesnât work, shout.
@SleeplessByte, that is great. When we are closer to launch, Iâll ping you and see if you can give it a shake. Thank you for the offer.
I updated the list of exercises we have in the PR pipeline for right now and am working on a new one. (See Exercise implementation tracker ¡ Issue #26 ¡ exercism/odin ¡ GitHub).
Right now the exercise wishlist is contained in a single github issue. Is that the best practice? I noted that some teams (like the MIPS Assembly) create one issue per exercise. Is that a good way to do it? The MIPS Assembly exercise issues appears in the Exercism Task List. Is that automatic or do you have to link the issue and the task?
And we do have one unclaimed exercise on the current list (High Score). I was going to claim it so I can eat our own dog food and check the tooling. Any objection?
+cc: @glennj
Go get that high score.
I made those MIPS issues to invite new contributors to add those specific exercises.
I made some similar Futhark issues, with advisory comments.
For exercises that maintainers themselves are adding, there is usually no need to create issues, unless it helps with coordination between maintainers. For example, I sometimes create an issue to tell other maintainers which exercises I am working on.
@keiraville, I noticed that you added the labels: x:action/create and x:type/content to your MIPS and Futhark issues. Is this how they show up on the âExplore Tasksâ page?
Contributing to Exercism - Product - Tasks
has explanations for the labels. We add labels so tasks appear in Explore tasks and so contributors can filter.
I could have also added x:module/practice-exercise x:knowledge/elementary x:size/small
I have been working on a draft concept tree for the Odin track. I was looking for a place where we can share developer docs for the track that we may want to keep around. The Go track has a folder called reference where they store their design documents. Not everything is worth keeping around but I was thinking it would be nice to have a central place where we can keep info we would like to pass along to newcomers (contributors or future maintainers).
I was thinking creating such a folder (dev-docs/) and posting the draft concept tree in there (through a PR so we can review it first). You can see what the concept tree looks like in Add a roadmap for the Odin concept tree by rmonnet ¡ Pull Request #51 ¡ exercism/odin ¡ GitHub.
Also we do have 23 exercises either merged or in PRs. I looked through the problem specification and picked the next batch. If there is no objections, I will open an issue to track the new list. (Thatâs 19 with difficulty 1-3 and 21 with difficulty 4+). I think ~ 60 exercises would be a good number for the track launch.
Practice Exercises - Wishlist (easy-medium)
Accumulate
Implement the accumulate operation, which, given a collection and an operation to perform on each element of the collection, returns a new collection containing the result of applying that operation to each element of the input collection.
- difficulty: 2
- topics: slices, first-class-procs, iters
Allergies
Given a personâs allergy score, determine whether or not theyâre allergic to a given item, and their full list of allergies.
- difficulty: 3
- topics: bit_ops, enums, cons, cons_ops
Bank Account
Simulate a bank account supporting opening/closing, withdraws, and deposits of money. Watch out for concurrent transactions!
- difficulty: 3
- topics: numbers, structs, error
Note: do not worry about concurrency, tests should be sequential (for now).
Binary Search
Implement a binary search algorithm.
- difficulty: 3
- topics: arrays, searching
Bob
Bob is a lackadaisical teenager. In conversation, his responses are very limited.
- difficulty: 2
- topics: conds, loops, strings
Bottle Song
Produce the lyrics to the popular childrenâs repetitive song: Ten Green Bottles.
- difficulty: 3
- topics: strings, numbers, loops
Circular Buffer
A data structure that uses a single, fixed-size buffer as if it were connected end-to-end.
- difficulty: 3
- topics: arrays, conds, loops, data_structures, errors, generics
Clock
Implement a clock that handles times without dates.
- difficulty: 3
- topics: math_ops, time
ISBN Verifier
Check if a given string is a valid ISBN-10 number.
- difficulty: 3
- topics: conds, loops, pattern_matching, strings
Isogram
Determine if a word or phrase is an isogram.
- difficulty: 2
- topics: filtering, strings, arrays, enums
Nucleotide Count
Given a DNA string, compute how many times each nucleotide occurs in the string.
- difficulty: 2
- topics: maps, strings, conds, loops
Simple Cipher
Implement the Vigenère cipher, a simple substitution cipher.
- difficulty: 3
- topics: loops, strings, transforming
Protein Translation
Translate RNA sequences into proteins.
- difficulty: 3
- topics: loops, conds, strings, arrays, maps
Proverb
For want of a horseshoe nail, a kingdom was lost, or so the saying goes. Output the full text of this proverbial rhyme.
- difficulty: 3
- topics: loops, strings, arrays
Robot Simulator
Write a robot simulator.
- difficulty: 3
- topics: structs, enums, conds
Reverse String
Reverse a given string.
- difficulty: 1
- topics: string, loops
Series
Given a string of digits, output all the contiguous substrings of length n in that string.
- difficulty: 3
- topics: lists, strings, transforming, loops
Triangle
Determine if a triangle is equilateral, isosceles, or scalene.
- difficulty: 3
- topics: unions, numbers, conds
Yacht
Score a single throw of dice in the game Yacht.
- difficulty: 3
- topics: first-class-procs, conds
Practice Exercises - Wishlist (hard)
Acronym
Convert a long phrase to its acronym.
- difficulty: 4
- topics: strings, loops, regex
Anagram
Given a word and a list of possible anagrams, select the correct sublist.
- difficulty: 4
- topics: filtering, strings, arrays, parsing
Atbash Cipher
Create an implementation of the Atbash cipher, an ancient encryption system created in the Middle East.
- difficulty: 5
- topics: strings, transforming, loops
Book Store
To try and encourage more sales of different books from a popular 5 book series, a bookshop has decided to offer discounts of multiple-book purchases.
- difficulty: 5
- prerequisites: numbers, enums, iters
Bowling
Score a bowling game.
- difficulty: 6
- topics: numbers, conds, structs, error
Change
Correctly determine change to be given using the least number of coins.
- difficulty: 6
- prerequisites: numbers, arrays, errors
Custom Set
Create a custom set type.
- difficulty: 5
- topics: bit_sets, arrays, numbers, bools, structs
Diamond
Given a letter, print a diamond starting with âAâ with the supplied letter at the widest point.
- difficulty: 6
- topics: strings, conds
Dominoes
Make a chain of dominoes.
- difficulty: 7
- topics: lists, tuples, enums, booleans
Flatten Array
Take a nested list and return a single list with all values except nil/null.
- difficulty: 4
- topics: lists, for_loops, searching
Forth
Implement an evaluator for a very simple subset of Forth.
- difficulty: 7
- prerequisites: arrays, strings, errors
Grade School
Given studentsâ names along with the grade that they are in, create a roster for the school.
- difficulty: 4
- topics: maps, sorting, enums, structs
Knapsack
Given a knapsack that can only carry a certain weight, determine which items to put in the knapsack in order to maximize their combined value.
- difficulty: 5
- topics: integer, arrays
Linked List
Implement a doubly linked list.
- difficulty: 4
- topics: pointers, generics, structs
Matching Brackets
Make sure the brackets and braces all match.
- difficulty: 5
- topics: parsing, strings, booleans, stacks
Pascalâs Triangle
Compute Pascalâs triangle up to a given number of rows.
- difficulty: 4
- topics: arrays, math_ops, recursion, loops, enums
Pythagorean Triplet
Given an integer N, find all Pythagorean triplets for which a + b + c = N.
- difficulty: 4
- topics: numbers, math_ops, structs
Rational Numbers
Implement rational numbers.
- difficulty: 4
- prerequisites: integers, structs, math-ops
Roman Numerals
Convert modern Arabic numbers into Roman numerals.
- difficulty: 4
- topics: recursion, transforming, strings, loops, integers
Word Count
Given a phrase, count the occurrences of each word in that phrase.
- difficulty: 4
- topics: maps, strings, transforming
Zebra Puzzle
Solve the zebra puzzle.
- difficulty: 8
- prerequisites: enums, searching, arrays
Accumulate was deprecated four years ago in favor of List Ops. List Ops is a bit more involved of an exercise so that might raise the exercise difficulty on your list.
I missed that one. I will replace Accumulate with List Ops. It seems more interesting.
I created an issue t. If anybody is interested in some of the exercises, let me know. The tooling is still quite rough (especially the test generator). This is the next thing I plan to work on.
I plan to start working on Circular Buffer and Roman Numerals to get the ball rolling.
Iâm interested in participating in the Odin language track. Is there a list somewhere of todos?
Oh, silly me, there it is: issues/53
First peek would be:
Showing 4 of 4 open issues in exercism/odin
ID TITLE LABELS UPDATED
#53 Odin Practice Exercises Implementation Status... x:type/content about 7 days ago
#29 Implement a new exercise generator about 24 days ago
#6 Odin track icon about 16 days ago
#1 Launch tracking about 7 days ago
But also the discussion started, I think, here:.
Your answer would have come quicker if e-mail had been setup to be received here. Took me a little longer to write the response here.