Przeglądałem Stackoverflow i zobaczyłem to pytanie o kafelkowanie prostokąta MxN i pomyślałem, że będzie to świetne miejsce do gry w golfa. Oto zadanie.
Biorąc pod uwagę wymiary M i N, napisz program, który wyświetli, ile unikalnych sposobów można prostokątować prostokątem MxN (N to liczba wierszy, a nie kolumn. To nie ma znaczenia), biorąc pod uwagę te ograniczenia.
- Wszystkie płytki to 2x1 lub 3x1
- Wszystkie płytki pozostają w swoim rzędzie (tzn. Wszystkie są poziome)
- Pomiędzy każdym dwoma sąsiadującymi rzędami płytki nie powinny być wyrównane, z wyjątkiem dwóch końców
- Gwarantowane jest, że M i N wynoszą co najmniej 1
Na przykład poprawne kafelkowanie macierzy 8x3 to
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|_____|___|
|___|_____|_____|
Ale następujące elementy byłyby nieprawidłowe, ponieważ wiersze są wyrównane
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|___|_____|
|_____|_____|___|
Przypadki testowe:
8x3: 4
3x1: 1
1x1: 0
9x4: 10
Code golf, więc najkrótsza odpowiedź wygrywa.
2x1
czy3x1
? Czy jest również wyjście dla4x1
zera?|
a nie przyczyniają się do długości rzędu stosując reprezentację jak to (w których, o ile nie jest to rura (|
), to jest przestrzeń).Odpowiedzi:
Galaretka , 20 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
119 110 106 9691 bajtówWypróbuj online!
Skomentował
źródło
R ,
243231 bajtówWypróbuj online!
Wersja z podziałami linii:
Nie zauważaj rekurencji i obsługuje dość duże wartości min (np. 24x20 -> 3,3e19)
Oto skomentowana odpowiedź, która działa mniej więcej tak samo jak powyżej, ale usunąłem wszystkie funkcje, więc jest w rzeczywistości czytelna:
Metoda pobierania macierzy i jej wielokrotnego mnożenia pochodzi z pytania o przepełnienie stosu . To podejście działa tutaj, ponieważ skutecznie oblicza łączną liczbę gałęzi w różnych możliwych rzędach cegieł.
Jeśli dozwolone są pakiety zewnętrzne, mogę sprowadzić je do 192:
źródło
Galaretka , 26 bajtów
Wypróbuj online!
Zepsuty:
Wygeneruj listę możliwych ścian jako sumy zbiorcze z usuniętym końcem:
Znajdź zewnętrzny stół wszystkich możliwych ścian, które nie mają żadnych skrzyżowań:
Weź tę macierz do potęgi (N-1), a następnie podsumuj wszystko:
Używa pierwszego bitu z odpowiedzi @ EriktheOutgolfer, aby wygenerować listę możliwych ścian, a następnie stosuje podejście przecięcia macierzy i wykładnika macierzy z mojej odpowiedzi R. Jako taki, działa dobrze nawet z dużymi N. To jest moja pierwsza odpowiedź na żelki i podejrzewam, że można więcej grać w golfa. Idealnie chciałbym również zmienić pierwszą sekcję, aby wymagania dotyczące czasu i pamięci nie skalowały się wykładniczo z M.
źródło
05AB1E , 42 bajty
Jestem prawie zbyt zawstydzony, aby to opublikować, i zdecydowanie może grać w golfa przez LOT z innym podejściem, ale ponieważ zajęło to trochę czasu, postanowiłem opublikować to i odtąd grać w golfa. Wyzwanie wygląda na łatwiejsze niż jest na Imo, ale zdecydowanie używam tutaj niewłaściwego podejścia i mam wrażenie, że 05AB1E może zrobić około 25 bajtów ..
Wypróbuj online. UWAGA: Jest nie tylko długi, ale także nieefektywny, ponieważ
9x4
przypadek testowy działa na TIO w około 40 sekund.Wyjaśnienie:
źródło
Węgiel drzewny , 89 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Działa w przypadku prostokątów o wielkości do około 12 w TIO, ale można je wykonać około trzy razy szybciej, kosztem 2 bajtów, stosując kręcenie bitów zamiast przecinania listy. Wyjaśnienie:
Wprowadź szerokość.
Zacznij od rzędu bez cegieł.
Zacznij bez zakończonych wierszy.
Pętla nad rzędami.
Pętla nad cegłami.
Dodaj szerokość cegły do bieżącej szerokości wiersza.
Jeśli spowoduje to szerokość wejściową, dodaj ten wiersz do listy zakończonych wierszy.
W przeciwnym razie, jeśli jest to nadal mniej niż szerokość wejściowa, dodaj nowy wiersz do listy wierszy, powodując, że zostanie on przechwycony przez późniejszą iterację.
Zrób listę ścian jednego rzędu.
Zapętlić o jeden mniej niż wysokość.
Zapisz listę ścian.
Wyczyść listę ścian.
Pętla nad zapisaną listą ścian.
Pętlę nad ukończonymi rzędami.
Jeśli wiersz można dodać do tej ściany, dodaj go do listy ścian.
Podaj długość końcowej listy ścian.
źródło