Napisz najkrótszy możliwy program, który przyjmuje zestaw różnych liczb całkowitych dodatnich i generuje renderowanie ASCII koncentrycznych sześciokątów o tych długościach boków, wykonanych z ukośników, znaków podkreślenia, spacji i nowych linii.
Najkrótszy program w bajtach, liczony przez https://mothereff.in/byte-counter, wygrywa.
Przykłady
(Wyglądają lepiej przy mniejszych odstępach między wierszami).
Jeśli dane wejściowe to 1
wyjście powinno być sześciokątem o długości boku 1:
__
/ \
\__/
Zauważ, że dwa podkreślenia są używane na górze i na dole sześciokąta, więc jest on bardziej proporcjonalny.
Ogólnie rzecz biorąc, sześciokąt w rozmiarze N zawiera N cięć po każdej stronie pod kątem i 2 * N podkreślenia na górze i na dole.
Jeśli dane wejściowe to 1 2
dane wyjściowe, powinny to być koncentryczne sześciokąty o długości boku 1 i 2:
____
/ __ \
/ / \ \
\ \__/ /
\____/
Jeśli wejście jest 1 3
wyjściem powinno być:
______
/ \
/ __ \
/ / \ \
\ \__/ /
\ /
\______/
Jeśli dane wejściowe to 1 3 2
wyjściem powinno być:
______
/ ____ \
/ / __ \ \
/ / / \ \ \
\ \ \__/ / /
\ \____/ /
\______/
itp.
Zasady we / wy
Dane wejściowe muszą pochodzić z wiersza polecenia lub standardowego wejścia, ale mogą być w dowolnym dogodnym formacie.
Na przykład możesz podać każdą liczbę jako argument wiersza poleceń: > myprogram 1 3 2
lub możesz poprosić użytkownika o wprowadzenie liczb w postaci wstępnie sformatowanej listy:[1, 3, 2]
.
Dane wyjściowe muszą przejść do standardowego lub najbliższego odpowiednika Twojego języka.
Dodatkowe zasady
- Dane wejściowe zawsze będą zbiorem wyraźnych liczb całkowitych dodatnich, niekoniecznie w dowolnej kolejności .
- Dane wyjściowe muszą ...
- nie może zawierać żadnych innych znaków
/\ _
i znaków nowej linii. - nie mają spacji końcowych ani niepotrzebnych spacji wiodących.
- nie zawierają obcych początkowych linii, ale mogą mieć jedną opcjonalną nową linię.
- nie może zawierać żadnych innych znaków
- Jeśli nic nie jest wprowadzone, to nic nie wypisuje (z wyjątkiem jednej nowej linii).
- Jeśli to pomoże, możesz założyć, że wejściowe liczby całkowite są mniejsze niż 2 16 .
1
odnosi się do najbardziej wewnętrznego lub najbardziej zewnętrznego sześciokąta?1
(lub dowolna liczba) odnosi się do sześciokąta o boku o długości 1. (Z zastrzeżeniem, że 1 cięcie = 2 podkreśla). Tak więc1
zawsze będzie odnosić się do najbardziej wewnętrznego sześciokąta.Odpowiedzi:
CJam,
148116109 bajtówTrwało to znacznie dłużej niż się spodziewałem. Początkowo chciałem po prostu iteracyjnie zbudować lewą górną ćwiartkę, tak jak w przypadku wyzwań z brylantami, a następnie pozyskać resztę z odbicia lustrzanego. Ale nie zauważyłem, że podkreślenia nie zachowują symetrii lustra między górną i dolną połową. Musiałem więc przerobić większość z nich, aby wygenerować iteracyjnie prawą połowę, a następnie tylko raz wykonać kopię lustrzaną (w lewo).
Sprawdź to tutaj.
Przykład Fibonacciego:
Wyjaśnienie:
Jak stwierdzono u góry, zaczynam od iteracyjnego budowania prawej połowy. Oznacza to, że początkowo mam tylko jedną przestrzeń na siatce, a następnie dla każdego możliwego pierścienia albo otaczam istniejącą siatkę w przestrzeni, albo nowy pół-sześciokąt.
Gdy to zrobisz, odbijam lustro każdą linię po lewej stronie i wypełniam ją wiodącymi spacjami, aby uzyskać prawidłowe wyrównanie. Oto podział kodu:
źródło
Python -
251, 240, 239228Alternatywne podejście (251):
źródło
APL (222 bajty w UTF-8)
(i 133 znaków)
Ponieważ pytanie to dotyczy konkretnie liczby bajtów w reprezentacji UTF8, musiałem trochę go rozholfować , aby było dłuższe, ale jego reprezentacja UTF8 jest krótsza. (W szczególności znak operatora dojeżdżania do pracy
⍨
ma trzy bajty, a()
tylko dwa, więc optymalizacja już nie działa, a ponadto przypisywanie jest bardzo kosztowne).Poprzednia wersja, która jest krótsza w znakach (124), ale używa więcej bajtów, gdy jest reprezentowana w UTF-8 (230, co umieściłoby ją na drugim miejscu):
Test:
źródło
Perl 5, 352 (349 bajtów + 3 dla
anE
flag)Prawdopodobnie można by to znacznie pograć w golfa ..
Nie golfowany:
Przykład (
1 5 3 14
):źródło
C # -
388316 bajtówEdycja: Zmieniono sposób, w jaki unika drukowania końcowych spacji i wrzucił w LINQ
Prosty program, który przyjmuje argumenty wiersza poleceń. Iteruje przez każdy możliwy znak w każdej linii prostokąta zdefiniowanego przez maksymalny wymiar sześciokąta i dołącza go do bieżącej linii, przed przycięciem linii i wydrukowaniem ich kolejno (tworzy opcjonalną końcową nową linię).
Kod do gry w golfa:
Nieskluczony kod:
źródło
APL (Dyalog Classic) , 151 bajtów (93 z klasycznym kodowaniem APL)
Wypróbuj online!
źródło