Advertisement
dzooli

Python beginner and advanced

Jun 6th, 2025
472
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.80 KB | Source Code | 0 0
  1. def find_lowest_valley(terrain):
  2.     """
  3.    Megkeresi a legalacsonyabb „völgyet” a 2D-s térképen.
  4.    A térkép egy numerikus értékeket tartalmazó listák listája (pl. [[5,3,4],[6,2,7],[8,9,1]]).
  5.    Völgynek tekintünk egy cellát, ha minden létező (fel, le, balra, jobbra) szomszédja magasabb nála.
  6.  
  7.    Visszatérési érték:
  8.      - Ha van legalább egy völgy, akkor egy tuple (i, j, érték), ahol (i,j) a koordináta,
  9.        és érték a cella magassága.
  10.      - Ha nincs egyetlen völgy sem, akkor None.
  11.    """
  12.  
  13.     if not terrain or not terrain[0]:
  14.         return None
  15.  
  16.     rows = len(terrain)
  17.     cols = len(terrain[0])
  18.  
  19.     directions = [(-1,0), (1,0), (0,-1), (0,1)]
  20.  
  21.     lowest_valley = None  # Ebbe fogjuk menteni a (i, j, magasság) hármasokat
  22.     lowest_value = None   # A legalacsonyabb völgy magassága
  23.  
  24.     for i in range(rows):
  25.         for j in range(cols):
  26.             current = terrain[i][j]
  27.             is_valley = True   # Kezdetben feltételezzük, hogy völgy
  28.  
  29.             for di, dj in directions:
  30.                 ni = i + di
  31.                 nj = j + dj
  32.  
  33.                 if 0 <= ni < rows and 0 <= nj < cols:
  34.                     if terrain[ni][nj] <= current:
  35.                         is_valley = False
  36.                         break
  37.  
  38.             if is_valley:
  39.                 if lowest_valley is None or current < lowest_value:
  40.                     lowest_valley = (i, j, current)
  41.                     lowest_value = current
  42.  
  43.     return lowest_valley
  44.  
  45. # ------------------------------------------------------------------------------------
  46.  
  47. import numpy as np
  48. from typing import NamedTuple, Optional
  49.  
  50. class Valley(NamedTuple):
  51.     row: int
  52.     col: int
  53.     elevation: float
  54.  
  55. def find_lowest_valley(terrain: np.ndarray) -> Optional[Valley]:
  56.     """
  57.    Megkeresi a legalacsonyabb völgyet egy 2D-s NumPy-tömbben.
  58.    Völgy: a cella értéke szigorúan kisebb a négyirányú szomszédainál.
  59.    """
  60.     arr = np.asarray(terrain, dtype=float)
  61.     if arr.ndim != 2:
  62.         raise ValueError(f"A bemenetnek kétdimenziós tömbnek kell lennie (ndim={arr.ndim}).")
  63.     rows, cols = arr.shape
  64.     if rows == 0 or cols == 0:
  65.         raise ValueError("A tömb nem lehet üres (legalább 1×1).")
  66.  
  67.     padded = np.pad(arr, pad_width=1, mode='constant', constant_values=np.inf)
  68.  
  69.     up    = padded[0:rows,     1:cols+1]
  70.     down  = padded[2:rows+2,   1:cols+1]
  71.     left  = padded[1:rows+1,   0:cols]
  72.     right = padded[1:rows+1,   2:cols+2]
  73.  
  74.     mask = (arr < up) & (arr < down) & (arr < left) & (arr < right)
  75.     if not np.any(mask):
  76.         return None
  77.  
  78.     min_elev = float(np.min(arr[mask]))
  79.     coords  = np.argwhere(mask & (arr == min_elev))
  80.     i_min, j_min = coords[0]
  81.  
  82.     return Valley(row=i_min, col=j_min, elevation=min_elev)
  83.  
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement