Schreiben Sie einen Code, der bei einer positiven Zahl als Eingabe den größten positiven Teiler von kleiner oder gleich der Quadratwurzel von ausgibt .
Mit anderen Worten, finde das größte so, dass
(Exists größer als oder gleich , so daß mal ist )
Wenn die Eingabe beispielsweise die Teiler , , , , und . , und multiplizieren sich alle mit größeren Zahlen, um zu erhalten , aber ist die größte, also geben wir .
Dies ist Codegolf, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes als bessere Bewertung gelten.
Testfälle
(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)
Antworten:
Python3 ,
4947 BytesErläuterung
l=x**.5//1
→ Weisen Siel
die größte Ganzzahl zu, die kleiner als die Quadratwurzel von istx
while x%l:l-=1
→ Währendl
sich nicht gleichmäßig teiltx
, wird dekrementiertl
.Bearbeitungen
...//1
zwei Bytes zu speichern. (Dezimalzahlen sind in Ordnung! Danke @Rod)quelle
input
/print
stattdef
/return
, können Sie auch ersetzenint(...)
mit...//1
mehr Bytes zu speichern , wie Sie sehen hierMATL , 7 Bytes
Probieren Sie es online!
Für diese Erklärung verwenden wir '12' als Beispieleingabe. Erläuterung:
Dies funktioniert aufgrund vieler glücklicher Zufälle.
<n>)
indizierenquelle
Z\J2/)
(J2/
oder gleichwertig.5j
steht für,end/2
wenn als Index verwendet)C (gcc)
-lm
, 35 BytesProbieren Sie es online!
quelle
sqrt
eine integrierte Funktion erkennt. Mit-fno-builtin-sqrt
, nimmt gcc anint sqrt(int)
und übergibt keindouble
. Auf x86-64double
wird in einem anderen Register als eine Ganzzahl übergeben. Bei 32-Bitdouble
würde a 2 Slots auf dem Stapel belegen, sodass Sie auch Garbage übergeben würden (oder ein Subnormal mit der Ganzzahl als unterster Mantisse, wenn die oberen 32 Bit Null wären). Dies funktioniert auch nur, wenn Sie einen Debugbuild durchführen, da es auf dem nicht optimierten Standardcode von gcc zur Auswertung von Ausdrücken im Rückgabewertregister basiert.sqrt()
Problem ist anders: Ich war gespannt, wie das funktioniert, weil der Anrufer irgendwie wissen muss, in was er konvertierenint
solldouble
. Ich habe die Antwort darauf als Kommentar gepostet, falls jemand anders neugierig war. Effektiv hat gccsqrt
(einschließlich Prototyp) als eingebaut, sonst würde dies aus Gründen scheitern, die wir manchmal in SO asm Qs seheni;f(n){for(i=0;++i<n/i||n%i;);}
ist 31B und funktioniert mitgcc -O
x86-64 (kostet 2 oder 3 Bytes mehr für die Befehlszeilenoption). Die Verwendung||
von|
gcc bewirkt nicht, dass dasn/i
Ergebnisidiv
in EAX, dem Rückgabewertregister ( godbolt.org/g/RJYeui), belassen wird ). Das undefinierte Verhalten von++i
ohne Sequenzpunkt funktioniert zufällig. (Der erzeugte asm ist im Grunde derselbe wie meine x86-Maschinencode-Antwort .) Mit-O0
scheint gcc immeri
in EAX zu bleiben, aber vielleicht können wir das verwenden ...05AB1E , 5 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
APL (Dyalog Unicode) ,
161412 BytesIch bin froh, dass ich eine Antwort in APL schreiben konnte, da ich es gerade erst gelernt habe. Vielen, vielen Dank an Adám für die Hilfe beim Golfen. Golfvorschläge sind sehr willkommen. Probieren Sie es online!
Weitere Informationen zu APL finden Sie unter The APL Orchard .
BEARBEITEN: -2 Bytes zur Behebung eines Problems mit meinem Code. Vielen Dank an H.PWiz für den Hinweis auf dieses Problem. -2 Bytes von alles wieder verkürzen.
Ungolfing
quelle
Schale , 4 Bytes
Probieren Sie es online!
Erläuterung
quelle
R ,
4533 BytesProbieren Sie es online!
Original:
Probieren Sie es online!
quelle
x86 32-Bit-Computercode (IA32):
18 bis16 ByteChangelog: Behandle den
n=1
Testfall korrekt, speichere 2 Bytes und kehre in EAX zurück.Zählen Sie bis
n/i <= i
(dh bis zum Erreichen des sqrt) und verwenden Sie danach den ersten exakten Divisor.Eine 64-Bit-Version davon kann mit der Aufrufkonvention x86-64 System V von C aus aufgerufen werden
int squarish_root_countup(int edi)
.nasm -felf32 -l/dev/stdout squarish-root.asm
:Probieren Sie es online! mit einem asm-Aufrufer, der das erste Byte von argv [1] direkt als Ganzzahl verwendet und das Ergebnis als Prozess-Exit-Status verwendet.
quelle
Japt
-h
,86 BytesVersuch es
2 Bytes gespart dank Oliver
Erläuterung
quelle
Gelee , 5 Bytes
Probieren Sie es online!
quelle
JavaScript ES7,
3331 BytesProbieren Sie es online aus
quelle
Schneemann , 38 Bytes
Probieren Sie es online!
quelle
dc , 24
Probieren Sie es online!
Erläuterung:
quelle
J,
2419 Bytes-5 Bytes dank Sherlocks GCD-Idee
Probieren Sie es online!
ursprüngliche Antwort
Probieren Sie es online!
analysiert
Erläuterung
1 + i.@<.@%:
gibt den Bereich an1 .. floor(sqrt)
.(A) B
bildet einen Haken, wobei der obige Bereich als rechtes Argument]
an A und die ursprüngliche Zahl als linkes Argument übergeben wird[
. Somit...] | [
gibt den verbleibenden Teil eines jeden Artikels in dem Bereich an, der in das ursprüngliche Argument unterteilt ist.0 = ] | [
gibt den Teilern keinen Rest.] #~ ...
filtert dann den Bereich und lässt nur diese übrig.{:
gibt das letzte Element in der Liste an, dh das größte.quelle
Gelee , 5 Bytes
Probieren Sie es online!
quelle
Haskell , 36 Bytes
Probieren Sie es online!
Nun, das ist meine Antwort auf diese Herausforderung. Dies verwendet ein bestimmtes Listenverständnis, um die Antwort zu finden. In unserem Listenverständnis wählen wir ausy von der unendlichen Liste z aus der Liste ( y, z) sind alle geordneten Paare so, dass y≥ z .
[1..]
, die die positiven ganzen Zahlen ist, und wir holen[1..y]
. Das bedeutet, dassWir wählen dann nur die Paare so aus, dassy⋅ z= x Dies bedeutet, dass wir die Liste aller Paare von Zahlen erstellen, die sich multiplizieren x . Seitdem basiert unser Verständnis zunächst aufy und dann z Dies bedeutet, dass unsere Paare in aufsteigender Reihenfolge von y , oder sinnvoller in absteigender Reihenfolge von z .
Also, um das Größte zu bekommenz wir nehmen die z Zugehörigkeit zum ersten Element. Das ist unser Ergebnis.
quelle
QBasic (4.5), 52 Bytes
quelle
Viertens (gviertens) , 53 Bytes
Der kürzeste Weg scheint die Verwendung des Gleitkommastapels zu sein, und
fsqrt
der kürzeste, den ich ohne diesen Stapel bekommen könnte, war die Verwendung von 62 Bytes/mod
und die Überprüfung, ob der Quotient größer als der Divisor war.Probieren Sie es online!
Erläuterung
Code-Erklärung
quelle
F #,
5549 BytesProbieren Sie es online!
Seq.findBack
: Gibt das letzte Element zurück, für das die angegebene Funktion zurückgibtTrue
. Die Funktion prüft in diesem Fall, ob eine Zahl ein Wertfaktor ist.quelle
Brain-Flak , 144 Bytes
Probieren Sie es online!
Ich bin mir nicht sicher, ob diese Antwort wirklich gut ist. Ich habe das Gefühl, dass es einen guten Weg gibt, diese Aufgabe zu lösen, aber ich bin einfach nicht schlau genug.
Erläuterung
Ich habe versucht, eine Explosionsansicht der Antwort zu erstellen, aber es gibt so viele bewegliche Teile, dass es nicht sehr aufschlussreich war. Hier finden Sie eine Erläuterung der Funktionsweise des Codes.
Der erste wichtige Punkt ist dies
Dabei werden die beiden Zahlen oben auf dem Stapel abgelegt. Wenn sie ungleich sind, wird die zweite Zahl inkrementiert. Wenn sie gleich sind, wird die erste Zahl inkrementiert und die zweite durch Null ersetzt. Wenn wir diesen Code ein paar Mal wiederholen, erhalten wir alle Paare( x , y) so dass x ≥ y .
Der nächste Teil ist die Multiplikation mit Änderungen aus dem Wiki . Diese Multiplikation ist besonders, weil sie die vorhandenen Werte beibehält, ohne sie zu zerstören. Es geht so:
Wir multiplizieren also alle diese geordneten Paare. Für jedes Ergebnis prüfen wir, ob es der Eingabe entspricht. In diesem Fall kündigen wir und senden den kleineren Artikel des Paares zurück.
quelle
Python 2 , 41 Bytes
Probieren Sie es online!
quelle
Gelee , 6 Bytes
Probieren Sie es online!
quelle
Perl 5
-p
, 26 BytesProbieren Sie es online!
quelle
Rust,
71-70BytesVor-uglified Version
Bearbeitungen
> 0
über!= 0
. (Danke an @CatWizard)quelle
!=
durch ersetzt werden>
?Japt , 8 Bytes
Probieren Sie es online!
quelle
Dreieckigkeit , 49 Bytes
Probieren Sie es online!
quelle
Pyret , 93 Bytes
Sie können dies online versuchen, indem Sie es in den Online-Pyret-Editor kopieren !
Das obige wird zu einer anonymen Funktion ausgewertet. Wenn es auf eine Ganzzahl angewendet wird, gibt es ein Ergebnis gemäß der Spezifikation zurück.
quelle
Eigentlich 7 Bytes
Basierend auf meiner APL-Antwort hier . Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle
Ein Port dieser Mathematica-Antwort .
Jelly , 11 Bytes
Probieren Sie es online!
Dies (11 Bytes) funktioniert auch und ist nicht abhängig von
³
:Leider
½Ḟ÷@Ċ÷@ʋÐL
(10 Bytes) funktioniert nicht. Und anscheinendƬ
undÐĿ
ist nicht genau das gleiche (wenn der Link dyadisch ist)Methode: (letn die Eingabe sein)
quelle
Java 8,
6554 BytesPort von @huntekes Python 3 Antwort .
Probieren Sie es online aus.
Alte 65-Byte-Antwort:
Probieren Sie es online aus.
Erläuterung:
quelle