Formuła
Weźmy na przykład liczbę 300
- Czynniki pierwsze 300 to
[2, 3, 5]
(unikalne liczby, które są współczynnikami 300 i liczba pierwsza) - Kwadrat każdej z tych liczb da ci
[4, 9, 25]
- Podsumowanie tej listy da ci
4 + 9 + 25 = 38
- Na koniec odejmij tę sumę (38) od oryginalnego numeru
300-38 = 262
(to wynik)
Wejście
Wprowadzona liczba będzie dodatnią liczbą całkowitą większą niż 2. Musisz sprawdzić wszystkie liczby od 2 do wartości wejściowej (włącznie) i znaleźć liczbę, która daje najlepszy wynik przy użyciu powyższej formuły.
Wynik
Wynikiem będą dwie liczby oddzielone spacją, przecinkiem, znakiem nowej linii lub czymkolwiek innym językiem, na jaki pozwalasz (separacja jest niezbędna do rozróżnienia dwóch liczb). Można je wyprowadzić do pliku, standardowego wyjścia lub dowolnego innego języka. Twoim celem jest znalezienie liczby w zakresie, który daje maksymalną wydajność, gdy przejdziesz przez powyższą formułę. Pierwsza wyświetlana liczba powinna być liczbą początkową (np. 300), a druga liczba powinna stanowić wynik wygenerowany przez formułę (jak 262)
Przypadki testowe
Input: 3 Output: 2, -2
Input: 10 Output: 8, 4
Input: 50 Output: 48, 35
Input: 1000 Output: 1000, 971
Input: 9999 Output: 9984, 9802
Przepracowano przez przykład
Rozważ wprowadzenie 10, musimy uruchomić formułę dla wszystkich liczb od 2 do 10 (włącznie)
Num PrimeFacs PrimeFacs^2 SumPrimeFacs^2 Result
2 [2] [4] 4 -2
3 [3] [9] 9 -6
4 [2] [4] 4 0
5 [5] [25] 25 -20
6 [2, 3] [4, 9] 13 -7
7 [7] [49] 49 -42
8 [2] [4] 4 4
9 [3] [9] 9 0
10 [2, 5] [4, 25] 29 -19
Jak widać, najlepszy wynik to 4
wynik wprowadzenia wartości 8
do formuły. Oznacza to, że wyjście 10
powinno mieć wartość wejściową8, 4
Punktacja i zasady
Obowiązują domyślne zasady dla wejść i wyjść: Domyślne dla Code Golf: Metody wejścia / wyjścia
Zabronione są standardowe luki: Luki, które są domyślnie zabronione
Zgłoszenia mogą być funkcjami lub pełnymi programami
Najkrótszy kod w bajtach wygrywa
50
:35, 48
?Odpowiedzi:
Pyth,
1715 bajtówZestaw testowy.
źródło
Java 8 lambda,
247239233225224219198161 znakówPomyślałem, że to musi być możliwe w przypadku mniej niż 300 znaków, ponieważ ... no wiesz ... Java!
I rzeczywiście jest to możliwe nawet w przypadku mniej niż 200 znaków!
Nie wiem, czy takie użycie importu jest uzasadnione, ale zakładam, że powinno być w porządku.Oto lambda nierozwinięta do klasy:Ustalenie pierwotnego czynnika opiera się na tej odpowiedzi . Kod wykorzystuje funkcjonalność zestawów, ponieważ zapisują każdą wartość tylko raz, więc nie muszę się już martwić o dodatkowe duplikaty. Reszta kodu jest dość prosta, po prostu po pytaniu.
Aktualizacje
Usunięto znak nowej linii z wyniku.
Dzięki @ogregoire za grę w golfa na liczbach całkowitych. MIN_VALUE do 1 << 31!
Po ponownym przejrzeniu kodu znalazłem jeszcze kilka miejsc, w których można grać w golfa.
Dzięki @Blue za lewę == 0 do <1!
Usunięto resztki białych znaków. Również do separacji potrzebny jest tylko jeden znak, więc nie musisz marnować jednego znaku.
Jeszcze raz dziękuję @ogregoire za wskazanie, że mogę zwrócić wartość zamiast wydrukować ją i złożyć deklaracje! To bardzo oszczędzało!
Dowiedziałem się, że mogę użyć trójki zamiast drugiej, aby zaoszczędzić jeszcze jeden znak.
Dzięki @AstronDan za niesamowite wykorzystanie tablicy, która oszczędza import. To dało mi również możliwość skrócenia pierwszego, jeśli do trójki.
źródło
Integer.MIN_VALUE
można skrócić jako1<<31
.int
w tym samym miejscu, aby uniknąć powtarzania ichint
kilka razy, i przypisz im ich wartość, jeśli to możliwe.System.out.println(...)
i zwróć wartość zamiast go drukować: jak wspomina OP, używana jest standardowa metoda I / O.Właściwie 21 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Actually Programming Language
i nic nie znalazłem nawet po przejrzeniu 5. strony wyników Google. Co to za język?MATL , 18 bajtów
Wypróbuj online!
Ostatni przypadek kompilatora online trwa zbyt długo, ale daje poprawny wynik (zajmuje to około 11 sekund na moim komputerze, działającym na Matlabie):
Wyjaśnienie
Proste zastosowanie opisanej procedury.
źródło
C #, 194 bajtów
Mój pierwszy Code Golf :). Użyłem mojego ulubionego języka pomimo jego gadatliwości. Zacząłem od tego jako portu funkcji C # w Javie @ Frozn, ale znalazłem kilka sposobów dalszego zmniejszenia kodu dzięki optymalizacji.
To używa tablicy do przechowywania czynników głównych. Ponieważ jest indeksowany przez czynnik, zastąpi powtarzające się czynniki kopiami tego czynnika. Dzięki temu funkcja nie ma importu. To nawet nie wymaga systemu.
źródło
Narzędzia Bash + GNU, 74
seq
generuje wszystkie liczby całkowite od 2 do nfactor
podaje liczbę, po której następuje dwukropek, a następnie rozdzieloną spacjami listę wszystkich czynników pierwszych, w tym duplikatów. np. wynik dla 12 to12: 2 2 3
sed
usuwa dwukropek i duplikaty czynników, a następnie generuje wymagane wyrażenie arytmetyczne. np. dla 12:12- 2* 2- 3* 3
bc
ocenia tonl
prefiksy n z powrotem (od 2)sort
według drugiej kolumny, numerycznie, w porządku malejącymseq
wypisuje pierwszą linię i wychodzi.Ideone.
źródło
Brachylog , 48 bajtów
Wyjaśnienie
źródło
Galaretka , 13 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
05AB1E,
191716 bajtówKod:
Wyjaśnienie:
Wypróbuj online
źródło
Julia, 56 bajtów
Wypróbuj online!
Jak to działa
Biorąc pod uwagę wartość wejściową n , dla każdej liczby całkowitej k takiej, że 2 ≤ k ≤ n , generujemy krotkę (f (k), k) , gdzie f (k) jest różnicą między k a sumą kwadratów jej czynników pierwszych .
f (k) oblicza się za pomocą tego
k-sumabs2(k|>factor|>keys)
, który uwzględnia k w Dyktat liczb pierwszych i wykładników, wyodrębnia wszystkie klucze (czynniki pierwsze), pobiera sumę ich kwadratów i odejmuje wynikową liczbę całkowitą od k .Na koniec bierzemy maksimum leksykograficzne wygenerowanych krotek i odwracamy je, uzyskując dostęp do wskaźników 2 i 1 .
źródło
Clojure, 215 bajtów
Po prostu przestrzega zasad. Oblicza czynniki pierwsze każdej liczby, oblicz je i zsumuj. Następnie wygeneruj listę wektorów 2 elementów: liczby początkowej i jej wyniku i znajdź element o maksymalnej wartości drugiego elementu.
Możesz to zobaczyć online tutaj: https://ideone.com/1J9i0y
źródło
R 109 bajtów
I oszukany i używane pakietu
gmp
.źródło
CJam, 32 bajty
Wypróbuj online!
źródło
Pyke, 17 bajtów
Wypróbuj tutaj!
źródło
PowerShell v2 +,
124120117 bajtówPierwszy wiersz oblicza wartości, drugi to tylko wynik.
Zaczynamy od utworzenia zakresu od
2
naszego argumentu wiersza poleceń$args[0]
i zapętlamy go|%{...}
. W każdej pętli ustawiamy zmienne pomocnicze równe naszej bieżącej wartości$y=$z=$_
. Następnie przeglądamy każdy numer od2
naszego obecnego numeru. W każdej wewnętrznej pętli sprawdzamy, czy liczba ta jest dzielnikiem!($z%$_)
i czy jest liczbą pierwszą('1'*$_-match'^(?!(..+)\1+$)..')
, a jeśli obie, odejmujemy kwadrat$y
(kontrole są wykonywane przy użyciu mnożenia logicznego).Po przejściu przez wszystkie podstawowe dzielniki i odjęciu kwadratów, jeśli pozostała liczba jest największa, jaką widzieliśmy do tej pory
$y-gt$o
, ustawiamy nasze zmienne wyjściowe$o=$y;$p=$_
. Po przejściu przez cały zakres po prostu wyprowadzamy z odstępem między.źródło
Haskell, 91 bajtów
Przykład użycia:
f 50
->[48,35]
.Funkcje współczynnika głównego są dostępne tylko za pośrednictwem,
import Data.Numbers.Primes
które kosztują zbyt wiele bajtów, więc używam sprawdzania liczb pierwszych @ Lynn . Reszta jest prosta: dla wejściam
pętlin
przez[2..m]
w wewnętrznej pętlip
przez[2..n]
. Zachowaj wszystko,p
co najważniejsze, dzieln
, kwadrat i suma.źródło
Python 2,
108105100 bajtówPrzetestuj na Ideone .
źródło
JavaScript (ES6),
111105 bajtówNie mam pojęcia, dlaczego wcześniej nie myślałem o tym rekurencyjnie.
źródło
J, 44 bajty
Proste podejście. Zwraca również wszystkie wartości
n
tego wyniku w maksymalnej wartości.Stosowanie
źródło