Otrzymasz ciąg znaków, który będzie zawierał zwykłe znaki az. (Możesz założyć, że tak będzie zawsze w każdym teście, i załóż, że wszystkie litery również będą pisane małymi literami). Musisz określić, ile unikalnych kombinacji można utworzyć z poszczególnych znaków w ciągu, i wydrukować tę liczbę.
Jednak zduplikowane litery można zignorować, licząc możliwe kombinacje. Innymi słowy, jeśli podany ciąg to „hello”, to po prostu zmiana pozycji dwóch l
s nie jest liczona jako unikalna fraza i dlatego nie może być liczona do sumy.
Zwycięża najkrótsza liczba bajtów, czekamy na kreatywne rozwiązania w językach innych niż golf!
Przykłady:
hello -> 60
aaaaa -> 1
abcde -> 120
Odpowiedzi:
Python 2 ,
5048 bajtówWypróbuj online!
Żadnych nudnych wbudowanych funkcji! Ku mojemu zdziwieniu jest to nawet krótsze niż podejście z użyciem brutalnej siły, obliczając wszystkie permutacje
itertools
i biorąc pod uwagę długość.Ta funkcja korzysta ze wzoru
i oblicza go w locie. Silnia w liczniku jest obliczana przez pomnożenie przez
len(s)
w każdym wywołaniu funkcji. Mianownik jest nieco bardziej subtelny; w każdym wywołaniu dzielimy przez liczbę wystąpień tego elementu w pozostałej części łańcucha, zapewniając, że dla każdego znakuc
wszystkie liczby od 1 do liczby wystąpieńc
(włącznie) zostaną podzielone przez dokładnie jeden raz. Ponieważ dzielimy tylko na samym końcu, gwarantujemy, że nie będziemy mieć problemów z domyślnym podziałem podłogi w Python 2.źródło
05AB1E , 3 bajty
Wypróbuj online!
Wyjaśnienie
źródło
CJam , 4 bajty
Wypróbuj online!
Wyjaśnienie
Czytaj linię jako ciąg znaków (
l
), unikalne permutacje jako tablicę ciągów znaków (e!
), długości (,
), niejawne wyświetlanie.źródło
R ,
6965 bajtówWypróbuj online!
4 bajty zapisane dzięki Zahiro Morowi w obu odpowiedziach.
Oblicza bezpośrednio współczynnik wielomianowy.
R ,
7268 bajtówWypróbuj online!
Korzysta z funkcji rozkładu wielomianowego podanej w
dmultinom
celu wyodrębnienia współczynnika wielomianowego.Pamiętaj, że zwykły (golfista)
x<-table(strsplit(s,""))
nie działa wdmultinom
połączeniu z nieznanego powodu.źródło
function(s,
!=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))
będzie działać. el () jest reduntant - tabela wie, jak szukać elementów ....JavaScript (Node.js) , 49 bajtów
t=t*
służyt*=
do uniknięcia błędu zaokrąglania (|t
zaokrągla liczbę w dół), ponieważt=t*
gwarantuje, że wszystkie wyniki pośrednie ( z punktu widzenia operatora) są liczbami całkowitymi.Wypróbuj online!
źródło
t=t*
jeśli chcesz tego uniknąć.)aaadegfbbbccc
dokładnie spowodowane błędem zaokrąglenia zmiennoprzecinkowegoAPL (Dyalog Unicode) , 14 bajtów
Wypróbuj online!
Zwraca wynik jako singleton.
źródło
⍴
->≢
aby zwrócić proste skalary,÷⍨/g⌸,g←!⊢∘≢
dla -2Japt ,
53 bajty-2 bajty dzięki @Shaggy
Wypróbuj online!
źródło
â
.J ,
15, 14 bajtówWypróbuj online!
-1 bajt dzięki FrownyFrog
źródło
~.
może być=
Galaretka , 4 bajty
Wypróbuj online!
Po prostu robi to, o co pytano: znajduj permutacje danych wejściowych, unikaj i drukuj długość.
źródło
C # (interaktywny kompilator Visual C #) , 59 bajtów
Port odpowiedzi @ArBo na Python 2 .
Wypróbuj online.
źródło
Brachylog , 3 bajty
Wypróbuj online!
pᵘl
robi prawie dokładnie to samo.źródło
Python 2 , 57 bajtów
Wypróbuj online!
Self-documenting: Zwraca długość zestawu unikalnych permutacji ciągu wejściowego.
Python 3 , 55 bajtów
Uznanie dla ArBo za to:
Wypróbuj online!
źródło
APL (Dyalog Unicode) , 24 bajty
Wypróbuj online!
Prosty Dfn, przyjmuje ciąg znaków jako argument.
W jaki sposób:
źródło
Rubinowy , 41 bajtów
Wypróbuj online!
źródło
to_a
f=
część. (W TIO przenieś go doPerl 5 , 43 bajtów
Używa metody z odpowiedzi Python na @ ArBo.
Wypróbuj online!
źródło
Perl 6 ,
3330 znaków (3431 bajtów)Dość prosty
Whatever
blok.comb
dzieli ciąg na litery,permutations
uzyskuje wszystkie możliwe kombinacje. Ze względu na sposób, w jakiSet
należyjoin
najpierw»
zastosować przymus ( dotyczyjoin
każdego elementu na liście).Wypróbuj online!
(poprzednia użyta odpowiedź,
.unique
aleSet
s gwarantuje unikatowość i numeruje to samo, więc oszczędza 3).źródło
K (oK) , 12 bajtów
Rozwiązanie:
Wypróbuj online!
Wyjaśnienie:
Wykorzystuje wbudowane OK
prm
:... który w
x^/:x
zasadzie generuje permutacje"helo"
nie"hello"
, dlatego musimy wygenerować permutacje0 1 2 3 4
, użyć ich do indeksowania,"hello"
a następnie policzyć unikalność.źródło
!-n
. pod koniec k5 i k6 stało sięprm
. K7 (Shakti)prm
też ma .Java 8,
103102 bajtówPort odpowiedzi @ArBo na Python 2 .
-1 bajt dzięki @ OlivierGrégoire poprzez iterację zamiast rekurencji.
Wypróbuj online.
W rzeczywistości wygenerowanie wszystkich unikalnych permutacji w zestawie i uzyskanie jego rozmiaru wynosi 221 bajtów :
Wypróbuj online.
źródło
s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}
.s->{long r=1,i=s.length();for(;i>0;)r=r*i/(s.chars().skip(--i).filter(c -> c==s.charAt(i)).count()+1);return r;}
ale jak dotąd bez powodzenia ...MATL , 9 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
j
staje sięi
, co można pozostawić niejawne. Również&nx
zapisuje bajt nadZy1)
tio.run/##y00syfn/P9IholQtr@L/f/WM1JycfHUAOctave / MATLAB, 35 bajtów
Anonimowa funkcja, która pobiera wektor znaków i tworzy liczbę.
W MATLAB można to skrócić do
size(unique(perms(s),'ro'),1)
(33 bajtów).Wypróbuj online!
Wyjaśnienie
źródło
unique
już unikalne wiersze? Czy to tylko dlatable
s?unique
najpierw ulegałyby linearyzacji. W przypadku stolików myślę, że masz rację; Nie wiedziałem tego!unique
w MATLAB bierze wierszetables
; Runique
pobiera unikalne rzędy macierzy lub ramek danych. Zbyt wiele języków tablic z tymi samymi poleceniami, które robią nieco inne rzeczy ...Retina 0.8.2 , 73 bajty
Wypróbuj online! Wykorzystuje formułę @ ArBo, ale ocenia od prawej do lewej, ponieważ można tego dokonać w arytmetyce liczb całkowitych, jednocześnie minimalizując wielkość zaangażowanych wartości jednostkowych. Wyjaśnienie:
Dla każdego znaku policz, ile pozostało duplikatów i ile jest kolejnych znaków, dodaj po jednym do każdego z nich, aby uwzględnić bieżący znak, i rozdziel wartości, abyśmy wiedzieli, które z nich mają zostać podzielone, a które należy pomnożyć .
Przedrostek 1, aby uzyskać pełne wyrażenie.
Kilkakrotnie pomnóż ostatnią i trzecią ostatnią liczbę, dzieląc ją przez drugą ostatnią liczbę. Zastępuje to ostatnie trzy liczby.
Konwertuj na dziesiętny.
źródło
K, 27 bajtów
K, 16 bajtów - nie jest to prawdziwa odpowiedź
Weź 999999 losowych kombinacji łańcucha wejściowego, weź ich unikalny zestaw i policz długość. Przez większość czasu daje właściwą odpowiedź, w przypadku krótkich łańcuchów.
Poprawiono dzięki @Sriotchilism O'Zaic, @Selcuk
źródło
999999
zamiast niej100000
?Wolfram Language (Mathematica) , 32 bajty
Wypróbuj online!
Objaśnienie: Kompozycja po prawej stronie
/*
stosuje te trzy operatory jeden po drugim do argumentu funkcji, od lewej do prawej:Characters
konwertuje wejściowy ciąg znaków na listę znaków.Permutations
tworzy listę wszystkich unikalnych kombinacji tej listy znaków.Length
zwraca długość tej listy unikalnych permutacji.Ta metoda jest bardzo marnotrawna w przypadku długich ciągów: unikatowe permutacje są faktycznie wyświetlane i liczone, zamiast używać a
Multinomial
do obliczania ich liczby bez wyświetlania.źródło
F # (mono) , 105 bajtów
Wypróbuj online!
źródło
Pyt ,
54 bajtówWypróbuj online!
Zakłada się, że dane wejściowe to literał ciągu znaków w języku Python. Jeśli dane wejściowe muszą być surowym tekstem, ta 5-bajtowa wersja będzie działać:
Tak czy inaczej, po prostu oblicza wszystkie permutacje danych wejściowych jako listę, deduplikuje je, pobiera liczbę elementów i domyślnie drukuje tę liczbę.
-1 bajt dzięki @ hakr14
źródło
{
deduplikuje listę dla bajtu mniejszego niż.{
.J ,
1413 bajtówWypróbuj online!
1 bajt dzięki milom
źródło
#(%*/)&:!#/.~
powinien oszczędzić kolejny bajtPHP , 77 bajtów
Wypróbuj online!
To jest po prostu port PHP zwycięskiej odpowiedzi Pythona @ ArBo, która jest śmiesznie mądrzejsza niż rekurencyjna odpowiedź, którą pierwotnie miałem. Brawo!
źródło
Ohm v2 , 4 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Stax , 3 bajty
Uruchom i debuguj
źródło