Zainspirowany wyzwaniem przełożenia Lego autorstwa Keitha Randalla.
Ja także planuję zbudować gigantycznego robota Lego, który ostatecznie będzie w stanie zniszczyć inne roboty w nigdy wcześniej nie wspomnianej konkurencji. * W trakcie budowy robota będę używać wielu pociągów zębatych do połączenia różne części robota. Chcę, żebyś napisał mi najkrótszy program, który pomoże mi zbudować złożone przekładnie zębate, które są wymagane do tak złożonego zadania. Oczywiście będę używać tylko kół zębatych o promieniu 1, 2, 3 i 5 jednostek arbitralnych-lego.
Każdy bieg w przekładni ma określoną współrzędną całkowitą na siatce 2D. Pierwszy bieg znajduje się na (0,0), a ostatni bieg będzie na współrzędnych nieujemnych. Lokalizacja i rozmiar pierwszego i ostatniego biegu zostaną podane jako dane wejściowe, twój program musi powiedzieć, które biegi idą gdzie wypełnić luki.
Dodatkowo twój program musi wykorzystywać minimalną możliwą liczbę biegów w przekładni. Mniej biegów / pociągów = więcej pociągów ** = większy i lepszy robot zniszczenia.
Dane wejściowe będą składać się z jednego wiersza:
X,Y,B,A
X i Y są współrzędnymi ostatniego biegu. Pierwszy bieg jest zawsze ustawiony na (0,0). B i A są odpowiednio promieniami biegu końcowego i początkowego. Aby dodać trochę trudności, musisz upewnić się, że koło wyjściowe obraca się we właściwym kierunku. Jeśli A i B mają ten sam znak, to koło wyjściowe musi się obracać w tym samym kierunku i należy użyć nieparzystej liczby kół zębatych. Jeśli mają przeciwne znaki, należy użyć parzystej liczby biegów.
Wyjściem powinna być lista lokalizacji X, lokalizacji Y i promieni każdego dodatkowego biegu, jeden bieg na linię. Jeśli istnieje wiele rozwiązań z minimalnym sprzętem, wydrukuj tylko jedno z wybranych. Kolejność biegów na wyjściu nie ma znaczenia.
Przykłady (możliwe mogą być bardziej równoważne rozwiązania):
in
4,0,1,1
out
2,0,1
in
7,7,-2,-2
out
4,3,3
OR
0,7,5
OR
the above reflected over y=x line
in
7,8,-1,2
out
7,0,5
7,6,1
OR
7,0,5
1,8,5
in
7,7,2,-2
out
4,-3,3
7,1,2
12,1,3
12,7,3
OR
any permutation of the above, or reflected over y=x line
Now you're thinking with gear trains!
Oto rozwiązania powyższych przykładów, wizualizowane:
O ile mi wiadomo, żaden problem nie jest niemożliwy, chyba że dwa biegi wejściowe nachodzą na siebie lub się bezpośrednio łączą. Nie będziesz musiał sobie z tym poradzić.
To jest golf golfowy, wygrywa najkrótsza odpowiedź.
* Przyszły KOTH, ktoś?
** CHOO CHOO !!
Odpowiedzi:
C #, 660 bajtów
Wypróbuj online
To była świetna zabawa !! Kompletny program, przyjmuje dane wejściowe z STDIN, dane wyjściowe do STDOUT. Wyjście to biegi w kolejności od końca do początku. Stosowanie:
Wykonuje proste wyszukiwanie szerokości, które rozwiązuje problem 4 biegów w mniej niż sekundę. Czynnik rozgałęzienia nie jest tak duży, więc powinien być dobry na znacznie więcej (naprawdę go nie testowałem). Niestety używa Linq.
Q
Ciąg jest tabela wszystkich dozwolonych połączeń zębatych (czylir=3
i połączyć sięr=1
, jeślidx=4
idy=0
) w jednej ćwiartce, który jest następnie obracana na znalezienie innych. Każdy zestaw 3 bajtów jestdx
,dy
oraz informacje promień połączenia prawnego. Wybór(
przesunięcia był bardzo przemyślany: raz fajnie było wybrać znak ASCII dla dobrych właściwości, zamiast desperacko próbować znaleźć ładne właściwości dla narzuconych znaków ASCII.Prawdopodobnie potrafię lepiej odczytać dane wejściowe, ale nie miałem jeszcze szczęścia, zwłaszcza dlatego, że Linq jest opłacany potrzebą listy. Jestem również bardzo rozczarowany obrotowym kodem, wydaje mi się, że można to zrobić w znacznie mniejszej liczbie bajtów.
Sformatowany i skomentowany kod z
Q
generatorem:źródło