Każda liczba może być reprezentowana za pomocą nieskończenie długiej sekwencji pozostałych. Na przykład, jeśli weźmiemy liczbę 7 i wykonamy 7mod2
, to 7mod3
wtedy 7mod4
, i tak dalej, otrzymamy 1,1,3,2,1,0,7,7,7,7,....
.
Potrzebujemy jednak możliwie najkrótszego podsekwencji reszty, która wciąż może być użyta do odróżnienia jej od wszystkich niższych liczb. Ponowne użycie 7 [1,1,3]
jest najkrótszym podsekwencją, ponieważ wszystkie poprzednie podsekwencje nie zaczynają się od [1,1,3]
:
0: 0,0,0,0...
1: 1,1,1,1...
2: 0,2,2,2...
3: 1,0,3,3...
4: 0,1,0,4...
5: 1,2,1,0...
6: 0,0,2,1...
Zauważ, że [1,1]
to nie działa na reprezentację 7, ponieważ może być również użyte do reprezentacji 1. Jednak powinieneś [1]
otrzymać dane wyjściowe z wejściem 1.
Wejście wyjście
Twoje dane wejściowe są nieujemną liczbą całkowitą. Musisz wygenerować sekwencję lub listę sekwencji reszt o minimalnej długości, jak zdefiniowano powyżej.
Przypadki testowe:
0: 0
1: 1
2: 0,2
3: 1,0
4: 0,1
5: 1,2
6: 0,0,2
7: 1,1,3
8: 0,2,0
9: 1,0,1
10: 0,1,2
11: 1,2,3
12: 0,0,0,2
30: 0,0,2,0
42: 0,0,2,2
59: 1,2,3,4
60: 0,0,0,0,0,4
257: 1,2,1,2,5,5
566: 0,2,2,1,2,6,6
1000: 0,1,0,0,4,6,0,1
9998: 0,2,2,3,2,2,6,8,8,10
9999: 1,0,3,4,3,3,7,0,9,0
Oto pierwsze 10 000 sekwencji , jeśli jesteś zainteresowany (numery linii są wyłączone o 1).
Jest to gra w golfa kodowego , dlatego postaraj się , aby była ona jak najkrótsza w swoim ulubionym języku. Fałszywe punkty bonusowe za szybkie odpowiedzi!
źródło
Odpowiedzi:
Mathematica,
6053 bajtówNieco szybko (obsługuje 10000 w ~ 0,1 sekundy, ale prawdopodobnie zabraknie pamięci dla 100000).
Kod zgłasza błąd, ale poprawnie oblicza wynik.
Wyjaśnienie
Wcześniej na czacie stwierdziliśmy, że wymagane dzielniki można zawsze określić jako najkrótszą listę,
{1, 2, ..., n}
której najmniejsza wspólna wielokrotność przekracza dane wejściowe. Krótki argument przemawiający za tym, dlaczego: jeśli LCM jest mniejszy niż dane wejściowe, to odjęcie LCM od danych wejściowych pozostawiłoby wszystkie dzielniki bez zmian, więc reprezentacja nie jest unikalna. Jednak dla wszystkich danych wejściowych mniejszych niż LCM pozostałe będą unikalne, w przeciwnym razie różnica między dwiema liczbami o równych resztach byłaby mniejszą wielokrotnością wszystkich dzielników.Jeśli chodzi o kod ... jak zwykle kolejność czytania w matematyce golfowej jest trochę zabawna.
To daje nam listę
[1, 2, 3, ..., n+2]
danych wejściowychn
. Ma+2
to zapewnić, że działa poprawnie dla0
i1
.Mapa
2~Range~#
(cukier składniowyRange[2,#]
) na tej liście, więc otrzymujemySą to listy dzielników kandydujących (oczywiście ogólnie rzecz biorąc, to o wiele więcej, niż będziemy potrzebować). Teraz znajdujemy pierwszy z nich, którego LCM przekracza dane wejściowe za pomocą:
Więcej składni:
x_
to wzorzec, który pasuje do dowolnej listy i wywołuje jąx
./;
Przywiązuje warunek do tego wzorca. Warunek ten jestLCM@@x>#
gdzie@@
stosuje funkcję do listy, czyliLCM@@{1,2,3}
środkówLCM[1,2,3]
.W końcu otrzymujemy wszystkie pozostałe, wykorzystując fakt, że
Mod
toListable
znaczy, tzn. Automatycznie mapuje listę, jeśli jeden z argumentów jest listą (lub jeśli oba są listami o tej samej długości):źródło
Galaretka , 14 bajtów
Wykorzystuje to fakt, że rozwiązaniem (jeśli w ogóle) systemu zgodności liniowej jest unikalny moduł LCM modułów. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
MATL , 24 bajty
Dzięki @nimi za wskazanie błędu w poprzedniej wersji tej odpowiedzi (teraz poprawionej)
Brakuje pamięci w kompilatorze online dla dwóch największych przypadków testowych (ale działa na komputerze z 4 GB pamięci RAM).
Wypróbuj online!
Wyjaśnienie
To stosuje definicję w prosty sposób. Dla wejścia
n
Oblicza tablicę zawierającą 2Dmod(p,q)
zp
od0
celun
iq
od1
celun+1
. Każdap
jest kolumną, a każdaq
jest rzędem. Na przykład przy wejściun=7
ta tablica toTeraz ostatnia kolumna, która zawiera resztę
n
, jest elementarna w porównaniu z każdą kolumną tej tablicy. To dajegdzie
1
oznacza równość. Ostatnia kolumna jest oczywiście równa sobie i dlatego zawiera wszystkie. Musimy znaleźć kolumnę, która ma największą liczbę początkowych nich , inne niż w ostatniej kolumnie, i wziąć pod uwagę, że liczby te początkowe,m
. (W tym przypadku jest to druga kolumna, która zawieram=3
początkowe). W tym celu obliczamy skumulowany iloczyn każdej kolumny:następnie suma każdej kolumny
a następnie sortuj coraz rzadziej i bierz drugą wartość, czyli
3
. Jest to pożądanem
, które wskazuje, ile reszt musimy zebrać.źródło
Galaretka ,
1311 bajtówTo nie zdobędzie żadnych punktów brownie prędkości ... Wypróbuj online! lub zweryfikuj mniejsze przypadki testowe .
Jak to działa
źródło
Python 3.5,
1179578 bajtówWymaga Python 3.5 i sympy (
python3 -m pip install --user sympy
). Podziękowania dla @Dennis za powiadomienie mnie, że Python 3.5 pozwala na*l
lewę z domyślnymi argumentami.źródło
M>n and l
dol*(M>n)
.Python 2,
73706965 bajtówPełny program. @Dennis zapisał 4 bajty, poprawiając sposób, w jaki zero jest obsługiwane.
źródło
Haskell,
66605150 bajtówPrzykład użycia:
f 42
->[0,0,2,2]
. Jest to algorytm opisany w odpowiedzi @Martin Büttner .Zachowam poprzednią wersję w celach informacyjnych, ponieważ jest ona dość szybka:
Haskell, 51 bajtów
To trwa 0,03 s dla
f (10^100)
mojego pięcioletniego laptopa.Edycja: @xnor znalazł bajt do zapisania. Dzięki!
źródło
h i=mod i<$>[2..2+sum[1|l<-scanl1 lcm[2..i],l<=i]]
Pyth,
51 bajtów66 bajtówWypróbuj to!
Znacznie wyższa prędkość 39-bajtowa wersja (nie działa dla 0-2):
Wydaje się, że działa na absurdalnie duże liczby, takie jak 10 10 3
Uwaga: ta odpowiedź nie działa dla 0, 1 i 2.Naprawiono!źródło
JavaScript (ES6),
8177 bajtówTo rekurencyjnie buduje odpowiedź, dopóki LCM nie przekroczy pierwotnej liczby. Oczywiście GCD jest również obliczane rekurencyjnie.
Edycja: Zapisano 4 bajty dzięki @ user81655.
źródło
Ruby, 52 bajty
To rozwiązanie sprawdza każdą możliwą wartość,
m
zaczynając od 2, które są resztą, która czyni sekwencję unikalną. To, co czyni ostatniąm
unikalną, nie jest samą resztą, ale tym, żem
jest ostatnim członkiem najmniejszego zakresu, w(2..m)
którym najmniejsza wspólna wielokrotność (LCM) tego zakresu jest większa niżn
. Wynika to z twierdzenia chińskiego reszty, w którym w celu jednoznacznego ustalenia, która liczban
jest liczbą reszt, LCM tych reszt musi być większy niżn
(w przypadku wyborun
z(1..n)
; w przypadku wyborun
za..b
LCM musi być większy niżb-a
)Uwaga: umieszczam
a<<n%m
na końcu kodu, ponieważuntil n<t=t.lcm(m+=1)
zwarcia wcześnieja
otrzymały ostatni element, aby uczynić go unikalnym.Jeśli ktoś ma jakieś sugestie dotyczące gry w golfa, daj mi znać w komentarzach lub na czacie PPCG .
Ungolfing:
źródło
Julia,
3633 bajtówWypróbuj online!
źródło
Python 3.5,
194181169152149146 bajtów:( Dzięki @ Sherlock9 za 2 bajty! )
Działa idealnie, a także jest dość szybki. Obliczenie minimalnej pozostałej sekwencji
100000
wyjść[0, 1, 0, 0, 4, 5, 0, 1, 0, 10, 4, 4]
i zajęło tylko około 3 sekund. Był nawet w stanie obliczyć sekwencję danych wejściowych1000000
(1 milion), wyjściową[0, 1, 0, 0, 4, 1, 0, 1, 0, 1, 4, 1, 8, 10, 0, 9]
i zajęło to około 60 sekund.Wyjaśnienie
Zasadniczo funkcja ta polega po pierwsze na utworzeniu listy, gdzie
y
wszystko,j mod i
gdziej
jest każda liczba całkowita z zakresu0=>7
(w tym 7) ii
każda liczba całkowita z zakresu0=>100
. Następnie program przechodzi w nieskończonąwhile
pętlę i porównuje tę samą liczbę treści każdej podlisty w ramach podrzędnych list podrzędnych ody
( do ostatnichy[:-1:]
) z taką samą liczbą elementów na ostatniejy[-1]
liście podlisty ( )y
. Kiedy podlistay[-1]
jest inna niż jakakolwiek inna podlista, pętla jest przerywana i zwracana jest poprawna minimalna sekwencja pozostałych reszt.Na przykład, jeśli dane wejściowe to 3,
y
to:Następnie, gdy wchodzi w pętlę while, porównuje każdą listę podlist na
y[:-1:]
tej samej liczbie elementów na liście podrzędnejy[-1]
. Na przykład najpierw porównuje[[0],[1],[0]]
i[1]
. Ponieważ ostatnia podlista jest w pozostałej częściy
, będzie kontynuowana, a następnie porównywana[[0,0],[0,1],[0,2]]
i[1,0]
. Ponieważ[1,0]
NIE jest teraz w pozostałej częściy
w tej określonej kolejności , jest to minimalna sekwencja przypomnień, a zatem[1,0]
zostanie poprawnie zwrócona.źródło
y[:c:]
jest takie samo jaky[:c]
C89, 105 bajtów
Kompiluje (z ostrzeżeniami) przy użyciu
gcc -std=c89
. Pobiera pojedynczą liczbę na standardowym wyjściu i wyświetla sekwencję reszt oddzieloną spacjami na standardowym wyjściu.źródło
C, 89 bajtów
Kompiluj z gcc. Wypróbuj online: n = 59 , n = 0 .
źródło