Podsumowanie
Zainspirowany niedawną popularnością wyzwań artystycznych ASCII, celem tego wyzwania jest narysowanie szachownicy ASCII, takiej jak ta, na której można grać w szachy.
Napisz program, który przyjmuje dodatnią liczbę całkowitą n
jako argument, w stdin
lub jako dane wejściowe użytkownika, i wypisz szachownicę z kwadratami n
x n
, wraz z ramką o grubości 1 znaku.
Każdy kwadrat powinien mieć 2x2 znaki. Kwadraty powinny być zgodne z normalnym naprzemiennie biało-czarnym (najpierw białym, jak w lewym górnym rogu) wzorem szachownicy. Białe kwadraty powinny być wykonane ze znaków spacji ( ), a czarne kwadraty powinny być wykonane ze
#
znaków funta ( ).
Obramowanie powinno być wykonane z myślników ( -
) z plusem ( +
) na obramowaniu lub prostopadłym punkcie kwadratu.
Wkład
Dodatnia liczba całkowita reprezentująca liczbę kwadratów (wymiary w kwadratach) do narysowania w szachownicy, przy czym każdy kwadrat ma 2x2 znaki.
Przykładowe wyniki
n=2
+--+--+
| |##|
| |##|
+--+--+
|##| |
|##| |
+--+--+
n=3
+--+--+--+
| |##| |
| |##| |
+--+--+--+
|##| |##|
|##| |##|
+--+--+--+
| |##| |
| |##| |
+--+--+--+
n=4
+--+--+--+--+
| |##| |##|
| |##| |##|
+--+--+--+--+
|##| |##| |
|##| |##| |
+--+--+--+--+
| |##| |##|
| |##| |##|
+--+--+--+--+
|##| |##| |
|##| |##| |
+--+--+--+--+
... i tak dalej.
Notatki
- Dopuszczalne są spacje końcowe i nowe linie.
- Możesz napisać cały program lub funkcję.
- Brak spacji wiodących.
- Twój program powinien wyświetlać prawidłowe wyniki dla n = 15.
- W przypadku mniej znanych języków ezoterycznych i podobnych podaj link do tego języka.
n=0
powinien produkować+
. (opcjonalnie, ale zdecydowanie zalecane i zalecane).- Najkrótszy kod w bajtach wygrywa, ponieważ jest to kod golfowy.
+
dlan=0
.Odpowiedzi:
J, 24 bajty
Anonimowa funkcja:
Stosowanie:
źródło
&.>
jest jeden krótszy niżeach
. Warto zauważyć, że działa tylko wtedy, gdyBoxForm
jest ustawiony naASCII
.Python 2, 79
Dla każdego wiersza wybiera jeden ze wzorów
i drukuje
3*n+1
z niego postacie. Wzór jest wybierany przez powtarzanie pierwszych 6 znaków, wybranych za pomocą sztuczki przeplatania łańcucha, która służy również do wyodrębnienia fragmentu o odpowiedniej długości.Prawidłowy wzorzec jest wybierany na podstawie wartości indeksu wiersza
i
modulo 6 przez wyrażenie arytmetyczne,3**i%7/2%3
które daje powtarzający się wzorzec [0,1,1,0,2,2]. Znalazłem to, korzystając z faktu, żex**i%7
ma kropkę6
, a następnie próbowałem różnych wartościx
i różnych postprocessingu, aby uzyskać odpowiedni wzór.źródło
Pyth, 37 lat
Raczej zhakowane razem, ale krótkie.
Demonstracja.
źródło
CJam,
4342 bajtyWypróbuj online .
Każda współrzędna jest odwzorowana na znak, np. Lewy górny róg to
(0, 0) -> "+"
. W szczególności obliczamyi odpowiednio indeksować w ciągu
"#|-+ "
.źródło
Siatkówka , 106 bajtów
Traktuje dane wejściowe jako jednoargumentowe (na podstawie tej meta dyskusji ).
Każda linia powinna przejść do własnego pliku i
n
powinna zostać zmieniona na nową linię w plikach. Jest to niepraktyczne, ale możesz uruchomić kod w postaci pliku z-s
flagą, zachowującn
znaczniki. Jeśli chcesz, możesz zmienić ten
znaki wyjściowe na nowe wiersze w celu zwiększenia czytelności. Na przykład:Dalsza gra w golfa i wyjaśnienia pojawiają się później.
źródło
JavaScript (ES6), 117
Skrawek:
Funkcja anonimowa. Zaczyna się od pełnej tablicy
+--+--+--...
linii i na odpowiednich liniach zastępuje+
for|
i-
forlub
#
odpowiednio.Wyrażenie, które decyduje o zamiennym znaku,
"| |##| "[x%6+(i%6>2)*3]
prawdopodobnie mogłoby być jeszcze bardziej golfa, ale odkryłem, że użycie dłuższego, zbędnego łańcucha oszczędza więcej znaków niż skomplikowane obliczenia.źródło
CJam, 59 bajtów
To .. jest… zbyt… długie…
Wypróbuj online tutaj
źródło
CoffeeScript z ES6, 106 bajtów
JavaScript (ES6), 111 bajtów
Nowe linie są znaczące i są liczone jako 1 bajt.
Wyraźny zwrot sprawił, że stał się on nieco dłuższy:
Próbny
W chwili pisania tego tekstu Firefox jest jedyną dużą przeglądarką zgodną z ES6.
źródło
Python 3,
114 108100Poprzednie rozwiązania
108
114
118 (nie przesłano)
źródło
CJam, 46 bajtów
Wypróbuj online
Cóż, miałem nadzieję, że przynajmniej będę miał oryginalne rozwiązanie (zwykle nie patrzę na inne odpowiedzi przed samodzielną pracą). Okazuje się, że @ Sp3000 zrobił już coś bardzo podobnego, tylko lepiej. Ale ponieważ już wykonałem tę pracę, pomyślałem, że i tak ją opublikuję.
Wyjaśnienie:
źródło
HackVM , 158 bajtów
Zdecydowanie nie jest zwycięzcą, ale wyglądało to na niezłe wyzwanie w HVM.
Umieść rozmiar w pierwszej komórce pamięci i użyj następującego kodu:
Uwaga: Kod musi działać dokładnie w jednym wierszu, aby działać.
Wyjaśnienie:
Kod wywołuje 2 funkcje
PLUSHDASHLINE
iNORMALLINE
utrzymuje stan globalny dla parzystości (tj. Czy wstawić a' '
czy a'#'
do komórki).Wyjaśnienie dla
PLUSDASHLINE
:Wyjaśnienie dla
NORMALLINE
:Byłbym wdzięczny, gdyby ktoś dał wskazówki, jak go ulepszyć :)
źródło
Python 2, 98
Nie najkrótsza droga, ale zabawna metoda. Funkcja
f
przyjmuje dwa ciągi znakówa,b
i separators
i przeplata swoje argumenty jaksaasbbsaasbbsaas
. Rzędy planszy są tworzone w tej formie z odpowiednimi postaciami, a następnie same są przeplatane w ten sposób, aby uzyskać wynik.źródło
n=0
. Większość rozwiązań (które zostaną zaakceptowane) daje „+”. To rozwiązanie generuje „++ (nowa linia) ++”, z wyłączeniem normalnych 2 nowych linii (co jest dozwolone).Ruby: 83 znaki
Przykładowy przebieg:
źródło
Ruby, 87
To anonimowa funkcja. Nazwij to tak (wszystkie możliwości od 0 do 5)
Wykorzystuje
ljust
metodę na pustym ciągu. Ruby pozwala na określenie łańcucha dopełniającego w celu uzasadnienia, dlatego używamyljust
jednego z trzech możliwych łańcuchów dopełniającychb,c,d
na tablicęa
, uporządkowanych jakobccbdd
.źródło
Julia, 124 bajty
To tworzy nienazwaną funkcję, która akceptuje liczbę całkowitą i wypisuje na standardowe wyjście.
Niegolfowane + wyjaśnienie:
źródło
JavaScript, ES6 149
Fajnie jest pisać, choć jest trochę długa
Działa na Firefox
1 - Otwórz konsolę
2 - Wpisz następujące polecenie
Wyjście (n = 15):
źródło
join('\n')
jejoin` `
znakiem, gdzie spacja, którą napisałem, oznacza nowy znak wiersza.Haskell, 99
Jest to częściowo inspirowane poprzednią odpowiedzią Haskell autorstwa catgocat ; Napisałem własną wersję, potem na nią spojrzałem, a potem napisałem inną. Gram na tych samych zasadach - wejście jest argumentem, ale wyjście jest standardowe. (Jeśli może to być czysta funkcja, odejmij 7 znaków
putStr$
.)Używamy
t
regionu 3 n + 1 znaków z nieskończonej szachownicy zbudowanej za pomocącycle
i to wszystko. Główną ideą, którą wziąłem z drugiej odpowiedzi, jest zebranie wzorów komórek granicy i kontrolera w ciągi.Moja pierwsza wersja (140 znaków) wykorzystywała strategię obliczania postaci w każdym punkcie, co może być lepsze w przypadku bardziej złożonego problemu niż ten.
źródło
cat <<EOF > sol1.hs
i liczącdu -b sol1.hs
.wc
zgadza się i sprawdziłem, czy nie ma znaków do drukowania. Czy ta 84-bajtowa wersja działa ? Jeśli tak, wezmę to :)Haskell, 118
To jest moja pierwsza odpowiedź na golfa haskell code i oto:
Bardziej czytelna wersja:
Wydajność
źródło
f 1
powinien wytworzyć 1 puste pudełko,f 0
produkuje tylko znak plus.C -
119101Używa teraz obliczeń podobnych do odpowiedzi @ Sp3000. Również kilka optymalizacji.
Myślę, że
?:
to rozszerzenie GCC ...Stara odpowiedź:
Utrzymuje 2 współrzędne i szczerze oblicza, który znak należy wydrukować dla każdej pary. Lista znaków do wydrukowania jest przechowywana w tablicy, a to samo drukuje „bezbarwną” siatkę. Pierwszy element tablicy jest modyfikowany, aby rysować czarne kwadraty.
Mógłbym to zmienić, tak aby zamiast dwóch niezależnych współrzędnych jedna wartość zliczała w górę lub (a może nawet lepiej) w dół, ale nie mogę teraz tego zawinąć.
Bonus - zastąpienie 3 dowolną inną liczbą powoduje, że program rysuje prawidłową szachownicę o innym rozmiarze komórki.
źródło
awk - 91
Walka o osiągnięcie poziomu poniżej 100 była przełomem. Przełomem było przełożenie;) Reszta jest dość logiczna.
źródło
Pyke, 47 bajtów, niekonkurujący
Wypróbuj tutaj!
źródło