Biorąc pod uwagę listę dodatnich liczb całkowitych, znajdź liczbę trójkątów, które możemy utworzyć, tak aby ich długości boków były reprezentowane przez trzy różne wpisy na liście wejściowej.
(Inspiracja pochodzi z CR .)
Detale
- Trójkąt można utworzyć, jeśli wszystkie kombinacje trzech długości boków spełniają ścisłą nierówność trójkąta(Oznacza to, że , oraz muszą być wszystkie.)
- Trzy długości boków muszą pojawić się w różnych pozycjach na liście, ale niekoniecznie muszą być odrębne parami.
- Kolejność trzech liczb na liście wprowadzania nie ma znaczenia. Jeśli weźmiemy pod uwagę listę
a
i trzy liczbya[i], a[j], a[k]
(gdziei,j,k
pary są różne), to(a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])
itd. Wszystkie są uważane za ten sam trójkąt. - Zakłada się, że lista wejściowa zawiera co najmniej 3 wpisy.
- Możesz założyć, że lista wejściowa jest posortowana w porządku rosnącym.
Przykłady
Mały program testowy można znaleźć tutaj na Wypróbuj online!
Input, Output:
[1,2,3] 0
[1,1,1] 1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50
Do wprowadzenia [1,2,3,...,n-1,n]
tego należy A002623 .
Dla wprowadzenia [1,1,...,1]
(długości n
) jest to A000292 .
Dla wprowadzenia pierwszych n
liczb Fibonacciego ( A000045 ) jest to A000004 .
[1,1,1,1]
pozwala na wybranie 4 „różnych” trójkątów[1,1,1]
za pomocą dowolnych trzech 1? Ale to nie 24, ponieważ trzy 1 są wybierane nieuporządkowane, tzn. Jest to podzbiór trzech wskaźników, a nie uporządkowana lista?Odpowiedzi:
R ,
62524034 bajtówWypróbuj online!
Rozwiązanie Octave dla portu Luisa Mendo
Ponieważ
a<=b<=c
warunek trójkąta jest równoważnya+b-c>0
. Jesta+b-c
to zwięźle uchwycone przez iloczyn macierzy[1,1,-1] * X
, gdzieX
są 3 kombinacje macierzy wejściowej.W komentarzach pojawiło się wiele sugestii dotyczących ulepszeń 3 różnych osób:
Robertowi S. za sugestię
scan
.Robin Ryder za zasugerowanie poprawy nierówności trójkąta i tego dziwnego, który wymaga, aby dane wejściowe były w porządku malejącym (co po prostu pokazuje, jak ważny jest elastyczny format wejściowy).
i wreszcie Nick Kennedy za:
R , 40 bajtów
Wypróbuj online!
źródło
x[3]<x[1]+x[2]
odpowiada2*x[3]<sum(x)
: 51 bajtów[
alias jest elegancki, naprawdę oczyszcza podejście.Stax ,
87 bajtówDzięki rekursywnemu dla -1!
Uruchom i debuguj na staxlang.xyz!
Rozpakowane (8 bajtów) i objaśnienie:
To fajna sztuczka. Jeśli masz sekwencję instrukcji, która zawsze spowoduje 0 lub 1 i musisz policzyć elementy z tablicy, która daje prawdziwy wynik na końcu programu,
F..+
jest to bajt krótszy niż{..f%
.Zakłada, że początkowa lista jest posortowana rosnąco. Bez tego założenia trzymaj
o
na początku 8 bajtów.źródło
r3SFE+<+
spakowuje do 7. Używa pętli foreach, aby dodać wyniki filtrów. Dodawanie jest jedną z operacji, która nie działa, gdy obecny jest tylko jeden element.Haskell , 49 bajtów
Wypróbuj online!
Rekurencyjnie generuje wszystkie podciągi
l
(odwrócone) i sprawdza, które długości 3 tworzą trójkąty.50 bajtów
Wypróbuj online!
Ten sam pomysł, generowanie podsekwencji
mapM
, poprzez mapowanie każdej wartościl
do siebie (dołącz) lub0
(wyklucz).50 bajtów
Wypróbuj online!
Próbuje każdego punktu podziału, aby wziąć środkowy element
b
.51 bajtów
Wypróbuj online!
Funkcja
q=scanr(:)[]
generuje listę sufiksów. Wiele problemów wiąże się z koniecznością uwzględnienia równych elementów we właściwej liczbie razy.52 bajty
Wypróbuj online!
Funkcja pomocnicza
q=scanr(:)[]
generuje listę sufiksów.57 bajtów
Wypróbuj online!
źródło
Brachylog , 11 bajtów
Wypróbuj online!
Być może zapomniałem skorzystać z posortowanych danych wejściowych w moim starym rozwiązaniu:
Brachylog ,
181715 bajtówWypróbuj online!
źródło
Perl 6 , 35 bajtów
Wypróbuj online!
Wyjaśnienie
Jest to dowolny kod, tzn. Zwięzły zapis funkcji lambda (który działa tylko w bardzo prostych przypadkach). Każdy
*
jest symbolem zastępczym dla jednego argumentu. Więc bierzemy listę długości (która pojawia się na początku*
), tworzymy wszystkie kombinacje 3 elementów (zawsze wychodzą w tej samej kolejności jak na oryginalnej liście, więc to oznacza, że kombinacje też są posortowane), spłaszcz listę, a następnie weźmy listę 3 na 3 i filtruj (grep
) tylko te trojaczki, które spełniają*+*>*
, tzn. że suma dwóch pierwszych argumentów jest większa niż trzecia. To daje wszystkie trojaczki, a my w końcu je liczymy, wymuszając kontekst liczbowy za pomocą+
.(Oczywiście musimy to przetestować tylko w przypadku „sumy dwóch mniejszych> największych”. Jeśli to się trzyma, to drugie trzyma się trywialnie, jeśli nie, triplet nie oznacza poprawnej długości trójkąta, a my nie trzeba szukać dalej.)
źródło
Siatkówka , 55 bajtów
Wypróbuj online! Link zawiera przypadki testowe, ale ze zmniejszonymi wartościami w piątym przypadku, aby mógł zakończyć się dzisiaj. Zakłada posortowane dane wejściowe. Objaśnienie: Regeksy tak naprawdę nie lubią dopasowywać więcej niż jednej rzeczy. Zwykłe wyrażenie regularne byłoby w stanie znaleźć wszystkie wartości, które mogłyby być najkrótszą odnogą trójkąta.
v
Opcja Retina nie pomaga tutaj, z wyjątkiem uniknięcia spojrzenia w przód. Jednakw
opcja Retiny jest nieco bardziej pomocna, ponieważ byłaby w stanie znaleźć zarówno najkrótszą, jak i najdłuższą nogę w tym samym czasie. To jednak nie wystarczy do tego wyzwania, ponieważ może być wiele środkowych nóg.Przekształć dane wejściowe w jednoargumentowe.
Dla każdego numeru wejściowego ...
... utwórz linię, która jest oryginalną tablicą obciętą, aby rozpocząć od tego numeru.
$'
normalnie oznacza ciąg po dopasowaniu, ale<
modyfikuje go, aby oznaczać ciąg po poprzednim separatorze, unikając marnowania 2 bajtów$&
. Każda linia reprezentuje zatem wszystkie potencjalne rozwiązania wykorzystujące ten numer jako najkrótszą nogę.Dla każdej z tych linii znajdź wszystkie możliwe środkowe i najdłuższe nogi, ale upewnij się, że różnica jest mniejsza niż pierwsza noga. Wyprowadź a
_
dla każdej pasującej kombinacji nóg.Policz całkowitą liczbę znalezionych trójkątów.
źródło
Python 3 , 73 bajty
Wypróbuj online!
źródło
Python 2 , 72 bajty
Wypróbuj online!
73 bajty
Wypróbuj online!
źródło
05AB1E ,
12109 bajtówMój pierwszy raz korzystam z 05AB1E! Dzięki [Grimy] za -1!
Wypróbuj online! lub pakiet testowy
Bezpośredni port mojej odpowiedzi Stax. Zbierz wszystkie kombinacje trzech wpisów i policz te, które mogą tworzyć trójkąty. To ta licząca część, która naprawdę mnie dopadła. Tam spędzam mnóstwo bajtów. Związany z tym, że jest to jakaś pomyłka nowicjusza.
źródło
ì
(odwróć każdy) przed filtrem zamiastŠ
(potrójna zamiana) wewnątrz filtra. Możesz też użyćε...}O
zamiastʒ...}g
, ale liczba bajtów pozostaje taka sama. PS: Liczba bajtów wynosząca 10 i TIO są poprawne, ale rzeczywista odpowiedź wciąż zawiera niepotrzebne wyraźne,y
które można usunąć. :) Niezła pierwsza odpowiedź, więc +1 ode mnie.3.ÆʒRÆd_}g
, to ta sama liczba bajtów.3.Æʒ`α›}g
9.JavaScript (ES6), 63 bajty
Wypróbuj online!
źródło
Octave / MATLAB, 33 bajty
Wypróbuj online!
źródło
Zsh , 66 bajtów
Wypróbuj online!
Stosunkowo proste, wykorzystujące posortowane dane wejściowe i zwiększające w
for
nagłówku (przyrost odbywa się raz na pętlę nadrzędną ).źródło
Excel VBA,
171164152 bajtów-26 bajtów dzięki TaylorScott
Dane wejściowe mieszczą się
A:A
w zakresie aktywnego arkusza. Dane wyjściowe są w bezpośrednim oknie.Ponieważ analizuje każdą kombinację każdej komórki w kolumnie o wysokości 2 20 komórek (czyli prawie 2 60 kombinacji), ten kod nie jest ... szybki. Możesz zrobić to znacznie szybciej, ale kosztem bajtów.
źródło
()
w instrukcji sub, spacjęDebug.? r
i można upuścićNext:Next:Next
doNext k,j,i
. poza tym - cóż, nadal wykonuje 2 ** 60 kombinacji, ale działar=r-(a+b>c)*(b+c>a)*(c+a>b)
Węgiel drzewny , 17 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Zakłada posortowane dane wejściowe. Wyjaśnienie:
źródło
Japt
-x
, 9 bajtówSpróbuj
Spróbuj
źródło
Wolfram Language (Mathematica) ,
3735 bajtówWypróbuj online!
źródło
Rubin , 41 bajtów
Wypróbuj online!
źródło
Pyth , 14 bajtów
Wypróbuj online!
Alternatywa (także 14 bajtów):
źródło
Perl 5 (
-p
),5552 bajtówprzy użyciu wyrażenia regularnego, -3 bajty dzięki kwakowi @Cows używają
^
zamiast(?!)
się nie udać i cofnąć.lub
TIO
źródło
(?!)
być^
?Galaretka , 9 bajtów
Wypróbuj online!
Monadyczny link przyjmujący posortowaną listę liczb całkowitych jako argument i zwracający liczbę trójkątów.
Wyjaśnienie
Alternatywne 9s:
źródło
J , 40 bajtów
Wypróbuj online!
źródło
Bash , 123 bajty
Wypróbuj online!
Zabawna.
źródło
SNOBOL4 (CSNOBOL4) , 181 bajtów
Wypróbuj online!
Brutalna siłaO ( n3)) algorytm. Pobiera dane wejściowe jako listę oddzieloną znakiem nowej linii i wyświetla liczbę trójkątów lub pustą linię dla
0
. Jest to prawdopodobnie dopuszczalne, ponieważ SNOBOL traktuje pusty ciąg znaków jak0
do obliczeń numerycznych.źródło
C (brzęk) , 83 bajty
Wypróbuj online!
Zapisano 1 dzięki @ceilingcat
źródło