Apuntes DAM
Volver al inicio

Configurador de PC: compatibilidad, fuente y precio

Ejercicio de PythonMedioUnos 60 minutos

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

  1. La entrada son configuraciones separadas por una línea en blanco. Cada una empieza por CONFIG nombre y 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 escribe Componente desconocido: línea antes del informe y no se tiene en cuenta.
  2. El informe empieza por Configuración nombre y sigue con líneas [OK] texto o [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.
  3. 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 placa o Socket: 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 CPU o Gráfica: la CPU X no tiene gráfica integrada y no hay tarjeta gráfica.
  4. 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.
  5. Después: Memoria: G GB · Almacenamiento: A GB · Precio: P (precio con dos decimales, coma decimal, punto de miles y €) y Veredicto: compatible o Veredicto: 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

Procesadores (CPU)
CódigoSocketConsumoGráfica integradaPrecio
R5-7600AM565 Wsí229 €
R7-7800X3DAM5120 Wsí449 €
I5-14400FLGA170065 Wno199 €
I7-14700KLGA1700125 Wsí409 €
Placas base (PLACA)
CódigoSocketMemoriaFormatoRanuras RAMRanuras M.2Precio
B650M-AM5AM5DDR5mATX22159 €
X670E-AM5AM5DDR5ATX44299 €
B760-DDR4LGA1700DDR4ATX42139 €
Z790-ITXLGA1700DDR5ITX22249 €
Memoria (RAM), gráficas (GPU), fuentes, cajas y discos
CódigoDatosPrecio
DDR5-32DDR5, 2 × 16 GB109 €
DDR5-64DDR5, 2 × 32 GB199 €
DDR4-16DDR4, 2 × 8 GB45 €
DDR4-32DDR4, 2 × 16 GB79 €
RTX4060115 W, 240 mm309 €
RTX4070S220 W, 300 mm649 €
RX7900XT315 W, 330 mm799 €
FA550 / FA750 / FA1000550 / 750 / 1000 W69 / 99 / 169 €
ATX-Mcaja ATX, gráficas hasta 360 mm89 €
MATX-Ccaja mATX, hasta 310 mm69 €
ITX-Scaja ITX, hasta 280 mm99 €
NVME1 / NVME2M.2, 1000 / 2000 GB69 / 129 €
SATA1SATA, 1000 GB59 €

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.

python
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.

🐍PythonConfigurador de PC: compatibilidad, fuente y precioMedio

Ejemplo

Entrada (lo que se escribe por teclado)
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 esperada
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
⏳
Test oculto #3
⏳
Test oculto #4
0/4 tests pasados · pulsa un test para ver su entrada y su salida esperada

Solución explicada

Ver la solución completa
python
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.

Dónde se explica