File size: 4,500 Bytes
e29cc8c
d924141
c9ca893
e29cc8c
32f2e18
d924141
c9ca893
 
e29cc8c
c9ca893
e29cc8c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9ca893
 
 
e29cc8c
 
 
 
 
 
 
c9ca893
e29cc8c
 
 
 
 
 
 
c9ca893
e29cc8c
 
 
 
 
 
 
c9ca893
e29cc8c
 
 
 
 
 
 
c9ca893
 
e29cc8c
c9ca893
e29cc8c
c9ca893
e29cc8c
 
 
 
d924141
c9ca893
e29cc8c
 
c9ca893
e29cc8c
c9ca893
 
 
 
 
 
 
 
 
 
 
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
# modules/number_system/grouping_techniques.py

title = "Grouping Techniques for Conversion"
description = "This module focuses on grouping techniques for conversion between bases such as binary, octal, and hexadecimal."

def generate_question():
    import random

    # Choose a random base to convert from, either 2, 8, or 16
    from_base = random.choice([2, 8, 16])
    to_base = 8 if from_base == 2 else 2 if from_base == 8 else 2
    number = ''

    if from_base == 2:
        # Generate a random binary number, optionally with a fractional part
        number = ''.join(random.choice('01') for _ in range(random.randint(4, 8)))
        if random.choice([True, False]):
            number += '.' + ''.join(random.choice('01') for _ in range(random.randint(1, 4)))
    elif from_base == 8:
        # Generate a random octal number, optionally with a fractional part
        number = ''.join(random.choice('01234567') for _ in range(random.randint(2, 4)))
        if random.choice([True, False]):
            number += '.' + ''.join(random.choice('01234567') for _ in range(random.randint(1, 3)))
    elif from_base == 16:
        # Generate a random hexadecimal number, optionally with a fractional part
        number = ''.join(random.choice('0123456789ABCDEF') for _ in range(random.randint(2, 4)))
        if random.choice([True, False]):
            number += '.' + ''.join(random.choice('0123456789ABCDEF') for _ in range(random.randint(1, 3)))

    def group_conversion(number, from_base, to_base):
        if from_base == 2 and to_base == 8:
            # Convert binary to octal
            integer_part, *fraction_part = number.split('.')
            integer_result = oct(int(integer_part, 2))[2:]
            if fraction_part:
                fraction_result = ''.join([oct(int(f'{fraction_part[0][i:i+3]:0<3}', 2))[2:] for i in range(0, len(fraction_part[0]), 3)])
                return f"{integer_result}.{fraction_result}"
            return integer_result
        elif from_base == 2 and to_base == 16:
            # Convert binary to hexadecimal
            integer_part, *fraction_part = number.split('.')
            integer_result = hex(int(integer_part, 2))[2:].upper()
            if fraction_part:
                fraction_result = ''.join([hex(int(f'{fraction_part[0][i:i+4]:0<4}', 2))[2:].upper() for i in range(0, len(fraction_part[0]), 4)])
                return f"{integer_result}.{fraction_result}"
            return integer_result
        elif from_base == 8 and to_base == 2:
            # Convert octal to binary
            integer_part, *fraction_part = number.split('.')
            integer_result = bin(int(integer_part, 8))[2:]
            if fraction_part:
                fraction_result = ''.join([bin(int(digit, 8))[2:].zfill(3) for digit in fraction_part[0]])
                return f"{integer_result}.{fraction_result}"
            return integer_result
        elif from_base == 16 and to_base == 2:
            # Convert hexadecimal to binary
            integer_part, *fraction_part = number.split('.')
            integer_result = bin(int(integer_part, 16))[2:]
            if fraction_part:
                fraction_result = ''.join([bin(int(digit, 16))[2:].zfill(4) for digit in fraction_part[0]])
                return f"{integer_result}.{fraction_result}"
            return integer_result

    correct_answer = group_conversion(number, from_base, to_base)
    options = {correct_answer}

    # Generate incorrect answers ensuring they are unique
    while len(options) < 4:
        invalid_number = group_conversion(''.join(random.choice('0123456789ABCDEF') for _ in range(len(correct_answer))), from_base, to_base)
        options.add(invalid_number)

    options = list(options)
    random.shuffle(options)
    
    question = f"Convert the number {number} from base {from_base} to base {to_base} using grouping technique."
    explanation = f"The number {number} in base {from_base} is {correct_answer} in base {to_base} using the grouping technique."
    step_by_step_solution = [
        "Step 1: Group the digits of the number according to the conversion rules.",
        "Step 2: Convert each group to the corresponding digit in the target base.",
        "Step 3: Combine the digits to form the final answer."
    ]
    
    return {
        "question": question,
        "options": options,
        "correct_answer": correct_answer,
        "explanation": explanation,
        "step_by_step_solution": step_by_step_solution
    }