Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)

Okładka posta: Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Warunek dla zadania jest następujący. Stwórz funkcję valid_braces, która przyjmuje ciąg składający się tylko z nawiasów: ()[]{}.
 Funkcja powinna zwracać true, jeśli wszystkie nawiasy otwierają się i zamykają w poprawnej kolejności, lub false — jeśli nawiasy są źle ustawione.
Przykład wykonania metody:
valid_braces("()")         → true  
valid_braces("({[]})")     → true  
valid_braces("({[)]}")     → false  
valid_braces("(((()")      → false  
valid_braces("{[()]}[]")   → true

Jak działa sprawdzanie nawiasów?

To zadanie klasycznie rozwiązuje się za pomocą stosu — struktury danych, która działa na zasadzie „ostatni wszedł — pierwszy wyszedł”.
Idea polega na tym, aby dodawać nawiasy otwierające do stosu, a gdy natrafimy na nawias zamykający — sprawdzać, czy odpowiada on temu, który jest na szczycie stosu. Jeśli tak — usuwamy ze stosu; jeśli nie — ciąg jest nieprawidłowy.

Test (RSpec) dla sprawdzenia metody

RSpec.describe '#valid_braces' do
  it 'zwraca true dla poprawnych nawiasów' do
    expect(valid_braces('()')).to eq(true)
    expect(valid_braces('([])')).to eq(true)
    expect(valid_braces('{[()]}')).to eq(true)
    expect(valid_braces('{[()]}[]')).to eq(true)
  end

  it 'zwraca false dla niepoprawnych nawiasów' do
    expect(valid_braces('[(])')).to eq(false)
    expect(valid_braces('({[)]}')).to eq(false)
    expect(valid_braces('((')).to eq(false)
    expect(valid_braces(']')).to eq(false)
  end
end

Metoda valid_braces

def valid_braces(string)
  stack = []
  pairs = { ')' => '(', ']' => '[', '}' => '{' }

  string.each_char do |char|
    if pairs.values.include?(char)
      stack.push(char)
    elsif pairs.keys.include?(char)
      return false if stack.pop != pairs[char]
    end
  end

  stack.empty?
end

Zasada działania algorytmu

  1. Za każdym razem, gdy widzimy nawias otwierający — dodajemy go do stosu.
  2. Jeśli natrafimy na nawias zamykający — porównujemy go z ostatnim nawiasem otwierającym (ze szczytu stosu).
  3. Jeśli się zgadzają — kontynuujemy.
  4. Jeśli nie — od razu zwracamy false.
  5. Jeśli po przejściu ciągu stos jest pusty — wszystkie nawiasy zostały poprawnie zamknięte, więc zwracamy true.
To podejście można stosować do parzystych symboli dowolnego typu — nie tylko nawiasów. Doskonale nadaje się do sprawdzania poprawności zagnieżdżonych struktur, na przykład w parserach lub analizatorach HTML.

Ten post nie ma jeszcze żadnych dodatków od autora.

Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?
11 kwi 18:24

Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?

meme code
meme code@memecode
24 kwi 20:17

Naprawiamy minikube "Próbujesz uruchomić binarkę amd64 na systemie M1."

meme code
meme code@memecode
24 kwi 20:55

Instalujemy minikube na Macu z M1 (rezygnujemy z qemu, uruchamiamy na dockerze)

meme code
meme code@memecode
Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca
25 kwi 23:02

Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca

meme code
meme code@memecode
9 maj 19:27

[FIXED] nie można załadować takiego pliku -- html/pipeline (LoadError) występuje podczas rails generate thredded:install

meme code
meme code@memecode
Zadanie: Przekształcenie liczby rzymskiej na dziesiętną (Ruby)
20 maj 12:05

Zadanie: Przekształcenie liczby rzymskiej na dziesiętną (Ruby)

meme code
meme code@memecode
Jak znaleźć podtablicę o maksymalnej sumie (Maximum Subarray Sum) w Ruby
22 maj 11:01

Jak znaleźć podtablicę o maksymalnej sumie (Maximum Subarray Sum) w Ruby

meme code
meme code@memecode
Reklama w Google dla początkujących: Krok po kroku do udanego startu
28 maj 10:21

Reklama w Google dla początkujących: Krok po kroku do udanego startu

meme code
meme code@memecode
Czym jest jemalloc i jak ma się do Ruby / Ruby on Rails
30 maj 11:53

Czym jest jemalloc i jak ma się do Ruby / Ruby on Rails

meme code
meme code@memecode
5 cze 01:52

[Fixed] niezainicjowana stała ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

meme code
meme code@memecode
Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały
5 cze 18:23

Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały

meme code
meme code@memecode
Czym jest format HEIC i dlaczego proste zmienienie jego nazwy na .jpg to zły pomysł
15 cze 18:17

Czym jest format HEIC i dlaczego proste zmienienie jego nazwy na .jpg to zły pomysł

meme code
meme code@memecode