Napisz kod, który po podaniu liczby dodatniej jako wartości wyjściowej wyprowadza największy dodatni dzielnik mniejszy lub równy pierwiastkowi kwadratowemu z .x x
Innymi słowy, znajdź największą taką, że
(Występuje większe lub równe tak, że razy jest )n m n x
Na przykład, jeśli dane wejściowe wynosiły dzielnikami są , , , , i . , i wszystkie mnożą się przez większe liczby, aby uzyskać , ale jest największym, więc zwracamy .1 2
To jest golf golfowy, więc odpowiedzi będą oceniane w bajtach, a mniej bajtów będzie uważanych za lepszy wynik.
Przypadki testowe
(1,1)
(2,1)
(3,1)
(4,2)
(5,1)
(6,2)
(7,1)
(8,2)
(9,3)
(10,2)
(11,1)
(12,3)
(13,1)
(14,2)
(15,3)
(16,4)
(17,1)
(18,3)
(19,1)
(20,4)
(21,3)
(22,2)
(23,1)
(24,4)
(25,5)
(26,2)
(27,3)
(28,4)
(29,1)
(30,5)
(31,1)
(32,4)
(33,3)
(34,2)
(35,5)
(36,6)
(37,1)
(38,2)
(39,3)
(40,5)
(41,1)
(42,6)
(43,1)
(44,4)
(45,5)
(46,2)
(47,1)
(48,6)
(49,7)
(50,5)
Odpowiedzi:
Python3 ,
4947 bajtówWyjaśnienie
l=x**.5//1
→ Przypiszl
największą liczbę całkowitą mniejszą niż pierwiastek kwadratowy zx
while x%l:l-=1
→ Chociażl
nie dzieli się równomierniex
, zmniejsza sięl
.Edycje
...//1
aby zapisać dwa bajty. (Dziesiętne są w porządku! Dzięki @Rod)źródło
input
/print
zamiastdef
/return
można również wymienićint(...)
się...//1
uratować więcej bajtów jak widać tutajMATL , 7 bajtów
Wypróbuj online!
W tym wyjaśnieniu użyjemy „12” jako próbki wejściowej. Wyjaśnienie:
Działa to z powodu wielu szczęśliwych zbiegów okoliczności.
<n>)
źródło
Z\J2/)
(J2/
lub równoważnie.5j
oznacza,end/2
gdy jest używany jako indeks)C (gcc)
-lm
, 35 bajtówWypróbuj online!
źródło
sqrt
funkcję wbudowaną. Z-fno-builtin-sqrt
, gcc zakładaint sqrt(int)
i nie przechodzi przezdouble
. Na x86-64double
jest przekazywany do innego rejestru niż liczba całkowita. W wersji 32-bitowej adouble
zajmie 2 miejsca na stosie, więc będziesz również przekazywał śmieci (lub wartość podnormalną z liczbą całkowitą jako dolną częścią mantysy, jeśli górne 32 bity były równe zero). To również się psuje, chyba że robisz kompilację debugowania, ponieważ opiera się na domyślnym niezoptymalizowanym genem kodu gcc do oceny wyrażeń w rejestrze wartości zwracanych.sqrt()
problem jest inny: Byłem ciekaw, w jaki sposób udało się pracy, ponieważ rozmówca musi jakoś wiedzieć, aby przekształcićint
siędouble
. Odpowiedziałem na to jako komentarz na wypadek, gdyby ktoś był ciekawy. Skutecznie gcc masqrt
(łącznie z prototypem) wbudowaną funkcję, w przeciwnym razie nie udałoby się to z powodów, które czasami widzimy w SO asm Qsi;f(n){for(i=0;++i<n/i||n%i;);}
ma rozmiar 31B i działagcc -O
na x86-64 (kosztuje 2 lub 3 bajty więcej dla opcji wiersza poleceń). Użycie||
zamiast|
powoduje, że gcc pozostawian/i
wynik zidiv
EAX, rejestr wartości zwracanej ( godbolt.org/g/RJYeui ). Działa niezdefiniowane zachowanie++i
bez punktu sekwencji. (Wytworzony asm jest w zasadzie taki sam jak odpowiedź na mój kod maszynowy x86 ). Z-O0
gcc zawsze wydaje się pozostawići
w EAX, ale może możemy tego użyć ...05AB1E , 5 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
APL (Dyalog Unicode) ,
161412 bajtówCieszę się, że mogłem napisać odpowiedź w APL, ponieważ dopiero ją nauczyłem. Bardzo, bardzo dziękuję Adámowi za pomoc w grze w golfa. Sugestie dotyczące gry w golfa bardzo mile widziane. Wypróbuj online!
Aby dowiedzieć się więcej o APL, spójrz na The APL Orchard .
EDYCJA: -2 bajty do rozwiązania problemu z moim kodem. Dzięki H.PWiz za wskazanie tego problemu. -2 bajty od ponownego skrócenia wszystkiego.
Ungolfing
źródło
Łuska , 4 bajty
Wypróbuj online!
Wyjaśnienie
źródło
R ,
4533 bajtówWypróbuj online!
Oryginalny:
Wypróbuj online!
źródło
x86 32-bitowy (IA32) kod maszynowy:
1816 bajtówdziennik zmian:
n=1
poprawnie obsługuj przypadek testowy, zapisz 2 bajty i wróć do EAX.Policz do
n/i <= i
(tj. Kiedy dotrzemy do sqrt), a następnie użyj pierwszego dokładnego dzielnika.Wersja 64-bitowa jest wywoływana z C przy użyciu konwencji wywoływania Systemu V x86-64, as
int squarish_root_countup(int edi)
.nasm -felf32 -l/dev/stdout squarish-root.asm
:Wypróbuj online! z wywołującym asm, który wykorzystuje pierwszy bajt argumentu argv [1] bezpośrednio jako liczbę całkowitą i wykorzystuje wynik jako status zakończenia procesu.
źródło
Japt
-h
,86 bajtówSpróbuj
2 bajty zapisane dzięki Oliverowi
Wyjaśnienie
źródło
Galaretka , 5 bajtów
Wypróbuj online!
źródło
JavaScript ES7,
3331 bajtówWypróbuj online
źródło
Bałwan , 38 bajtów
Wypróbuj online!
źródło
dc , 24
Wypróbuj online!
Wyjaśnienie:
źródło
J,
2419 bajtów-5 bajtów dzięki pomysłowi Sherlocka na GCD
Wypróbuj online!
oryginalna odpowiedź
Wypróbuj online!
przeanalizowane
wyjaśnienie
1 + i.@<.@%:
daje zasięg1 .. floor(sqrt)
.(A) B
tworzy hak, z powyższym zakresem przekazywanym jako prawy argument]
do A, a pierwotna liczba przekazywana jako lewy argument[
. A zatem...] | [
daje pozostałą część każdego elementu w zakresie podzieloną na oryginalny argument.0 = ] | [
daje dzielniki bez reszty.] #~ ...
następnie filtruje zakres, pozostawiając tylko te.{:
podaje ostatni element na liście, tj. największy.źródło
Galaretka , 5 bajtów
Wypróbuj online!
źródło
Haskell , 36 bajtów
Wypróbuj online!
[1..]
[1..y]
źródło
QBasic (4.5), 52 bajty
źródło
Dalej (gforth) , 53 bajty
Najkrótszym sposobem wydaje się być użycie stosu zmiennoprzecinkowego
fsqrt
, a najkrótszym, jaki udało mi się uzyskać bez niego, było użycie 62 bajtów/mod
i sprawdzenie, czy iloraz jest większy niż dzielnik.Wypróbuj online!
Wyjaśnienie
Objaśnienie kodu
źródło
F #,
5549 bajtówWypróbuj online!
Seq.findBack
: Zwraca ostatni element, dla którego dana funkcja zwracaTrue
. Funkcja w tym przypadku sprawdza, czy liczba jest czynnikiem wartości.źródło
Brain-Flak , 144 bajty
Wypróbuj online!
Nie jestem pewien, czy ta odpowiedź jest bardzo dobra. Wydaje mi się, że może być dobry sposób na rozwiązanie tego zadania, ale po prostu nie jestem wystarczająco sprytny.
Wyjaśnienie
Próbowałem zrobić rozłożony widok odpowiedzi, ale jest tak wiele ruchomych części, że nie było to bardzo pouczające, więc oto wyjaśnienie tego, co robi kod.
Pierwszy ważny bit to
Następną częścią jest mnożenie, pobrane z modyfikacją z wiki . To zwielokrotnienie jest wyjątkowe, ponieważ zachowuje istniejące wartości bez ich niszczenia. To wygląda tak:
Pomnożymy więc wszystkie te uporządkowane pary. Dla każdego wyniku sprawdzamy, czy jest on równy wartości wejściowej. Jeśli tak, zakończymy i zwrócimy mniejszy element w parze.
źródło
Python 2 , 41 bajtów
Wypróbuj online!
źródło
Galaretka , 6 bajtów
Wypróbuj online!
źródło
Perl 5
-p
, 26 bajtówWypróbuj online!
źródło
Rdza,
7170 bajtówWersja wstępnie zlepiona
Edycje
> 0
ponad!= 0
. (Dzięki @CatWizard)źródło
!=
zastąpić>
?Japt , 8 bajtów
Wypróbuj online!
źródło
Trójkątność , 49 bajtów
Wypróbuj online!
źródło
Łeb , 93 bajty
Możesz tego spróbować online, kopiując go do internetowego edytora Pyret !
Powyższe odnosi się do funkcji anonimowej. Po zastosowaniu do liczby całkowitej zwraca wynik zgodnie ze specyfikacją.
źródło
Właściwie 7 bajtów
Na podstawie mojej odpowiedzi APL tutaj . Zapraszamy do gry w golfa! Wypróbuj online!
Ungolfing
źródło
Część tej odpowiedzi Mathematica .
Galaretka , 11 bajtów
Wypróbuj online!
To (11 bajtów) również działa i nie zależy od
³
:Niestety
½Ḟ÷@Ċ÷@ʋÐL
(10 bajtów) nie działa. I widocznieƬ
iÐĿ
nie jest dokładnie taka sama (jeśli link jest dwójkowym)źródło
Java 8,
6554 bajtówPort odpowiedzi @hunteke na Python 3 .
Wypróbuj online.
Stara 65 bajtów odpowiedź:
Wypróbuj online.
Wyjaśnienie:
źródło