Dom Świętego Mikołaja

16

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.

ElPedro
źródło
To mogło spędzić trochę czasu w piaskownicy . Spróbuj dodać parametr dotyczący wielkości domu - lub liczby połączonych domów (lub obu). Uważam to za zbyt łatwe. Możesz także dodać rym do przykładowego wyjścia - lub w ogóle o nim nie wspominać. Znajduję ten gif fajny lub ten .
Tytus
4
@Titus Dziękujemy za opinię. Moim zamiarem nie było stworzenie szczególnie trudnego wyzwania, ale stworzenie takiego, które jest dość łatwe do wykonania i dlatego zachęca jak najwięcej ludzi do proponowania rozwiązań. Przyjmę twoje sugestie do kolejnej próby.
ElPedro
1
Moja wina; Spodziewałem się zbyt skomplikowanych rzeczy dla sztuki ascii. :) Ale nadal lubię gify.
Tytus
Gify są fajne i podoba mi się również pomysł włączenia rymu do wyboru języka :)
ElPedro

Odpowiedzi:

10

Galareta , 40 39 36 bajtów

“ḥ%DtƊVḍI’ḃ9W;“|_/-\/\|‘Ė¤y@\FỌ»⁶s4Y

Wypróbuj online!

Jak to działa

“ḥ%DtƊVḍI’

jest bijective base-250 dosłowny; każdy znak odpowiada punktowi kodowemu w kodowemu na stronie kodowej Jelly . Wynikiem jest liczba całkowita 13192938935880491074 .

          ḃ9

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ę.

            W

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]] .

                          y@\

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 | .

                             FỌ

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.

                                 s4Y

dzieli wygenerowany ciąg na fragmenty o długości czterech i łączy je z separatorem.

Dennis
źródło
2
Łał. Po prostu wow. +1
ElPedro
Ale czekaj, to są bajty?
Leif Willerts,
1
@LeifWillerts Tak. Aby uniknąć znaków niedrukowalnych, Jelly używa niestandardowej strony kodowej, która koduje 256 znaków, które rozumie jako pojedynczy bajt. Te bajty odwołuje się w punktach głowicy do niego.
Dennis
Przepraszam, że nie
wymyśliłem
Wygrywa tyle samo co wyjaśnienie. Szacunek.
ElPedro
13

JavaScript (ES6), 119 116 96 92 91 bajtów

for(i=8;i--;)console.log(`834
3554
2610
2160
7777`.replace(/./g,c=>'|/|/\\_\\- '[c<i?8:c]))

Arnauld
źródło
Niezła odpowiedź. Miałem przeczucie, że Javascript będzie tam lub w pobliżu :-)
ElPedro
Przepraszamy za wiele zmian. Nie powinienem pisać przed drugą kawą.
Arnauld,
Wiele zmian jest dobrych. Miło widzieć, jak spada liczba bajtów.
ElPedro,
Czy ma sens posiadanie dwóch identycznych kopii kodu w odpowiedzi?
Neil
@Neil - Zatrzymam tylko jeden, dopóki nie znajdę dobrego powodu, aby mieć dwa z nich. ^^
Arnauld,
9

Partia, 356 344 341 337 bajtów

@set s=@set "
%s%g=@goto 1
%s%r=
%s%c=
%s%u=|
%s%l=|
%s%f=
@for /l %%i in (1,1,7)do @call:%%i
%s%u=|\/|
%s%l=|/\|
%g%
:7
%s%u=|\/
%s%l=|/\
%g%
:6
%s%f=----
%g%
:5
%s%u=|\
%s%l=| \
%g%
:4
%s%c=/__\
%g%
:3
%s%r= /\
%s%c=/  \
%g%
:2
%s%r= /
%s%c=/
:1
@for %%l in ("%r%" "%c%" "%u%" "%l%" "%f%")do @echo(%%~l

Gł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, ci fzmienne może być pusta i nie chcemy ECHO is off.wydrukować.

Edycja: Zapisano 12 bajtów, wykorzystując przeglądanie ostatniej części. Zapisano 3 bajty za pomocą forpę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.

Neil
źródło
2
Może nie jest najkrótszy, ale dostaje ode mnie opinię za to, że udało mi się to zrobić w partii +1
ElPedro,
echo:jest bardziej standardowy, ale echo(wygląda na to, że nadużywasz funkcji językowych, więc daj +1.
wizzwizz4
@ wizzwizz4 echo:kończy się niepowodzeniem w niektórych niejasnych przypadkach krawędzi, ale nie znam żadnych przypadków awarii echo(.
Neil
@ wizzwizz4 Jeśli masz plik foo.batw bieżącym katalogu, echo(\..\foo.batecho, \..\foo.batale echo:\..\foo.batwykonuje się foo.bat.
Neil
@Neil Czy wiesz, dlaczego tak jest? Wydaje echo:.\foo.batsię, ż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?
wizzwizz4
7

C, 118 bajtów

main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}
Martin Rosenau
źródło
Imponujący! Ładna pierwsza odpowiedź i witamy na stronie!
DJMcMayhem
1
Aby zapisać 3 bajty: char*p(brak miejsca) oraz zmiany 'B'i 'J'ich kody ASCII.
Level River St
Dziękuję za odpowiedź. Nie spodziewałem się, że C nawet weźmie udział. To naprawdę imponujące i warte +1
ElPedro
6

/// , 112 bajtów

/!/\/\///*/----
 !@/\\\\!$/ @@!^/
*@\/@@
@\/__@@
/*@
 $
*__
$
 $
*$
 __@
$
 $^$
 $^|@
|$^|@\/
|\/@^|@\/|
|\/@|
*

Wypróbuj online!

Erik the Outgolfer
źródło
Nie rozumiem ani jednego bajtu numeru 112, ale próbowałem go online i robi dokładnie to, co jest napisane na puszce, więc +1
ElPedro
1
@ElPedro Spróbuj kliknąć link w nagłówku, możesz zrozumieć koncepcję, ale jeśli nie, to wróć do mnie. Chcę, aby coraz więcej osób rozumiało język, a jeśli nie, to smutny fakt. Wiem, że nie mogę zmusić wszystkich do zrozumienia /// (niektórzy ludzie chcą po prostu jedzenia i wody, /// i PPCG są daleko od tego, choć nie jest to niemożliwe).
Erik the Outgolfer,
Dzięki. Jest tyle języków do nauki! Na pewno się obejrzę. Nadal gram w Python i Lotus Formula, ale bardziej się w to pakuję. Więcej języków to więcej zabawy.
Jeszcze
2

PHP, 98 95 bajtów

zainspirowany rozwiązaniem Arnauld

for($i=8;$i--;)for($p=24;$p--;)echo"|/|/\\_\\- 
"[($c="977779061290162945539438"[$p])<$i?8:$c];

Uwaga: Pierwszy wiersz kodu ma spację końcową.

Tytus
źródło
Fajny @Titus. Końcowe spacje są dozwolone.
ElPedro,
@ElPedro: Znam tylko kilka osób, które skonfigurowały tam edytory do automatycznego przycinania; dlatego o tym wspomniałem.
Tytus
1

PHP z GD, 348 338 bajtów (nie konkuruje)

niezupełnie o co proszono, ale ...

function f($v,$w){global$x,$y,$i;imageline($i,$x,$y,$x=$v,$y=$w,1);ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';}$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

zapisz do pliku, zadzwoń w przeglądarce

awaria

function f($v,$w)
{
    global$x,$y,$i;
    imageline($i,$x,$y,$x=$v,$y=$w,1);      // draw line, set end coords as new start coords
    ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();           // get image output
    echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';    // print <img> tag
}
// calculate dimensions, create image, allocate background color (foreground implicitly black)
$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);
// paint lines: implicit `$x=0`
f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

Aby narysować większy dom, zmień $w=9na żądaną szerokość.

Tytus
źródło
Daję również +1. Mimo że nie odnosi się do bezpośredniego wyzwania, obejmuje sugerowane ulepszenia i wygląda bardzo fajnie :)
ElPedro,