Powinieneś napisać program lub funkcję, która otrzymuje listę różnych liczb całkowitych jako dane wejściowe i wyjściowe lub zwraca liczbę wystąpień liczb wejściowych w poniższej piramidzie liczb odwróconych.
Zaczynając od oryginalnej listy w każdym kroku, tworzymy nową z maksymalnymi wartościami każdej pary sąsiednich liczb (np. 5 1 2 6
Staje się 5 2 6
). Zatrzymujemy się, gdy na liście jest tylko jeden numer.
Pełna piramida dla 5 1 2 6
jest
5 1 2 6
5 2 6
5 6
6
Wynikowa liczba wystąpień to 3 1 2 4
( 5 1 2 6
odpowiednio).
Wejście
- Lista jednej lub więcej liczb całkowitych bez powtórzeń. (np.
1 5 1 6
jest nieprawidłowy.)
Wynik
- Lista liczb całkowitych dodatnich. Ten
i
element listy to liczba wystąpieńi
th liczby wejściowej w piramidzie.
Przykłady
Dane wejściowe => Dane wyjściowe
-5 => 1
8 4 => 2 1
5 9 7 => 1 4 1
1 2 3 9 8 6 7 => 1 2 3 16 3 1 2
6 4 2 1 3 5 => 6 4 2 1 3 5
5 2 9 1 6 0 => 2 1 12 1 4 1
120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9
68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12
To jest golf golfowy, więc wygrywa najkrótszy wpis.
Bonusowa łamigłówka: czy potrafisz rozwiązać problem na O(n*log n)
czas?
Odpowiedzi:
Pyth,
1917 bajtówSprawdź demonstrację online lub pełny pakiet testowy (pierwsze 4 bajty iterują przykłady).
Ten jest nieco mądrzejszy niż naiwne podejście. Każda liczba trójkąta może być reprezentowana jako maksymalna wartość podłączonego podzbioru
Q
. W pierwszym wierszu używa podzbiorów o długości 1, druga linia trójkąta używa podzbiorów o długości 2, ...Wyjaśnienie
Aby to trochę zobrazować.
m.:QhdUQ
a dane wejściowe[5, 1, 2, 6]
dają mi wszystkie możliwe podzbiory:I
mmeSk.:QhdUQ
daje mi każdą z ich maksimów (które dokładnie odpowiadają rzędom w piramidzie):Pyth,
2322 bajtówTo tylko proste podejście „rób, co ci powiedziano”.
Sprawdź demonstrację online lub pełny pakiet testowy (pierwsze 4 bajty iterują przykłady).
Wyjaśnienie
meSd.:G2
odwzorowuje każdą parę[(G[0], G[1]), (G[1], G[2]), ...]
na maksymalny element.Y
jest pustą listą, dlategoaYG
dołączaG
się doY
.u...QQ
wielokrotnie stosuje te dwie funkcje (len(Q)
czasy), rozpoczynając odG = Q
i aktualizującG
po każdym uruchomieniu.m/sYdQ
mapuje każdy element listy danych wejściowych na ich liczbę na spłaszczonejY
liście.źródło
Python, 81
Rozwiązanie typu „dziel i rządź”. Maksymalny element
M
przesiewa całą piramidę, dzieląc ją na prostokątM
i dwie podpiramidy.Tak więc ogólny wynik to wynik dla lewej podlisty, następnie obszar prostokąta, a następnie wynik dla prawej podlisty.
Zmienna wejściowa
L
jest ponownie wykorzystywana do przechowywania wyniku, dzięki czemu pusta lista jest mapowana na pustą listę.Konstrukty w rozwiązaniu są uciążliwe w Pythonie. Może jakiś język z dopasowaniem wzorca może implementować następujący pseudokod?
źródło
f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
CJam,
2322 bajtówWciąż szukam opcji golfowych.
To jest funkcja CJam (w pewnym sensie). Oczekuje to liczb wejściowych na stosie i zwraca odpowiednie liczby wyjściowe również na stosie. Przykład:
pozostawia
na stosie.
Jestem całkiem pewien, że tego nie ma
O(n log n)
czas.Rozszerzenie kodu :
Przyjrzyjmy się, jak to działa, opracowując przykład
5 1 2 6
W drugim rzędzie
5 1 2 6
staje się,5 2 6
ponieważ5, 2 and 6
są odpowiednio maksimum[5 1], [1 2] and [2 6]
. W trzecim rzędzie staje się,5 6
ponieważ5 and 6
są[5 2] and [2 6]
odpowiednio maksimum . Można to również zapisać odpowiednio jako maksimum[5 1 2] and [1 2 6]
. Podobnie dla ostatniego wiersza6
jest maksymalnie[5 1 2 6]
.Zasadniczo tworzymy wycinki o odpowiedniej długości, zaczynając od wycinka długości
1
, który jest zasadniczo pierwotnymi liczbami, z których każda jest owinięta w tablicę, aż do wycinka długościN
dla ostatniego rzędu, gdzieN
jest liczba liczb całkowitych wejściowych.Wypróbuj online tutaj
źródło
Mathematica, 72 bajty
źródło
Python, 81
Każde wejście piramidy stanowi maksimum podlisty na jej stożku skierowanym w górę. Generujemy więc wszystkie te listy podrzędne, indeksowane według przedziałów
[i,j]
z0 < i < j <= len(L)
, i policzyć ile pojawi każdy element jako maksymalny czas.Krótszy sposób wyliczenia podprzedziałów prawdopodobnie uratowałby znaki. Parametryzacja par z jednym indeksem
[i,j]
byłaby prawdopodobnym podejściem.źródło
Pip , 56 + 1 = 57 bajtów
Obawiam się, że nie konkuruję dużo z voodoo CJam. Wygląda na to, że potrzebuję lepszego algorytmu. Uruchom z
-s
flagą, aby uzyskać wynik rozdzielany spacjami.Niegolfowany, z komentarzami:
Ponowne zdefiniowanie za
r
każdym razem poprzez działa w następujący sposób:źródło
APL (24)
Jest to funkcja, która pobiera taką listę;
Wyjaśnienie:
{
...}⍵
: zastosuj następującą funkcję do ⍵:⍵≡⍬:⍵
: jeśli ⍵ jest puste, zwróć ⍵2⌈/⍵
: wygeneruj następną listę⍵,∇
: return ⍵, a następnie wynik zastosowania tej funkcji do następnej listy⍵∘.=
: porównaj każdy element w ⍵ z każdym elementem w wyniku funkcji+/
: zsumuj wiersze (reprezentujące elementy w ⍵)źródło
Haskell, 78 bajtów
Zastosowanie:
f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]
->[2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]
.Jak to działa
źródło
JavaScript, 109 bajtów
Myślę, że znalazłem ciekawy sposób, aby to zrobić, ale dopiero po tym, jak skończyłem, zorientowałem się, że kod jest zbyt długi, aby konkurować. No cóż, i tak to opublikuję, na wypadek, gdyby ktoś zobaczył dalszy potencjał golfa.
Korzystam z następującej formuły tutaj:
W ten sposób nie trzeba generować całej piramidy ani jej podzbiorów. (Dlatego początkowo myślałem, że będzie działać w O (n), ale przy odrobinie szczęścia nadal potrzebujemy wewnętrznych pętli.)
źródło
MATLAB: (266 b)
WEJŚCIE
wektor musi mieć postać [abcd ...]
przykład:
[2 4 7 11 3]
WYNIK
występujące wzory.
WYJAŚNIENIE:
jeśli [abcd] jest wejściem, program oblicza wynik ghij jako
g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c) ( 1+ (a> c))))
h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d ) = ... „uproszczony”
i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a ) = ..
j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...
źródło
J (49)
Przypuszczam, że jest miejsce na poprawę ...
źródło