#!/usr/bin/python3


"""
ΑΣΚΗΣΗ 10
Να γραφεί πρόγραμμα που θα χρησιμοποιεί συνάρτηση για να γεμίζει k διανύσματα n στοιχείων (k<n) με ψευδοτυχαίες πραγματικές τιμές στο [1,100] και εν συνεχεία συνάρτηση που θα τυπώνει τυα διανύσματα αυτά στην οθόνη καθώς και συνάρτηση που θα υπολογίζει και θα τυπώνει τα μέτρα των διανυσμάτων αυτών στον Rn
"""

import random
import math
from math import hypot

def generate_vectors(dimension,count=1):
	if count>dimension:
		print("count>dimension".center(25,'*').upper())
		return
	return [ [round(random.uniform(1,100),2) for _ in range(dimension)] for _ in range(count) ]

def print_vec(vec_list):
	for i,el in enumerate(vec_list):
		print(f"Το διάνυσμα {i+1:3d} είναι: {el}")

	
def norm_vec(vec_list):
	print("Υπολογίζουμε τα μέτρα των διανυσμάτων στον Rn")

	norm_dict={}
	for el in vec_list:
		norm_dict[tuple(el)]=math.sqrt(sum(x**2 for x in el))
	# ΠΡΟΣΟΧΗ: ως κλειδιά λεξικού μπορούν να χρησιμοποιηθούν μόνο immutable μεταβλητές
	# Για παράδειγμα, θα ήταν λάθος να γράψουμε 
	"""
		norm_dict[el]=math.sqrt(sum(x**2 for x in el))
	"""
	# γιατί το el είναι λίστα (mutable)
	# Επομένως βάζοντας το στοιχείο σε 1Χ1 tuple, το κάνουμε immutable  

	"""
	ΕΝΑΛΛΑΚΤΙΚΑ από την Python3.8 μπορούμε να χρησιμοποιήσουμε την hypot() για περισσότερα από δύο ορίσματα  για τον υπολογισμό της νόρμας

	norm_dict={tuple(el):math.hypot(*el) for el in vec_list}
	"""	
	for key,value in norm_dict.items():
		print(f"Το μέτρο του διανύσματος {list(key)} είναι: {value:.2f}")
	return

def main():
	k=None
	n=None
	try:
		while True:
			try:
				k=int(input("Δώσε το πλήθος των διανυσμάτων, δηλαδή το k: "))
				if k<=0:
					print("Μη έγκυρο πλήθος k. Το k πρέπει να είναι θετικός ακέραιος.")
					continue
				break
			except ValueError:
				print("Μη έγκυρη εισαγωγή")

		while True:
			try:
				n = int(input("Δώσε τη διάσταση των διανυσμάτων, δηλαδή το n: "))
				if n<=0 or n<=k:
					print("Μη έγκυρη διάσταση n. Το n πρέπει να είναι θετικός αριθμός και μεγαλύτερος από το πλήθος των διανυσμάτων k.")
					continue
				break
			except ValueError:
				print("Μη έγκυρη εισαγωγή")

	except Exception as e:
		print(f"Exception: {str(e)}")
		exit(1)

	vec_list=generate_vectors(n,k)
	print_vec(vec_list)
	norm_vec(vec_list)
			
if __name__=="__main__":
	main()
