Dom Świętego Mikołaja
Uwaga: to pierwsze wyzwanie, które próbowałem ustawić. Przeszło to przez piaskownicę, ale jeśli znajdziesz coś złego, nie tylko głosuj negatywnie, ale zostaw komentarz, abym mógł to poprawić.
tło
Jest stara łamigłówka dla dzieci, w której wyzwaniem jest narysowanie pudełka z dachem i krzyżem przez środek bez podnoszenia pióra z papieru lub dwukrotnego przekraczania dowolnej linii.
W Niemczech znany jest jako „das Haus des Nikolaus” lub „Dom Świętego Mikołaja”. Szczerze mówiąc, nie pamiętam, jak to nazywaliśmy. Dla każdego, kto nie zna zagadki, pełne informacje są dostępne tutaj .
Oto artystyczna reprezentacja domu ASCII.
/\
/__\
|\/|
|/\|
----
Wyzwanie
Napisz program lub funkcję, aby narysować Dom Świętego Mikołaja w dowolnym wybranym języku.
Brzmi zbyt łatwo? Oto haczyk. Musi także generować każdy etap losowania i być zgodny z zasadami układanki. Twój program nie musi przyjmować żadnych danych wejściowych. Gotowy dom musi wyglądać dokładnie tak, jak pokazano powyżej.
Według powyższej strony istnieją 44 możliwe rozwiązania. Możesz użyć dowolnego z nich. To wyzwanie artystyczne ASCII, więc nie musisz obliczać rozwiązania, ale tylko je narysować.
Wynik
Przykład wymaganej wydajności jednego z 44 rozwiązań pokazano poniżej:
----
\
\
----
__
\
\
----
\
__\
\
\
----
/\
/__\
\
\
----
/\
/__\
|\
| \
----
/\
/__\
|\/
|/\
----
/\
/__\
|\/|
|/\|
----
Zasady
- Dodałem 1 dodatkową linię między każdym oczekiwanym wyjściem, aby wyjaśnić wymagania. To jest opcjonalne. Dowolna liczba pustych linii między każdym wyjściem jest dozwolona.
- Twój wynik musi składać się tylko ze znaków /, \, -, _ i spacji, jak pokazano powyżej. Końcowe spacje są dozwolone.
- Każda linia na rysunku musi być kontynuowana od końca poprzedniej linii i nie można powtarzać żadnej linii.
- Standardowe luki zabronione.
- Nie musisz wysyłać rymu wymienionego w powyższym linku.
- To jest golf golfowy, więc zwycięzcą zostanie najkrótsza odpowiedź w bajtach.
Wynik
Kilka świetnych odpowiedzi, podziękowań i szacunku dla wszystkich, którzy napisali. Powiedziałem, że ma najmniejszą liczbę bajtów, ale zaznaczyłem jako najwyższą odpowiedź nie tylko dla tego, ale także dla doskonałego wyjaśnienia kodu. Niezły @Dennis.
Odpowiedzi:
Galareta ,
403936 bajtówWypróbuj online!
Jak to działa
jest bijective base-250 dosłowny; każdy znak odpowiada punktowi kodowemu w kodowemu na stronie kodowej Jelly . Wynikiem jest liczba całkowita 13192938935880491074 .
konwertuje wygenerowaną liczbę całkowitą na bijective base 9, uzyskując tablicę liczb całkowitych
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Liczby całkowite odpowiadają kolejności obrysu, z wyjątkiem 9 , która wskazuje spację.
opakowuje wygenerowaną tablicę do tablicy singleton, która będzie wymagana, aby dołączyć ją do tablicy, którą teraz wygenerujemy.
działa w następujący sposób.
¤
łączy dwa ogniwa po lewej w łańcuch niladyczny. Pierwszy“|_/-\/\|‘
daje punkty kodowe określonych znaków, dając [124, 95, 47, 45, 92, 47, 92, 124] . NastępnieĖ
wylicza punkty kodowe, uzyskując[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . Para [n, c] oznacza, że n- ty skok będzie znakiem ASCII z punktem kodowym c .
łączy wygenerowane tablice. Wynikiem jest macierz
[[9,6,7,9,6,2,2,7,7,1,5,3,8,1,3,5,8,4,4,4,4], [1,124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8,124]] .
wykonuje kumulatywne (tj. pokazujące wszystkie pośrednie kroki) redukcje, używając transliteracji (
y
) z zamienionymi argumentami (@
). W pierwszym kroku, np. Zamieniamy każdy 1 w oryginalnej tablicy na 124 , który jest punktem kodowym znaku | .spłaszcza wynik i zastępuje wszystkie punkty kodowe odpowiednimi znakami ASCII. Na wszystkich etapach wygeneruje to niektóre niedrukowalne znaki z punktami kodowymi 1 do 9 .
bierze maksymalne pod względem znaków ze znakiem spacji, zastępując wszystkie niedrukowalne znaki spacjami.
dzieli wygenerowany ciąg na fragmenty o długości czterech i łączy je z separatorem.
źródło
JavaScript (ES6),
119116969291 bajtówźródło
Partia,
356344341337 bajtówGłupie|
reguły cytowania partii ... jeśli chcesz mieć|
zmienną, musisz zacytować ją trzema^
s, więc jest tańsze w użyciu@
i zastępuje ją na wyjściu, chociaż aby to osiągnąć, muszę zacząć od lewej ściany. Linia pierwsza ma spację końcową.echo(
jest używany, ponieważr
,c
if
zmienne może być pusta i nie chcemyECHO is off.
wydrukować.Edycja: Zapisano 12 bajtów, wykorzystując przeglądanie ostatniej części. Zapisano 3 bajty za pomocą
for
pętli do wydrukowania każdej części, co oznacza, że teraz używam|
s w moich zmiennych, co sprawia, że kod jest nieco łatwiejszy do odczytania. Zapisano 4 bajty, używając@
znaków jawnych zamiast@echo off
. Myślę, że rozpoczęcie od lewej ściany wciąż wymaga najmniejszej liczby bajtów.źródło
echo:
jest bardziej standardowy, aleecho(
wygląda na to, że nadużywasz funkcji językowych, więc daj +1.echo:
kończy się niepowodzeniem w niektórych niejasnych przypadkach krawędzi, ale nie znam żadnych przypadków awariiecho(
.foo.bat
w bieżącym katalogu,echo(\..\foo.bat
echo,\..\foo.bat
aleecho:\..\foo.bat
wykonuje sięfoo.bat
.echo:.\foo.bat
się, że zamiast tego miałby taki efekt. Czy to z powodu usterki stosu katalogów, gdzie „UP” z katalogu głównego to katalog bieżący?C, 118 bajtów
źródło
char*p
(brak miejsca) oraz zmiany'B'
i'J'
ich kody ASCII./// , 112 bajtów
Wypróbuj online!
źródło
PHP,
9895 bajtówzainspirowany rozwiązaniem Arnauld
Uwaga: Pierwszy wiersz kodu ma spację końcową.
źródło
PHP z GD,
348338 bajtów (nie konkuruje)niezupełnie o co proszono, ale ...
zapisz do pliku, zadzwoń w przeglądarce
awaria
Aby narysować większy dom, zmień
$w=9
na żądaną szerokość.źródło