(Kontynuacja mojego pytania dotyczącego wymiany bitów z sąsiadami ).
Zadanie
Biorąc pod uwagę dodatnią liczbę całkowitą x = (2 a · 3 b ) · (5 c · 7 d ) · (11 e · 13 f ) ·… , wydrukuj liczbę całkowitą uzyskaną przez zamianę wykładników w tym rozkładzie na każdą kolejną parę liczb pierwszych, y = (2 b · 3 a ) · (5 d · 7 c ) · (11 f · 13 e ) ·…
A061898 w OEIS. To jest golf golfowy , więc wygrywa najkrótszy program (w bajtach)!
Przypadki testowe
1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871
Odpowiedzi:
Galaretka , 10 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Galaretka,
171611 bajtów5 bajtów dzięki Dennisowi.
Wypróbuj online!
Wyjaśnienie
Poprzednia 16-bajtowa wersja
Wypróbuj online!
Wyjaśnienie
Poprzednia 17-bajtowa wersja:
Wypróbuj online!
Wyjaśnienie
źródło
Mathematica,
7069 bajtówNienazwana funkcja, która przyjmuje i zwraca liczbę całkowitą. Zgłasza błąd na wejściu,
1
ale nadal oblicza poprawny wynik.Wyjaśnienie
Jak zwykle, ze względu na cały cukier składniowy, kolejność czytania jest nieco śmieszna.
&
Na prawo definiuje nienazwana funkcyjnych i jej argumenty są określane przez#
,#2
,#3
, itd.Zaczynamy od faktoryzacji danych wejściowych. Daje listę par
{prime, exponent}
np wejście12
daje{{2, 2}, {3, 1}}
. Nieco niewygodnie1
daje{{1, 1}}
.Powoduje to zastosowanie funkcji po lewej do listy liczb całkowitych na poziomie 1, to znaczy funkcja jest wywoływana dla każdej pary, przekazując liczbę pierwszą i wykładnik jako osobne argumenty, a następnie zwraca listę wyników. (Jest to podobne do mapowania funkcji na liście, ale otrzymywanie dwóch oddzielnych argumentów jest wygodniejsze niż otrzymywanie pary.)
Obliczamy liczbę liczb pierwszych do (włącznie) danych wejściowych (pierwszych) za pomocą wbudowanego
PrimePi
. To daje nam indeks liczby pierwszej.Wynik jest zwiększany, XOR'owany
1
i ponownie zmniejszany. To zamienia1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, tzn. Wszystkie indeksy 1. Zauważ, że dane wejściowe1
przyniosą zysk,0
naPrimePi
który jest następnie mapowany-1
w tym procesie. Zajmiemy się tym później.Otrzymujemy teraz n- tą liczbę pierwszą (gdzie n jest wynikiem poprzedniego obliczenia), która jest poprawnie zamienioną liczbą pierwszą i podnosimy ją do potęgi oryginalnej liczby pierwszej w rozkładzie na czynniki wejściowe. W tym momencie
Prime[-1]
wyrzuci błąd, ale zwróci się bez oceny. Moc w tym przypadku jest1
taka, że cały dotychczasowy proces daje{Prime[-1]}
wkład1
i listę poprawnych mocy pierwotnych dla wszystkich innych czynników.Następnie pomnożymy wszystkie główne moce.
1##&
to standardowa sztuczka golfowa dla tejTimes
funkcji. Zobacz tę końcówkę (sekcja „sekwencje argumentów”) dla, jak to działa.Wreszcie musimy zadbać o wkład,
1
w wyniku którego wszystkie powyższe wyniki zaowocowałyPrime[-1]
. Możemy to łatwo naprawić za pomocą prostej reguły wymiany. Pamiętaj, żef@x
to jest skrót odf[x]
. Chcemy tylko dopasować dowolne wyrażenie tej formy (ponieważ wszystkie inne wyniki będą liczbami całkowitymi, tj. Wyrażeniami atomowymi) i zastąpimy je1
:Tutaj
/.
jest skrótemReplaceAll
,_@_
jest wzorem dlaf[x]
dowolnej postaci (tj. Dowolnego wyrażenia złożonego z jednym dzieckiem) i->1
mówi „zamień na1
”.źródło
Python 2,
149139 bajtów10 bajtów dzięki Dennisowi.
źródło
input()
działa w Python 2?eval(input())
w Pythonie 3.MATL , 17 bajtów
Wypróbuj online!
Wyjaśnienie
To nie korzysta bezpośrednio z wykładników. Zamiast tego zamienia każdy (prawdopodobnie powtarzany) czynnik pierwszy na pierwszą lub poprzednią liczbę pierwszą.
źródło
Julia, 64 bajty
Wypróbuj online! Ostatni przypadek testowy wymaga zbyt dużo pamięci dla TIO, ale zweryfikowałem to lokalnie.
Jak to działa
Aby uniknąć wejścia specjalnego 1 - nie jest zdefiniowany iloczyn pustego słownika - mnożymy wejście n przez 2 i dzielimy wynik końcowy przez jego parę 3 .
factor(2n)
daje wszystkim dodatnim wykładnikom czynników pierwszych 2n jako słownik. Podczas iteracji w słowniku otrzymamy pary klucz-wartość / liczba pierwsza-wykładnik. Funkcjaprod
weźmie te pary, zastosujet->...
wobec nich funkcję anonimową i zwróci iloczyn wyników.Dla każdej pary T = (s, e) ,
endof(~t[1])
lubendof(primes(t[1]))
dwie strony k liczba bodźców, które są mniejsze lub równe p , co oznacza, że p jest k p pierwsza.+1$1-1
zwiększy k , XOR k + 1 o 1 i zmniejszy wynik. Jeśli k jest nieparzyste, k + 1 jest parzyste, więc XOR zwiększa się, a końcowy wynik to k + 1 . Jeśli k jest parzyste, k + 1 jest nieparzyste, więc XOR zmniejsza się, a końcowy wynik to k - 1 .Na koniec obliczamy wszystkie liczby pierwsze mniejsze lub równe 3n z
(~3n)
lubprimes(3n)
(najwyższy współczynnik liczby podstawowej 2n jest mniejszy lub równy n, jeśli n> 2 , i zawsze jest liczba pierwsza między n a 2n ), wybierz tę o indeksie k + 1 lub k - 1 i podnieś ją do e- mej mocy za pomocą^t[2]
.źródło
Python 2,
1121091089594 bajtówPrzetestuj na Ideone .
Jak to działa
Gdy wywoływane jest f , najpierw oblicza 1 / n . Jeśli wynik jest niezerowy, n oznacza 1, a f zwraca 1 .
Jeśli n> 1 , dzieje się tak.
Jeśli n nie jest podzielne przez p [1] (początkowo 2 ),
n%p[1]
daje prawdziwą wartość izostaje wezwany.
Ta gałąź generuje liczbę pierwszą, dopóki przedostatnia nie podzieli n . W tym celu wykorzystuje następujący wniosek twierdzenia Wilsona .
Przez cały czas m jest równe silni k-1 (początkowo 6 = 3! I 4. W każdej iteracji wynik
m*m%k*[k]
jest dodawany do listy liczb pierwszych p . Zgodnie z tym wynikiemm*m%k
jest 1, jeśli k jest liczbą pierwszą i 0, jeśli nie, to wstawia k do p wtedy i tylko wtedy, gdy k jest liczbą pierwszą.Jeżeli n jest podzielne przez p [1] , to
n%p[1]
daje 0 izostaje stracony.
Jeśli p zawiera parzystą liczbę liczb pierwszych,
len(p)*2%4
zwróci 0, a pierwsza liczba mnoga przyjmuje wartość p [0] . Jeśli p zawiera nieparzystą liczbę liczb pierwszych,len(p)*2%4
zwróci 2, a pierwsza liczba mnoga przyjmuje wartość p [2] .W obu przypadkach jest to liczba pierwsza, której wykładniki muszą zostać zamienione na jeden z p [1] , więc dzielimy n przez p [1] (zmniejszając wykładnik o 1 ) i mnożymy wynik
f(n/p[1])
przez odpowiednią liczbę pierwszą (zwiększając wykładnik o 1 ).Zauważ, że
f(n/p[1])
resetuje k , m oraz p do ich wartości domyślnych.f(n/p[1],k,m,p)
poprawiłoby wydajność kosztem sześciu dodatkowych bajtów.źródło
Pyth, 25 bajtów
Zestaw testowy.
Wyjaśnienie
źródło
Julia,
155131127 bajtówJest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą. Aby go wywołać, przypisz go do zmiennej. Wymaga wersji Julii <0,5, ponieważ podstawowa funkcjonalność została usunięta z bazy w wersji 0.5.
Nie golfowany:
Wypróbuj online! (Obejmuje wszystkie przypadki testowe)
źródło
Właściwie 15 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
05AB1E, 22 bajty
Wyjaśniono
Wypróbuj online
źródło
J, 21 bajtów
Pobiera główne wykładniki n jako główne potęgi z zerami. Następnie podziel je na nie nakładające się podlisty o rozmiarze 2, wypełniając dodatkowe zero. Następnie odwróć każdą podlistę i spłaszcz ją na liście. Na koniec przekonwertuj z głównych wykładników na liczbę.
Stosowanie
Wyjaśnienie
źródło