Powiedzmy, że Twoim zadaniem jest malowanie tyczek, a klient prosi o pomalowanie tyczki za pomocą 4 czerwonych odcinków i 3 żółtych odcinków. Możesz to zrobić dość łatwo w następujący sposób:
r y r y r y r
Tylko żółte i czerwone paski. Powiedzmy teraz, że klient prosi o pomalowanie słupa za pomocą 2 czerwonych sekcji, 2 żółtych sekcji i 1 zielonej sekcji . Istnieje kilka sposobów na pomalowanie słupa
g y r y r
y g r y r
y r g y r
y r y g r
y r y r g
g r y r y
r g y r y
r y g r y
r y r g y
r y r y g
y r g r y
r y g y r
Dokładniej, to 12 sposobów na pomalowanie słupa. To wysadza więcej kolorów i sekcji, które są zaangażowane
Teraz, jeśli klient mówi, że chce 3 czerwonych sekcji i 1 żółtej sekcji, nie ma sposobu, aby pomalować taki słup. Ponieważ bez względu na to, jak spróbujesz ułożyć sekcje, dwie czerwone sekcje się dotkną, a gdy dwie czerwone sekcje się dotkną, staną się pojedynczą czerwoną sekcją.
I to właściwie nasza jedyna zasada malowania tyczek
Sąsiednie sekcje mogą nie być tego samego koloru
Zadanie
Biorąc pod uwagę listę wymaganych kolorów i przekrojów, podaj liczbę możliwych sposobów pomalowania słupa zgodnie z życzeniem. Możesz przedstawiać kolory w dowolny rozsądny sposób (liczby całkowite, znaki, łańcuchy), ale nigdy nie otrzymasz więcej niż 255 różnych kolorów jednocześnie. Jeśli chcesz, możesz nawet nie mieć nazw kolorów i po prostu zrób listę sekcji, jeśli jest to łatwiejsze.
Przypadki testowe
Są one trudne do obliczenia ręcznie, zwłaszcza gdy stają się większe. Jeśli ktoś ma sugerowany przypadek testowy, dodam go.
[4,3] -> 1
[2,2,1] -> 12
[3,1] -> 0
[8,3,2] -> 0
[2,2,1,1]-> 84
źródło
[1, 1, 1, 1, 2, 2, 2]
? Tak przypuszczam.Odpowiedzi:
Mathematica, 37
44486062bajtyWeź dane jako listę liczb całkowitych
{1, 1, 1, 2, 2}
. Wypróbuj na Wolfram Sandbox .Metoda dopasowywania wzorów, dzięki @Nie drzewo!
Split
dzieli pojedynczą listę na podlisty kolejnych elementów, np.{1, 1, 2, 3, 4, 4}
na{{1, 1}, {2}, {3}, {4, 4}}
{{_}..}
jest mianowicie{{_}, {_}, {_}, ...}
. Wzór pasuje do listy pojedynczych podlist.Differences
metoda, 48 bajtów:Kod używa
Differences
do ustalenia, czy sąsiednie elementy są takie same.Krok po kroku:
Permutations@#
generuje wszystkie permutacje listy wejściowej do listy N! * N.Differences/@
oblicza różnicę między N elementami i daje listę N! * (N-1).1##&@@@
oblicza pomnożenie wszystkich list. Jeśli lista zawiera0
(dwa sąsiednie elementy są takie same), wynik będzie0
, w przeciwnym razie niezerowy, na N! lista.Clip[]
działa jakSign[]
, przekształca listę z (-inf, inf) na [-1, 1]Tr@Abs
zamienia wszystko-1
w,1
a teraz lista długości N! zawiera tylko0
(niepoprawne) i1
(ważne). Podsumowujemy więc listę.źródło
Permutations@#~Count~Except@{___,x_,x_,___}&
.Count[Split/@Permutations@#,{{_}..}]&
37 bajtów!Galaretka , 7 bajtów
Wypróbuj online!
Pobiera dane wejściowe jak np .
[1,1,1,1,2,2,2]
Dla[4,3]
.[8,3,2]
Testcase trwa zbyt długo, aby uruchomić na TIO.Jak to działa
źródło
Œ!QIẠ€S
działa Wypróbuj online!P
atom ze względu na jego prostotę.P€
zamiastẠ€
nadal będzie działać.05AB1E , 7 bajtów
Wypróbuj online!
-1 dzięki nmjcman101 na innej odpowiedzi.
źródło
Mathematica, 50 bajtów
Wypróbuj w Mathics lub w piaskownicy Wolfram !
Pobiera dane jak w przypadkach testowych - np.
{4,3}
Oznacza „4 czerwone paski, 3 żółte paski”.To naiwne wdrożenie wzoru, który tu znalazłem . „Naiwny” oznacza „nie mam pojęcia, jak działa matematyka, więc proszę nie pytaj mnie o wyjaśnienia…”
źródło
Python 3.5 , 65 bajtów
Wypróbuj online!
źródło
Ruby 2.4, 47 bajtów
Wejście znajduje się lista znaków: Dla przypadku testowego
[4,3]
, wejście może być%w[a a a a b b b]
,"1111222".chars
albo jakaś inna metoda formatowania tablica to ważne w Ruby.Wymaga wersji 2.4 dla
Enumerator#uniq
(wcześniejsze wersje posiadały ją tylko wArray
klasie). Jako taki, łącze TIO dodaje 5 bajtów, aby najpierw przekonwertować moduł wyliczający permutację na tablicęto_a
, ponieważ nie ma powyższej funkcji.Wypróbuj online!
źródło
R, 72 bajty
Tworzy funkcję
Pobiera dane w formularzu
[1,1,1,1,2,2,2]
zgodnie z komentarzem Erika the Outgolfer. Zastosowaniacombinat
„spermn
funkcja utworzyć listę wszystkich permutacji, a następnieunique
, aby uzyskać wszystkie odrębne pozycje.sapply
następnie stosuje następującą funkcję do wszystkich wpisów:Który ocenia na
Zauważ, że to
x
nie to samo, co nax
wejściu dużej funkcji. Użycie innej postaci w tej funkcji mogłoby doprowadzićpryr::f
do przekonania, że duża funkcja wymaga kolejnego argumentu.W każdym razie, gdy podaje się permutacji, funkcja do kwadratu różnicę pomiędzy wektorem:
2 1 3 4 2 1 -> -1 2 1 -2 -1
.!
konwertuje niezerowe naFALSE
i zera naTRUE
, więc wektor staje sięFALSE FALSE FALSE FALSE FALSE
. Podsumowując, aby sprawdzić, czy są jakieśTRUE
s (TRUE
oznaczałoby todiff=0
-> dwie takie same kolejne liczby). Możemy ponownie odwrócić to za pomocą,!
aby uzyskać wartość logiczną określającą, czy w permutacji występują kolejne wartości.Podsumowanie tych boolanów daje nam całkowitą liczbę permutacji, w których tak nie jest.
Nie działa dla przypadku
[8,3,2]
testowego, ponieważ wymaga wektora 46 GB do przechowywania tych permutacji.źródło
Galaretka , 11 bajtów
Wypróbuj online!
źródło
Python 2 ,
14089 bajtówFormat wejściowy jest
'aaaabbb'
dla przypadku testowego[4,3]
.Wypróbuj online!
źródło
Łuska , 8 bajtów
Wypróbuj online! Trwa wejście w formacie
"aaabb"
do[3,2]
. Przekroczono limit czasu najdłuższego przypadku testowego.Wyjaśnienie
Nic szczególnego tutaj, licząc tylko unikalne permutacje, w których wszystkie grupy sąsiednich elementów mają długość 1.
źródło
Rubin,
8476 bajtówRekurencyjna funkcja lambda. Patrzy na każdy możliwy kolor i dozuje rekurencyjne wyszukiwanie drzewa, licząc ile razy używa wszystkich pasków.
Objaśnienie (dla starej wersji):
źródło
x=p
jako warunek początkowy? w tym przypadkup
działa jako aliasnil
i powinien spełniać warunek, do którego jest używany.MATL ,
118 bajtówFormat wejściowy to
[1 1 1 1 2 2 2]
za[4 3]
, itd.Skończy się pamięć dla ostatniego przypadku testowego.
Wypróbuj online!
Wyjaśnienie
źródło