Manchmal, wenn ich müßig versuche, die vor mir auftauchende Zahl zu berücksichtigen¹, merke ich nach einer Weile, dass es einfacher ist, als ich dachte. Nehmen wir 2156
zum Beispiel: Irgendwann fällt mir ein, dass beide 21
und ein 56
Vielfaches von sind 7
, und so sicherlich 2156 = 21 x 100 + 56
auch ein Vielfaches von 7
.
Ihre Aufgabe ist es, einen Code zu schreiben, der Zahlen identifiziert, die aufgrund eines solchen Zusammentreffens leichter zu faktorisieren sind.
Etwas präziser:
Schreiben Sie ein Programm oder eine Funktion mit einer positiven Ganzzahl n
als Eingabe verwendet und einen Wahrheitswert zurückgibt, wenn ein Divisor d
(größer als 1
) vorhanden n
ist, der in zwei Teile geteilt werden kann, um zwei positive Ganzzahlen zu erhalten, von denen jede ein Vielfaches von ist d
. Wenn nicht, wird ein falscher Wert zurückgegeben.
- "In zwei Hälften geteilt" bedeutet, was Sie denken: Die übliche Basis-10-Darstellung unterteilt sich
n
irgendwann in eine vordere und eine hintere Hälfte, um zwei weitere Basis-10-Ganzzahlen zu erhalten. Es ist in Ordnung, wenn die zweite Ganzzahl eine führende Null hat (beachten Sie jedoch, dass es sich um eine positive Ganzzahl handeln muss, sodass die Aufteilung1230
in123
und0
ungültig ist). - Die Wahrheits- und Falschheitswerte können von der Eingabe abhängen. Wenn beispielsweise eine Ganzzahl ungleich Null in der Sprache Ihrer Wahl wahr ist, können Sie den Teiler
d
oder eines der "Teile" vonn
(oder sichn
selbst) zurückgeben. - Zum Beispiel
{2, 4, 6, 8}
ergibt jede gerade Zahl mit mindestens zwei Ziffern im Satz einen Wahrheitswert: Teilen Sie ihn einfach nach der ersten geraden Ziffer. Zum Beispieln
liefert jede Primzahl ebenso wie jede einstellige Zahl einen falschen Wert. - Beachten Sie, dass es ausreicht, Primteiler zu berücksichtigen
d
. - Sie können davon ausgehen, dass die Eingabe gültig ist (dh eine positive Ganzzahl).
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Lösungen in allen Sprachen sind jedoch willkommen, sodass wir in jeder Sprache den kürzesten Code anstreben können, nicht nur den kürzesten Code insgesamt.
Testfälle
(Sie müssen nur einen Wahrheitswert oder einen falschen Wert ausgeben. Die folgenden Anmerkungen dienen lediglich der Erläuterung.) Einige Eingaben, die Wahrheitswerte liefern, sind:
39 (3 divides both 3 and 9)
64 (2 divides both 6 and 4)
497 (7 divides both 49 and 7)
990 (splitting into 99 and 0 is invalid; but 9 divides both 9 and 90)
2233 (11 divides both 22 and 33)
9156 (3 divides both 9 and 156; or, 7 divides both 91 and 56)
11791 (13 divides both 117 and 91)
91015 (5 divides both 910 and 15)
1912496621 (23 divides both 1912496 and 621; some splittings are multiples of 7 as well)
9372679892 (2473 divides both 937267 and 9892; some splittings are multiples of 2 as well)
Einige Eingaben, die falsche Werte ergeben, sind:
52
61
130 (note that 13 and 0 is not a valid splitting)
691
899
2397
9029
26315
77300 (neither 7730 and 0 nor 773 and 00 are valid splittings)
2242593803
¹ Ja, das mache ich wirklich
quelle
;(11+)+,\1+;
Brachylog (2), 8 Bytes
Probieren Sie es online!
Erläuterung
Wenn dieselbe Zahl (größer als 1) beide Teile teilt, teilt dieselbe Primzahl beide Teile. Das Erfordernis, dass der Faktor Primzahl ist, verbietet 1 als Faktor. Außerdem wird verhindert, dass ein Literal
0
als Segment einer Zahl ausgewählt wird (da0
es keine Primfaktorisierung gibt und diesḋ
zum Fehlschlagen führt).Es ist nicht erforderlich, nach übereinstimmenden internen Nullen zu suchen. Wenn eine Aufteilung von
x
und0y
gültig istx0
undy
genauso gut funktioniert (und umgekehrt, wennx0
undy
funktioniert, dann haben wir eine funktionierende Lösung, unabhängig davon, obx
und ob0y
nicht).Ein volles Brachylog-Programm wie dieses gibt einen Booleschen Wert zurück.
true.
Wenn es eine Möglichkeit gibt, es ohne Fehler auszuführen (dh Entscheidungen so zu treffen, dass kein Fehler auftritt),false.
wenn alle Pfade zu einem Fehler führen. Genau das wollen wir hier.quelle
Jelly ,
14121110 BytesVielen Dank an @JonathanAllan für das Abschlagen von 1 Byte!
Probieren Sie es online!
Wie es funktioniert
quelle
D
, wiemake_digits
es in Kraft istŒṖ
.Mathematica,
6362 Bytes(1 Byte danke an Greg Martin)
Es ist eine Funktion, die eine Ganzzahl als Eingabe verwendet und
True
oder zurückgibtFalse
. Wenn Sie es an einer großen Zahl testen, bringen Sie ein Buch zum Lesen mit, während Sie warten.Erläuterung:
Floor@{Mod[#,t=10^n],#/t}
Teilt die Eingabe arithmetisch in die letztenn
und die verbleibendenm-n
Ziffern auf (wobeim
die Gesamtzahl der Ziffern ist).Table[1~Max~#&/@...,{n,#}]
Tut dies für jedenn
bis zur eingegebenen Nummer. (Dies ist viel zu groß. Wir müssen dies nur bis zur Anzahl der Stellen der Eingabe tun , aber auf diese Weise werden Bytes gespeichert und es wird immer noch das richtige Ergebnis1~Max~#&/@
erzielt .) Das Bit wird von Nullen befreit, sodass Zahlen wie130 -> {13,0}
nicht zählen alsTrue
.1<Max@@GCD@@@...
findet den größten gemeinsamen Teiler jedes dieser Paare und prüft, ob einer dieser Teiler größer als 1 ist.quelle
{#~Mod~10^n,#/10^n}
oder speichern{Mod[#,t=10^n],#/t}
.#~Mod~10^n
, aber es scheint, als würde esMod[#,10]^n
stattdessen in Klammern gesetztMod[#,10^n]
. An Ihren zweiten Vorschlag habe ich allerdings nicht gedacht!Mod[#,10]^n
Haskell , 57 Bytes
Probieren Sie es online! Verwendung:,
(#1) 2156
gibtTrue
oder zurückFalse
quelle
C
145142139138135 Bytesquelle
JavaScript (ES6),
747170 ByteÜbernimmt die Eingabe als String, was für das Snippet praktisch ist. Bearbeiten: 3 Bytes dank @ user81655 gespeichert.
quelle
(c,i)
->c
,i+1
->++i
,t=''
->i=t=''
, dieser Trick ist nützlich, wann immer Sie benötigen 1-basierte Indizes zu verwenden , und irgendwo zu initialisieren habeni
zu0
.t=''
könnte seint=0
, da das Hinzufügenc
es sowieso zu einer Zeichenfolge zwingt.i
, also keine 1-basierten Indizes benötigt habe, aber dann habe ich das erste Stück nach Golf gespieltt+=c
.f=(x,y,z)=>z?x%y?g(y,x%y):y:x?f(x,y,1)>1||f(x.slice(1),~~y+x[0]):0
. Ich habe auch Ihre GCD-Funktion damit kombiniertf
. Könnte wahrscheinlich weiter golfen werden. Letzter Vorschlag, das verspreche ich! : Pgcd
funktioniert meine übervereinfachte Funktion nicht, wennx=0
, und das Umgehen und Ihr Tippfehler haben mich auf 72 Bytes gebracht, so dass ich glücklicherweise 2 Bytes weggolfen konnte.Python 3,
133118117 BytesMit Sicherheit nicht die kürzeste, könnte wohl etwas gekürzt werden. Funktioniert in der
O(n)
Zeit. Die Eingabe erfolgt im Format\d+
und die Ausgabe erfolgt(True|False)
standardmäßig im Format Python-Boolescher Wert-3 Byte dank Dead Possum
-15 Byte dank Ovs
-1 Byte dank This Guy
quelle
from fractions import*
würde 3 Bytes sparenany
zuall
? In diesem Fall können Sie den gesamten Teili(j[k:])and i(j[:k])
auf 125 Byte ändern . Hier sind Korrekturenany(i(j[k:])*i(j[:k])*~-gcd(i(j[k:]),i(j[:k]))for k in range(1,len(j)))
)) for
QBIC ,
91 bis90 BytesErläuterung:
quelle
Python 3 ,
7069 BytesProbieren Sie es online!
quelle
Perl 5 , 46 Bytes
43 Byte Code + 3 Byte für
-p
Flag.Probieren Sie es online! oder versuchen Sie es mit dieser modifizierten Version, die mehrere Eingaben zulässt.
Sie möchten dies wahrscheinlich nicht bei der größten Eingabe versuchen, da dies eine (sehr lange) Zeit in Anspruch nehmen kann.
Erklärungen:
Wir durchlaufen jede Stelle im Wort mit
s~~~g
, wobei wir$`
die Zahlen davor und$'
die Zahlen danach enthalten. Wenn$`*$'
wahr ist (es bedeutet, dass keiner leer ist und keiner leer ist0
), prüfen wir, ob eine Zahl zwischen 2 und$`
dividiert beide (mit demgrep!(...),2..$`
). Wenn ja,$\|=..
wird der$\
Wert auf einen Wert ungleich Null gesetzt, der am Ende dank-p
Flag implizit ausgegeben wird .quelle
$<backquote>
Abschlag in SE rendert, wäre ich dankbar, wenn Sie mir sagen, wie.<code>
...</code>
(anstatt`
...`
) verwenden und dann die Anführungszeichen als maskieren\`
. Dieser Kommentar war auch sehr schwierig zu schreiben, da er doppelt maskiert werden muss (und die beiden Regeln für die Maskierung sind unterschiedlich!).Python 2 , 69 Bytes
Verwendet die Rekursion anstelle der integrierten GCD-Funktionen.
Probieren Sie es online!
Wie es funktioniert
Wenn f ist mit einem bis drei Argumente (genannt D standardmäßig auf 10 , k bis 2 ), prüft er zuerst den Wert des Ausdrucks
k<d<n
. Wenn die Ungleichungen k <d und d <n beide gelten, wird der folgende Ausdruckand
ausgeführt und sein Wert zurückgegeben. Andernfalls gibt f einfach Falsch zurück .Im ersteren Fall beginnen wir mit der Auswertung des Ausdrucks
n/d%k+n%d%k<1<n%d
.d wird immer eine Zehnerpotenz sein, so
n/d
undn%d
effektiv die Dezimalziffern auf aufgeteilt n in zwei Scheiben. Diese Schichten sind beide genau dann durch k teilbar, wenn sien/d%k+n%d%k
zu 0 ausgewertet werden , was durch Vergleichen des Ergebnisses mit 1 überprüft wird .Da es Teil der Anforderungen ist, dass beide Schichten positive ganze Zahlen darstellen müssen, wird der Wert von
n%d
auch mit 1 verglichen . Beachten Sie, dass 1 keine Primteiler hat, so dass der teurere Vergleich mit 0 nicht erforderlich ist. Beachten Sie auch, dass d <n dies bereits sicherstelltn/d
eine positive Ganzzahl ausgewertet wird.Schließlich rekursiv alle
f(n,d,k+1)
(versuchen Sie den nächsten potenziellen gemeinsamen Divisor) undf(n,10*d)
(versuchen Sie die Aufteilung) und gibt das logische ODER aller drei Ergebnisse zurück. Diese Mittel f kehrt Wahr , wenn (und nur wenn) k ein gemeinsamer Teiler von ist n / d und n% d oder das gleiche gilt für einen größeren Wert von k und / oder einer höheren Potenz von zehn d .quelle