tło
Największy wspólny dzielnik ( w skrócie gcd ) jest wygodną funkcją matematyczną, ponieważ ma wiele przydatnych właściwości. Jednym z nich jest tożsamość Bézouta : jeśli d = gcd(a, b)
, to istnieją liczby całkowite x
i y
takie tam d = x*a + y*b
. W tym wyzwaniu Twoim zadaniem jest wizualizacja tej właściwości za pomocą prostej grafiki ASCII.
Wkład
Twoje wejścia są dwie dodatnie liczby całkowite a
i b
, biorąc pod uwagę w każdym rozsądnym formacie. Możesz również przyjmować jednoargumentowe dane wejściowe (powtórzenia jednego wybranego znaku ASCII do wydrukowania), ale musisz być spójny i używać tego samego formatu dla obu danych wejściowych. Dane wejściowe mogą być w dowolnej kolejności i mogą być równe.
Wydajność
Twój wynik jest ciągiem s
długości lcm(a, b) + 1
( lcm oznacza najniższą wspólną wielokrotność). Znaki s
reprezentują liczby całkowite od 0
do lcm(a, b)
. Znak s[i]
jest małą literą, o
jeśli i
jest wielokrotnością a
lub b
, a kropką w .
innym przypadku. Zauważ, że zero jest wielokrotnością każdej liczby. Teraz, ze względu na tożsamość Bézouta, będzie co najmniej jedna para znaków, o
w s
których odległości jest dokładnie gcd(a, b)
. Najbardziej z lewej taka para ma zostać zastąpiona wielkimi literami O
s; to jest końcowy wynik.
Przykład
Rozważ dane wejściowe a = 4
i b = 6
. Mamy więc, gcd(a, b) = 2
a lcm(a, b) = 12
więc długość s
będzie 13
. Wielokrotności a
i b
są podświetlone w następujący sposób:
0 1 2 3 4 5 6 7 8 9 10 11 12
o . . . o . o . o . . . o
Istnieją dwie pary o
s z odległością 2, ale zamienimy tylko te lewe z lewej na O
s, więc końcowy wynik to
o...O.O.o...o
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
1 1 -> OO
2 2 -> O.O
1 3 -> OOoo
4 1 -> OOooo
2 6 -> O.O.o.o
2 3 -> o.OOo.o
10 2 -> O.O.o.o.o.o
4 5 -> o...OO..o.o.o..oo...o
8 6 -> o.....O.O...o...o.o.....o
12 15 -> o...........O..O........o.....o.....o........o..o...........o
19 15 -> o..............o...o..........o.......o......o...........o..o..............OO.............o....o.........o........o.....o............o.o..............o.o............o.....o........o.........o....o.............oo..............o..o...........o......o.......o..........o...o..............o
.
,o
lubO
.) Czy też ma być1
? Czy0
?Odpowiedzi:
Jolf, 52 bajty
Podzielę ten kod na dwie części.
Wypróbuj tutaj!
źródło
Julia,
11111010710396 bajtówJest to funkcja, która akceptuje dwie liczby całkowite i zwraca ciąg znaków.
Nie golfowany:
Zapisałem bajt dzięki nim!
źródło
Retina ,
112109999491 bajtówMyślę, że niezbyt konkurencyjny, ale teoria liczb w Retinie zawsze jest całkiem fajna. :)
Pobiera dane wejściowe jako liczby jednoargumentowe za pomocą
.
cyfry jednoargumentowej.Wypróbuj online.
Wyjaśnienie
To wstawia a
.
i spację przed wejściem. To ostatecznie stanie się rezultatem.To dodaje LCM do
a
ib
do łańcucha. Ponieważ już.
tam mamy, skończymylcm(a,b)+1
. Dokonuje się tego poprzez wielokrotne przygotowywanie,b
o ilea
nie dzieli tego nowego prefiksu. Przechwytujemya
do grupy, a następnie sprawdzamy, czy możemy osiągnąć początek ciągu, dopasowując to przechwytywanie przynajmniej raz.b
jest następnie wstawiany do ciągu za pomocą rzadko używanego,$'
który wstawia wszystko po dopasowaniu do podstawienia.Ten dopasowuje znaki na pozycjach, które są podzielone przez
a
lubb
. Wykorzystuje fakt, że wynik jest symetryczny: ponieważlcm(a,b)
jest dzielony przez obaa
ib
przechodzenie w lewo przez odejmowanie wystąpieńa
lubb
daje ten sam wzorzec, jak przechodzenie w prawo0
przez dodawanie ich. Pierwszy lookahead po prostu rejestrujea
ib
. Drugi lookahead sprawdza,a
czyb
przed pierwszą spacją jest wielokrotność każdego lub znaków.Jak stwierdzono na Wikipedii, oprócz tożsamości Bézouta prawdą jest również to
Oznacza to, że GCD będzie odpowiadać najkrótszej szczelinie między dwoma
o
s na wyjściu. Więc wcale nie musimy zawracać sobie głowy znalezieniem GCD. Zamiast tego szukamy tylko pierwszego wystąpienia najkrótszej luki.o(\.*)o
dopasowuje przerwę kandydata i przechwytuje jej szerokość do grupy 1. Następnie próbujemy dotrzeć do pierwszej spacji, zmieniając odniesienie do grupy 1 io
s (z opcjonalnymi dodatkowymi.
s). Jeśli po prawej stronie znajduje się krótsza luka, nie będzie to zgodne, ponieważ nie możemy przekroczyć tej luki z odniesieniem wstecznym. Gdy tylko wszystkie dalsze luki będą co najmniej tak duże jak bieżące, to się dopasowuje. Przechwytujemy koniec łańcucha LCM do grupy 2 i dopasowujemy pozostałą część ciągu.*
. Odpisujemy wielkie literyO
s (z odstępem pomiędzy), a także pozostałą część łańcucha LCM, ale odrzuć wszystko, zaczynając od spacji, aby usunąća
ib
od końcowego wyniku.źródło
(\.*)
=>(a*)
.
później, co kosztuje cztery bajty (a pozbycie się ucieczek oszczędza tylko 3).𝔼𝕊𝕄𝕚𝕟, 50 znaków / 90 bajtów
Try it here (Firefox only).
Musi być jeszcze jakiś sposób na grę w golfa!
Wyjaśnienie
Jest to podstawowy algorytm dwufazowy. To jest właściwie dość proste.
Faza 1
Najpierw tworzymy zakres od 0 do LCM + 1. Następnie odwzorowujemy to, sprawdzając, czy którekolwiek z danych wejściowych jest czynnikiem bieżącego elementu w zakresie. Jeśli tak, zamieniamy ten element na
o
; w przeciwnym razie zamieniamy go na.
. Łączenie go daje nam serię kropek i kropek, które możemy przejść do drugiej fazy.Faza 2
To tylko jedna duża funkcja zamiany. Wyrażenie regularne jest tworzone jako
o[dots]o
, gdzie liczba kropek jest określana przez GCD-1. Ponieważ wyrażenie regularne nie jest globalne, będzie pasować tylko do pierwszego wystąpienia. Następnie dopasowanie jest zastępowane zaO[dots]O
pomocą funkcji toUpperCase.źródło
MATL , 72 bajty
Używa wersji 6.0.0 , która jest wcześniejsza niż to wyzwanie. Kod działa w Matlabie i Octave.
Przykład
Wyjaśnienie
Nie mam pojęcia jak to działa. Właśnie wpisałem znaki losowo. Myślę, że w grę wchodzi pewien splot.
Edycja: Wypróbuj online! Kod w łączu został nieznacznie zmodyfikowany w celu dostosowania do zmian w języku (od 2 czerwca 2016 r.).
źródło
Japt , 83 bajty
Jeszcze nie w pełni golfa ... I nie chcę grać w golfa: /
źródło
r
zamiast$.replace($
?JavaScript,
170164161153145141136 136 bajtówTo dość lonnnggggg ....
Demo , zmienne jawnie zdefiniowane, ponieważ interpreter używa trybu ścisłego.
źródło
i%a<1||i%b<1?'o':'.'
zi%a&&i%b?'.':'o'
[...Array((d=a*b/(c=(g=(a,b)=>b?g(b,a%b):a)(a,b)))+1).keys()].map(i=>i%a&&i%b?'.':'o')
oszczędza dwa bajty. (Próbowałem też użyć indeksowania ciągów, aby utworzyć „.” I „o”, ale tak naprawdę kosztuje to dwa bajty.)Python 2,
217200191 bajtówTo trochę tępe, ale działa. Wszelkie wskazówki dotyczące gry w golfa są mile widziane,
zwłaszcza jeśli wiesz, jak rozwiązać!s[i] = s[v] = "o"
napotkany problem, który zastąpiłby „O”, rozumiemNie golfowany:
źródło