Initial commit
This commit is contained in:
commit
24600885b9
12 changed files with 339 additions and 0 deletions
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
14
README.md
Normal file
14
README.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Project 02 - Python test generator
|
||||
|
||||
### About the Project
|
||||
|
||||
This project has the goal of writing a search based automated test generator for Python.
|
||||
It is part of the Knowledge Search & Extraction - 2023 course from the Università della Svizzera italiana.
|
||||
|
||||
In this repository, you can find the following files:
|
||||
- benchmark folder: which contains the benchmark of functions under test to be instrumented
|
||||
|
||||
Note: Feel free to modify this file according to the project's necessities.
|
||||
|
||||
|
||||
|
15
benchmark/anagram_check.py
Normal file
15
benchmark/anagram_check.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/anagram_check.py
|
||||
|
||||
# function to check if two strings are
|
||||
# anagram or not
|
||||
def anagram_check(s1: str, s2: str) -> bool:
|
||||
if len(s1) == 1 and len(s2) == 1:
|
||||
return s1 == s2
|
||||
if len(s1) != len(s2):
|
||||
return False
|
||||
|
||||
# the sorted strings are checked
|
||||
if ''.join(sorted(s1)) == ''.join(sorted(s2)):
|
||||
return True
|
||||
else:
|
||||
return False
|
25
benchmark/caesar_cipher.py
Normal file
25
benchmark/caesar_cipher.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/caesar_cipher.py
|
||||
|
||||
|
||||
def encrypt(strng: str, key: int) -> str:
|
||||
assert 0 < key <= 94
|
||||
encrypted = ''
|
||||
for x in strng:
|
||||
indx = (ord(x) + key) % 256
|
||||
if indx > 126:
|
||||
indx = indx - 95
|
||||
encrypted = encrypted + chr(indx)
|
||||
return encrypted
|
||||
|
||||
|
||||
def decrypt(strng: str, key: int) -> str:
|
||||
assert 0 < key <= 94
|
||||
decrypted = ''
|
||||
for x in strng:
|
||||
indx = (ord(x) - key) % 256
|
||||
if indx < 32:
|
||||
indx = indx + 95
|
||||
decrypted = decrypted + chr(indx)
|
||||
return decrypted
|
||||
|
||||
|
18
benchmark/check_armstrong.py
Normal file
18
benchmark/check_armstrong.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/check_armstrong.py
|
||||
|
||||
def check_armstrong(n: int) -> bool:
|
||||
assert n >= 0
|
||||
if n == 0 or n == 1:
|
||||
return True
|
||||
if n <= 150:
|
||||
return False
|
||||
t = n
|
||||
sum = 0
|
||||
while t != 0:
|
||||
r = t % 10
|
||||
sum = sum + (r * r * r)
|
||||
t = t // 10
|
||||
if sum == n:
|
||||
return True
|
||||
else:
|
||||
return False
|
27
benchmark/common_divisor_count.py
Normal file
27
benchmark/common_divisor_count.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/common_divisor_count.py
|
||||
|
||||
"""
|
||||
The function takes two integers as input and return the number of common divisors of
|
||||
that pair
|
||||
"""
|
||||
|
||||
|
||||
def cd_count(a: int, b: int) -> int:
|
||||
if a == 0 or b == 0:
|
||||
return 2
|
||||
a = (-1 * a if a < 0 else a)
|
||||
b = (-1 * b if b < 0 else b)
|
||||
|
||||
result = 0
|
||||
while a != 0:
|
||||
c = a
|
||||
a = b % a
|
||||
b = c
|
||||
|
||||
for i in range(1, int((b ** 0.5) + 1)):
|
||||
if b % i == 0:
|
||||
if int(b / i) == i:
|
||||
result = result + 1
|
||||
else:
|
||||
result = result + 2
|
||||
return result
|
24
benchmark/exponentiation.py
Normal file
24
benchmark/exponentiation.py
Normal file
|
@ -0,0 +1,24 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/exponentiation.py
|
||||
|
||||
def exponentiation(baseNumber: int, power: int) -> float:
|
||||
assert not (baseNumber == 0 or power <= 0)
|
||||
|
||||
answer = None
|
||||
|
||||
if power > 1:
|
||||
halfAnswer = exponentiation(baseNumber, power//2)
|
||||
answer = halfAnswer * halfAnswer
|
||||
|
||||
if power%2 == 1:
|
||||
answer *= baseNumber
|
||||
|
||||
elif power == 1:
|
||||
answer = baseNumber
|
||||
|
||||
elif power == 0:
|
||||
answer = 1
|
||||
|
||||
else: # negative power
|
||||
answer = 1 / exponentiation(baseNumber, abs(power))
|
||||
|
||||
return answer
|
15
benchmark/gcd.py
Normal file
15
benchmark/gcd.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/common_divisor_count.py
|
||||
|
||||
def gcd(a: int, b: int) -> int:
|
||||
assert a > 0 and b > 0
|
||||
if a == 1 or b == 1:
|
||||
return 1
|
||||
if a == b:
|
||||
return a
|
||||
if b > a:
|
||||
a, b = b, a
|
||||
while b != 0:
|
||||
temp = b
|
||||
b = a % b
|
||||
a = temp
|
||||
return a
|
28
benchmark/longest_substring.py
Normal file
28
benchmark/longest_substring.py
Normal file
|
@ -0,0 +1,28 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/longest_substring.py
|
||||
|
||||
# Create an algorithm that prints the longest substring of s in which
|
||||
# the letters occur in alphabetical order. For example, if
|
||||
# s = 'azcbobobegghakl', then your program should print:
|
||||
# Longest substring in alphabetical order is: beggh
|
||||
|
||||
# In the case of ties, print the first substring.
|
||||
# For example, if s = 'abcbcd', then your program should print:
|
||||
# Longest substring in alphabetical order is: abc
|
||||
|
||||
|
||||
def longest_sorted_substr(s: str) -> str:
|
||||
count = 0
|
||||
max_count = 0
|
||||
end_position = 0
|
||||
for char in range(len(s) - 1):
|
||||
if (s[char] <= s[char + 1]):
|
||||
count += 1
|
||||
if count > max_count:
|
||||
max_count = count
|
||||
end_position = char + 1
|
||||
else:
|
||||
count = 0
|
||||
start_position = end_position - max_count
|
||||
return s[start_position:end_position+1]
|
||||
|
||||
|
46
benchmark/rabin_karp.py
Normal file
46
benchmark/rabin_karp.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/rabin_karp.py
|
||||
|
||||
|
||||
# Rabin Karp Algorithm in python using hash values
|
||||
|
||||
|
||||
def rabin_karp_search(pat: str, txt: str) -> list:
|
||||
assert len(pat) <= len(txt)
|
||||
|
||||
# d is the number of characters in input alphabet
|
||||
d = 2560
|
||||
q = 101
|
||||
|
||||
M = len(pat)
|
||||
N = len(txt)
|
||||
i = 0
|
||||
j = 0
|
||||
|
||||
p = 0
|
||||
t = 0
|
||||
h = 1
|
||||
|
||||
for i in range(M - 1):
|
||||
h = (h * d) % q
|
||||
|
||||
for i in range(M):
|
||||
p = (d * p + ord(pat[i])) % q
|
||||
t = (d * t + ord(txt[i])) % q
|
||||
|
||||
found_at_index = []
|
||||
for i in range(N - M + 1):
|
||||
if p == t:
|
||||
for j in range(M):
|
||||
if txt[i + j] != pat[j]:
|
||||
break
|
||||
|
||||
j += 1
|
||||
if j == M:
|
||||
found_at_index.append(i)
|
||||
|
||||
if i < N - M:
|
||||
t = (d * (t - ord(txt[i]) * h) + ord(txt[i + M])) % q
|
||||
if t < 0:
|
||||
t = t + q
|
||||
|
||||
return found_at_index
|
73
benchmark/railfence_cipher.py
Normal file
73
benchmark/railfence_cipher.py
Normal file
|
@ -0,0 +1,73 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/railfence_cipher.py
|
||||
|
||||
|
||||
def railencrypt(st: str, k: int) -> str:
|
||||
assert k > 1
|
||||
c = 0
|
||||
x = 0
|
||||
m =[[0] * (len(st)) for i in range(k)]
|
||||
for r in range(len(st)):
|
||||
m[c][r] = ord(st[r])
|
||||
if x == 0:
|
||||
if c == (k-1):
|
||||
x = 1
|
||||
c -= 1
|
||||
else:
|
||||
c += 1
|
||||
else:
|
||||
if c == 0:
|
||||
x = 0
|
||||
c += 1
|
||||
else:
|
||||
c -= 1
|
||||
|
||||
result = []
|
||||
for i in range(k):
|
||||
for j in range(len(st)):
|
||||
if m[i][j] != 0:
|
||||
result.append(chr(m[i][j]))
|
||||
return ''.join(result)
|
||||
|
||||
|
||||
def raildecrypt(st: str, k: int) -> str:
|
||||
assert k > 1
|
||||
c , x = 0 , 0
|
||||
m =[[0] * (len(st)) for i in range(k)]
|
||||
for r in range(len(st)):
|
||||
m[c][r] = 1
|
||||
if x == 0:
|
||||
if c == (k-1):
|
||||
x = 1
|
||||
c -= 1
|
||||
else:
|
||||
c += 1
|
||||
else:
|
||||
if c == 0:
|
||||
x = 0
|
||||
c += 1
|
||||
else:
|
||||
c -= 1
|
||||
result = []
|
||||
c , x = 0 , 0
|
||||
for i in range(k):
|
||||
for j in range(len(st)):
|
||||
if m[i][j] == 1:
|
||||
m[i][j] = ord(st[x])
|
||||
x += 1
|
||||
for r in range(len(st)):
|
||||
if m[c][r] != 0:
|
||||
result.append(chr(m[c][r]))
|
||||
if x == 0:
|
||||
if c == (k-1):
|
||||
x = 1
|
||||
c -= 1
|
||||
else:
|
||||
c += 1
|
||||
else:
|
||||
if c == 0:
|
||||
x = 0
|
||||
c += 1
|
||||
else:
|
||||
c -= 1
|
||||
return ''.join(result)
|
||||
|
52
benchmark/zellers_birthday.py
Normal file
52
benchmark/zellers_birthday.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Based on https://github.com/AllAlgorithms, python/algorithms/math/zellers_birthday.py
|
||||
|
||||
|
||||
def zeller(d: int, m: int, y: int) -> str:
|
||||
assert abs(d) >= 1
|
||||
assert abs(m) >= 1
|
||||
assert 0 <= abs(y) <= 99 or 1000 <= abs(y) <= 3000
|
||||
|
||||
d = abs(d)
|
||||
m = abs(m)
|
||||
y = abs(y)
|
||||
if d > 31:
|
||||
d = d % 31 + 1
|
||||
if m > 12:
|
||||
m = m % 12 + 1
|
||||
if y < 100 and y < 23:
|
||||
y = 2000 + y
|
||||
if y < 100 and y >= 23:
|
||||
y = 1900 + y
|
||||
|
||||
days = {
|
||||
'0': 'Sunday',
|
||||
'1': 'Monday',
|
||||
'2': 'Tuesday',
|
||||
'3': 'Wednesday',
|
||||
'4': 'Thursday',
|
||||
'5': 'Friday',
|
||||
'6': 'Saturday'
|
||||
}
|
||||
|
||||
# m = int(bday[0] + bday[1])
|
||||
# d = int(bday[3] + bday[4])
|
||||
# y = int(bday[6] + bday[7] + bday[8] + bday[9])
|
||||
|
||||
if m <= 2:
|
||||
y = y - 1
|
||||
m = m + 12
|
||||
c = int(str(y)[:2])
|
||||
k = int(str(y)[2:])
|
||||
|
||||
t = int(2.6 * m - 5.39)
|
||||
u = int(c / 4)
|
||||
v = int(k / 4)
|
||||
x = d + k
|
||||
z = t + u + v + x
|
||||
w = z - (2 * c)
|
||||
|
||||
f = round(w % 7)
|
||||
|
||||
for i in days:
|
||||
if f == int(i):
|
||||
return days[i]
|
Reference in a new issue