BuK/IIm20/Vorlesung 4 Lemke

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Python</language>
== Kreativaufgabe S. 15 ==

=== Aufzählfunktion für semi-entscheidbare Menge ===

<code id="607b1c0c5f723">
import signal

from itertools import product
from math import sqrt

'''
A = {a, b, c}
M = words that begin with ab
'''

ALPHABET = 'abc'
a = 'ab'

def timeout(signum, frame):
	raise Exception('Stop waiting')

def semi_chi(word):
	if word[0:2] == 'ab':
		return True
	else:
		while True:
			pass
			
def generate_words_with_length(length):
	return ["".join(x) for x in product(ALPHABET, repeat=length)]
			
def generate_wordset():
	length = 0
	while True:
		for w in generate_words_with_length(length):
			yield w
		length += 1
		
def get_word_at(wordset, index):
	for i in range(index+1):
		w = next(wordset)
		if i == index:
			return w
			
def get_x_y_from_z(z):
	w = int((sqrt(8 * z + 1) -1) / 2)
	t = int((w * (w + 1)) / 2) # has to be typecast bc otherwise it will be .0 float
	y = z - t
	x = w - y
	return (x, y)
	
def generate_M(z):
	x, y = get_x_y_from_z(z)
	signal.signal(signal.SIGALRM, timeout)
	signal.alarm(y+1)
	try:
		word = get_word_at(generate_wordset(), x)
		if semi_chi(word):
			return word
	except Exception:
		return a
</code>

<run id="607b1c0c5f7bf">
for z in range(20):
	print(generate_M(z))
</run>