forked from mouredev/roadmap-retos-programacion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathavcenal.py
230 lines (202 loc) · 6.47 KB
/
avcenal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
"""
* EJERCICIO:
* Implementa los mecanismos de introducción y recuperación de elementos propios de las
* pilas (stacks - LIFO) y las colas (queue - FIFO) utilizando una estructura de array
* o lista (dependiendo de las posibilidades de tu lenguaje).
"""
class Stack:
def __init__(self):
self.__stack = list()
def push(self,item):
if len(self.__stack) == 0:
self.__stack.append(item)
else:
temp = list()
temp = self.__stack.copy()
self.__stack.clear()
self.__stack.append(item)
for element in temp:
self.__stack.append(element)
return self.__stack
def pop(self):
if len(self.__stack) == 1:
self.__stack.clear()
else:
self.__stack = self.__stack[1:]
return self.__stack
def top(self):
return self.__stack[0]
def size(self):
return len(self.__stack)
def empty(self):
return self.__stack.clear()
def show(self) -> None:
print(self.__stack)
class Queue():
def __init__(self) -> None:
self.__queue = list()
def enqueue(self,item):
return self.__queue.append(item)
def dequeued(self):
self.__queue = self.__queue[1:]
return self.__queue
def front(self):
return self.__queue[0];
def show(self):
print(self.__queue)
my_stack = Stack()
my_stack.show()
my_stack.push(3)
my_stack.show()
my_stack.push(2)
my_stack.show()
my_stack.push(5)
my_stack.show()
my_stack.push(9)
my_stack.show()
my_variable = my_stack.top()
print(f"El valor accesible de la pila es el: {my_variable}")
my_stack.pop()
my_stack.show()
print(f"La longitud de la pila es: {my_stack.size()}")
my_stack.empty()
my_stack.show()
my_queue = Queue()
my_queue.show()
my_queue.enqueue("hola")
my_queue.enqueue("mi nombre")
my_queue.show()
my_queue.enqueue("es Alex")
my_queue.show()
my_queue.dequeued()
my_queue.show()
print(f"El primer valor de la cola es: \"{my_queue.front()}\"")
"""
* DIFICULTAD EXTRA (opcional):
* - Utilizando la implementación de pila y cadenas de texto, simula el mecanismo adelante/atrás
* de un navegador web. Crea un programa en el que puedas navegar a una página o indicarle
* que te quieres desplazar adelante o atrás, mostrando en cada caso el nombre de la web.
* Las palabras "adelante", "atrás" desencadenan esta acción, el resto se interpreta como
* el nombre de una nueva web.
"""
class Web_Navigator(Stack):
def go(self,web):
return self.push(web)
def back(self):
try:
popped = (self.top())
except IndexError:
print("no hay sitios web almacenados")
else:
self.pop()
return self,popped
finally:
time.sleep(1)
print("\n")
def forward(self,popped:list):
if len(popped) == 1:
self.push(popped[0])
else:
self.push(popped[-1])
popped = popped.pop()
def show(self):
try:
print(f"Ahora estas en la web: {self.top()}")
except IndexError:
print("No hay más web almacenadas hacia atrás")
finally:
time.sleep(1)
print("\n")
def go_to_website(navigator,pop_list):
pop_list.clear()
website = input("Perfecto. Dime por favor la web a la que quieres navegar: ")
navigator.go(website)
navigator.show()
return navigator
def go_back(navigator,pop_list):
if navigator.size() != 0:
navigator,temp = navigator.back()
pop_list.append(temp)
navigator.show()
def go_forward(navigator,pop_list):
if len(pop_list)!= 0:
navigator.forward(pop_list)
navigator.show()
else:
print("No hay más webs en adelante")
time.sleep(1)
print("\n")
my_web_navigator = Web_Navigator()
my_popped_list = list()
import time
print("\n")
def web_navigation():
web_option = ""
while web_option != "4":
web_option = input("Elije una de las opciones:\n1. Navegar a un sitio web.\n2. Ir hacia adelante.\n3. Ir hacia atrás.\n4. Salir\n ---> ")
match web_option:
case "1":
go_to_website(my_web_navigator,my_popped_list)
case "2":
go_forward(my_web_navigator,my_popped_list)
case "3":
go_back(my_web_navigator,my_popped_list)
case "4":
break
case _:
print("La opción introducida no es correcta")
time.sleep(2)
print("\n")
print("Gracias por usar el sistema de navegación web")
print("\n")
web_navigation()
"""
* DIFICULTAD EXTRA (opcional):
* - Utilizando la implementación de cola y cadenas de texto, simula el mecanismo de una
* impresora compartida que recibe documentos y los imprime cuando así se le indica.
* La palabra "imprimir" imprime un elemento de la cola, el resto de palabras se
* interpretan como nombres de documentos.
"""
class Printer(Queue):
def send_doc(self,doc):
self.enqueue(doc)
print(f"El documento {doc} ha quedado encolado en la impresora")
time.sleep(1)
print("\n")
def print_doc(self):
try:
doc = self.front()
except IndexError:
print("No hay más documentos en la cola de impresión")
else:
self.dequeued()
print(f"El documento impreso es: {doc}")
finally:
time.sleep(1)
print("\n")
def pending_docs(self):
print("Los documentos que faltan por imprimit son: ")
self.show()
time.sleep(1)
print("\n")
def printer():
my_printer = Printer()
print_option = ""
while print_option != 4:
print_option = input ("Elije una de las cuatro opciones:\n1. Enviar documento a la impresora\n2. Imprimir documento\n3. Mostrar cola de impresión\n4. Salir\n----> ")
match print_option:
case "1":
document = input("Dame el nombre del documento: ")
my_printer.send_doc(document)
case "2":
my_printer.print_doc()
case "3":
my_printer.pending_docs()
case "4":
break
case _:
print("La opción elegida no es válida. Prueba de nuevo")
time.sleep(1)
print("\n")
print("Gracias por usar este sistema de impresión")
printer()