Porozmawiajmy o dzielnikach ...
Pomijając na chwilę idealne kwadraty, wszystkie dodatnie liczby całkowite można wyrazić jako iloczyn 2 ich dzielników. Szybki przykład dla 126
: Oto wszystkie dzielniki126
Jak widać, wszystkie dzielniki można sparować. Oto, co nazwiemy parami dzielników :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]
Do tego wyzwania potrzebujemy tylko ostatniej pary z tej listy (która jest środkową parą obrazka):
[9,14]
Nazwiemy tę parę parą dzielnika MaxMin . Różnica maxmin dzielnik Pair (DMDP) jest różnicą pomiędzy dwoma elementami pary, która jest
jeszcze jeden przykład dla . Dzielnikami są:
[9,14]=5
544
[1, 2, 4, 8, 16, 17, 32 , 34, 68, 136, 272, 544]
i DMDP (544) = 15, ponieważ32-17=15
Co z idealnymi kwadratami ? Wszystkie idealne kwadraty mają DMDP = 0
Weźmy na przykład 64
dzielniki
{1, 2, 4, 8 , 16, 32, 64}
Jak widać w tym przypadku, para dzielników MaxMin jest [8,8]
już DMDP=0
prawie gotowa.
Wyzwanie
Biorąc pod uwagę liczbę całkowitą n>0
, wypisz ile liczb całkowitych mniejszych lub równych 10000
, DMDP mniej niż n
Przypadki testowe
wejście -> wyjście
1->100 (those are all the perfect squares)
5->492
13->1201
369->6175
777->7264
2000->8478
5000->9440
9000->9888
10000->10000
20000->10000
To jest golfowy kod. Krótka odpowiedź w bajtach wygrywa .
10000
drugą zmienną wejściową?Odpowiedzi:
JavaScript (ES7), 60 bajtów
Prawdopodobnie przekracza limit rekurencji, więc możesz wybrać wersję iteracyjną dla 70 bajtów:
źródło
Galaretka , 13 bajtów
1 bajt dzięki Jonathan Allan.
Wypróbuj online!
źródło
ÆDạ"Ṛ$Ṃ
oszczędza ci bajtÆDạ:@¥⁸Ṃ
(miałemạ"ṚṂ
...ȷ4RÆDÇ€<⁸S
za 15 - zbyt podobny - EDYCJA: hmm, czy to było, nie było:
zaangażowane ... co myślisz?)Java 8,
151111110101 bajtów-10 bajtów dzięki @Nevay .
Wyjaśnienie:
Wypróbuj tutaj.
źródło
for(i=1,i+=Math.sqrt(x);--i>0;)if(...
aby zapisać 1 bajt.n->{int r=0,x=10000,i;for(;x-->0;r-=i-n>>-1)for(i=x;i-->1;)if(x>=i*i&x%i<1){i=x/i-i;break;}return r;}
x>=i*i
jako alternatywę dla używaniaMath.sqrt
, ponieważ po raz drugi grałeś w golfa w moim kodzie.R , 73
77bajtówDzięki @Guiseppe za 4 bajty
Wypróbuj online!
Straciłem funkcję wektoryzacji, aby obliczyć DMDP, i używa teraz sapply nad funkcją. Prawdy dla przedmiotów, które są mniejsze niż dane wejściowe, są sumowane dla wyniku.
źródło
sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())
jest nieco krótszyMathematica, 64 bajty
Wypróbuj na Wolfram Sandbox
Stosowanie
Wyjaśnienie
Wygeneruj listy dzielników, od
1
do10000
. (listy dzielników są sortowane automatycznie)Policz wystąpienia elementów
a
, takie jak ...(input) + (left one of the middle element(s)) > (right one of the middle element(s))
Jeśli jest tylko jeden środkowy element, left = right.źródło
05AB1E ,
191817161512 bajtówWypróbuj online!
Wyjaśnienie
źródło
MATL , 20 bajtów
Przekroczono limit czasu w TIO. Oto przykład uruchomienia z kompilatorem offline:
źródło
R , 91 bajtów
Przy obliczaniu DMDP stosuje inne (gorsze) podejście niż rozwiązanie MickyT, stosując indeksowanie tablic i
diff
obliczanie go. Niestety.Wypróbuj online!
źródło
Mathematica,
119115 bajtówW końcu udało mi się to uruchomić i próbowałem przez ostatnie pół godziny. ._.
Przykładowy przebieg
źródło
Cases
Jest4
bajtów krócej:Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&
. Zobacz tę wskazówkę .Count
jest nawet krótszy niżCases
.Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]&
10^4
lub1*^4
jest krótszy niż10000
i/@Range@
jest równoważny~Array~
.Mathematica, 78 bajtów
źródło
Cases
Jest4
bajtów krócej:Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&
. Zobacz tę wskazówkę .Count
jest jeszcze krótszy:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]&
Łuska , 19 bajtów
Brak linku TIO, ponieważ upłynął limit czasu. Ta wersja używa 100 zamiast 10000 i kończy się w ciągu kilku sekund.
Wyjaśnienie
Husk nie ma jeszcze wbudowanych dzielników ani wsparcia notacji naukowej.
źródło
Japt ,
251917 bajtówSprawdź to
Wyjaśnienie
Domniemane wprowadzenie liczby całkowitej
U
.Wygeneruj tablicę liczb całkowitych (
õ
) od 1 do 100 (L
) podniesionych do kwadratu.Przekaż każdą przez funkcję (gdzie
X
jest bieżącym elementem), która generuje tablicę dzielników (â
) zX
.Odwzoruj na tej tablicy dzielników, gdzie
Z
jest bieżący element.Uzyskaj różnicę bezwzględną (
a
)Z
iX
podzielone przezZ
.Czy któryś z elementów (
d
) w wynikowej tablicy jest mniejszy niżU
?Policz prawdziwe elementy i w sposób dorozumiany wyprowadź wynik.
źródło
Rubin, 62 bajty
Wypróbuj online.
źródło
TI-BASIC, 46 bajtów
Zauważ, że TI-BASIC jest językiem tokenizowanym. Ponadto E w wierszu 2 jest małą dużą literą E, znalezioną po naciśnięciu 2ND +,.
Wynik będzie w D, a Ans natychmiast po wykonaniu programu. Jeśli ma być wyświetlony,
Ans
wystarczy dodać jeszcze dwa bajty (znak nowej linii i ).źródło
Python 2 , 134 bajty
Wypróbuj online!
Eugh ... trzeba zrobić znacznie lepiej.
źródło
len(filter(lambda n:n<i,...))
jesum(n<i for n in ....)
Python 2 , 83 bajty
Trochę wolniej, zużywa 5 sekund na przypadek testowy
Wypróbuj online!
źródło
PHP, 94 + 1 bajtów
Uruchom jako potok z
-nR
lub spróbuj online .źródło
VB.NET (.NET 4.5)
116115 bajtówWyjaśnienie:
Funkcja, która bierze
n
jako parametr i zwraca wynik.Zaczyna się od pierwiastka kwadratowego i szuka najbliższej liczby całkowitej, która równomiernie dzieli (będzie mniejsza z
MaxMin Divisor Pair
). Następnie pobiera większą z pary (i/s
), znajduje różnicę i porównuje dane wejściowe.Zastosowane strategie golfowe:
Dim
jest drogi, więc im mniej zmiennych deklaruję, tym lepiej.s
jako integralny typ, rzuca mnie na podłogę.^
jako wykładnik. Więc chociaż10000
ma 5 znaków,10^4
ma tylko 4.return
, wartość zmiennej funkcji zostanie zwrócona. Zapisuję więc znaki, nie deklarując osobnej zmiennej i nie używając instrukcji return.i
zakłada się,Integer
ponieważ przypisałem literałowi całkowitemu.A
zakłada się,Object
ale jak tylko dodam liczbę całkowitą, zachowuje się jakInteger
.if
sprawdzać, czy różnica jest zadowalająca, dodaj ją bezpośrednio do wyniku, przesyłając wartość logiczną na liczbę całkowitą. Jednak VB używa-1
doTrue
, więc odejmij, aby uzyskać poprawny znak.Mod
, aby nie być0
. Biorąc moduł liczby ujemnej w VB.NET da wynik ujemny. Ale wszystko jest pozytywne, więc mogę zaoszczędzić bajt, zamieniając się<>
w>
.Byte
tego, aby zapisać, oszczędzając bajty w deklaracji, używając krótszego nazwanego typu.Wypróbuj online!
źródło
C # (.NET Core) , 104 bajty
Wypróbuj online!
źródło