Repository navigation
[Exercise Approaches]: Audit/Cleanup of Track Approaches 2026 (part 2) #4197
Copy link
Copy link
Open
Labels
x:rep/massiveMassive amount of reputationMassive amount of reputation
Description
This is a tracking issue for existing approaches on the Python track.
(Part 1 of the audit/cleanup was issue #4055.)
In general, we are auditing/reviewing the following:
- Spelling, grammar, and typos
- Python syntax
- Clarity of writing and explanation
- Readability and maintainability
- White space
- Other Exercism markdown specifications as needed
- Possible missing/additional approaches (noted as TODOs of future work)
See the lists for each category below. Exercises in "Merged Audits" have been reviewed, changed, and merged. Exercises in "Unaudited" have approaches that have not been audited yet.
Exercises in "Approaches In Progress" do not have finished/published approaches yet, while those in "Missing Approaches" do not have any known work on their approaches yet.
If you want to work on an exercise that is missing an approach, please check in with the maintainers to avoid conflicting with current track priorities or others who may be working on things.
Merged Audits
- Acronym: [Acronym] Approach docs cleanup #4258
- Atbash Cipher: [RNA Transcription & Atbash Cipher]: Approaches Cleanup #4191
- Collatz Conjecture: [Collatz Conjecture Dig Deeper]: Corrections & Edit #4250
- Darts: [Darts Approach Docs] Various fixes and improvements #4187
- Leap: [Leap Approaches]: Typos & Fixes per issue 4197 #4252
- Reverse String: [Reverse String] Clean up approach docs #4226
- RNA Transcription: [rna-transcription approach]: a few improvements #4052 and [RNA Transcription & Atbash Cipher]: Approaches Cleanup #4191
- Robot Name: robot-name approach: fix typos, minor rephasing/improvements #4051
- Roman Numerals: [Roman Numerals] Approach docs fixes #4289 and [Roman Numerals] Approach docs improvements #4300
- Rotational Cipher: [Rotational Cipher Approaches] Fix
ALPHABETcapitalization and approaches link #4184 - Sublist: [Sublist] Fix existing approaches & add new ones #4190
- Wordy: [Wordy] Clean up Approaches #4198
Unaudited
- All Your Base
- Bob: PR forthcoming
- Circular Buffer
- DnD Character
- Flower Field (formerly Minesweeper)
- Grains
- Hamming
- Isogram
- Luhn
- Matching Brackets
- Nth Prime
- Palindrome Products
- Pangram
- Pig Latin
- Raindrops: PR [Raindrops] Approach Docs and Peformance Article Cleanup #4308
- Scrabble Score
- Sieve
- Yacht
Approaches In Progress
- Allergies
- Anagram
- Armstrong Numbers
- Book Store
- ETL: [ETL] Approaches First Draft #3378
- Gigasecond: Create intoduction for dig deeper in gigasecond exercise #3772
- ISBN Verifier
- Markdown
- Matrix
- Perfect Numbers
- Protein Translation
- Robot Simulator
- Saddle Points
- Say
- Space Age
- Sum Of Multiples: [Sum of Multiples] Add Approaches #3375
- Transpose
- Triangle
- Word Count: [Word Count] Approaches First Draft #3371
Missing Approaches
- Affine Cipher
- Alphametics
- Bank Account
- Binary Search
- Binary Search Tree
- Bottle Song
- Bowling
- Change
- Clock
- Complex Numbers
- Connect
- Crypto Square
- Diamond
- Difference Of Squares
- Diffie Hellman
- Dominoes
- Dot DSL
- Flatten Array
- Food Chain
- Forth
- Go Counting
- Grade School
- Grep
- Hangman (to be replaced by Save the Cow)
- High Scores
- House
- Kindergarten Garden
- Knapsack
- Largest Series Product
- Ledger
- Linked List
- List Ops
- Meetup
- OCR Numbers
- PaaS I/O
- Phone Number
- Poker
- POV
- Prime Factors
- Proverb
- Pythagorean Triplet
- Queen Attack
- Rail Fence Cipher
- Rational Numbers
- React
- Rectangles
- Resistor Color
- Resistor Color Duo
- Resistor Color Trio
- Rest API
- Run Length Encoding
- Satellite
- Scale Generator
- Secret Handshake
- Series
- SGF Parsing
- Simple Cipher
- Simple Linked List
- Spiral Matrix
- Tournament
- Tree Building
- Twelve Days
- Two Bucket
- Two Fer
- Variable Length Quantity
- Word Search
- Zebra Puzzle
- Zipper
Reactions are currently unavailable
Metadata
Metadata
Labels
x:rep/massiveMassive amount of reputationMassive amount of reputation
Activity
github-actions commentedon May 21, 2026
BethanyG commentedon May 21, 2026
That markdown table is ... terrifying. We might need to try something else. I will think on it. 😄
Yrahcaz7 commentedon May 21, 2026
Just went and updated the entries for the approaches that I audited... Yeah, that table's terrifying.
Edit: Just went and normalized the formatting on the table as well. ADHD beats terror every time 😆.
Yrahcaz7 commentedon May 23, 2026
Addressed in PR #4258:
Acronym Dig Deeper audit
Overall:
#, which can hurt readability.introduction.md:re.sub()approach is called a "fun experiment" in its approach doc, it is many times slower than the others, and it can be hard to understand.re.subis the slowest by far.loop/content.md, list-comprehension/content.md,generator-expression/content.md,functools-reduce/content.md, andmap-function/content.md:<str>.replace()has actual string arguments, and it might make it sound like somehow those turn into lists.exercism/note: Is "As of this writing" a valid way to say "when this was written"? The phrase reads kind of strangely.map-function/content.md:'GNU'[0], 'IMAGE'[0], 'MANIPULATION'[0]), 'PROGRAM'[0]functools-reduce/content.md:regex-join/content.mdandregex-sub/content.md:regex-join/content.md:regex-sub/content.md:returnandrehave an extra space between them.to_abbreviate.-should be_.The performance article:
numpyis callednumbpy.re.findall()approach always has "first letters" by it, but it is not clear that this means a differentre.findall()approach than what is in the approach doc.@BethanyG, I have a question: My solution seems to use an approach that doesn't have an approach doc. Is it worth adding a new approach doc for this? I'd probably need some guidance on how to update and use the benchmark application.
BethanyG commentedon May 23, 2026
Sure! why not?. I say go for it, and I am happy to help you use/update the benchmarking! 😄
Yrahcaz7 commentedon May 29, 2026
Addressed in PR #4226:
Reverse String Dig Deeper audit (part 1 of 2)
Overall:
introduction.md:range()".#Forshould probably be replaced with# <-- For.sequence-slicing/content.md:**for bold, but the website renders it as italics instead?O(n + n)is not valid Big-O notation, it should be changed toO(n)or just removed entirely.iteration-and-concatenation/content.md:output.O(m + n)and the other hasO(n + m), it should be consistent.=and''.+operator is actually used in this approach, it would be clearer if usages of "+" in the prose were replaced with "and" or "plus".backward-iteration-with-range/content.md:#Forshould probably be replaced with# <-- For.Yrahcaz7 commentedon May 29, 2026
Addressed in PR #4226:
Reverse String Dig Deeper audit (part 2 of 2)
introduction.md:,andcodepoint.list-and-join/content.md:,andcodepoint.range()".#and the comment.UnicodeDecodeError". Also, should this "an" be an "a"? It reads more naturally with an "a", but I'm not sure which is correct.built-in-list-reverse/content.md:list.append()" for clarity.None" and "as".built-in-reversed/content.md:introduction.md(and not having a header of its own inbuilt-in-reversed/content.md) is confusing, especially because it does not usestr.join(), which is in the header for the approach inintroduction.md.additional-approaches/content.md:+and1.#.stniopedocsupposed to mean? It doesn't seem like a good variable name.O(n**2)space complexity (wherenis the length of the string)?lambbdashould belambda.Join()should bejoin().-x-1are unnecessary.O(n)" should be removed, it was alreadyO(n)(even though it was less efficient).The performance article:
map()" should be "(for the 'other interesting approaches' category, themap()approach will be used)"@BethanyG, Can I open a PR to fix these?
BethanyG commentedon May 30, 2026
@Yrahcaz7 - apologies. 😅 I was out today running errands and food shopping, so didn't get to this until now. Since I wrote this set of approaches, I sorta feel obligated to correct them. But if you really want to PR them, have at it. 😄 💙
4 remaining items
BethanyG commentedon Jun 22, 2026
@Yrahcaz7 - with any luck... the
LeapPR will fix the missing approach. I replaced the UUID with a new one inconfig.json.Yrahcaz7 commentedon Jun 23, 2026
It seems like it's fixed now!
Fi6uDvGWucFv commentedon Jun 25, 2026
Regarding the "Acronym" approach, instead of using "scrub the input," it might be clearer to say "clean the input" to align with standard terminology in data processing. Additionally, can we clarify what the expected format for the input string is in this approach to enhance clarity for users?
BethanyG commentedon Jun 25, 2026
@Fi6uDvGWucFv - the changes to the
Acronymexercise have already been PR-d.Yrahcaz7 commentedon Jun 25, 2026
@BethanyG, actually, I think we never PRed those changes. I still see the old version on the website -- We probably both confused the new approach with the cleanup and never actually PRed it 😅.
Should I draft up a PR? I'll probably have the time to do so tomorrow.
BethanyG commentedon Jun 26, 2026
Sure! Let's go ahead and do that. 😄 Thanks!
Yrahcaz7 commentedon Jul 13, 2026
Bob Dig Deeper audit
introduction.md:if-statements/content.mdandif-statements-nested): "If anifstatement can return" is confusing, as it makes it seem like theifstatement only sometimes returns. It should probably be "If anifstatement returns" instead.introduction.md. Should this be added?-" at the beginning.highlightparameter. The parameter should either be removed or changed toendswith: https://docs.python.org/3/library/stdtypes.html?highlight=endswith#str.endswithifstatements nested" is a bit awkward, "nestedifstatements" would be clearer.if-statements/content.mdandif-statements-nested/content.md:answer-list/content.md): "Z" should be "Z". Also, "when uppercase" should probably be "when uppercased" for grammar.if-statements-nested/content.md:ifstatement, not anif/else.answer-list/content.md:python-tuplesheader also seems to have been renamed tocreating-tuples-in-python.# code snippedinstead of the usual...; which one of these is preferred?The performance article:
Bbk1AtJJF8 commentedon Aug 3, 2026
For the Affine Cipher exercise, consider including a function that explicitly demonstrates how the encoding and decoding are related mathematically, which would enhance clarity and educational value for new learners.
BethanyG commentedon Aug 17, 2026
@gjbbcjj The changes to the Acronym exercise were already PR'd.
BethanyG commentedon Sep 10, 2026
@kyliekamesha26 - I'm sorry, but this issue is closed to contributions from anyone but Yrahcaz7, who was originally assigned to it.
Yrahcaz7 commentedon Sep 14, 2026
Roman Numerals Dig Deeper audit
Overall:
introduction.md:ifconditions" approach.itertools.starmap()approach.if-else/content.md,if-else/snippet.txt, andintroduction.md:if-else/content.md:+=.>.> 0and> 4comparisons.table-lookup/content.md,table-lookup/snippet.txt, andintroduction.md:table-lookup/content.md:introduction.md): "we need" should be "get" and "our" should be "the".loop-over-romans/snippet.txt:loop-over-romans/content.md) has an unnecessary assertion.loop-over-romans/content.md:while".recurse-match/content.md,recurse-match/snippet.txt, andintroduction.md:[ROMAN_NUM[idx],]is unnecessary, as it is a single-element list, not a tuple.case [num, idx, digits]:) can be changed to a default case (case _:).recurse-match/content.md:introduction.md) use double quotes.convert.ltrvariable represents from its name. It should probably be renamed toroman_valor similar.loop-over-romaninstead ofloop-over-romans.itertools-starmap/content.mdanditertools-starmap/snippet.txt:itertools-starmap/content.md:compute" should probably be "compute()".config.json:@BethanyG, can I open a PR to fix these? (Or perhaps 2 separate ones due to the amount?)
BethanyG commentedon Sep 15, 2026
Hi @Yrahcaz7 👋🏽
Apologies for the delay in replying. Go for it. Maybe two groups: The straight-up typos, whitespace, and punctuation-related stuff. And a second one for rephrases and other more substantial edits? Many thanks for working on this!
jonahwhite115 commentedon Sep 27, 2026
I can take a look at auditing
Circular Buffernext, specifically ensuring we cover the trade-offs between using aYrahcaz7 commentedon Oct 14, 2026
Raindrops Dig Deeper audit
Overall:
str.join()have a link to the docs onjoin().introduction.md:3,5or7)".'Plong'and(7).f-strings" here.results" here.approach-itertools-compress, notitertools-compress.number % factor.#and has an extra space before "Unless".nis usually used for big-O notation instead ofmwhen there is only one factor.if-statements/content.md:introduction.md.sounds" here.truthy-and-falsey-with-fstring/content.md:modulo == 1should bemodulo > 0.introduction.md): The#OR#is indented here.f-strings should be linked here.introduction.md): The last comma is unnecessary.'Pling"should be'Pling'.''looks like a double quote when rendered on the website. Surrounding it in backticks could fix this.loop-and-fstring/content.md:introduction.md, line 3 inloop-and-fstring/snippet.txt): Double quotes are used here, when single quotes are used in most other places.introduction.md): "sounds string" should be "thesoundsstring".introduction.md): "Sounds" should be "sounds".sequence-with-join/content.md:introduction.md) use double quotes.introduction.md, line 6 insequence-with-join/snippet.txt) have unnecessary parentheses around theifclause.introduction.md): "Sounds" should be "sounds".dict-and-join/content.md:ifclause.itertools-compress/content.md:itertools-compress/snippet.txt) should either use parentheses or there should be explanation of implicittuplecreation.introduction.md, line 5 initertools-compress/snippet.txt) have unnecessary parentheses aroundnumber % factor.functools-reduce/content.md:introduction.md, line 5 infunctools-reduce/snippet.txt) have unnecessary parentheses aroundnumber % factor.#.item[0] * item[1].The performance article:
introduction.md): PEP 622 was superseded by PEP 634, which points to the up-to-date documentation here.The performance article's
snippet.md:@BethanyG, can I open a PR for these? (There's quite a few audit items, but only a couple of them need prose rewording.)
BethanyG commentedon Oct 14, 2026
Go for it! 😄