Jest to dobry sposób na wykonanie długiego mnożenia dla dwóch liczb całkowitych bez konieczności robienia niczego poza liczeniem, które od czasu do czasu są udostępniane w Internecie. Cyfry każdej liczby zapisujesz jako wiązkę ukośnych linii, z dwiema liczbami pod kątem 90 stopni. Następnie możesz po prostu policzyć skrzyżowania w oddzielnych kolumnach, które się pojawiają. Schemat prawdopodobnie to wyjaśni. Oto przykład obliczania 21 * 32
:
Jeśli wyszukujesz w Google „wizualne / graficzne długie mnożenie”, znajdziesz o wiele więcej przykładów.
W tym wyzwaniu musisz wygenerować te diagramy przy użyciu grafiki ASCII. W tym samym przykładzie dane wyjściowe wyglądałyby tak:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Prawdopodobnie najłatwiej jest obliczyć reguły konstrukcyjne dla nich z kilku przykładów (patrz poniżej), ale tutaj kilka szczegółów:
- Przecinające się segmenty to
X
nie przecinające się segmenty linii to/
lub\
. - Powinien znajdować się dokładnie jeden segment za najbardziej zewnętrznymi skrzyżowaniami.
- Pomiędzy skrzyżowaniami należącymi do różnych cyfr powinien znajdować się dokładnie jeden segment. Jeśli są cyfry zerowe, będą to kolejne
/
lub\
segmenty. - Musisz wesprzeć wszelkie pozytywne dane wejściowe (przynajmniej do pewnego rozsądnego limitu, takiego jak 2 16 lub 2 32 ), oraz wszelkie cyfry od
0
do9
. Możesz jednak założyć, że nie ma ani początku, ani końca0
. - Nie wolno drukować obcych początkowych białych znaków ani początkowych lub końcowych pustych linii.
- Można wydrukować końcowe białe znaki, ale nie mogą one przekraczać wyrównanego do osi obwiedni.
- Możesz opcjonalnie wydrukować jedną końcową linię nowego wiersza.
- Możesz wybrać, w jakiej kolejności wziąć dwie liczby wejściowe. Jednak musi obsługiwać dowolne liczby dla obu orientacji, więc nie można wybrać czegoś w rodzaju „Najpierw podawana jest większa liczba”.
- Jeśli bierzesz dane wejściowe jako ciąg, możesz użyć dowolnego niecyfrowego separatora między dwiema liczbami.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
To jest kod golfowy, wygrywa najkrótsza odpowiedź (w bajtach).
Przykłady
1*1
\ /
X
/ \
2*61
\ /
\ X /
X X /
/ X X /
/ X X /
/ X X /
/ X X
/ X \ /
/ \ X
X \
/ \
45*1
\ /
\ X
\ X \
\ X \
\ X \
X \
\ / \
\ X
\ X \
\ X \
X \
/ \
21001*209
\ /
X /
/ X
/ / \
\ / / \ /
X / X /
\ / X / X /
\ X / \ / / X /
X X \ / / / X /
/ X \ X / / / X /
/ \ \ / X / / / X /
\ X / X / / / X /
X X / X / / / X /
/ X X / X / / / X
/ X X / X / / / \
/ X X / X / /
/ X X / X /
/ X X / X
/ X X / \
/ X X
/ X \
/ \
Odpowiedzi:
Pyth - 79 bajtów
Tłumaczenie odpowiedzi @ AlexeyBurdin. Prawdopodobnie można grać w golfa o wiele więcej.
Pobiera dane wejściowe jako dwie liczby oddzielone znakiem nowej linii. Wyjaśnienie już wkrótce.
Wypróbuj online tutaj .
źródło
python, 303
Myślę, że jest wystarczająco czytelny dla człowieka.
Weryfikacja:
źródło
reversed
jest to samo[::-1]
, co: możesz umieścić zawartość pętli for w jednej linii, aby zaoszczędzić na wcięciach,len(a)+len(b)
jest krótszy niżsum(map(len,[a,b]))
, nie używajxrange
w golfie,) for
można usunąć miejsce, a ponieważ jesteś za pomocą python2 możesz łączyć spacje i tabulatory z wcięciem.276
proste składanie we=enumerate
na początku golfa 4 znakiPython 3, 205 bajtów
Wyrażenia są dość długie, więc myślę, że jest sporo miejsca na ulepszenia, ale w każdym razie ...
Oddziela przestrzeń wejściową przez STDIN, np
W niektórych liniach jest możliwe spacje końcowe, ale
A+B-2
zapewnia, że wszystkie spacje końcowe znajdują się w obwiedni.źródło
C #, 451 bajtów
Sformatowana pod kątem czytelności, funkcja w kontekście:
Bitowe OR było po prostu dla zabawy, ale dodawanie też by działało.
źródło
JavaScript ( ES6 ) 271
Jestem pewien, że istnieje rozwiązanie, które buduje dane wyjściowe rząd po rzędzie, bawiąc się współrzędnymi matematycznymi i x, y (x + y == k, xy == k ...). Ale nadal nie mogę tego zrobić.
Oto rozwiązanie, które po prostu rysuje linie jeden po drugim.
Uruchom fragment w przeglądarce Firefox, aby go przetestować.
źródło
VC ++
(289)280Stosowanie
Wyniki
źródło
---48
za?...)-- - 48)...
.Płótno , 41 bajtów
Wypróbuj tutaj!
źródło
C (329 b)
SPRÓBUJ
źródło
R , 294 bajty
Wypróbuj online!
źródło
Galaretka , 58 bajtów
Wypróbuj online!
Wyjaśnienie
Pełny program, który bierze dwie liczby jako listę dwóch liczb całkowitych i zwraca ciąg znaków.
Łącze pomocnicze 1: obróć matrycę
Łącze pomocnicze 2: wygeneruj szablony wierszy i kolumn
Główny link
źródło