code: 
  
  def  _A  (			SCREAMING_SNAKE_CASE			):
  	UpperCAmelCase__:  str		       =   word.upper()
  	UpperCAmelCase__:  int		       =   0
  	UpperCAmelCase__:  Any		       =   {}
  	UpperCAmelCase__:  Optional[int]		       =   []
  
  	for letter in word:
  		if letter not in letter_nums:
  			UpperCAmelCase__:  Dict		       =   str(SCREAMING_SNAKE_CASE			)
  			next_num += 1
  		word_pattern.append(letter_nums[letter]			)
  	return ".".join(SCREAMING_SNAKE_CASE			)
  
  
  if __name__ == "__main__":
  					import pprint
  					import time
  
  					_lowerCAmelCase     :			Optional[int]    =time.time()
  					with open("""dictionary.txt""") as in_file:
  										_lowerCAmelCase     :			List[str]    =in_file.read().splitlines()
  
  					_lowerCAmelCase     :			dict    ={}
  					for word in word_list:
  										_lowerCAmelCase     :			List[str]    =get_word_pattern(word)
  										if pattern in all_patterns:
  															all_patterns[pattern].append(word)
  										else:
  															_lowerCAmelCase     :			List[Any]    =[word]
  
  					with open("""word_patterns.txt""", """w""") as out_file:
  										out_file.write(pprint.pformat(all_patterns))
  
  					_lowerCAmelCase     :			List[str]    =round(time.time() - start_time, 2)
  					print(F"Done!  {len(all_patterns):,} word patterns found in {total_time} seconds.")
  					# Done!  9,581 word patterns found in 0.58 seconds.
style_context: 
  
  from __future__ import annotations
  
  from collections import Counter
  
  
  
  def  _A  (			SCREAMING_SNAKE_CASE			):
  	UpperCAmelCase__:  Optional[Any]		       =   [True] * n
  	UpperCAmelCase__:  Any		       =   False
  	UpperCAmelCase__:  Tuple		       =   False
  	UpperCAmelCase__:  Optional[Any]		       =   True
  
  	for i in range(3  ,int(n**0.5 + 1			)  ,2			):
  		UpperCAmelCase__:  Any		       =   i * 2
  		while index < n:
  			UpperCAmelCase__:  Optional[int]		       =   False
  			UpperCAmelCase__:  Tuple		       =   index + i
  
  	UpperCAmelCase__:  int		       =   [2]
  
  	for i in range(3  ,SCREAMING_SNAKE_CASE  ,2			):
  		if is_prime[i]:
  			primes.append(SCREAMING_SNAKE_CASE			)
  
  	return primes
  
  
  
  def  _A  (			SCREAMING_SNAKE_CASE			):
  	UpperCAmelCase__:  List[Any]		       =   str(SCREAMING_SNAKE_CASE			)
  	UpperCAmelCase__:  Tuple		       =   []
  	UpperCAmelCase__:  Optional[int]		       =   ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
  
  	for duplicate in Counter(SCREAMING_SNAKE_CASE			) - Counter(set(SCREAMING_SNAKE_CASE			)			):
  		UpperCAmelCase__:  Optional[Any]		       =   [int(number_str.replace(SCREAMING_SNAKE_CASE  ,SCREAMING_SNAKE_CASE			)			) for digit in digits]
  		replacements.append(SCREAMING_SNAKE_CASE			)
  
  	return replacements
  
  
  
  def  _A  (			SCREAMING_SNAKE_CASE = 8			):
  	UpperCAmelCase__:  Union[str, Any]		       =   set()
  
  	# Filter primes with less than 3 replaceable digits
  	UpperCAmelCase__:  Optional[Any]		       =   {
  	    x for x in set(prime_sieve(1_0_0_0_0_0_0			)			) if len(str(SCREAMING_SNAKE_CASE			)			) - len(set(str(SCREAMING_SNAKE_CASE			)			)			) >= 3
  	}
  
  	for prime in primes:
  		if prime in numbers_checked:
  			continue
  
  		UpperCAmelCase__:  Optional[int]		       =   digit_replacements(SCREAMING_SNAKE_CASE			)
  
  		for family in replacements:
  			numbers_checked.update(SCREAMING_SNAKE_CASE			)
  			UpperCAmelCase__:  Dict		       =   primes.intersection(SCREAMING_SNAKE_CASE			)
  
  			if len(SCREAMING_SNAKE_CASE			) != family_length:
  				continue
  
  			return min(SCREAMING_SNAKE_CASE			)
  
  	return -1
  
  
  if __name__ == "__main__":
  					print(solution())