5 Best Ways to Implement the 3 6 9 Game in Python

Rate this post

πŸ’‘ Problem Formulation: We need to implement the ‘3 6 9’ game in Python, where, traditionally, people sit in a circle and count up from 1. Instead of saying numbers divisible by 3, or containing 3, 6, or 9, they say “clap”. For example, the sequence starts 1, 2, “clap”, 4, 5, “clap”, 7, 8, “clap”, 10, 11, “clap”, “clap”, 14, “clap” and so on.

Method 1: Using a Simple Loop and the Modulo Operator

This method involves using a for loop to iterate through a range of numbers, checking for divisibility by 3 with the modulo operator. If divisible, or if the number contains 3, 6, or 9, the program prints “clap”. This method is straightforward and clear for beginners to understand.

Here’s an example:

def three_six_nine(n):
    for i in range(1, n+1):
        if i % 3 == 0 or '3' in str(i) or '6' in str(i) or '9' in str(i):
            print("clap", end=' ')
        else:
            print(i, end=' ')
three_six_nine(15)

Output:

1 2 clap 4 5 clap 7 8 clap 10 11 clap clap 14 clap 

In this snippet, a function three_six_nine() prints a sequence of numbers where every number divisible by 3 or containing 3, 6, or 9 is replaced with “clap”. The % operator checks for divisibility, and the in keyword checks if ‘3’, ‘6’, or ‘9’ are in the string representation of the number. This is a simple and effective method for the problem.

Method 2: Using List Comprehensions

List comprehensions in Python provide a concise way to create lists. It can be utilized in our game to generate the appropriate sequence in a single line of code. Utilizing list comprehensions makes the code more Pythonic and generally more readable for those familiar with Python syntax.

Here’s an example:

def three_six_nine_compact(n):
    return ['clap' if x % 3 == 0 or any(dig in str(x) for dig in '369') else x for x in range(1, n+1)]

print(*three_six_nine_compact(15))

Output:

1 2 clap 4 5 clap 7 8 clap 10 11 clap clap 14 clap 

The code snippet creates a function three_six_nine_compact() that uses a list comprehension to perform the same task as Method 1 in a more concise way. This method is more elegant and takes advantage of Python’s expressive syntax, where the condition within the list comprehension handles the game’s logic smartly.

Method 3: Using Regular Expressions for Pattern Matching

Regular expressions can be used to match patterns within text. By using regular expressions, we can check if the number contains 3, 6, or 9. This method may be less intuitive for beginners but is powerful for text processing and pattern matching.

Here’s an example:

import re

def three_six_nine_regex(n):
    for i in range(1, n+1):
        if i % 3 == 0 or re.search('[369]', str(i)):
            print("clap", end=' ')
        else:
            print(i, end=' ')
three_six_nine_regex(15)

Output:

1 2 clap 4 5 clap 7 8 clap 10 11 clap clap 14 clap 

This code uses a function three_six_nine_regex() that employs regular expressions to find if a number contains ‘3’, ‘6’, or ‘9’ and prints “clap” accordingly. This approach can be more efficient when searching through large datasets or performing more complex pattern matching tasks.

Method 4: Using Functions and Recursion

Recursion is an approach where a function calls itself to break down the problem into smaller, easier-to-solve problems. While not the most efficient for this task, using recursion can be a good exercise in understanding function calls and the call stack.

Here’s an example:

def clap_or_number(i):
    if i % 3 == 0 or '3' in str(i) or '6' in str(i) or '9' in str(i):
        return "clap"
    return str(i)

def three_six_nine_recursive(n, i=1):
    if i > n:
        return
    print(clap_or_number(i), end=' ')
    three_six_nine_recursive(n, i+1)

three_six_nine_recursive(15)

Output:

1 2 clap 4 5 clap 7 8 clap 10 11 clap clap 14 clap 

The recursive function three_six_nine_recursive() calls itself, incrementing the number each time until it surpasses the input limit. The helper function clap_or_number() returns “clap” or the number as a string, which is printed by the recursive function. This is an interesting method that illustrates the power of recursion.

Bonus One-Liner Method 5: Using Lambda and Map

Lambda functions are anonymous functions in Python, written in one line. When combined with the map function, they can create a concise one-liner solution to iterate and apply a condition over a range of numbers, ideal for those who favor functional programming styles.

Here’s an example:

result = list(map(lambda x: "clap" if x % 3 == 0 or any(dig in str(x) for dig in '369') else x, range(1, 16)))
print(*result)

Output:

1 2 clap 4 5 clap 7 8 clap 10 11 clap clap 14 clap 

A single line of code uses a lambda function with a conditional expression inside the map function to produce the game’s sequence as a list. This line is then unpacked and printed out. This method is incredibly compact and showcases the power of Python’s functional programming capabilities.

Summary/Discussion

  • Method 1: Simple Loop and Modulo Operator. It is straightforward, easy for beginners to understand. It can be less elegant and longer in terms of code length.
  • Method 2: List Comprehensions. Provides a more Pythonic and readable solution for those familiar with this feature. Might be confusing for newcomers.
  • Method 3: Regular Expressions. Powerful for pattern matching, and efficient with larger sets, although potentially complex for simple tasks or for those not familiar with regex.
  • Method 4: Functions and Recursion. It’s a good learning tool to understand recursive functions, albeit not the most efficient choice performance-wise for this particular task.
  • Bonus Method 5: Lambda and Map. A compact and elegant one-liner fitting a functional programming style, yet possibly cryptic for those not used to lambda or map functions.