Biorąc pod uwagę liczbę całkowitą N > 1
, wypisz wszystkie pozostałe liczby, których podstawowy rozkład ma te same cyfry, co pierwotny rozkład N
.
Na przykład, jeśli N = 117
, to wynik musi być [279, 939, 993, 3313, 3331]
, ponieważ
117 = 3 × 3 × 13
Dlatego dostępne są cyfry 1
, 3
, 3
a 3
i mamy
279 = 3 × 3 × 31
939 = 3 × 313
993 = 3 × 331
3313 = 3313
3331 = 3331
Są to jedyne możliwe liczby, ponieważ inna kombinacja tych cyfr daje liczby całkowite inne niż pierwotne, co nie może być wynikiem faktoryzacji liczby pierwszej.
Jeśli N
jakakolwiek z 117
, 279
, 939
, 993
, 3313
lub 3331
, następnie wyjście będzie zawierać pięć innych numerów: są czynniki pierwsze kumple.
Nie można używać zer wiodących, aby uzyskać liczby pierwsze, np. N = 107
Jego jedyny znajomy to 701
( 017
nie jest brany pod uwagę).
Wejścia i wyjścia
Dane wejściowe i wyjściowe muszą zostać pobrane i zwrócone w postaci dziesiętnej.
N
zawsze będzie zdecydowanie większy niż1
.Dane wyjściowe mogą być formatowane raczej swobodnie, pod warunkiem, że zawierają tylko elementy znajomych i separatory / elementy składniowe listy.
Kolejność danych wyjściowych jest nieistotna.
Możesz wziąć dane wejściowe
STDIN
jako argument funkcji lub coś podobnego.Możesz wydrukować dane wyjściowe
STDOUT
, zwrócić je z funkcji lub coś podobnego.
Przypadki testowe
Twój program powinien rozwiązać dowolny z poniższych przypadków testowych w mniej niż minutę .
N Buddies
2 []
4 []
8 []
15 [53]
16 []
23 [6]
42 [74, 146, 161]
126 [222, 438, 483, 674, 746, 851, 1466, 1631, 1679]
204 [364,548,692,762,782,852,868,1268,1626,2474,2654,2921,2951,3266,3446,3791,4274,4742,5426,5462,6233,6434,6542,7037,8561,14426,14642,15491,15833,22547]
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Ç€=$
byłoby to trochę szybszeÇ€=Ç
, biorąc pod uwagę ograniczenia czasowe.PowerShell v3 +, 450 bajtów
Wreszcie!
Program PowerShell nie ma żadnych wbudowanych funkcji sprawdzania pierwotności, faktoryzacji ani permutacji, więc jest to całkowicie ręcznie. Przeszedłem przez szereg sztuczek optymalizacyjnych, aby zmniejszyć złożoność czasu do poziomu, który będzie pasował do ograniczeń wyzwania, i cieszę się, że w końcu udało mi się -
Wyjaśnienie
Dużo się tu dzieje, więc spróbuję to zepsuć.
Pierwsza linia zajmuje wejście
$n
i określafunction
,f
. Ta funkcja wykorzystuje kumulatywny podział prób, aby uzyskać listę głównych czynników. Jest dość szybki dla małych wejść, ale oczywiście zapada się, jeśli wejście jest duże. Na szczęście wszystkie przypadki testowe są małe, więc to wystarczy.Następna linia dostaje
f
aktorów$n
,-split
s je na każdej cyfry ignorowania pustych wyników (jest to konieczne ze względu na to, jak PowerShell robi regex dopasowywania i jak przesuwa wskaźnik przez wejście i jest trochę irytujące dla celów golfa), a następniesort
s wyniki w porządku rosnącym. Przechowujemy tę tablicę cyfr$x
i używamy jej jako danych wejściowych do|?{...}
filtra, aby wyciągnąć tylko te, które same są pierwsze. Te pierwsze cyfry są przechowywane w$y
celu późniejszego użycia.Następnie podzieliliśmy się
$x
na dwa składniki. Pierwsza (tj. Najmniejsza) cyfra jest zapisywana$a
, a pozostałe są przekazywane$b
. Jeśli$x
ma tylko jedną cyfrę, wówczas$b
będzie pusta / null. Następnie musimy ponownie rzutować$a
jako tablicę, więc używamy do tego szybkiego operatora przecinka.Następnie musimy skonstruować wszystkie możliwe kombinacje cyfr. Jest to konieczne, więc nasze testy podziału pomijają później kilka liczb i ogólnie przyspieszają.
Tak długo, jak pozostanie element
$b
, odklejamy pierwszą cyfrę$z
i pozostawiamy pozostałą$b
. Następnie musimy kumulować się$a
w wyniku niektórych cięć i krojenia sznurków. Weźmiemy$a+$y
w tablicy konkatenacji, a każdy element skonstruowano nowy łańcuch$c
, a następnie za pomocą pętli$c
jest.length
i wkładką$z
w każdej pozycji, w tym poprzedzenie$z$c
i dołączanie$c$z
, aselect
nia tylko-u
Nique elementy. To jest ponownie połączone z macierzą$a
i ponownie zapisane w$a
. Tak, kończy się to, że głupie rzeczy się zdarzają, tak jakbyś mógł uzyskać3333
wkład117
, co w rzeczywistości nie jest permutacją, ale jest to znacznie krótsze niż próba ich jawnego odfiltrowania, zapewnia, że otrzymujemy każdą permutację i jest tylko bardzo nieznacznie wolniejsza.Tak więc teraz
$a
ma tablicę wszystkich możliwych (a następnie niektórych) permutacji cyfr czynnika. Musimy zresetować,$x
aby być naszą górną granicą możliwych wyników, łącząc|sort
cyfry w-des
kolejności nadawania i-join
łącząc je z powrotem. Oczywiście żadna wartość wyjściowa nie może być większa niż ta liczba.Ustawiliśmy naszą tablicę pomocniczą
$l
jako tablicę wartości, które wcześniej widzieliśmy. Następnie wyciągamy każdą wartość z$a
(tj. Tych permutacji), które są liczbą pierwszą, i wchodzimy do pętli, która jest największym ujściem czasowym całego programu ...Podczas każdej iteracji zapętlamy się
0
do górnej granicy$x
, zwiększając o bieżący element$j
. Tak długo, jak$i
rozważana wartość nie jest wielokrotnością poprzedniej wartości (to0-notin($l|%{$i%$_})
sekcja), jest potencjalnym kandydatem na wynik. Jeśli weźmiemyf
aktorzy$i
,sort
oni i oni są-eq
przekonani$x
, dodaj wartość do rurociągu. Na końcu pętli dodajemy nasz bieżący element$j
do naszej$l
tablicy, aby użyć go następnym razem, ponieważ rozważaliśmy już wszystkie te wartości.Wreszcie staramy
|?{$_-ne$n}
się wyciągać te, które nie są elementem wejściowym. Wszystkie pozostały w przygotowaniu, a dane wyjściowe są niejawne.Przykłady
źródło
CJam ,
2623 bajtówWypróbuj online
Wyjaśnienie
Łączenie dwóch liczb zawsze daje większy wynik niż pomnożenie ich. Zatem największa liczba, którą prawdopodobnie powinniśmy wziąć pod uwagę, to największa liczba, jaką możemy utworzyć z cyfr pierwszego podziału na czynniki pierwsze, czyli wszystkie cyfry posortowane w porządku malejącym. Dla podanych liczb górna granica jest wystarczająco mała, abyśmy mogli wyczerpująco sprawdzić każdą liczbę w zakresie, czy jest to kolega z czynnika pierwszego:
źródło
05AB1E , 17 bajtów
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
Pyth, 17 lat
Zestaw testowy .
Używa tej samej obserwacji, co post Martina .
Ekspansja:
źródło
JavaScript (ES6),
163158 bajtówEdytować : Wyjaśniono, że liczba pierwsza, taka jak 23, powinna zwrócić [6] raczej pusty zestaw wyników. Zaoszczędzono 5 bajtów, usuwając teraz bezużyteczną regułę, która - celowo - zapobiegała temu.
Ostatni przypadek testowy został skomentowany, aby ten fragment działał wystarczająco szybko, chociaż powinien również zostać ukończony w mniej niż minutę.
źródło
PHP 486 bajtów
może być krótszy z algorytmem, którego nie ma w książce.
(ale podoba mi się bieżąca liczba bajtów)
awaria
źródło
Właściwie 27 bajtów
Wykorzystuje ten sam algorytm , którego używali Martin , Adnan , FryAmTheEggman i Dennis . Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Ungolfing
źródło
PowerShell, 147 bajtów (wersja CodeGolf)
Uwaga: Skrypt rozwiązuje ostatnie przypadki testowe na moim lokalnym notatniku w czasie krótszym niż 3 minuty. Zobacz rozwiązanie „wydajność” poniżej.
Skrypt testu mniej golfowego:
Wydajność:
PowerShell, 215 bajtów (wersja „Performance”)
Uwaga: Uważam, że wymagania dotyczące wydajności są sprzeczne z zasadą GodeGolf. Ale ponieważ istniała reguła
Your program should solve any of the test cases below in less than a minute
, wprowadziłem dwie zmiany w celu jej spełnienia:-split'(.)'-ne''
zamiast tego krótki kod|% t*y
;Każda zmiana skraca czas oceny o połowę. Nie sądzę, że wykorzystałem wszystkie funkcje do poprawy wydajności. Wystarczyły te, aby spełnić regułę.
Skrypt testu mniej golfowego:
Wydajność:
źródło
Japt, 18 bajtów
Spróbuj
źródło