Czasami, gdy bezczynnie próbuję uwzględnić liczbę, która pojawia się przede mną¹, po chwili zdaję sobie sprawę, że jest to łatwiejsze niż myślałem. Weźmy 2156
na przykład: w końcu przychodzi mi do głowy, że jedno 21
i drugie 56
jest wielokrotnością 7
, a więc na pewno 2156 = 21 x 100 + 56
jest wielokrotnością 7
.
Twoim zadaniem jest napisanie kodu, który identyfikuje liczby, które są łatwiejsze do obliczenia z powodu tego rodzaju zbiegu okoliczności.
Dokładniej:
Napisz program lub funkcję, która przyjmuje na n
wejściu dodatnią liczbę całkowitą i zwraca prawdziwą wartość, jeśli istnieje dzielnik d
(większy niż 1
), który n
można podzielić na dwie części, aby uzyskać dwie dodatnie liczby całkowite, z których każda jest wielokrotnością d
; zwraca wartość fałsz, jeśli nie.
- „Posiekane na dwa” oznacza to, co myślisz: zwykła reprezentacja bazy-10
n
podzielona w pewnym momencie na przednią i tylną połowę, aby uzyskać dwie inne liczby całkowite base-10. Jest w porządku, jeśli druga liczba całkowita ma wiodące zero (ale pamiętaj, że musi to być dodatnia liczba całkowita, więc podział1230
na123
i0
jest niepoprawny). - Wartości prawdy i fałszu mogą zależeć od danych wejściowych. Na przykład, jeśli jakakolwiek niezerowa liczba całkowita jest zgodna z prawdą w wybranym języku, możesz zwrócić dzielnik
d
lub jeden z „elementów”n
(lubn
sam w tym zakresie). - Na przykład dowolna liczba parzysta zawierająca co najmniej dwie cyfry w zestawie
{2, 4, 6, 8}
da prawdziwą wartość: po prostu podziel ją po pierwszej parzystej cyfrze. Na przykład każda liczba pierwszan
da wartość fałszowania, podobnie jak każda liczba jednocyfrowa. - Zauważ, że wystarczy rozważyć podstawowe dzielniki
d
. - Możesz założyć, że dane wejściowe są prawidłowe (dodatnia liczba całkowita).
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach. Ale rozwiązania we wszystkich językach są mile widziane, więc możemy dążyć do najkrótszego kodu w każdym języku, a nie tylko najkrótszego kodu w ogóle.
Przypadki testowe
(Musisz podać tylko wartość prawdy lub fałszu; poniższe adnotacje służą jedynie wyjaśnieniu). Niektóre dane wejściowe, które dają prawdziwe wartości, to:
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)
Niektóre dane wejściowe, które dają wartości fałszowania, to:
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
¹ tak, naprawdę to robię
źródło
;(11+)+,\1+;
Brachylog (2), 8 bajtów
Wypróbuj online!
Wyjaśnienie
Oczywiście, jeśli ta sama liczba (większa niż 1) dzieli obie części, ta sama liczba pierwsza podzieli obie. Wymaganie, aby czynnik był liczbą pierwszą, nie zezwala na 1 jako czynnik. Zapobiega to również
0
wybraniu literału jako segmentu liczby (ponieważ0
nie ma on pierwszej faktoryzacji i spowodujeḋ
awarię).Nie ma potrzeby sprawdzania zgodności z wewnętrznymi zerami; jeśli podział na
x
i0y
jest poprawnyx0
iy
będzie działał równie dobrze (i idąc w drugą stronę, jeślix0
iy
działa, to mamy działające rozwiązanie niezależnie od tego, czyx
i czy0y
będzie działać, czy nie).Pełny program Brachylog, taki jak ten, zwraca wartość logiczną;
true.
jeśli istnieje jakiś sposób, aby uruchomić go bez awarii (tj. dokonać takich wyborów, aby nie wystąpił błąd),false.
jeśli wszystkie ścieżki prowadzą do awarii. Właśnie tego tu chcemy.źródło
Galaretka ,
14121110 bajtówDzięki @JonathanAllan za grę w golfa na 1 bajcie!
Wypróbuj online!
Jak to działa
źródło
D
, jakmake_digits
to działaŒṖ
.Mathematica,
6362 bajty(1 bajt dzięki Gregowi Martinowi)
Jest to funkcja, która przyjmuje liczbę całkowitą jako dane wejściowe i zwraca
True
lubFalse
. Jeśli testujesz na dużej liczbie, przynieś książkę do przeczytania na czas oczekiwania.Wyjaśnienie:
Floor@{Mod[#,t=10^n],#/t}
arytmetycznie dzieli dane wejściowe na ostatnien
cyfry i pozostałem-n
cyfry (gdziem
jest łączna liczba cyfr).Table[1~Max~#&/@...,{n,#}]
robi to dla każdegon
do liczby wejściowej. (Jest to zdecydowanie za duże. Musimy to zrobić tylko do liczby cyfr na wejściu, ale w ten sposób oszczędzamy bajty i nadal dajemy prawidłowy wynik.)1~Max~#&/@
Bit pozbywa się zer, więc liczby takie jak130 -> {13,0}
się nie liczą jakTrue
.1<Max@@GCD@@@...
znajduje największy wspólny dzielnik z każdej z tych par i sprawdza, czy którykolwiek z tych dzielników jest większy niż 1. Jeśli tak, to znaleźliśmy sposób na podzielenie liczby na czynniki.źródło
{#~Mod~10^n,#/10^n}
albo{Mod[#,t=10^n],#/t}
.#~Mod~10^n
, ale wygląda na to, żeMod[#,10]^n
zamiast tegoMod[#,10^n]
. Jednak nie pomyślałem o twojej drugiej sugestii!Mod[#,10]^n
Haskell , 57 bajtów
Wypróbuj online! Zastosowanie:
(#1) 2156
zwracaTrue
lubFalse
źródło
C,
145142139139135 135 bajtówźródło
JavaScript (ES6),
747170 bajtówPobiera dane wejściowe jako ciąg, co jest przydatne w przypadku fragmentu kodu. Edycja: Zapisano 3 bajty dzięki @ user81655.
źródło
(c,i)
->c
,i+1
->++i
,t=''
->i=t=''
, ta sztuczka jest przydatna za każdym razem trzeba użyć wskaźników opartych na 1 i mają gdzieś do zainicjowaniai
do0
.t=''
może byćt=0
, ponieważ i tak dodawaniec
wymusza na nim ciąg.i
, więc nie potrzebowałem indeksów opartych na 1, ale potem grałem w golfa na pierwszy kawałekt+=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
. Połączyłem również twoją funkcję GCDf
. Prawdopodobnie można by dalej grać w golfa. Ostatnia propozycja, obiecuję! : Pgcd
funkcja nie działax=0
, a obejście tego i twoja literówka zajęły mi 72 bajty, więc na szczęście mogłem zagrać w golfa 2 bajty.Python 3,
133118117 bajtówZ pewnością nie najkrótszy, prawdopodobnie można go nieco skrócić. Działa na
O(n)
czas. Dane wejściowe są pobierane w formacie,\d+
a dane wyjściowe są podawane w formacie zgodnym z(True|False)
domyślną wartością logiczną Python-3 bajtów dzięki Dead Possum
-15 bajtów dzięki ovs
-1 bajtów dzięki This Guy
źródło
from fractions import*
zaoszczędzi 3 bajtyany
naall
? W takim przypadku możesz zmienić całą tę część, abyi(j[k:])and i(j[:k])
doprowadzić ją do 125 bajtów. Oto poprawkiany(i(j[k:])*i(j[:k])*~-gcd(i(j[k:]),i(j[:k]))for k in range(1,len(j)))
)) for
QBIC ,
9190 bajtówWyjaśnienie:
źródło
Python 3 ,
7069 bajtówWypróbuj online!
źródło
Perl 5 , 46 bajtów
43 bajty kodu + 3 bajty na
-p
flagę.Wypróbuj online! lub wypróbuj zmodyfikowaną wersję umożliwiającą wiele danych wejściowych.
Prawdopodobnie nie chcesz wypróbować tego przy największym wejściu, ponieważ może to potrwać (bardzo długo).
Objaśnienia:
Iterujemy każdą pozycję w słowie z
s~~~g
,$`
zawierając liczby przed i$'
liczby po. Jeśli$`*$'
jest to prawda (oznacza to, że żaden nie jest pusty, a żaden nie jest0
), wówczas sprawdzamy, czy liczba między 2 i$`
dzieli oba z nich (za pomocągrep!(...),2..$`
). Jeśli tak,$\|=..
ustawi$\
się na wartość niezerową, która jest domyślnie drukowana na końcu dzięki-p
znacznikowi.źródło
$<backquote>
w SE, byłbym wdzięczny, jeśli powiesz mi, jak to zrobić.<code>
…</code>
(zamiast`
…`
), a następnie unikając cudzysłowów jako\`
. Również ten komentarz był trudny do napisania, ponieważ musi być podwójnie zmieniony (a dwa zestawy reguł zmiany są różne!).Python 2 , 69 bajtów
Używa rekurencji zamiast wbudowanych GCD.
Wypróbuj online!
Jak to działa
Kiedy f jest wywoływany z jednego do trzech argumentów ( d domyślnie to 10 , k do 2 ), najpierw sprawdza wartość wyrażenia
k<d<n
. Jeśli obie nierówności k <d i d <n zostaną zachowane, wyrażenie po nimand
zostanie wykonane i jego wartość zostanie zwrócona; w przeciwnym razie f po prostu zwróci False .W pierwszym przypadku zaczynamy od oceny wyrażenia
n/d%k+n%d%k<1<n%d
.d zawsze będzie potęgą dziesięciu, więc
n/d
in%d
skutecznie podziel cyfry dziesiętne n na dwa wycinki. Te wycinki są podzielne przez k wtedy i tylko wtedy, gdy man/d%k+n%d%k
wartość 0 , co jest testowane przez porównanie wyniku z 1 .Ponieważ część wymagań jest taka, że oba wycinki muszą reprezentować dodatnie liczby całkowite, wartość
n%d
jest również porównywana z 1 . Zauważ, że 1 nie ma dzielników głównych, więc droższe porównanie z 0 nie jest wymagane. Zauważ też, że d <n już zapewnia, żen/d
będzie oceniać na dodatnią liczbę całkowitą.Wreszcie rekurencyjnie wszystko
f(n,d,k+1)
(próba następnego potencjalnego wspólnego dzielnika) if(n,10*d)
(próba podziału) i zwraca logiczną OR wszystkich trzech wyników. Oznacza to, że f zwróci True, jeśli (i tylko jeśli) k jest wspólnym dzielnikiem n / d, a n% d lub tym samym jest prawdą dla większej wartości k i / lub wyższej potęgi dziesięciu d .źródło