Wyzwanie
Napisać program lub funkcję, która pobiera dwie liczby całkowite wejściowe, i
a j
, i wysyła ich największy wspólny dzielnik; obliczone przy użyciu algorytmu euklidesowego (patrz poniżej).
Wkład
Dane wejściowe można traktować jako ciąg znaków rozdzielany spacjami i
i j
lub jako dwie oddzielne liczby całkowite. Możesz założyć, że liczby całkowite będą mniejsze lub równe 10 000. Możesz także założyć, że wejściowe liczby całkowite nie będą względem siebie pierwszymi.
Podział euklidesowy
Im większa liczba z przedziału i
i j
jest podzielony przez mniejszą tyle razy, ile to możliwe. Następnie dodaje się resztę. Ten proces powtarza się z resztą i poprzednim numerem, aż reszta stanie się 0
.
Na przykład, jeśli dane wejściowe to 1599 650
:
1599 = (650 * 2) + 299
650 = (299 * 2) + 52
299 = (52 * 5) + 39
52 = (39 * 1) + 13
39 = (13 * 3) + 0
Ostateczna liczba 13
to największy wspólny dzielnik dwóch liczb całkowitych wejściowych. Można to wizualizować w następujący sposób:
Wydajność
Twój wynik musi być zestawieniem w powyższym formularzu, po którym następuje nowa linia i GCD. Może być wyprowadzany przez dowolny nośnik.
Przykłady
Wejścia
18 27
50 20
447 501
9894 2628
Wyjścia
27 = (18 * 1) + 9
18 = (9 * 2) + 0
9
50 = (20 * 2) + 10
20 = (10 * 2) + 0
10
501 = (447 * 1) + 54
447 = (54 * 8) + 15
54 = (15 * 3) + 9
15 = (9 * 1) + 6
9 = (6 * 1) + 3
6 = (3 * 2) + 0
3
9894 = (2628 * 3) + 2010
2628 = (2010 * 1) + 618
2010 = (618 * 3) + 156
618 = (156 * 3) + 150
156 = (150 * 1) + 6
150 = (6 * 25) + 0
6
Uwaga: Wyjścia nie muszą być rozmieszczane tak, jak są powyżej. Odstępy służą jedynie przejrzystości. Wymagane są nawiasy.
Premia
Jeśli twój wynik jest podzielony jak wyżej, możesz dodać -10% premii do swojego wyniku.
Odpowiedzi:
Pyth, 33 bajty
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
źródło
CJam,
464339 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Python 2, 70
Funkcja rekurencyjna, która zwraca ciąg wielowierszowy. Funkcja tworzy pierwszy wiersz, a następnie dołącza go do wyniku rekurencyjnego z następną parą liczb w algorytmie euklidesowym. Gdy druga liczba jest równa zero, bierzemy ciąg drugiej liczby za przypadek podstawowy, powodując, że jest ona drukowana w swoim własnym wierszu na końcu.
Formatowanie odbywa się przez podstawienie łańcucha, przy użyciu dzielenia liczb całkowitych, aby uzyskać multiplicand.
Jeden czkawka musi zacząć się od przyjęcia większej liczby modów, tym mniejszej liczby. Dogodnie, jeśli liczby są w niewłaściwej kolejności, pierwszy krok algorytmu euklidesowego je odwraca. Aby zapobiec wyświetlaniu tego kroku, dodaj bieżący wiersz tylko wtedy, gdy pierwsza liczba to co najmniej druga (powiedzmy, że wymagana jest równość
f(9,9)
).źródło
awk,
7877Sortowanie danych wejściowych według rozmiaru zajmuje dużo bajtów: /
Sprowadza się do tego:
Wydajność
Dla zabawy stworzyłem też odpowiednio rozłożoną wersję, dającą mi wynik 233 * 0,9 == 209,7 bajtów.
Aktualizacja Byłem w stanie skrócić to z 285 bajtów, a teraz działa na dowolnie długie numery, jeśli wywołuje gawk4 z
-M
opcją.Ale wciąż mam wrażenie, że gdzieś wpadłem na jakiś mentalny blok ...
Wyjście (wywołanie gawk4 z
awk -M -f code.awk
)Dodano kilka nowych linii i kart
Na początku mogę zapisać długości początkowych wartości dla x, y i x% y, ponieważ mogą one być coraz krótsze z każdym krokiem. Ale dla współczynnika muszę określić maksymalną długość przed wydrukowaniem czegokolwiek, ponieważ jego długość może się różnić. Używam
$i
tutaj jako tablicy, ponieważ zapisuje dwa znaki w porównaniu do używania [i] za każdym razem.źródło
C ++, kompilator GCC, 171 bajtów (-10%, więc 154 bajty)
dobrze, więc moja pierwsza próba ...
mile widziane wskazówki do kodowania golfa.
PS Czy konieczne jest zliczanie bajtów standardowych plików nagłówkowych i int main podczas korzystania z c ++? Wykluczenie zmniejsza 50 bajtów
źródło
T-SQL (2012+), 268 bajtów
Zaimplementowano jako funkcję tabeli wbudowanej, która wykonuje rekurencyjną CTE. Być może warto spróbować sformatować bonus 10%, ale to będzie musiało poczekać.
Objaśnienie i użycie:
źródło
Rev 1: Ruby, 86
Algorytm rekurencyjny dzięki wskazówce od Klamki.
Rev 0: Ruby, 93
To naprawdę nie wyszło dobrze.
while
Pętla zajmuje zbyt wiele znaków, zwłaszcza zend
. Nie widzę sposobu na uniknięcie tego. Rekurencja wymagałaby nazwanej funkcji zamiast lambda, która zjadłaby również wiele znaków.Nazwij to tak:
źródło
a=->i,j{...}
i dzwonića
przeza[1,2]
- nie jestem jednak pewien, czy to uratuje ci znaki.f.call
.) Jest w rzeczywistości nieco krótszy, ale wciąż daleko od Pythona.PowerShell, 84
Rekurencyjny blok kodu, przechowywany w zmiennej. Wywołaj go za pomocą
& $e num1 num2
np .:W bardziej czytelnej formie robi to następująco (nb. Dla jaśniejszego kodu umieściłem pełne nazwy komend, więcej spacji w łańcuchu i jawnie wydałem komendy wyjściowe potoku):
Jedna irytacja z punktu widzenia codegolfa; PoSh nie ma podziału na liczby całkowite, 10/3 zwraca Double, ale rzutuje wynik na liczbę całkowitą i nie zawsze zaokrągla w dół, zaokrągla N.5 do najbliższej parzystej liczby - w górę lub w dół. Tak
[int](99/2) == 50
.To pozostawia dwie niezręczne opcje:
Dlatego muszę spalić niektóre postacie, wykonując:
Poza tym jest to liczba
Mam również wersję iteracyjną, która, całkiem ładnie, ma również 84 znaki:
Całkowicie anonimowy blok kodu, więc uruchom go
źródło
PHP, 118 bajtów
Wypróbuj online!
PHP, 131 bajtów
Wypróbuj online!
-4 bajty wymienić
list(,$n,$m)=$argv
z[,$n,$m]=$argv
potrzebami PHP> = 7.1źródło
Japt ,
434241 bajtówMoje nowo odkryte „umiejętności” Japt wydają się coraz gorsze, a nie lepsze!
Wypróbuj online
źródło
JavaScript (ES6),
7450626155 bajtówSpróbuj
Wyjaśnienie
źródło
JS, 151
źródło
C, 83 bajty
test i wyniki
źródło
Java 133
Nie wykonuje zwykłego algorytmu euklidesowego. Zamiast tego używa modułu, a następnie oblicza drugą liczbę do pomnożenia przez wydruk. Możesz także skrócić to, zmieniając je w wyrażenie lambda, ale nie jestem pewien, jak to zrobić.
źródło
public
, zmienić drugiprintln
naprint
i zmienićd!=0
nad>0
. Ponadto obecnie daje niepoprawne dane wyjściowe dla pierwszych wierszy. Można to naprawić, dodającif(d!=i)
przedSystem.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);
. W sumie:void z(int i,int j){for(int d=1;d>0;i=j,j=d){d=i%j;if(d!=i)System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);}System.out.print(i);}
( 131 bajtów i naprawiony błąd)