Czas na mash!
Jest to część nr 5 zarówno mojej Random Golf of the Day, jak i serii ASCII Art of the Day firmy Optimizer . Zgłoszenia w tym wyzwaniu zostaną uwzględnione w obu tabelach wyników (w których można znaleźć powiązane posty). Oczywiście możesz traktować to jak każde inne wyzwanie związane z golfem i odpowiedzieć na nie, nie martwiąc się o żadną z serii.
Otwór 5: Diamentowe tilings
Zwykły sześciokąt można zawsze wyłożyć kafelkami z takimi diamentami:
Użyjemy artystycznej reprezentacji tych tafli ASCII. W przypadku sześciokąta o długości boku 2 istnieje 20 takich nachyleń:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Biorąc pod uwagę długość boku N
, należy wygenerować takie kafelki N
losowo dla sześciokąta o długości boku . Dokładny rozkład nie ma znaczenia, ale każde kafelkowanie musi zostać zwrócone z niezerowym prawdopodobieństwem.
Ponieważ N ≤ 4
zgłoszenie musi wygenerować kafelkowanie w ciągu 1 minuty co najmniej 80% czasu, a co najmniej 80% kafelków musi zostać wygenerowane w ciągu 1 minuty. Większość podejść nie będzie musiała się martwić tą zasadą (jest bardzo łagodna) - ma to na celu wykluczenie bardzo naiwnych algorytmów opartych na odrzucaniu, które generują dowolne ciągi znaków, dopóki nie pojawi się kafelkowanie.
Być może chcesz wiedzieć, że całkowitą liczbę możliwych przechyleń dla danego N można znaleźć w OEIS A008793 .
Możesz napisać pełny program lub funkcję i pobrać dane wejściowe za pomocą STDIN (lub najbliższej alternatywy), argumentu wiersza poleceń lub argumentu funkcji i wygenerować wynik za pomocą STDOUT (lub najbliższej alternatywy), wartości zwracanej funkcji lub parametru funkcji (wyjściowej).
Nie możesz wyprowadzać więcej spacji wiodących niż jest to konieczne do wyrównania sześciokąta (to znaczy lewy róg sześciokąta nie powinien mieć spacji przed nim). Każda linia może zawierać maksymalnie N
spacje (niekoniecznie spójne, więc możesz np. Mieć prostokątny wydruk, drukujący obwiednię sześciokąta).
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach). I oczywiście najkrótsze zgłoszenie na użytkownika wejdzie również do ogólnej tabeli liderów serii.
Liderów
Pierwszy post z każdej serii generuje tabelę wyników.
Aby upewnić się, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Język nie jest obecnie wyświetlany, ale fragment go wymaga i analizuje, a w przyszłości mogę dodać tabelę wyników według języków).
For N ≤ 4, your submission must produce a tiling within 1 minute at least 80% of the time.
zbyt łatwe: 80% czasu to samo, podstawowe kafelki, w przeciwnym razie znajdę kolejne kafelki w dowolnym momencieOdpowiedzi:
CJam, 105 bajtów
Dodano nową linię, aby uniknąć przewijania. Wypróbuj online
Wyjaśnienie:
To rozwiązanie rozpoczyna każdą linię jako zygzak, a następnie umieszcza na niej N znaków podkreślenia na podstawie ich pozycji w poprzedniej linii i kilku zasad. Otrzymałem to z serii obserwacji, patrząc na wynik jako zwykłą matrycę 2D znaków:
/\
w górnej połowie,\/
w dolnej połowie)/_/
może zmienić się tylko o -1 lub 0 i\_\
może zmienić się tylko o 0 lub 1"_ "
wzorca lub" _"
wzorca, oba są w porządkuPostanowiłem go zatem wdrożyć, zachowując poprzednie pozycje podkreślenia, modyfikując je losowo (2 opcje dla każdego podkreślenia) i powtarzając, aż reguły będą spełnione. W trakcie optymalizacji przełączyłem się na pozycje podkreślenia względem lewej strony sześciokąta (bez spacji).
Stara wersja „3D”, 189 bajtów:
Wypróbuj online
źródło
Python 2,
337335324318311300296 bajtówChodzi o to, aby najpierw utworzyć sześciokąt diamentów, taki jak ten:
A następnie wypełnij go ścieżkami podkreślenia w dół, takimi jak to:
Ostateczny wynik z dodanymi wszystkimi ścieżkami wyglądałby mniej więcej tak:
Spora część kodu wymaga upewnienia się, że ścieżki te nie wykraczają poza granice ani się nie krzyżują.
Nieskluczony kod:
źródło
randint(0,1)*(p<n*3+i*2-j)
dorandint(0,p<n*3+i*2-j)
.Perl,
174 168 166161Spróbuj mnie .
źródło
JavaScript ( ES6 ), 376
416 494Po prostu być tam ...
Zbuduj wszystkie tilings, a następnie wybierz losowy. Czas na tilings 232848 dla N = 4 to ~ 45 sekund na moim laptopie. Nie próbowałem N = 5.
Jako EcmaScript 6 działa tylko w przeglądarce Firefox.
źródło
dom.max_script_run_time
. Jest to globalna preferencja w około: config, moja jest ustawiona na 30.SmileBASIC, 241 bajtów
Mocno oparty na odpowiedzi Matty'ego
źródło