Otrzymujesz sześciokątną siatkę postaci .
i #
, w ten sposób:
. . . . . . . .
. . . . # . . .
. # . . . # . .
. . . # . . . .
. . . . . # . .
. . . . . . . .
Twoim zadaniem jest, aby wypełnić całą oś wyrównany obwiedni #
z dodatkowo #
:
. . . . . . . .
. . # # # # . .
. # # # # # . .
. . # # # # # .
. . # # # # . .
. . . . . . . .
Obwiednia wyrównana do osi jest najmniejszym wypukłym sześciokątnym kształtem, który zawiera wszystkie elementy #
. Zauważ, że w przypadku siatki sześciokątnej są należy wziąć pod uwagę trzy osie (W / E, SW / NE, NW / SE):
Oto kolejny przykład pokazujący, że w niektórych przypadkach jedna lub więcej stron będzie zawierać tylko jedną #
:
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . . . . . . . . . . . . .
Możesz albo zobaczyć je jako sześciokąty ze zdegenerowanymi bokami, lub możesz narysować wokół nich obwiednię, tak jak to zrobiłem powyżej, w którym to przypadku nadal są sześciokątami:
Zbyt trudne? Spróbuj część I!
Zasady
Możesz użyć dowolnych dwóch różnych znaków ASCII drukowalnych spacji (od 0x21 do 0x7E włącznie), zamiast #
i .
. Będę nadal odnosząc się do nich, jak #
i .
dla pozostałej części specyfikacji chociaż.
Dane wejściowe i wyjściowe mogą być albo pojedynczym ciągiem oddzielonym od linii, albo listą ciągów (po jednym dla każdej linii), ale format musi być spójny.
Możesz założyć, że wejście zawiera co najmniej jeden, #
a wszystkie wiersze mają tę samą długość. Zauważ, że istnieją dwa różne „rodzaje” linii (zaczynające się spacją lub spacją) - możesz tego nie robić zakładać, że wejście zawsze zaczyna się od tego samego typu. Możesz założyć, że obwiednia zawsze pasuje do podanej siatki.
Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i zapewniania danych wyjściowych.
Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.
To jest golf golfowy , więc najkrótsza ważna odpowiedź - mierzona w bajtach wygrywa .
Przypadki testowe
Każdy przypadek testowy ma wejścia i wyjścia obok siebie.
# #
. . . .
# . # # # #
. . . .
. # . #
. . . . # .
# . # .
# . # .
. . . . # .
. # . #
# . # .
# . . # # .
. # # #
. # # #
# . . # # #
. # # #
. . # . # #
. . # #
# . . # # .
# . . # # .
. . # #
. . # . # #
. . . . . . . . . . . . . . . .
. . # . # . . . . . # # # . . .
. . . . . . . . . . . # # . . .
. . . # . . . . . . . # . . . .
. . . . . . . . . . . . . . . .
. . # . . . # . . . # # # # # .
. . . . . . . . . . . # # # # .
. . . # . . . . . . . # # # . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . # . . . . . # # # # . .
. # . . . # . . . # # # # # . .
. . . # . . . . . . # # # # # .
. . . . . # . . . . # # # # . .
źródło
Odpowiedzi:
Pyth ,
8271 bajtówWypróbuj online!
Wyjaśnienie
Niech A będzie punktem o najniższej współrzędnej y, a B punktem o najwyższej współrzędnej y.
Niech C będzie punktem o najniższej wartości (wartość x minus wartość y), a D punktem o najwyższej.
Niech E będzie punktem o najniższej wartości (wartość x plus wartość y), a F punktem o najwyższej wartości.
Zatem jest to równoważne ze znalezieniem współrzędnych, których współrzędna y znajduje się między A i B, wartość x minus wartość y jest pomiędzy C i D, a wartość x plus wartość y jest pomiędzy E i F.
źródło
Haskell,
256 254243 bajtówDzięki @Damien za grę w golfa
f
!Dane wejściowe są traktowane jako lista list znaków, dane wyjściowe są podawane w ten sam sposób.
To była bestia do napisania. Opiera się na pomyśle LeakyNun przy użyciu filtrowania opartego na maksimum i minimum na współrzędnych przedmiotów.
Jestem naprawdę zaskoczony faktem, że
m=map
faktycznie oszczędza bajty, ponieważ wydaje się to tak kosztowne.Wyjaśnienie:
Oto nieco mniej zamaskowana wersja (nacisk nieco ):
f
to funkcja, która przypisuje każdemu znakowi indeks(y-index, x-index)
, zachowując oryginalną strukturę listy.b
: Biorąc pod uwagę pozycję z indeksowanej listy,b
oblicza[y-index, y - x, y + x]
.p
: Biorąc pod uwagę pole indeksowane, zwróć 3 funkcjeInt -> Bool
, z których pierwszą jest sprawdzenie indeksu y, druga różnicy i trzecia suma.min(snd e)
zajmuje się przestrzeniami (przestrzeń jest mniejsza od obu). Ta funkcja jest wbudowana w kod do gry w golfa.q
biorąc pod uwagę pola indeksowane, zmień wszystkie niezbędne.
do#
sprawdzając czy tego zwrotu danej dziedzinieTrue
do każdej funkcji testowej.Ostatecznym rozwiązaniem jest wówczas skład
q
if
.źródło
f=z(\y->z((,).(,)y)[0..])[0..]
h x=z x[0..]
f=h$h.curry(,)
Python 3,
380378348346 bajtówZauważ, że wcięcie ma tabulatory, a nie spacje.
Wersja golfowa:
Przetestuj na Ideone
Objaśnienie (dla wersji bez golfa poniżej):
Wszystkie przetwarzanie odbywa się bez konwersji, znaki spacji są po prostu pomijane.
Funkcja
axes_pos
oblicza 3-krotne wyimaginowane współrzędne „3D”, są one kumulowane w minimalnych i maksymalnych 3-krotnych (bmin
,bmax
) dla wszystkich#
znaków.Współrzędne są obliczane w
def axes_pos(x, y): return y, x + y, lc - y + x
;gdzie X liczy się od 0 do prawej, a Y liczy się od 0 do dołu (od pierwszej linii do ostatniej).
Pierwsza wyobrażona współrzędna to w zasadzie Y, ponieważ jest oczywiste, dlaczego. Jego topór jest prostopadły do zielonych granic (na zdjęciach PO).
Drugi jest prostopadły do czerwonych granic, a trzeci prostopadły do niebieskich granic.
W drugim przejściu zastępowane są wszystkie
.
znaki, których współrzędne „3D” mieszczą się wbmin
…bmax
zakresie, jeśli chodzi o element - jest to zaznaczone w tym wyrażeniuall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
.Wersja bez golfa z testami, także na Ideone :
Aktualizacja 1:Usunięto niepotrzebne
Aktualizacja 2,3:-1
dla trzeciej wyobrażonej współrzędnej, ponieważ nic to nie zmieniaCzęściowo zaimplementowane ulepszenia sugerowane również przez
Leaky Nun
+ moje.źródło
def A(x,y):return y,x+y,len(L)-1-y+x
->A=lambda x,y:(y,x+y,len(L)-1-y+x)
len(L)-y+x
dox-y
Galaretka ,
4535 134241 bajtówTo jest lista linków; ostatni musi zostać wywołany na wejściu, aby uzyskać wynik.
I / O ma postać tablic łańcuchowych, gdzie
.
wskazuje pusty i@
wskazuje wypełniony.Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Rozważmy następujący przykład.
Rysując parę lub równoległe linie - najbliższą parę obejmującą wszystkie wypełnione pozycje - w każdym z trzech kierunków, możemy określić sześciokątną ramkę ograniczającą.
W implementacji zamieniamy wszystkie znaki między tymi dwiema liniami
@
i wszystko poza tymi liniami na.
, z możliwym wyjątkiem przekątnych zawierających tylko spacje).W przypadku osi poziomej daje to
dla opadającej osi ukośnej daje
a dla podniesienia osi ukośnej daje
Biorąc pod względem charakteru minimum wszystkich trzech, ponieważ
.
<@
, otrzymujemyPozostało tylko przywrócić miejsca.
Jak to działa
źródło
Python,
237230 bajtów7 bajtów dzięki Dennisowi.
Port mojej odpowiedzi w Pyth .
Pobiera tablicę wierszy jako dane wejściowe, generuje tablicę znaków 2D.
źródło
Perl,
128126 bajtówObejmuje +6 za
-0F\n
Uruchom z wejściem na STDIN. Użyj
1
dla wypełnionego,0
dla pustego. Linie nie muszą być wypełnione spacjami na końcu:hexafill.pl
Wykorzystuje współrzędne kostki. Określ maksimum i minimum podczas
$= == 1
pętli i wypełnia współrzędne między tymi granicami podczas$= == 0
pętli. Pierwsze 58 pętli jest bezcelowe i jest tylko po to, by wypełnić$-
je liczbą liniiźródło
TSQL, 768 bajtów
Napisałem zapytanie, aby rozwiązać ten problem - co było dla mnie dość trudne. Nie jest w stanie konkurować z doskonałą krótszą odpowiedzią. Ale i tak chciałem to opublikować dla zainteresowanych. Przepraszam za długość odpowiedzi - mam nadzieję, że codegolf dotyczy również różnych podejść.
Gra w golfa:
Nie golfowany:
Skrzypce bez golfa
źródło
GNU Octave,
212, 196 bajtówMoże nie jest to ulubiony język golfisty, ale to właśnie stanowi wyzwanie, prawda? Zakładając, że m jest traktowane jako macierz char: 178 bajtów autonomicznie i 196, jeśli są wypełnione funkcją .
grał w golfa:
bez golfa:
Wyjaśnienie : budujemy układ współrzędnych, 3 osie - prostopadłe do boków sześciokątów, znajdujemy maksimum i min dla każdej współrzędnej, następnie budujemy maskę logiczną zaczynając od 1 wszędzie i logicznie oraz: łącząc ograniczenia maks. I min. Każdej współrzędnej, w końcu ponownie ustawiając każda pozostała „prawdziwa” pozycja do znaku „#”.
Jeśli chcesz to przetestować, możesz po prostu utworzyć macierz m:
a następnie wywołaj f (m) i porównaj z m, budując macierz z obydwoma w:
źródło
m
a dane wyjściowe mają zostać zapisanek
. Odpowiedzi powinny zawsze być pełnymi programami lub funkcjami wywoływalnymi.