Definitionen
- Ein perfektes Quadrat ist eine ganze Zahl, die als Quadrat einer anderen ganzen Zahl ausgedrückt werden kann. Zum Beispiel
36
ist ein perfektes Quadrat, weil6^2 = 36
. - Eine quadratfreie Zahl ist eine ganze Zahl, die mit Ausnahme von durch kein perfektes Quadrat teilbar ist
1
. Zum Beispiel10
ist eine quadratische Zahl. Allerdings12
ist keine Zahl quadrat, weil12
teilbar durch4
und4
ist ein perfekter Platz.
Aufgabe
Bei einer positiven Ganzzahl n
wird die größte teilende quadratfreie Zahl ausgegeben n
.
Testfälle
n output
1 1
2 2
3 3
4 2
5 5
6 6
7 7
8 2
9 3
10 10
11 11
12 6
13 13
14 14
15 15
16 2
17 17
18 6
19 19
20 10
21 21
22 22
23 23
24 6
25 5
26 26
27 3
28 14
29 29
30 30
31 31
32 2
33 33
34 34
35 35
36 6
37 37
38 38
39 39
40 10
41 41
42 42
43 43
44 22
45 15
46 46
47 47
48 6
49 7
50 10
Wertung
Das ist Code-Golf . Kürzeste Antwort in Bytes gewinnt.
Es gelten Standardlücken .
Referenz
code-golf
math
arithmetic
number-theory
Undichte Nonne
quelle
quelle
Antworten:
05AB1E , 2 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Brachylog , 3 Bytes
Probieren Sie es online!
Eine sehr originelle Antwort ...
Erläuterung
quelle
JavaScript (ES6),
55545046 ByteOEIS zitieren :
a (n) ist der kleinste Teiler u von n, so dass n u ^ n teilt
Aktualisierte Implementierung:
a (n) ist der kleinste
Teiler u von npositiven ganzen Zahlen u, so dass n u ^ n teiltquelle
MATL ,
64 Bytes2 Bytes mit Hilfe von @LeakyNun gespeichert
Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
48
.quelle
Gelee , 4 Bytes
Probieren Sie es online!
quelle
CJam , 8 Bytes
Warum muss jede Operation in diesem Programm aus 2 Bytes bestehen -_-
Probieren Sie es online!
quelle
Retina ,
363028 BytesEin- und Ausgabe in unary .
Probieren Sie es online! (Beinhaltet eine Kopf- und Fußzeile zur dezimalen <-> unären Konvertierung und zur gleichzeitigen Ausführung mehrerer Testfälle.)
Erläuterung
Die Idee ist, die Eingabe als ein Quadrat mal einen Faktor abzugleichen. Der grundlegende reguläre Ausdruck zum Abgleichen eines Quadrats verwendet eine Vorwärtsreferenz, um Summen aufeinanderfolgender ungerader Ganzzahlen abzugleichen:
Da wir perfekte Quadrate nicht passen wollen, aber Zahlen , die durch ein Quadrat teilbar sind, ersetzen wir , dass
1
mit einer Rückreferenzierung selbst:Die äußere Gruppe
1
wird also n- mal verwendet, wobei n 2 das größte Quadrat ist, das die Eingabe teilt, und die Gruppe2
den verbleibenden Faktor speichert. Was wir wollen, ist, die ganze Zahl durch n zu teilen , um das Quadrat zu entfernen. Das Ergebnis kann als die Anzahl der Iterationen von Gruppe zu1
Gruppe ausgedrückt werden2
, dies ist jedoch etwas schwierig. Retina$*
wird wahrscheinlich bald verbessert, um ein Nicht-Zeichen-Token als Argument für die rechte Hand zu verwenden. In diesem Fall könnten wir dies einfach ersetzen$#1$*$2
, aber das funktioniert noch nicht.Stattdessen zerlegen wir die ungeraden Zahlen unterschiedlich. Kehren wir zum einfacheren Beispiel des Abgleichs perfekter Quadrate mit zurück
(^1|11\1)+$
. Anstatt einen Zähler zu haben,\1
der bei jeder Iteration auf 1 initialisiert und um 2 erhöht wird , haben wir zwei Zähler. Einer wird auf 0 und einer auf 1 initialisiert , und beide werden bei jeder Iteration um 1 erhöht . Wir haben also die ungeraden Zahlen 2n + 1 in (n) + (n + 1) zerlegt . Der Vorteil ist , dass wir am Ende folgendes haben n in einer der Gruppen. In seiner einfachsten Form sieht das so aus:Wo
\2
ist n und\3
ist n + 1 . Wir können dies jedoch ein wenig effizienter tun, indem wir feststellen, dass das n + 1 einer Iteration gleich dem n der nächsten Iteration ist, sodass wir hier Folgendes einsparen können1
:Jetzt müssen wir nur noch einen Anfangsfaktor verwenden, anstatt
1
Eingaben abzugleichen, die durch ein perfektes Quadrat geteilt werden:Jetzt müssen wir nur noch das Ganze durch
$3
das Ende ersetzen , das den Anfangsfaktor multipliziert mit der Anzahl der Schritte speichert und einen Faktor des Quadrats aus der Eingabe entfernt.Dies wird
+
am Anfang des Programms wiederholt durchgeführt, um Eingaben zu berücksichtigen, die höhere Potenzen als Quadrate enthalten.quelle
Oktave, 27 Bytes
Ähnliches Vorgehen wie bei den anderen Antworten. Der Unterschied ist: Die Funktionen haben viel längere Namen. Ich glaube, der Code erklärt sich von selbst: Nimmt die
prod
Summe derunique
Primzahlenfactor
einer Zahl.quelle
Wolfram-Sprache,
2928 Bytes-1 Danke an @Martin Ender ♦
Erläuterung:
quelle
Times@@(#&@@@FactorInteger@#)&
Most
Lässt es als Liste. Sie müssenFirst
den Wert erhalten.Python , 37 Bytes
Probieren Sie es online!
Der größte quadratfreie Teiler von
n
ist die kleinste Zahlr
mit allenn
Primfaktoren. Wir können dies alsr**n%n==0
, dar**n
machenn
Kopien von jedem Primfaktorr
und ist teilbar durchn
nur , wenn jedern
‚s Primfaktoren vertreten ist.Das
1>>r**n%n
ist gleichbedeutend mitint(r**n%n==0)
. WennTrue
Ausgang 1 verwendet werden kann, sind es 2 Byte weniger.quelle
Mathematik , 40 Bytes
Probieren Sie es online!
quelle
Times@@#&@@Transpose@FactorInteger@#&
Spart 3 Bytes (#&@@
ist ein Standardtrick[[1]]
und kann in solchen Fällen oft zusätzliche Bytes in Klammern einsparen).Thread
anstelle von verwendenTranspose
. In Mathematica gibt es auch einen 3-Byte-Operator fürTranspose
, aber ich weiß nicht, ob Mathics ihn unterstützt.#&@@(1##&@@FactorInteger@#)&
vermeidet die NotwendigkeitTranspose
zusammen. (1##&@@
Ist nurTimes@@
in der Verkleidung, die funktioniert gut auf die geordneten Paare nachgegebenFactorInteger
; und'#&@@
istFirst@
in der Verkleidung.)Alice , 4 Bytes
Probieren Sie es online!
Eingabe und Ausgabe werden als Codepunkt eines Zeichens angegeben (funktioniert für alle gültigen Unicode-Codepunkte).
Erläuterung
Nun, Alice hat eine eingebaute,
D
deren Definition "Deduplizieren Primfaktoren" ist. Das heißt, solange ein Wert für eine Primzahl p durch etwas p 2 teilbar ist , dividiere diesen Wert durch p . Dies ist genau die Funktion, die für diese Herausforderung erforderlich ist. Der Rest ist nur Eingabe, Ausgabe, Programm beenden.Der Grund, warum dies zu Alice hinzugefügt wurde, hat eigentlich nichts mit dieser Ganzzahlsequenz zu tun. Ich habe versucht, mich an das Thema zu halten, Teiler mit Teilzeichenfolgen und Primfaktoren mit Zeichen zu verknüpfen. Und ich brauchte eine Funktion, die zu "deduplizierten Zeichen" passt (was im Allgemeinen viel nützlicher ist, weil Sie damit Zeichenfolgen als Mengen behandeln können, insbesondere wenn sie zusammen mit den verschiedenen Multiset-Operatoren verwendet werden).
quelle
Haskell , 31 Bytes
Probieren Sie es online!
quelle
Pyke , 3 Bytes
Probieren Sie es online!
quelle
Prolog (SWI) ,
8439 BytesProbieren Sie es online!
Die Idee von @ xnors Haskell-Antwort wurde an Prolog angepasst .
quelle
PHP, 70 Bytes
Probieren Sie es online!
quelle
Pyth,
86 Bytes* -2 Bytes dank @LeakyNun
Wäre 3, wenn Pyth ein eingebautes Produkt für Listen hätte ...
Versuch es!
quelle
*F+1{P
stattdessen verwenden.C
6550 BytesVielen Dank an @ Ørjan Johansen für die Beseitigung der Notwendigkeit für
r
. Dank dieser und einiger anderer schmutziger Tricks konnte ich 15 Bytes wegpressen!while
ist weg und ersetzt mit||
und Index Twiddling.<=
sollte die<
ganze Zeit gewesen sein.<=
gedreht,<
indem Sie das Inkrement bewegen, um zu erhaltenn%(++d*d)
(sollte aufgrund der Priorität des Operators genau definiert sein).Originalcode:
quelle
r
und stattdessen verwendenwhile(n%(d*d)<1)n/=d;
.++d*d
ist in den C-Standards absolut nicht gut definiert - es ist ein klassischer Fall von explizit undefiniertem Verhalten. Aber wir werden hier sowieso Implementierungen durchführen.d++<n
, was gut definiert ist, noch funktionieren? Ich denke, die alte Version ging den ganzen Wegn+1
(harmlos).d++<n
, wenn Sie Recht haben. Aus irgendeinem Grund habe ich das nicht gesehen, als ich den Code neu geschrieben habe.Axiom, 89 Bytes
Test und Ergebnisse
Dies ist die Funktion, bei der factor () nicht verwendet wird
es sind aber nur 125 bytes
quelle
R, 52 Bytes
liest
n
aus stdin. Erfordert diegmp
Installation der Bibliothek (damit TIO nicht funktioniert). Verwendet den gleichen Ansatz wie viele der obigen Antworten, stürzt jedoch bei der Eingabe von ab1
, dafactorize(1)
ein leerer Klassenvektor zurückgegeben wirdbigz
, derunique
leider abstürzt .quelle
Eigentlich 2 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Pari / GP , 28 Bytes
Probieren Sie es online!
quelle
Pyt , 3 Bytes
Erläuterung:
quelle