Kto nie lubi absolutnie permutacji, prawda? Wiem, że są niesamowici - tyle radości!
Cóż, dlaczego nie skorzystać z tej zabawy i uczynić go funner ?
Oto wyzwanie:
Biorąc pod uwagę dane wejściowe w dokładnej formie: nPr
gdzie n
jest pobierana pula i r
jest liczbą wyborów z tej puli ( n
i r
są liczbami całkowitymi), wyprowadza / zwraca dokładną liczbę permutacji. Dla tych, którzy są nieco zardzewiali terminologią: Permutation, def. 2a .
Jednak tutaj pojawia się wyzwanie (sprawia, że nie jest to zbyt łatwe):
Nie możesz używać żadnej wbudowanej biblioteki, frameworku lub metody dla swojej funkcji permutacji. Nie możesz używać metody silni, metody permutacji ani niczego w tym rodzaju; musisz wszystko napisać sam.
Jeśli potrzebne są dalsze wyjaśnienia, proszę nie wahaj się powiedzieć mi w komentarzach, a niezwłocznie podejmę odpowiednie działania.
Oto przykład we / wy:
Przykładowa funkcja to permute(String) -> int
Wejście:
permute("3P2")
Wynik:
6
To jest golf golfowy, więc wygrywa najkrótszy kod!
źródło
split
aby podzielić wejście naP
? Co z funkcją, która konwertuje ciąg na liczbę?0 <= r <= n
?Odpowiedzi:
CJam,
1514 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Perl, 27 bajtów
Licząc shebang jako 4, dane wejściowe są pobierane ze standardowego wejścia.
Przykładowe użycie
źródło
l61
?$\
na1
(char 49, octal 61).Haskell,
7166 bajtówCałkiem proste rzeczy: podziel na „P”, a następnie weź iloczyn między (n-k + 1) i n.
Dzięki nim za pomysł zastosowania strażników wzorów zamiast
where
klauzuli, straciło 5 bajtów.źródło
Minkolang 0.11 ,
132519 bajtówDziękujemy Sp3000 za zasugerowanie tego!
Wypróbuj tutaj.
Wyjaśnienie
Używa tego samego algorytmu jak Alexa:
n P k
=n(n-1)(n-2)...(n-k+1)
.źródło
Julia,
635848 bajtówTworzy to nienazwaną funkcję, która akceptuje ciąg znaków i zwraca liczbę całkowitą. Aby to nazwać, nadaj mu nazwę, np
f=s->...
.Nie golfowany:
Wykorzystuje to fakt, że liczba permutacji wynosi n ( n -1) ( n -2) ... ( n - k +1).
Zaoszczędź 10 bajtów dzięki Glen O!
źródło
Int
, więc możesz po prostu użyćmap(parse,...)
.Int
że w tej sytuacji jest to konieczne. Dzięki wielkie!Narzędzia Bash + Linux, 33
jot
tworzy sekwencjęr
liczb całkowitych rozpoczynającą się odn-r+1
i oddziela je za pomocą*
. To wyrażenie jest przesyłane potokowo dobc
oceny arytmetycznej.źródło
MATLAB, 54 bajty
Próbowałem go zmniejszyć, ale jedną z rzeczy, w których MATLAB jest naprawdę zły, jest uzyskiwanie danych wejściowych. Aby pobrać dwie liczby z ciągu wejściowego, potrzeba 32 znaków!
Dość oczywisty kod. Uzyskaj dane wejściowe w postaci, w
%dP%d
której% d jest liczbą całkowitą. Podziel to nan
ir
. Następnie wyświetl iloczyn każdej liczby całkowitej z zakresun-r+1
don
. Co ciekawe, działa to nawet dlaxP0
podania poprawnej odpowiedzi 1. Jest tak, ponieważ w MATLABprod()
funkcja zwraca 1, jeśli spróbujesz wykonać iloczyn pustej tablicy. Ilekroćr
wynosi zero, zasięg będzie pustą tablicą, więc bingo dostajemy 1.Działa to również doskonale z Octave . Możesz spróbować online tutaj .
źródło
JavaScript,
5957 bajtówźródło
Java (594 - bajty)
źródło
J, 23 bajty
Anonimowa funkcja. Przykład:
Wyjaśnienie:
Funkcja stope, której użyłem, może liczyć na liczenie jako wbudowane ... Opiera się ona gdzieś między ogólnością operatora mnożenia a specyfiką operatora silni.
źródło
APL, 23
Bierze ciąg jako argument. Wyjaśnienie:
źródło
⎕ML←3
w Dyalogu.Python 2, 66
Całkiem proste. Przetwarza wprowadzoną liczbę jako
a,b
. Utrzymuje działający produkt jakoP
pomnożony przez pierwszeb
warunkia, a-1, a-2, ...
.źródło
input()
nie może spowodować błędu."3P2"
, które moim zdaniem są zwykle dozwolone, ale tutaj wyzwanie mówi „dane wejściowe w dokładnej formie”, więc zmieniam je na funkcję, która pobiera ciąg znaków.TI-BASIC, 52 bajty
TI-BASIC ma funkcję „produktu z listy”, więc obejście ograniczeń wbudowanych nie jest zbyt trudne. Jednak TI-BASIC nie obsługuje pustych list - więc musimy
Aby wyodrębnić dwie liczby, wyodrębniam pierwszą liczbę jako podłańcuch. To jest drogie ; zajmuje całą drugą linię. Aby nie musieć tego robić ponownie dla drugiej liczby, ustawiam zmienną P na tę liczbę i oceniam cały łańcuch za pomocą
expr(
, a następnie dzielę przez P².Na koniec biorę losową permutację listy między dwiema liczbami (dbając o dodanie jednej do drugiej liczby) i biorę produkt.
źródło
Ouroboros ,
4745 bajtówNiektóre z nich są dość brzydkie - wyobrażam sobie, że można by dalej grać w golfa.
Każda linia kodu w Ouroboros reprezentuje węża jedzącego ogon.
Snake 1
S
przełącza na wspólny stos.r.r
odczytuje jeden numer, powiela go i odczytuje inny. (Znaki nieliczbowe, takie jakP
są pomijane.) Odejmuje-
dwa. Jeśli dane wejściowe były7P2
, mamy teraz7
,5
na wspólnym stosie. Wreszcie1(
zjada ostateczną postać węża. Ponieważ jest to znak, na którym znajduje się wskaźnik instrukcji, wąż umiera.Snake 2
)s
nic nie robi za pierwszym razem..!+
duplikuje górę stosu węża 2, sprawdza, czy wynosi zero, a jeśli tak, dodaje 1. Przy pierwszej iteracji stos jest pusty i traktowany tak, jakby zawierał nieskończone zera, więc przesuwa się1
; w późniejszych iteracjach stos zawiera niezerową wartość i nie ma to wpływu.Następnie
S
przełącza się na wspólny stos, gdzie mamy liczbęn
i licznik do obliczania produktu.1+
zwiększa licznik..@@.@\<!
duplikuje obie liczby i wypycha 1, jeślin
nadal jest większy lub równy licznikowi, 0 w przeciwnym razie.@@*Y
następnie mnoży licznik przez tę liczbę i ciągnie kopię na stos węża 2.s.!+
przełącza się z powrotem na stos węża 2 i używa tego samego kodu, co wcześniej, aby przekonwertować najwyższy numer na 1, jeśli był równy 0, i w przeciwnym razie nie zmieniaj go. Następnie*
mnoży wynik przez częściowy produkt, który siedział na tym stosie.Wracamy teraz do współdzielonego stosu (
S
), duplikujemy licznik lub zero (.
) i negujemy go dwukrotnie (!!
), aby zamienić niezerowy licznik na 1.4*.(
mnoży to przez 4, duplikuje i zjada tyle znaków z koniec węża.(
są zjadane, a pętle kontrolne rozpoczynają się na początku kodu. Tutaj)
regurgituje cztery znaki,s
przełącza się z powrotem na stos węża 2 i wykonywanie jest kontynuowane.n
, mamy na stosie 0 i nic nie zostaje zjedzone.sn
przełącza na stos snake 2 i wyświetla najwyższą wartość jako liczbę; następnie1(
zjada ostatnią postać i umiera.W rezultacie produkt
(r+1)*(r+2)*...*n
jest obliczany i generowany.Wypróbuj to
Pokaż fragment kodu
źródło