A volte, quando sto pigramente cercando di calcolare il numero che appare davanti a me¹, dopo un po 'mi rendo conto che è più facile di quanto pensassi. Prendiamo 2156
ad esempio: alla fine mi viene in mente che entrambi 21
e 56
sono multipli di 7
, e quindi sicuramente 2156 = 21 x 100 + 56
è anche un multiplo di 7
.
Il tuo compito è scrivere del codice che identifichi i numeri che sono più facili da considerare a causa di una coincidenza di questo tipo.
Più precisamente:
Scrivi un programma o una funzione che accetta un intero positivo n
come input e restituisce un valore di verità se esiste un divisore d
(maggiore di 1
) tale che n
può essere tagliato in due per produrre due numeri interi positivi, ognuno dei quali è un multiplo di d
; restituire un valore errato in caso contrario.
- "Troncato in due" significa ciò che pensi: la solita rappresentazione in base 10 di
n
partizionata ad un certo punto in una metà anteriore e una metà posteriore per produrre altri due numeri interi in base 10. Va bene se il secondo numero intero ha uno zero iniziale (ma nota che deve essere un numero intero positivo, quindi la divisione1230
in123
e0
non è valida). - I valori di verità e falsità possono dipendere dall'input. Ad esempio, se un numero intero diverso da zero è veritiero nella tua lingua di scelta, allora sei il benvenuto a restituire il divisore
d
o uno dei "pezzi" din
(on
se stesso per quella materia). - Ad esempio, qualsiasi numero pari con almeno due cifre nell'insieme
{2, 4, 6, 8}
produrrà un valore veritiero: basta dividerlo dopo la prima cifra pari. Ad esempio, qualsiasi numero primon
produrrà un valore falso, così come qualsiasi numero a una cifra. - Si noti che è sufficiente considerare i divisori primi
d
. - È possibile supporre che l'input sia valido (ovvero un numero intero positivo).
Questo è code-golf , quindi vince il codice più breve in byte. Ma le soluzioni in tutte le lingue sono benvenute, quindi possiamo cercare il codice più breve in ogni lingua, non solo il codice più breve in generale.
Casi test
(Devi solo generare un valore di verità o falsa; le annotazioni di seguito sono solo a scopo di spiegazione.) Alcuni input che danno valori di verità sono:
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)
Alcuni input che producono valori falsi sono:
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
¹ sì, lo faccio davvero