Podczas pisania określonego zadania natykamy się na szereg pytań i pojedynczych zagadnień, które musimy wdrożyć by całość składała się w jedną funkcjonalność. Te pojedyncze zagadnienia mogą zainspirować nas lub innych do napisania krótkich zadań. Tak też było tym razem.
Pisząc jeden kod w py zadałam pytanie mojemu facetowi - jak rozwiązać jeden problem. Chodziło o odejmowanie poszczególnych liczb z kilku tablic po wskazanym indeksie. Już tłumaczę o co chodzi na przykładzie - przykłady zawsze bardziej przemawiają
1
2
3
4
5
6
7
a = [1, 2, 3, 4, 5] # jedna tablica zawierającą liczby
b = [1, 2, 3, 4] # druga tablica zawierającą liczby
indekses = [1, 3] # indeksy, które wskazują, na których liczbach mamy
# konkretnie wykonać dane działanie matematyczne
# OUTPUT => 2 - 2 = 0 i 4 - 4 = 0
A, że chłop jest w py
lepszy, moje pytanie było zasadne. Niestety, nie otrzymałam odpowiedzi - za to zainspirowałam go do napisania clusha (czyli 15minutowego zadania na codingames jakie należy rozwiązać).
Swój problem rozwiązałam i też postanowiłam napisać clush’a, który ściśle będzie odpowiadał zagadnieniu o jakie pytałam. Po rozwiązaniu, wydało mi się to bardzo proste i banalne. Jak się okazuje niekoniecznie. Podobno rozwiązanie tego zadania w 15 minut, to mało - takie komentarze otrzymałąm pod zgłoszonym zadaniem do moderacji. Tyle, że ja znalazłam rozwiązanie właśnie w takim czasie
Poniżej kod w py
, który następnie będę tłumaczyć:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
idx = [1, 2, 4, 5] # indeksy na których mamy wykonać odejmowanie
a = [
[1, 1, 1],
[1, 1, 2],
[1, 1, 2],
[5, 1, 2],
[1, 5, 2],
[1, -5, 2]
] # nasza tablica z liczbami
# kod
if (
# jeśli są wskazane co najmniej dwa indeksy, co odpowiada dwóm liczbom
len(idx)>1 and
# jeśli podtablice tablicy a są tej samej długości
(len(set([*map(lambda x: len(x), a)])) == 1 ) and
# jeśli wszystkie indeksy znajdują się w tablicy
False not in [*map(lambda x: x < len(a), idx)]
):
# i tutaj zaczynają się czary :
print(*(i[0] - sum(i[1:]) for i in zip(*([a[c] for c, d in zip(idx, idx)]))))
else:
print("Invalid")
# OUTPUT: -2, 0 -4
Omówię jedynie “czary mary” w stylu pythona
Jak zazwyczaj w py
zaczynamy od końca:
c, d in zip(idx, idx)
- ponieważ potrzebujemy pierwszy i kolejny indeks z idx
zip(*([a[c] for c, d in zip(idx, idx)])
=> (1, 1, 1, 1) (1, 1, 5, -5) (2, 2, 2, 2)
W pierwszym “nawiasie” ()
mamy liczby wskazane poprzez indeks na pozycji zero, w przypadku przykładu jest to 1
Adekwatnie w drugim i trzecim