Jeśli weźmiesz arkusz papieru milimetrowego i narysujesz nachyloną linię, która prowadzi m
jednostki w prawo, a n
jednostki w górę, przecinasz n-1
poziome i m-1
pionowe linie siatki w pewnej sekwencji. Napisz kod, aby wygenerować tę sekwencję.
Na przykład m=5
i n=3
daje:
Prawdopodobnie związane: rytmy Generowanie euklidesowej , tilings Fibonacciego , FizzBuzz
Wejście: Dwie dodatnie liczby całkowite, m,n
które są względnie pierwsze
Wyjście: Zwróć lub wydrukuj skrzyżowania jako sekwencję dwóch różnych tokenów. Na przykład może to być ciąg H
i V
, lista True
i False
, lub 0
„i 1
” są wydrukowane w osobnych wierszach. Może istnieć separator między tokenami, o ile jest zawsze taki sam, a nie, powiedzmy, zmienna liczba spacji.
Przypadki testowe:
Pierwszy przypadek testowy daje pusty wynik lub brak wyjścia.
1 1
1 2 H
2 1 V
1 3 HH
3 2 VHV
3 5 HVHHVH
5 3 VHVVHV
10 3 VVVHVVVHVVV
4 11 HHVHHHVHHHVHH
19 17 VHVHVHVHVHVHVHVHVVHVHVHVHVHVHVHVHV
39 100 HHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
W formacie (m,n,output_as_list_of_0s_and_1s)
:
(1, 1, [])
(1, 2, [0])
(2, 1, [1])
(1, 3, [0, 0])
(3, 2, [1, 0, 1])
(3, 5, [0, 1, 0, 0, 1, 0])
(5, 3, [1, 0, 1, 1, 0, 1])
(10, 3, [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
(4, 11, [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0])
(19, 17, [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
(39, 100, [0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0])
Odpowiedzi:
Ruby, 92; Struś 0.7.0 , 38
Dane wyjściowe dla obu z nich używają 1 i 0 (np.
101101
).Oto wyjaśnienie strusia:
I wyjaśnienie, jak to wszystko działa, używając kodu Ruby jako przewodnika:
źródło
Python, 53
Wykorzystuje dane wyjściowe z listy Prawda / Fałsz. Nic specjalnego.
źródło
Pyth -
3224 bajtyPobiera dane wejściowe za pośrednictwem standardowego formatu
[m,n]
. Wyświetla wynik na standardowe wyjście jako listę zer i jedynek, gdzie 0 = V, a 1 = H.Przetestuj online
Wyjaśnienie:
źródło
eM
jest taki sam jakmed
.@"VH"
ponieważ możesz drukować,0
a1
zamiastV
iH
.J
. Oto, co do tej pory mam przy 25 bajtach: pyth.herokuapp.com/…jk
ponieważ wyjściem może być lista.Kod maszynowy IA-32, 26 bajtów
Hexdump kodu:
Zacząłem od następującego kodu C:
Zapisuje dane wyjściowe w dostarczonym buforze. Nie zwraca długości danych wyjściowych, ale nie jest tak naprawdę potrzebne: długość wyjściowa wynosi zawsze
m + n - 2
:Aby przekonwertować kod C na kod maszynowy, najpierw zrobił kilka szczypanie, aby jeden z
if/else
oddziałów opróżnić i porównać0
zamiastn
:Odtąd pisanie kodu asemblera jest proste:
źródło
t
„odległość dobuzz
”. Jeśli odległość jest co najmniejn
, idźfizz
, albo idźbuzz
; zaktualizować odległość; powtarzaj do 0.Python - 125 bajtów
Wykorzystuje bardzo prosty algorytm, po prostu zwiększa współrzędne i wykrywa, kiedy przecina linie i drukuje. Chcę przetłumaczyć na Pyth.
Ta pętla while sprawdza liczbę
l
ines, a następnie sprawdza, czy którakolwiek z wartości nie przekroczyła wewnętrznej granicy, odejmując.Pobiera dane wejściowe jak
39, 100
ze standardowego wejścia i wypisuje jak standardoweHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
w jednym wierszu.źródło
CJam, 15 bajtów
Wypróbuj tutaj.
Drukuje
01
dla V i10
H.Wyjaśnienie
Linia ukośna przecina linię poziomą na każdy 1 / n całej linii ukośnej i przecina linię pionową na każdy 1 / m.
źródło
TI-BASIC, 32
Bezpośredni. Wykorzystuje sekwencję
0
i1
, oddzielone podziałami linii. Zaletami TI-BASIC są dwubajtowegcd(
i dorozumiane mnożenie, ale jego wadami są pętla For, w tym wartość końcowa i 5 bajtów wydanych na dane wejściowe.źródło
Python, 47
Jak algorytm anatolyga , ale sprawdzany bezpośrednio za pomocą modułów.
źródło
Haskell, 78 bajtów
Przykład użycia:
Jak to działa: sporządzić listę wartości x wszystkich skrzyżowań pionowych
(x,0)
dlax
w [1,2, ..., m-1] (0
wskazuje w pionie) i dołączyć listę wartości x wszystkich skrzyżowań poziomych(y*m/n,1)
dlay
w [1,2, ..., n-1] (1
wskazuje poziomo). Posortuj i weź drugie elementy par.Klątwa dnia: znowu muszę wydać 17 bajtów,
import
ponieważsort
jest wData.List
standardowej bibliotece, a nie w niej.źródło
KDB (Q), 44 bajty
Wyjaśnienie
Znajdź wszystkie wartości osi x punktów przecięcia i posortuj je. Jeśli mod 1 wynosi zero, jego „V”, niezerowe oznacza „H”.
Test
źródło
CJam,
2624 bajtówWypróbuj online
Bardzo prosta, prawie bezpośrednia implementacja algorytmu typu Bresenham.
Wyjaśnienie:
Ostatni
01
musi zostać usunięty, ponieważ pętla przeszła aż do punktu końcowego, który nie jest częścią pożądanego wyjścia. Należy pamiętać, że możemy nie tylko zmniejszyć liczbę pętli o 1. W przeciwnym razie,N > M
wszystkie0
s od ostatniej iteracji będzie brakować, gdy musimy tylko pozbyć się bardzo ostatnio0
.źródło
>
do;W<
.1
stos na szczycie, równie dobrze mogę go produktywnie wykorzystać.