Die Formel
Nehmen Sie zum Beispiel die Nummer 300
- Die Primfaktoren von 300 sind
[2, 3, 5]
(eindeutige Zahlen, die Faktoren von 300 und Primzahlen sind) - Durch Quadrieren jeder dieser Zahlen erhalten Sie
[4, 9, 25]
- Wenn Sie diese Liste zusammenfassen, erhalten Sie
4 + 9 + 25 = 38
- Subtrahieren Sie schließlich diese Summe (38) von Ihrer ursprünglichen Zahl
300-38 = 262
(dies ist das Ergebnis)
Eingang
Ihre Eingabe ist eine positive Ganzzahl größer als 2. Sie müssen alle Zahlen von 2 bis einschließlich des Eingabewerts überprüfen und die Zahl ermitteln, die mit der obigen Formel das beste Ergebnis erzielt.
Ausgabe
Ihre Ausgabe besteht aus zwei Zahlen, die durch ein Leerzeichen, ein Komma, einen Zeilenvorschub oder in einer anderen Sprache voneinander getrennt sind (die Trennung ist erforderlich, um die beiden Zahlen voneinander zu unterscheiden). Diese können in eine Datei, eine Standardausgabe oder in eine andere Sprache ausgegeben werden. Ihr Ziel ist es, die Zahl in dem Bereich zu finden, der die maximale Ausgabe erzeugt, wenn Sie die obige Formel durchlaufen. Die erste angezeigte Zahl sollte die Startnummer sein (wie 300) und die zweite Zahl sollte die Ausgabe sein, die die Formel erzeugt hat (wie 262).
Testfälle
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
Beispiel durchgearbeitet
Betrachten wir die Eingabe von 10, müssen wir die Formel für alle Zahlen von 2-10 (einschließlich) ausführen.
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
Wie Sie sehen, ist das beste Ergebnis 4
das Ergebnis der Eingabe des Werts 8
in die Formel. Das heißt die Ausgabe für eine Eingabe von 10
sollte sein8, 4
Wertung & Regeln
Es gelten die Standardregeln für Ein- und Ausgaben: Standard für Code Golf: Eingabe- / Ausgabemethoden
Die Standardlücken sind verboten: Lücken , die standardmäßig verboten sind
Einsendungen können Funktionen oder vollständige Programme sein
Kürzester Code in Bytes gewinnt
50
:35, 48
?Antworten:
Pyth,
1715 BytesTestsuite.
quelle
Java 8 Lambda,
247239233225224219198161 ZeichenIch dachte, das muss in weniger als 300 Zeichen möglich sein, weil ... du weißt ... Java!
Und es ist in der Tat sogar in weniger als 200 Zeichen möglich!
Ich weiß nicht, ob diese Verwendung von Importen legitim ist, aber ich gehe davon aus, dass es in Ordnung sein sollte.Hier ist der Lambda ungolfed in eine Klasse:Die Ermittlung des Primefaktors basiert auf dieser Antwort . Der Code nutzt die Funktionalität von Mengen, da sie jeden Wert nur einmal speichern, sodass ich mich später nicht mehr um hinzugefügte Duplikate kümmern muss. Der Rest des Codes ist ziemlich einfach und folgt nur der Frage.
Aktualisierung
Die neue Zeile wurde aus der Ausgabe entfernt.
Vielen Dank an @ogregoire für das Golfen der Integer.MIN_VALUE auf 1 << 31!
Nachdem ich den Code noch einmal durchgesehen hatte, fand ich einige weitere Stellen, an denen man Golf spielen konnte.
Vielen Dank an @Blue für den == 0 to <1 Trick!
Restliches Leerzeichen entfernt. Auch für die Trennung wird nur ein Char benötigt, sodass kein Char verschwendet werden muss.
Nochmals vielen Dank an @ogregoire für den Hinweis, dass ich den Wert zurückgeben kann, anstatt ihn auszudrucken und die Erklärungen zusammenzustellen! Das hat viel gespart!
Ich habe herausgefunden, dass ich anstelle des zweiten einen Ternären verwenden kann, um einen weiteren Buchstaben zu speichern.
Vielen Dank an @AstronDan für die großartige Verwendung eines Arrays, das den Import spart. Das gab mir auch die Möglichkeit, das erste wenn in ein ternäres zu kürzen.
quelle
Integer.MIN_VALUE
kann gekürzt werden als1<<31
.int
s am selben Ort, um Wiederholungen zu vermeidenint
, und weisen Sie ihnen dort nach Möglichkeit ihren Wert zu.System.out.println(...)
und geben Sie einen Wert zurück, anstatt ihn zu drucken: Wie im OP erwähnt, wird die Standard-E / A-Methode verwendet.Eigentlich 21 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Actually Programming Language
und auch nach dem Durchsuchen der 5. Seite der Google-Ergebnisse nichts gefunden. Welche Sprache ist das?MATL , 18 Bytes
Probieren Sie es online!
Der letzte Fall dauert für den Online-Compiler zu lange, führt jedoch zu dem richtigen Ergebnis (es dauert ungefähr 11 Sekunden auf meinem Computer, der unter Matlab ausgeführt wird):
Erläuterung
Einfache Anwendung des beschriebenen Verfahrens.
quelle
C #, 194 Bytes
Mein erster Code Golf :). Ich habe meine Lieblingssprache trotz ihrer Ausführlichkeit benutzt. Ich habe dies als C # -Funktionsport von @ Frozns Java gestartet, aber verschiedene Möglichkeiten gefunden, den Code durch Optimierungen weiter zu verkleinern.
Dies verwendet ein Array, um die Primfaktoren zu speichern. Da es durch den Faktor indiziert ist, werden wiederholte Faktoren durch Kopien des Faktors ersetzt. Dadurch kann die Funktion nicht importiert werden. Dies erfordert nicht einmal System.
quelle
Bash + GNU-Dienstprogramme, 74
seq
generiert alle ganzen Zahlen 2 bis nfactor
Gibt die Zahl gefolgt von einem Doppelpunkt und einer durch Leerzeichen getrennten Liste aller Primfaktoren einschließlich Duplikate an. zB ist das Ergebnis für 1212: 2 2 3
sed
Entfernt den Doppelpunkt und doppelte Faktoren und generiert dann den erforderlichen arithmetischen Ausdruck. zB für 12:12- 2* 2- 3* 3
bc
bewertet diesnl
Präfixe n wieder ein (ab 2)sort
durch die zweite Spalte numerisch in absteigender Reihenfolgeseq
druckt die erste Zeile und wird beendet.Ideone.
quelle
Brachylog , 48 Bytes
Erläuterung
quelle
Jelly , 13 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
05AB1E,
191716 BytesCode:
Erläuterung:
Probieren Sie es online aus
quelle
Julia, 56 Bytes
Probieren Sie es online!
Wie es funktioniert
Bei einer Eingabe n erzeugen wir für jede ganze Zahl k , die 2 ≤ k ≤ n ist , das Tupel (f (k), k) , wobei f (k) die Differenz zwischen k und der Summe der Quadrate seiner Primfaktoren ist .
f (k) selbst wird berechnet mit
k-sumabs2(k|>factor|>keys)
, welche Faktoren k in ein Dict von Prim- und Exponentenwerten, alle Schlüssel (Primfaktoren) extrahiert, die Summe ihrer Quadrate und die resultierende ganze Zahl von k subtrahiert .Schließlich nehmen wir das lexikographische Maximum der generierten Tupel und kehren es um, indem wir auf die Indizes 2 und 1 zugreifen .
quelle
Clojure, 215 Bytes
Befolgen Sie einfach die Regeln. Berechnet die Primfaktoren jeder Zahl, setzt sie in Quadrate und summiert sie. Danach erzeugen Sie eine Liste von Vektoren aus 2 Elementen: Anfangszahl und deren Ergebnis und finden das Element mit dem Maximalwert des zweiten Elements.
Sie können es hier online sehen: https://ideone.com/1J9i0y
quelle
R 109 Bytes
Ich habe geschummelt und ein Päckchen benutzt
gmp
.quelle
CJam, 32 Bytes
Probieren Sie es online!
quelle
Pyke, 17 Bytes
Probieren Sie es hier aus!
quelle
PowerShell v2 +,
124120117 ByteDie erste Zeile berechnet die Werte, die zweite Zeile wird gerade ausgegeben.
Wir beginnen mit der Erstellung eines Bereichs von
2
bis zu unserem Befehlszeilenargument$args[0]
und wiederholen diesen|%{...}
. In jeder Schleife setzen wir Hilfsvariablen gleich unserem aktuellen Wert mit$y=$z=$_
. Wir durchlaufen dann jede Nummer von2
bis zu unserer aktuellen Nummer. In jeder inneren Schleife prüfen wir, ob diese Zahl ein Divisor!($z%$_)
und eine Primzahl ist('1'*$_-match'^(?!(..+)\1+$)..')
, und subtrahieren das Quadrat von beiden$y
(die Prüfungen werden mit Boolescher Multiplikation durchgeführt).Sobald wir alle Primteiler durchlaufen und die Quadrate subtrahiert haben und die verbleibende Zahl die größte ist, die wir bisher gesehen haben
$y-gt$o
, setzen wir unsere Ausgabevariablen$o=$y;$p=$_
. Nachdem wir den gesamten Bereich durchlaufen haben, geben wir einfach mit einem Leerzeichen dazwischen aus.quelle
Haskell, 91 Bytes
Anwendungsbeispiel:
f 50
->[48,35]
.Prime Factor-Funktionen sind nur verfügbar
import Data.Numbers.Primes
, wenn sie zu viele Bytes kosten. Daher verwende ich @ Lynns Prime Checker . Der Rest ist einfach: fürm
Eingangsschleifen
durch[2..m]
und in einer inneren Schleifep
durch[2..n]
. Behalte allesp
, was Primzahl und Teilung istn
, Quadrat und Summe.quelle
Python 2,
108105100 BytesTeste es auf Ideone .
quelle
JavaScript (ES6),
111 bis105 ByteKeine Ahnung, warum ich vorher nicht daran gedacht habe, dies rekursiv zu tun.
quelle
J, 44 Bytes
Unkomplizierter Ansatz. Gibt auch alle Werte
n
dieses Ergebnisses in einem Maximalwert zurück.Verwendung
quelle