Zadanie Figury

0

Witam,
czy ktoś wie co trzeba zmienić w tym zadaniu, by program został zaliczony przez strone?
Jaś narysował w zeszycie figury: koła, kwadraty i trójkąty. Wszystkie w linii prostej. Po narysowaniu
pożyczył zeszyt koleżance z ławki - Małgosi.

n = int(input())
f = input().split()
if {'0', '1', '2'} == set(f):
print('TAK')
else:
print('NIE')

Małgosia próbuje znaleźć 3 różne figury (koło, kwadrat i trójkąt) położone obok siebie w dowolnej kolejności. Stwierdź, czy Małgosi uda się znaleźć obok siebie takie 3 różne figury.
Wejście
Pierwszy wiersz standardowego wejścia zawiera jedną liczbę całkowitą ( ), oznaczającą liczbę
figur, które narysował Jaś.
Drugi wiersz wejścia opisuje figury w zeszycie Jasia i zawiera liczb całkowitych ( ),
gdzie oznacza -tą w kolejności figurę: 0 - oznacza koło, 1 - kwadrat, 2 - trójkat.
Wyjście
Pierwszy i jedyny wiersz stanardowego wyjścia powinien zawierać jedno słowo TAK, jeśli Małgosi uda się
znaleźć 3 różne figury położone obok siebie, lub NIE, w przeciwnym przypadku.
Przykład
Dla danych wejściowych:
7
2 2 1 2 1 0 1
poprawną odpowiedzią jest:
TAK

0

W zadaniu jest „narysować koło siebie”, Ty zaś sprawdzasz, czy w ogóle będą narysowane wszystkie trzy. W szczególności, Ty zwracasz TAK dla danych wejściowych 2 2 2 1 1 1 0 0 0, chociaż nigdzie koło siebie nie występują trzy różne figury.

0
Althorion napisał(a):

W zadaniu jest „narysować koło siebie”, Ty zaś sprawdzasz, czy w ogóle będą narysowane wszystkie trzy. W szczególności, Ty zwracasz TAK dla danych wejściowych 2 2 2 1 1 1 0 0 0, chociaż nigdzie koło siebie nie występują trzy różne figury.

a jak proponujesz rozwiązać to zadanie?

0

Najbardziej „na pałę” będzie sprawdzić, czy występuje w wejściu podciąg 012, 021, 102, 120, 201 lub 210: przyjąć wejście, wywalić białe znaki (split), skleić z powrotem do stringa (join), sprawdzić należenie (in). Da się to odczuwalnie zoptymalizować, jeśli będzie taka potrzeba (lekko zmodyfikowany algorytm Aho-Corasick).

0

A nie prościej

def sprawdz(ile, figury):
    figury =figury.split()
    for i in range(ile - 2):
        if figury[i] !=  figury[i+1]:
            if figury[i] != figury[i+2]:
                if figury[i+1] != figury[i+2]:
                    return "Tak"
    return"Nie"


def wczytaj():
    ile = int(input)
    figury = input()


print(sprawdz(7,"2 2 1 1 1 0 1 "))
print(sprawdz(7,"2 2 1 1 2 0 1 "))
0

Taki tam jednolinijkowiec:

def sprawdz(figs):
    return bool([True for i,v in enumerate(figs[:-2]) if len(set(figs[i:i+3]))==3])

sprawdz("2 2 1 2 1 0 1".split())
sprawdz("2 2 1 1 1 0 1".split())
sprawdz("2 2 1 1 2 0 1".split())
  1. enumerate(figs[:-2]) zwróci krotki z indeksem bez dwóch ostatnich elementów tablicy
  2. set(figs[i:i+3]) stworzy set z trzech elementów, a len będzie 3 gdy wystąpi 0, 1 i 2 w dowolnej kolejności
  3. gdy trzy elementy są różne to do tablicy wstawiamy True ale może być cokolwiek
  4. bool z tablicy nie pustej zwróci True
0

Splity i slajsy są niepotrzebne. Wystarczy jedno przejście w O(1) space.

jvoytech napisał(a):
    return bool([True for i,v in enumerate(figs[:-2]) if len(set(figs[i:i+3]))==3])
    return any(len(set(figs[i:i+3]))==3 for i in range(len(figs)-2))

1 użytkowników online, w tym zalogowanych: 0, gości: 1