Algorytm euklidesowy jest powszechnie znanym algorytmem do obliczania największego wspólnego dzielnika (GCD) dwóch dodatnich liczb całkowitych.
Algorytm
Na potrzeby tego wyzwania algorytm opisano poniżej:
Wyświetl dwa wejścia jako sąsiednie linie określonego znaku,
np. Wejście3,4
może być reprezentowane przez sąsiednie linie000
i0000
Zamień pierwsze
length(short_line)
znaki w dłuższej linii na inną, powiedz-
teraz, że wygląda jak000
i---0
Wyeliminuj pierwsze
length(short_line)
znaki w dłuższej linii.
teraz000
,0
Powtórzyć kroki 2 i 3 do dwóch mają jednakową długość, z wykorzystaniem krótszych i dłuższych liniach po każdej iteracji, na przykład
000
,0
-00
,0
00
,0
-0
,0
0
,0
- Możesz wybrać, czy chcesz zatrzymać się tutaj, czy kontynuować iterację i zamienić jedną z linii w pustą.
Każdy z tych kroków powinien być oddzielony odstępem między 0,3s a 1,5s.
Wyzwanie
Napisz program, który podając dwie liczby naturalne jako dane wejściowe, tworzy wynik, który wygląda dokładnie tak samo jak wynik powyższego algorytmu. Można używać innych znaków ASCII , które nie można drukować spacjami, niż 0
i -
, ale należy zachować spójność i używać tylko dwóch znaków. Możesz także użyć alternatywnych algorytmów, pod warunkiem, że dane wyjściowe, w tym taktowanie, są dokładnie takie same, jak w przypadku powyższego algorytmu.
Przykłady
To jest przykład z 24,35
danymi wejściowymi , które są koprime, więc ich GCD wynosi 1.
To jest przykład z wejściem 16,42
, które mają GCD 2.
Zasady
- To jest golf golfowy , więc wygrywa najkrótszy bajt
- Standardowe luki zastosowanie
- Można założyć, że dane wejściowe są dodatnimi liczbami całkowitymi dziesiętnymi
Wyjaśnienia
- Linie reprezentujące liczby muszą pozostać w oryginalnej kolejności, tj. Pierwsza i druga linia pierwszej wyświetlanej „ramki” muszą być odpowiednio pierwszą i drugą linią we wszystkich kolejnych ramkach.
- Po zakończeniu algorytmu nie powinien pojawiać się żaden dodatkowy widoczny element . Oznacza to jednak również, że można wyczyścić linie, jeśli upewnisz się, że ostatnia „klatka” jest wyświetlana przez co najmniej tyle samo czasu, co wszystkie inne klatki przed wygaszeniem.
:-)
Odpowiedzi:
Galaretka , 29 bajtów
Wypróbuj online!
Definiuje to funkcję
2Ŀ
(nie pełny program; łącze TIO zawiera stopkę przekształcającą funkcję w program), która pobiera listę dwóch elementów jako dane wejściowe i wyświetla dane wyjściowe na ekranie (jedna z naszych legalnych metod we / wy i taki, który jest niezbędny do tego wyzwania, ponieważ mówi o wyglądzie na ekranie). Zakłada się, że program działa w terminalu zgodnym ze standardem ANSI (użyłem,gnome-terminal
ale większość będzie działać) i że terminal jest początkowo pusty (co wydaje się najbardziej sensownym domyślnym); Uwaga: Wypróbuj online! nie jest zgodny z tymi założeniami, a zatem dane wyjściowe są tam zniekształcone (uruchomiłem program lokalnie, aby sprawdzić, czy animuje zgodnie z oczekiwaniami). Używam1
tam, gdzie używa to pytanie0
, i2
w miejsce-
.Wyjaśnienie
Funkcja pomocnicza
1Ŀ
(podana lista dwóch list cyfr, wyświetla je w pierwszym i drugim wierszu ekranu, a następnie czeka 0,5 sekundy; zwraca dane wejściowe)Ciąg „\ x1bc” wysłany do terminala kompatybilnego z ANSI jest interpretowany jako kod sterujący do resetowania terminala; powoduje to wyczyszczenie ekranu i przesunięcie kursora do lewego górnego rogu (w ten sposób resetując terminal gotowy do następnego wyjścia).
Funkcja pomocnika jest nazwana
1Ŀ
(Jelly automatycznie generuje nazwy tej formy dla funkcji i w rzeczywistości nie ma innego sposobu nazywania ich), ale można ją nazwać po prostu jakoÇ
z programu głównego (ponieważ język ma skrót dla funkcji z liczbami w pobliżu ).Główna funkcja
2Ŀ
(realizuje zadanie wymagane w pytaniu)źródło
JavaScript (ES6),
128124 bajtówźródło
Python 2 ,
152146 bajtówWypróbuj online!
Pobiera na wejściu dwie liczby całkowite oddzielone przecinkami
źródło
JavaScript (ES6),
215 194...135 129127 bajtówStosowanie
Wymaga to odmiany curry. Aby go użyć, najpierw przypisz funkcję do zmiennej (na przykład
G
), a następnie wywołaj ją w następujący sposób:Wyjaśnienie
Nieco rekurencyjna funkcja, która wywołuje się po 1 sekundzie, dopóki algorytm się nie skończy. Śledzi trzeciej zmiennej
c
, która określa, czya
ib
powinien być zmieniony (jeślic
jest1
, że nadszedł czas na zmiany).Po pierwsze, funkcja zapisuje coś na konsoli. Jeśli
c
tak0
, zapisuje dwa ciągi zer z nową linią między nimi. Ponieważc
jest inicjowany do0
, możemy skorzystać z tego i skonfigurować zmienne globalnef
ig
które posiadają pewne ciągi musimy często (jak0
irepeat
).W przeciwnym razie tworzy ciąg z zerami i minusami. Wszystkie takie ciągi składają się z dwóch części: najpierw niektóre
A
minusy (zadzwoń do tej kwoty ), następnie niektóreB
zera (zadzwoń do tej kwoty ), następnie znak nowej linii, potemD
minusy (zadzwoń do tej kwoty ) i na końcu niektóreE
zera (zadzwoń do tej kwoty ).Jeśli pierwsze wejście jest mniejsze niż drugie wejście, musimy usunąć zera z drugiego wejścia, więc
A
wynosi zero,B
równa się pierwsze wejście,D
równa się pierwsze wejście iE
równa się drugie wejście minus pierwsze wejście. Jeśli pierwsze wejście nie jest mniejsze niż drugie wejście, obowiązuje odwrotność (A
to drugie wejście,B
to pierwsze wejście minus drugie wejście itp.).Z tymi nowymi wartościami wejściowymi i zmienną przełączaną
c
funkcja ma być wywoływana ponownie w1e3
milisekundach, co równa się jednej sekundzie.Notatki
alert
dane wyjściowe0
i-
, podobnie jak w przykładachWypróbuj online
Wypróbuj tutaj!
źródło
Python 2 ,
208204194 bajtów-4 dzięki dzięki @math_junkie za podstępną sztuczkę z
time.sleep
-10 dzięki dzięki @busukxuan za wyjaśnienie zasady „wyczyść ekran”.
Wypróbuj online!
Jestem prawie pewien, że to może być bardziej golf. Boli mnie, powielać
print
ifor
pętlę, aby utworzyć pauzę, ale nie mogę znaleźć sposób wokół niego w tej chwili.Notatki
źródło
import time
,s=time.sleep
as(1)
zamiast pętli dla opóźnieniatime.sleep
ale tęskniłem. Spróbuje.perl,
161149 bajtów... bez wcięć i znaków nowej linii:
Umieść go w pliku gcd.pl i uruchom tak:
źródło
-M5.010
Flag Perl jest wolny, dzięki czemu można zaoszczędzić kilka bajtów za pomocąsay
ciąguprint…\n
. Ponadto jestem prawie pewien, że łatwiej jest nadać swojej anonimowej podprogramowi nazwę, niż przechowywać w zmiennej.GNU Sed (z
e
rozszerzeniem xec), 88Wynik obejmuje +3 dla
-zrf
opcji dosed
.Dane wejściowe są podawane jako dwie oddzielne liczby całkowite oddzielone znakiem nowej linii, przy użyciu wielkich liter
O
jako cyfr.Na przykład przykład 16, 42 można uruchomić jako:
Zgodnie z najnowszymi komentarzami nie usuwam ekranu między iteracjami.
źródło
V ,
4744 bajtówWypróbuj online!
Nagłówek i stopka w TIO wystarczy zmodyfikować,
gs
aby skopiować bieżące dwa wiersze na dole ekranu, a następnie usunąć pierwsze dwa na końcu. To wizualizuje operację dla TIO, ale jeśli uruchomiłeś ją w V (bez nagłówka i stopki), to po prostu poczekałby sekundę między każdą operacją.źródło
ò
?