Jest dość osobliwa liczba, która pojawia się czasami w problemach matematycznych lub zagadkach. Pseudoczynnik (N) jest najmniejszą (tj. Najniższą) wspólną wielokrotnością liczb od 1 do N; innymi słowy, jest to najniższa liczba, która ma wszystkie liczby od 1 do N jako czynniki.
Na przykład pseudofactorial (7) = 3 * 4 * 5 * 7, czyli tyle samo, co 7! z wyjątkiem tego, że 2 i 6 zostały usunięte, ponieważ są zawarte w innych warunkach.
Napisz program do obliczania pseudofactorial (N) i jak zawsze wygrywa najkrótszy kod.
Oto krótka lista do użytku. Więcej przypadków testowych można znaleźć w OEIS pod A003418 .
Factorial:
- 1
- 2)
- 6
- 24
- 120
- 720
- 5040
Pseudofactorial:
- 1
- 2)
- 6
- 12
- 60
- 60
- 420
code-golf
math
number-theory
factorial
Tony Ruth
źródło
źródło
2
i6
zostały usunięte z listy wielokrotności. Czy możesz wyjaśnić zasady?Odpowiedzi:
Dyalog APL , 3 bajty
APL bije Jelly ‽
⍳
1 choć argument∧/
LCM w poprzekźródło
Galaretka , 4 bajty
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
C (z x86), 52 bajty
Sprawdza liczby od 1 w górę. Dla każdej liczby dzieli ją przez wszystkie liczby od n do 1 i sumuje pozostałe. Zatrzymuje się, gdy suma wynosi 0.
Stosowanie:
Nie jest oczywiste, w jaki sposób zwraca wartość (nie ma
return
instrukcji).Konwencja wywoływania dla x86 mówi, że funkcja musi zwrócić swoją wartość w
eax
rejestrze. Dogodnie instrukcja dzieleniaidiv
oczekuje, że zostanie wprowadzonaeax
, i wyświetli wynik weax
(ilorazie) iedx
(reszcie). Ostatnia iteracja dzielik
się1
, więceax
będzie zawierać prawidłową wartość po wyjściu z funkcji.Działa to tylko z optymalizacjami na (w trybie debugowania, wyświetla
421
).źródło
int
(w tym wartość zwracana). Działa dla argumentów funkcji, jeśli są one zadeklarowane przy użyciu tak zwanej składni „starego stylu”. Deklaracja z wyraźnie określonymi typami byłabyint d(n,k,b,t) int n,k,b,t; {...}
cdecl
istdcall
używają tej samej metody do zwracania wartości, więc myślę, żex86
to wystarczyHaskell, 20 bajtów
Przykład użycia:
map f [1..7]
->[1,2,6,12,60,60,420]
.lcm
Trik w Haskell.źródło
Python + SymPy, 45 bajtów
Dość oczywiste.
Python 2,
5754 bajtówPrzetestuj na Ideone .
Jak to działa
Dane wejściowe są przechowywane w zmiennych ı i R .
exec
wykonuje następujący kod r razy.Podczas gdy i zmienia się od r do 1 , dodajemy wartość początkową r (zapisaną w t ) tyle razy, ile jest to konieczne, aby samo r by utworzyć wielokrotność i . Wynikiem jest oczywiście wielokrotność t .
Ostateczna wartość r jest zatem wielokrotnością wszystkich liczb całkowitych z zakresu [1, ..., n] , gdzie n jest wejściem.
źródło
exec
sztuczek stron trzecich istnieje 78-bajtowe rozwiązanie:from fractions import*;lambda n:reduce(lambda x,y:x*y/gcd(x,y),range(1,n+1),1)
Wykorzystuje tolcm(x,y) = x*y/gcd(x,y)
.Python, 46 bajtów
Szukasz wielokrotności
c
zg(n-1)
bezpośrednio. Myślałem wcześniej, że ta metoda niesłusznie znalazłaby 0 jako wielokrotność czegokolwiek, aleor
zwarcie lub też(c%n<1)*c
przeskoczy,c==0
ponieważ 0 to Falsey.50 bajtów:
Podobnie jak rozwiązanie Dennisa , ale jako funkcja rekurencyjna. Mając obliczone
g(n-1)
, szuka najmniejszego wielokrotnościi*n
on
to również wielokrotnościąg(n-1)
. Bardzo wolno.Dzięki Dennis za 4 bajty, patrząc na wielokrotności
n
zamiastg(n-1)
.źródło
J, 9 bajtów
Proste podejście. Tworzy zakres liczb
[0, ..., n-1]
, a następnie dodaje po jednym do każdego z nich i zmniejsza go za pomocą LCM.Stosowanie
źródło
MATL , 4 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Mathematica, 13 bajtów
źródło
LCM
iRange
ze@*
?LCM
operuje elementami na liście, która byłaby przekazywanaRange
, co oznacza, że zwróciłoby to po prostu lcm ( x ) dla x od 1 do n . Brakuje&
również anonimowej funkcji. Działa coś w rodzajuLCM@@Range@#&
13 bajtów.Julia, 11 bajtów
Wypróbuj online!
źródło
Pyth - 8 bajtów
Sprawdza wszystkie liczby, aż znajdzie numer, który można podzielić
[1..N]
.Pakiet testowy .
źródło
Oktawa, 27 bajtów
Tworzy anonimową funkcję, którą można wywołać jako
ans(N)
.Demo online
Wyjaśnienie
To rozwiązanie tworzy listę wszystkich liczb pomiędzy
1
ix
(1:x
), konwertuje je na tablicę komórkową za pomocąnum2cell
. Następnie{:}
indeksowanie tworzy listę rozdzielaną przecinkami, która jest przekazywanalcm
jako wiele argumentów wejściowych w celu obliczenia najmniejszej wspólnej wielokrotności. 1 jest zawsze przekazywany jako pierwszy argument,lcm
ponieważlcm
zawsze wymaga co najmniej dwóch argumentów wejściowych.źródło
lcm
w Octave akceptuje więcej niż 2 wejścia! CiekaweMATLAB, 49 bajtów
źródło
bsxfun
Perl 6 , 13 bajtów
Anonimowy blok kodu, który tworzy zakres od 1 do wejścia (włącznie), a następnie zmniejsza to za pomocą
&infix:<lcm>
.Przykład:
źródło
JavaScript (ES6),
9288807469 bajtów:Dzięki @ConorOBrien i @Neil
źródło
b?g(b,a%b):a
zapisuje bajt.y*++i/g(y,i)
oszczędza trochę więcej bajtów.05AB1E, 20 bajtów
Wyjaśnienie
Wypróbuj online
źródło
Minkolang 0,15 , 12 bajtów
Mam dwa 12-bajtowe rozwiązania i uwzględniłem je oba.
Wypróbuj tutaj!
Wyjaśnienie
Mniej więcej tak proste, jak to możliwe.
Wypróbuj tutaj!
Wyjaśnienie
Z tego można wyprowadzić trzecie rozwiązanie: usuń a
1
i dodajd
po bieżącymd
. W obu przypadkach potrzebna jest dodatkowa liczba, ponieważ pętla for działa zbyt wiele razy, a sprawienie, by działała o jeden raz krócej, zajmuje dwa bajty (1-
tuż przed[
).źródło
Rubin, 25 bajtów
Rubin, 25 bajtów
źródło
g=
.GameMaker Language, 60 bajtów
Oparty na logice odpowiedzi anatolyga.
źródło
PHP,
615248 bajtówzapisano 9 bajtów dzięki @ user59178, 4 bajty poprzez scalenie pętli.
Rekurencja w PHP jest nieporęczna ze względu na
function
słowo kluczowe; więc używam iteracji.I kilkoma „sztuczkami” pokonałem teraz nawet JS Arnaulda .
pobiera dane wejściowe z argumentu wiersza poleceń. Uruchom z
-r
.awaria
bez golfa
To właściwie dwie pętle w jednym:
Uwaga: skopiowano z mojej odpowiedzi na duplikacie
źródło
Japt, 10 bajtów
Brak wbudowanego LCM.
Spróbuj
źródło
Pyke, 3 bajty, niekonkurujące
Wypróbuj tutaj!
źródło
Hoon , 67 bajtów
Utwórz listę
[1..n]
, złóż listę za pomocą lcm. Niestety, Hoon stdlib nie ma gotowego, którego mogę użyć: /źródło
𝔼𝕊𝕄𝕚𝕟, 7 znaków / 9 bajtów
Try it here (ES6 only).
Tylko LCM z zakresu od 1 do wejścia.
źródło
AWK, 42 bajty
Wykorzystanie wiersza poleceń:
Nie widziałem
AWK
rozwiązania, a duplikat pytania właśnie został opublikowany wczoraj, więc pomyślałem, że zebrałem to razem. Na19
moim komputerze jest to raczej powolne rozwiązywanie lub większe, ale działa.źródło
QBIC ,
3532 bajtówTo mnie tu sprowadziło.
Wyjaśnienie:
Oto wersja, która przestaje testować,
q
gdyb
nie dzieli go czysto. Również kolejność testowaniab
„s Againstq
odwraca się w założeniu, że wyższeb
” s trudniej będzie podzielić przez (take2
,3
,4
na przykład: jeśli%2=0
,%4
może być!0
. Vice versa nie tak dużo ...).źródło
Aksjomat, 35 bajtów
kod testowy i wyniki
Właśnie wykonuję rozwiązanie Znajdź najmniejszą dodatnią liczbę całkowitą, która ma wszystkie liczby całkowite od 1 do n, ponieważ czynniki, ponieważ mówisz, że jest podwójna, zamieszczam ją tutaj
źródło
Pari / GP , 14 bajtów
Wypróbuj online!
źródło
8 , 23 bajty
Kod
Ten kod pozostawia wynikowy pseudoczynnik na TOS
Zastosowanie i przykład
Lub bardziej wyraźnie
źródło