Configurador de PC: compatibilidad, fuente y precio
Comprueba si las piezas de un ordenador encajan: socket, tipo y número de módulos de memoria, ranuras M.2, formato de placa y caja, longitud de la gráfica, gráfica integrada y una fuente con margen; y calcula memoria, almacenamiento y precio. Diccionarios, tuplas y reglas.
- Socket y chipset
- DDR4 y DDR5
- Factores de forma ATX, mATX, ITX
- Cálculo de la fuente con margen
- Diccionarios de tuplas
- Validación por reglas
Enunciado
Antes de comprar las piezas de un ordenador hay que comprobar que encajan: una CPU AM5 no entra en una placa LGA1700, una placa DDR5 no admite memoria DDR4, una placa ATX no cabe en una caja ITX y una gráfica de 330 mm no entra en una caja que admite 280 mm. Y la fuente tiene que dar la potencia que piden la CPU y la gráfica con un margen, porque una fuente al límite se calienta, hace ruido y dura menos.
La tienda tiene este catálogo (está en el código de partida como diccionarios):
Qué tiene que hacer el programa
- La entrada son configuraciones separadas por una línea en blanco. Cada una empieza por
CONFIG nombrey sigue con una pieza por línea:TIPO código(CPU, PLACA, RAM, GPU, FUENTE, CAJA o DISCO; puede haber varios RAM y varios DISCO). Lo que no esté en el catálogo escribeComponente desconocido: líneaantes del informe y no se tiene en cuenta. - El informe empieza por
Configuración nombrey sigue con líneas[OK] textoo[ERROR] texto, en este orden: falta CPU, PLACA, RAM, FUENTE, CAJA o DISCO (Falta la cpu… con el texto de la regla 3); más de una CPU, PLACA, FUENTE, CAJA o GPU; socket; tipo de cada kit de memoria (solo si no coincide); ranuras de memoria; ranuras M.2 (si hay discos M.2); tamaño de placa y caja; longitud de la gráfica (si hay gráfica); gráfica integrada (si no hay gráfica); fuente. - Textos:
Falta la CPU,Falta la placa,Falta la ram,Falta la fuente,Falta la caja,Falta el disco;Solo puede haber un componente de tipo T;Socket: AM5 en la CPU y en la placaoSocket: la CPU es A y la placa B;Memoria: la placa usa DDR5 y el kit X es DDR4;Ranuras de memoria: M módulos para R ranuras;M.2: N de R ranuras;Tamaño: placa mATX en caja ATX(una caja ATX admite ATX, mATX e ITX; una mATX, mATX e ITX; una ITX, solo ITX);Gráfica: L mm en una caja de hasta M mm;Gráfica: se usa la integrada de la CPUoGráfica: la CPU X no tiene gráfica integrada y no hay tarjeta gráfica. - Fuente: el consumo estimado es CPU + gráfica + 75 W del resto del equipo, y lo recomendado es ese consumo × 1,3 redondeado.
Fuente: W W, consumo estimado C W (recomendado R W con un 30 % de margen), correcto si la fuente da al menos lo recomendado. - Después:
Memoria: G GB · Almacenamiento: A GB · Precio: P(precio con dos decimales, coma decimal, punto de miles y€) yVeredicto: compatibleoVeredicto: N problema(s)(el número de líneas de error).
Entrada
Configuraciones separadas por una línea en blanco.
Cada una: CONFIG nombre y una pieza por línea, TIPO código.
Datos de referencia
| Código | Socket | Consumo | Gráfica integrada | Precio |
|---|---|---|---|---|
| R5-7600 | AM5 | 65 W | sí | 229 € |
| R7-7800X3D | AM5 | 120 W | sí | 449 € |
| I5-14400F | LGA1700 | 65 W | no | 199 € |
| I7-14700K | LGA1700 | 125 W | sí | 409 € |
| Código | Socket | Memoria | Formato | Ranuras RAM | Ranuras M.2 | Precio |
|---|---|---|---|---|---|---|
| B650M-AM5 | AM5 | DDR5 | mATX | 2 | 2 | 159 € |
| X670E-AM5 | AM5 | DDR5 | ATX | 4 | 4 | 299 € |
| B760-DDR4 | LGA1700 | DDR4 | ATX | 4 | 2 | 139 € |
| Z790-ITX | LGA1700 | DDR5 | ITX | 2 | 2 | 249 € |
| Código | Datos | Precio |
|---|---|---|
| DDR5-32 | DDR5, 2 × 16 GB | 109 € |
| DDR5-64 | DDR5, 2 × 32 GB | 199 € |
| DDR4-16 | DDR4, 2 × 8 GB | 45 € |
| DDR4-32 | DDR4, 2 × 16 GB | 79 € |
| RTX4060 | 115 W, 240 mm | 309 € |
| RTX4070S | 220 W, 300 mm | 649 € |
| RX7900XT | 315 W, 330 mm | 799 € |
| FA550 / FA750 / FA1000 | 550 / 750 / 1000 W | 69 / 99 / 169 € |
| ATX-M | caja ATX, gráficas hasta 360 mm | 89 € |
| MATX-C | caja mATX, hasta 310 mm | 69 € |
| ITX-S | caja ITX, hasta 280 mm | 99 € |
| NVME1 / NVME2 | M.2, 1000 / 2000 GB | 69 / 129 € |
| SATA1 | SATA, 1000 GB | 59 € |
Ejemplos de ejecución
Tu programa debe escribir exactamente esta salida para estas entradas. Las pruebas del editor incluyen estos ejemplos y otros casos ocultos.
Una configuración buena y una sin gráfica
Entrada
CONFIG Gaming CPU R7-7800X3D PLACA B650M-AM5 RAM DDR5-32 GPU RTX4070S FUENTE FA750 CAJA ATX-M DISCO NVME2 CONFIG Oficina barata CPU I5-14400F PLACA B760-DDR4 RAM DDR4-16 FUENTE FA550 CAJA MATX-C DISCO SATA1
Salida por consola
Configuración Gaming [OK] Socket: AM5 en la CPU y en la placa [OK] Ranuras de memoria: 2 módulos para 2 ranuras [OK] M.2: 1 de 2 ranuras [OK] Tamaño: placa mATX en caja ATX [OK] Gráfica: 300 mm en una caja de hasta 360 mm [OK] Fuente: 750 W, consumo estimado 415 W (recomendado 540 W con un 30 % de margen) Memoria: 32 GB · Almacenamiento: 2000 GB · Precio: 1.683,00 € Veredicto: compatible Configuración Oficina barata [OK] Socket: LGA1700 en la CPU y en la placa [OK] Ranuras de memoria: 2 módulos para 4 ranuras [ERROR] Tamaño: placa ATX en caja mATX [ERROR] Gráfica: la CPU I5-14400F no tiene gráfica integrada y no hay tarjeta gráfica [OK] Fuente: 550 W, consumo estimado 140 W (recomendado 182 W con un 30 % de margen) Memoria: 16 GB · Almacenamiento: 1000 GB · Precio: 580,00 € Veredicto: 2 problemas
Muchos problemas a la vez
Entrada
CONFIG Errores CPU R5-7600 PLACA Z790-ITX RAM DDR4-32 RAM DDR5-32 GPU RX7900XT FUENTE FA550 CAJA ITX-S DISCO NVME1 DISCO NVME2 DISCO NVME1 MONITOR LG27
Salida por consola
Componente desconocido: MONITOR LG27 Configuración Errores [ERROR] Socket: la CPU es AM5 y la placa LGA1700 [ERROR] Memoria: la placa usa DDR5 y el kit DDR4-32 es DDR4 [ERROR] Ranuras de memoria: 4 módulos para 2 ranuras [ERROR] M.2: 3 de 2 ranuras [OK] Tamaño: placa ITX en caja ITX [ERROR] Gráfica: 330 mm en una caja de hasta 280 mm [ERROR] Fuente: 550 W, consumo estimado 455 W (recomendado 592 W con un 30 % de margen) Memoria: 64 GB · Almacenamiento: 4000 GB · Precio: 1.900,00 € Veredicto: 6 problemas
Guía paso a paso
Intenta resolverlo por tu cuenta y abre un paso solo cuando te atasques: cada uno te acerca a la solución sin dártela entera.
1. Agrupa las piezas por tipo
Para cada configuración crea un diccionario tipo → lista de códigos: así sabes si falta algo (lista vacía), si sobra (más de uno) y puedes recorrer los kits de RAM y los discos.
2. Una función para cada línea
Una función interna linea(ok, texto) que escribe [OK] o [ERROR] y cuenta los errores te ahorra repetir el formato en cada regla.
def linea(ok, texto):
nonlocal problemas
if not ok:
problemas += 1
print(f" [{'OK' if ok else 'ERROR'}] {texto}")3. Las reglas, en orden
Socket, memoria, ranuras, tamaño, gráfica y fuente. Cada una solo se comprueba si están las piezas que necesita (sin placa no hay ranuras que contar).
4. Precio y formato
El precio es el último elemento de cada tupla del catálogo. Para el punto de miles, separa la parte entera en grupos de tres desde la derecha.
Resuélvelo aquí
El editor trae el esqueleto del programa. Pulsa «Ejecutar» para comprobarlo con los ejemplos y con 2 casos ocultos que buscan los errores típicos.
Ejemplo
CONFIG Gaming CPU R7-7800X3D PLACA B650M-AM5 RAM DDR5-32 GPU RTX4070S FUENTE FA750 CAJA ATX-M DISCO NVME2 CONFIG Oficina barata CPU I5-14400F PLACA B760-DDR4 RAM DDR4-16 FUENTE FA550 CAJA MATX-C DISCO SATA1
Configuración Gaming [OK] Socket: AM5 en la CPU y en la placa [OK] Ranuras de memoria: 2 módulos para 2 ranuras [OK] M.2: 1 de 2 ranuras [OK] Tamaño: placa mATX en caja ATX [OK] Gráfica: 300 mm en una caja de hasta 360 mm [OK] Fuente: 750 W, consumo estimado 415 W (recomendado 540 W con un 30 % de margen) Memoria: 32 GB · Almacenamiento: 2000 GB · Precio: 1.683,00 € Veredicto: compatible Configuración Oficina barata [OK] Socket: LGA1700 en la CPU y en la placa [OK] Ranuras de memoria: 2 módulos para 4 ranuras [ERROR] Tamaño: placa ATX en caja mATX [ERROR] Gráfica: la CPU I5-14400F no tiene gráfica integrada y no hay tarjeta gráfica [OK] Fuente: 550 W, consumo estimado 140 W (recomendado 182 W con un 30 % de margen) Memoria: 16 GB · Almacenamiento: 1000 GB · Precio: 580,00 € Veredicto: 2 problemas
Solución explicada
Ver la solución completa
1import sys
2
3# código: (socket, vatios, tiene gráfica integrada, precio)
4CPU = {
5 "R5-7600": ("AM5", 65, True, 229.0), "R7-7800X3D": ("AM5", 120, True, 449.0),
6 "I5-14400F": ("LGA1700", 65, False, 199.0), "I7-14700K": ("LGA1700", 125, True, 409.0),
7}
8# código: (socket, memoria, formato, ranuras de memoria, ranuras M.2, precio)
9PLACA = {
10 "B650M-AM5": ("AM5", "DDR5", "mATX", 2, 2, 159.0), "X670E-AM5": ("AM5", "DDR5", "ATX", 4, 4, 299.0),
11 "B760-DDR4": ("LGA1700", "DDR4", "ATX", 4, 2, 139.0), "Z790-ITX": ("LGA1700", "DDR5", "ITX", 2, 2, 249.0),
12}
13# código: (tipo, módulos, GB por módulo, precio)
14RAM = {"DDR5-32": ("DDR5", 2, 16, 109.0), "DDR5-64": ("DDR5", 2, 32, 199.0), "DDR4-16": ("DDR4", 2, 8, 45.0), "DDR4-32": ("DDR4", 2, 16, 79.0)}
15# código: (vatios, longitud en mm, precio)
16GPU = {"RTX4060": (115, 240, 309.0), "RTX4070S": (220, 300, 649.0), "RX7900XT": (315, 330, 799.0)}
17FUENTE = {"FA550": (550, 69.0), "FA750": (750, 99.0), "FA1000": (1000, 169.0)}
18# código: (formato, longitud máxima de gráfica, precio)
19CAJA = {"ATX-M": ("ATX", 360, 89.0), "MATX-C": ("mATX", 310, 69.0), "ITX-S": ("ITX", 280, 99.0)}
20# código: (interfaz, capacidad en GB, precio)
21DISCO = {"NVME1": ("M.2", 1000, 69.0), "NVME2": ("M.2", 2000, 129.0), "SATA1": ("SATA", 1000, 59.0)}
22CABE = {"ATX": ["ATX", "mATX", "ITX"], "mATX": ["mATX", "ITX"], "ITX": ["ITX"]}
23CATALOGO = {"CPU": CPU, "PLACA": PLACA, "RAM": RAM, "GPU": GPU, "FUENTE": FUENTE, "CAJA": CAJA, "DISCO": DISCO}
24
25
26def euros(x):
27 entero, dec = f"{x:.2f}".split(".")
28 grupos = []
29 while len(entero) > 3:
30 grupos.insert(0, entero[-3:])
31 entero = entero[:-3]
32 grupos.insert(0, entero)
33 return ".".join(grupos) + "," + dec + " €"
34
35
36def revisar(nombre, piezas):
37 print(f"Configuración {nombre}")
38 problemas = 0
39
40 def linea(ok, texto):
41 nonlocal problemas
42 if not ok:
43 problemas += 1
44 print(f" [{'OK' if ok else 'ERROR'}] {texto}")
45
46 for tipo in ["CPU", "PLACA", "RAM", "FUENTE", "CAJA", "DISCO"]:
47 if not piezas[tipo]:
48 linea(False, f"Falta {'la' if tipo in ('CPU', 'PLACA', 'RAM', 'FUENTE', 'CAJA') else 'el'} {tipo.lower() if tipo != 'CPU' else 'CPU'}")
49 for tipo in ["CPU", "PLACA", "FUENTE", "CAJA", "GPU"]:
50 if len(piezas[tipo]) > 1:
51 linea(False, f"Solo puede haber un componente de tipo {tipo}")
52 cpu = CPU[piezas["CPU"][0]] if piezas["CPU"] else None
53 placa = PLACA[piezas["PLACA"][0]] if piezas["PLACA"] else None
54 caja = CAJA[piezas["CAJA"][0]] if piezas["CAJA"] else None
55 gpu = GPU[piezas["GPU"][0]] if piezas["GPU"] else None
56 fuente = FUENTE[piezas["FUENTE"][0]] if piezas["FUENTE"] else None
57 if cpu and placa:
58 linea(cpu[0] == placa[0], f"Socket: la CPU es {cpu[0]} y la placa {placa[0]}" if cpu[0] != placa[0] else f"Socket: {cpu[0]} en la CPU y en la placa")
59 if placa:
60 for codigo in piezas["RAM"]:
61 if RAM[codigo][0] != placa[1]:
62 linea(False, f"Memoria: la placa usa {placa[1]} y el kit {codigo} es {RAM[codigo][0]}")
63 modulos = sum(RAM[c][1] for c in piezas["RAM"])
64 if piezas["RAM"]:
65 linea(modulos <= placa[3], f"Ranuras de memoria: {modulos} módulos para {placa[3]} ranuras")
66 m2 = sum(1 for c in piezas["DISCO"] if DISCO[c][0] == "M.2")
67 if m2:
68 linea(m2 <= placa[4], f"M.2: {m2} de {placa[4]} ranuras")
69 if placa and caja:
70 linea(placa[2] in CABE[caja[0]], f"Tamaño: placa {placa[2]} en caja {caja[0]}")
71 if gpu and caja:
72 linea(gpu[1] <= caja[1], f"Gráfica: {gpu[1]} mm en una caja de hasta {caja[1]} mm")
73 if cpu and not gpu:
74 linea(cpu[2], "Gráfica: se usa la integrada de la CPU" if cpu[2] else f"Gráfica: la CPU {piezas['CPU'][0]} no tiene gráfica integrada y no hay tarjeta gráfica")
75 if cpu and fuente:
76 consumo = cpu[1] + (gpu[0] if gpu else 0) + 75
77 recomendado = round(consumo * 1.3)
78 linea(fuente[0] >= recomendado, f"Fuente: {fuente[0]} W, consumo estimado {consumo} W (recomendado {recomendado} W con un 30 % de margen)")
79 precio = sum(CATALOGO[t][c][-1] for t, codigos in piezas.items() for c in codigos)
80 memoria = sum(RAM[c][1] * RAM[c][2] for c in piezas["RAM"])
81 almacenamiento = sum(DISCO[c][1] for c in piezas["DISCO"])
82 print(f" Memoria: {memoria} GB · Almacenamiento: {almacenamiento} GB · Precio: {euros(precio)}")
83 print(f" Veredicto: {'compatible' if problemas == 0 else str(problemas) + (' problema' if problemas == 1 else ' problemas')}")
84
85
86def main():
87 bloques = sys.stdin.read().strip().split("\n\n")
88 for bloque in bloques:
89 lineas = [l.strip() for l in bloque.split("\n") if l.strip()]
90 if not lineas:
91 continue
92 nombre = lineas[0][7:].strip() if lineas[0].upper().startswith("CONFIG ") else "sin nombre"
93 piezas = {t: [] for t in CATALOGO}
94 desconocidas = []
95 for l in lineas[1:] if lineas[0].upper().startswith("CONFIG ") else lineas:
96 partes = l.split()
97 tipo = partes[0].upper()
98 codigo = partes[1].upper() if len(partes) > 1 else ""
99 if len(partes) != 2 or tipo not in CATALOGO or codigo not in CATALOGO[tipo]:
100 desconocidas.append(l)
101 else:
102 piezas[tipo].append(codigo)
103 for d in desconocidas:
104 print(f"Componente desconocido: {d}")
105 revisar(nombre, piezas)
106
107
108main()El socket físico y el tipo de memoria son las dos incompatibilidades que no tienen arreglo: una DDR4 ni siquiera entra en una ranura DDR5 (la muesca está en otro sitio).
Los formatos se encajan de mayor a menor: una caja ATX tiene los anclajes de las placas más pequeñas, pero una caja pequeña no puede alojar una placa más grande.
La fuente se dimensiona con margen (aquí un 30 %) porque el consumo real tiene picos por encima del nominal y porque las fuentes son más eficientes y silenciosas lejos de su máximo.
Los procesadores con sufijo F de Intel no tienen gráfica integrada: sin una tarjeta gráfica no hay imagen, un error de compra muy común.
Para ir más allá
- Añade la altura máxima del disipador de la caja y el disipador como pieza.
- Propón la fuente más barata que cumpla cuando la elegida no llegue.
- Lee el catálogo de un CSV en lugar de tenerlo en el código.