0% found this document useful (0 votes)
873 views10 pages

Aether Code Screening

The document discusses issues with a broken Sieve of Atkin implementation and a Tic Tac Toe game UI, highlighting problems with returning boolean values instead of primes and misaligned UI elements. It provides corrected code for both the sieve and the game, ensuring proper functionality and adherence to specified requirements. Changes include returning actual prime integers, implementing a polynomial rolling hash, fixing UI alignment, and adjusting the reset timer to 10 seconds.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
873 views10 pages

Aether Code Screening

The document discusses issues with a broken Sieve of Atkin implementation and a Tic Tac Toe game UI, highlighting problems with returning boolean values instead of primes and misaligned UI elements. It provides corrected code for both the sieve and the game, ensuring proper functionality and adherence to specified requirements. Changes include returning actual prime integers, implementing a polynomial rolling hash, fixing UI alignment, and adjusting the reset timer to 10 seconds.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Aether Code Screening​

1. How would you change the given response?


The original sieve is fundamentally broken because it returns a list of booleans instead
of prime integers and is improperly initialized, causing index errors. Additionally, the
hashing function fails to implement the requested polynomial rolling algorithm. I would
fix the logic to return actual primes and implement a mathematically correct rolling
hash.​
There are some Issues.​

Instruction Following (IF) Issues: No.

Truthfulness Issues: Yes.

2. Ideal Response (The Code)


Python

def sieve(limit):
if limit < 2: return []
# Initialize list to correct size to prevent index errors
res = [False] * (limit + 1)
if limit >= 2: res[2] = True
if limit >= 3: res[3] = True

# Corrected Sieve of Atkin logic


for i in range(1, int(limit**0.5) + 1):
for j in range(1, int(limit**0.5) + 1):
n = (4 * i * i) + (j * j)
if n <= limit and (n % 12 == 1 or n % 12 == 5):
res[n] ^= True
n = (3 * i * i) + (j * j)
if n <= limit and n % 12 == 7:
res[n] ^= True
n = (3 * i * i) - (j * j)
if i > j and n <= limit and n % 12 == 11:
res[n] ^= True

for r in range(5, int(limit**0.5) + 1):


if res[r]:
for i in range(r * r, limit + 1, r * r):
res[i] = False

# Return actual prime integers to ensure pick_prime works


return [i for i, is_prime in enumerate(res) if is_prime]

def pick_prime(primes, min_size=1000):


for prime in primes:
if prime >= min_size:
return prime
return primes[-1]

def polynomial_hash(string, modulus):


"""
Implements TRUE polynomial rolling: H = (s[0]*p^0 + s[1]*p^1 + ...) mod m
"""
p = 31
hash_value = 0
p_pow = 1
for char in string:
hash_value = (hash_value + (ord(char) - ord('a') + 1) * p_pow) % modulus
p_pow = (p_pow * p) % modulus
return hash_value

if __name__ == '__main__':
primes_list = sieve(10000)
mod = pick_prime(primes_list, 1000)

test_array = ["alpha", "beta", "gamma", "delta", "epsilon"]


for s in test_array:
print(f"Hash of {s} is {polynomial_hash(s, mod)}")

3. Summary of Changes
The Sieve of Atkin was broken, returning booleans and crashing due to poor
initialization. I re-engineered the logic to output actual prime integers and implemented
a genuine polynomial rolling hash, ensuring the algorithm finally matches the requested
mathematical rigor.​


There are some Issues​
Instruction Following (IF) Issues: No.​
Truthfulness Issues: Yes.

The UI is misaligned because draw_status incorrectly uses HEIGHT/2, putting the


turn-message in the center of the grid instead of the status bar. The screen
dimensions are 400x500, but the bottom 100px is not utilized properly. Additionally,
the reset function only waits 3 seconds when the prompt explicitly demanded a
10-second pause. I would fix the coordinates and update the [Link]() duration.
Ideal Response (The Code)

import pygame as pg

import sys

import time

from [Link] import *

# Initialize variables

current_player = 'x'

current_winner = None

is_draw = False

WIDTH = 400

HEIGHT = 400 # Game area height

STATUS_HEIGHT = 100 # Dedicated status bar height

BACKGROUND = (255, 255, 255)

LINE_COLOR = (0, 0, 0)

WIN_LINE_COLOR = (250, 0, 0)

grid = [[None]*3, [None]*3, [None]*3]


[Link]()

FPS = 30

clock = [Link]()

screen = [Link].set_mode((WIDTH, HEIGHT + STATUS_HEIGHT))

[Link].set_caption("Tic Tac Toe")

def game_initiating_window():

[Link](BACKGROUND)

# Draw vertical lines

[Link](screen, LINE_COLOR, (WIDTH / 3, 0), (WIDTH / 3, HEIGHT), 7)

[Link](screen, LINE_COLOR, (WIDTH / 3 * 2, 0), (WIDTH / 3 * 2, HEIGHT), 7)

# Draw horizontal lines

[Link](screen, LINE_COLOR, (0, HEIGHT / 3), (WIDTH, HEIGHT / 3), 7)

[Link](screen, LINE_COLOR, (0, HEIGHT / 3 * 2), (WIDTH, HEIGHT / 3 * 2), 7)

draw_status()

def draw_status():

global is_draw

if current_winner is None:
message = current_player.upper() + "'s Turn"

else:

message = current_winner.upper() + " won!"

if is_draw:

message = "Game Draw!"

font = [Link](None, 30)

text = [Link](message, 1, (255, 255, 255))

# Correctly fill the bottom status bar area

[Link]((0, 0, 0), (0, HEIGHT, WIDTH, STATUS_HEIGHT))

# Correctly center text in the status bar (HEIGHT + 50)

text_rect = text.get_rect(center=(WIDTH / 2, HEIGHT + 50))

[Link](text, text_rect)

[Link]()

def check_win():

global grid, current_winner, is_draw

# Row win check

for row in range(0, 3):

if (grid[row][0] == grid[row][1] == grid[row][2]) and (grid[row][0] is not None):


current_winner = grid[row][0]

y_pos = (row * HEIGHT / 3) + (HEIGHT / 6)

[Link](screen, WIN_LINE_COLOR, (20, y_pos), (WIDTH - 20, y_pos), 4)

break

# Col win check

for col in range(0, 3):

if (grid[0][col] == grid[1][col] == grid[2][col]) and (grid[0][col] is not None):

current_winner = grid[0][col]

x_pos = (col * WIDTH / 3) + (WIDTH / 6)

[Link](screen, WIN_LINE_COLOR, (x_pos, 20), (x_pos, HEIGHT - 20), 4)

break

# Diagonal win checks

if (grid[0][0] == grid[1][1] == grid[2][2]) and (grid[0][0] is not None):

current_winner = grid[0][0]

[Link](screen, WIN_LINE_COLOR, (20, 20), (WIDTH - 20, HEIGHT - 20), 4)

if (grid[0][2] == grid[1][1] == grid[2][0]) and (grid[0][2] is not None):

current_winner = grid[0][2]

[Link](screen, WIN_LINE_COLOR, (WIDTH - 20, 20), (20, HEIGHT - 20), 4)

if all([all(row) for row in grid]) and current_winner is None:


is_draw = True

draw_status()

def drawXO(row, col):

global grid, current_player

pos_x = (col - 1) * WIDTH / 3 + 30

pos_y = (row - 1) * HEIGHT / 3 + 30

grid[row-1][col-1] = current_player

if current_player == 'x':

[Link](screen, LINE_COLOR, (pos_x, pos_y), (pos_x + 80, pos_y + 80), 5)

[Link](screen, LINE_COLOR, (pos_x, pos_y + 80), (pos_x + 80, pos_y), 5)

current_player = 'o'

else:

[Link](screen, LINE_COLOR, (int(pos_x + 40), int(pos_y + 40)), 40, 5)

current_player = 'x'

[Link]()

def user_click():

x, y = [Link].get_pos()

if x < WIDTH and y < HEIGHT:


col = int(x // (WIDTH / 3)) + 1

row = int(y // (HEIGHT / 3)) + 1

if grid[row-1][col-1] is None:

drawXO(row, col)

check_win()

def reset_game():

global grid, current_winner, current_player, is_draw

[Link](10) # RESET WAIT TIME INCREASED TO 10 SECONDS

current_player = 'x'

current_winner = None

is_draw = False

grid = [[None]*3, [None]*3, [None]*3]

game_initiating_window()

game_initiating_window()

while True:

for event in [Link]():

if [Link] == QUIT:

[Link](); [Link]()
elif [Link] == MOUSEBUTTONDOWN:

user_click()

if current_winner or is_draw:

reset_game()

[Link]()

[Link](FPS)

I synchronized the 10-second reset timer, aligned the UI coordinates to the bottom
status bar, and fixed the window height usage. The status display no longer gets stuck,
and the red winning line now perfectly intersects the marks.​

—END—​


For Aether Quality Management contact us +254 714 091 722 (FESTUS)

You might also like