Будинок Діда Мороза


16

Будинок Діда Мороза

Примітка. Це перше завдання, яке я намагався поставити. Це пройшло через «Пісочницю», але якщо ви знайдете щось не так, будь ласка, не просто зверніть увагу, а залиште коментар, щоб я міг його покращити.

Фон

Існує стара дитяча головоломка, де завдання - намалювати коробочку з дахом і хрестом посередині, не піднімаючи ручку з паперу або переходячи будь-яку лінію двічі.

У Німеччині його називають "das Haus des Nikolaus" або "Будинок Діда Мороза". Я, чесно кажучи, не пам'ятаю, як ми називали це. Для всіх, хто не знайомий з головоломкою, тут можна ознайомитись з усіма деталями .

Тут представлено художнє представлення будинку ASCII.

 /\
/__\
|\/|
|/\|
----

Виклик

Напишіть програму чи функцію, щоб намалювати Будинок Діда Мороза будь-якою мовою на ваш вибір.

Звучить занадто просто? Ну ось ось улов. Він також повинен виводити кожен етап малюнка і відповідати правилам пазла. У вашій програмі не потрібно приймати будь-які дані. Готовий будинок повинен виглядати точно так, як показано вище.

За даними сайту вище, існує 44 можливих рішення. Ви можете використовувати будь-яку з них. Це виклик мистецтва ASCII, тому вам не потрібно розраховувати рішення, а лише його малювати.

Вихідні дані

Приклад необхідного виходу з одного з 44 рішень наведено нижче:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

 /\
/__\
|\
| \
----

 /\
/__\
|\/
|/\
----

 /\
/__\
|\/|
|/\|
----

Правила

  • Я додав 1 додатковий новий рядок між кожним очікуваним результатом, щоб спробувати зробити вимоги зрозумілішими. Це необов’язково. Дозволяється будь-яка кількість порожніх рядків між кожним висновком.
  • Ваш вихід повинен містити лише символи /, \, -, _ та пробіл, як показано вище. Додаткові місця доступні.
  • Кожен рядок на вашому малюнку повинен продовжуватися з кінця попереднього рядка, і ви не можете повторювати жоден рядок.
  • Стандартні лазівки заборонені.
  • Вам не потрібно виводити риму, згадану у вищенаведеному посиланні.
  • Це кодовий гольф, тому найкоротша відповідь у байтах буде переможцем.

Результат

Деякі чудові відповіді, подяки та поваги всім, хто розмістив повідомлення. Я сказав, що найменший байт, але я вказав як головну відповідь не тільки за це, але і за велике пояснення коду. Гарний @Dennis.


Це могло б провести деякий час у пісочниці . Спробуйте додати параметр для розміру будинку - або кількості об'єднаних будинків (або обох). Я вважаю це занадто легко, як це є. Ви також можете додати риму до свого прикладу - або взагалі не згадати про це. Я вважаю цей gif приємним, або цим .
Тит


4
@Titus Дякую за відгук. Мій намір полягав не в тому, щоб створити особливо складний виклик, а створити такий, який досить легко виконати, і таким чином заохочувати якомога більше людей пропонувати рішення. Я прийму ваші пропозиції на борт для моєї наступної спроби.
ElPedro

1
Моя провина; Я очікував занадто складних речей для мистецтва ascii. :) Але я все одно люблю gif.
Тит

Гіфки цікаві, і мені також подобається ідея включити риму також на вибір мови :)
ElPedro

Відповіді:


10

Желе , 40 39 36 байт

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

Спробуйте в Інтернеті!

Як це працює

“ḥ%DtƊVḍI’

є бієктивною базою-250 буквально; кожен символ відповідає кодовій точці на кодовій сторінці Jelly . Результат - ціле число 13192938935880491074 .

          ḃ9

перетворює згенероване ціле число в біективну базу 9, отримуючи цілочисельний масив
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Цілі числа відповідають порядку обведення, за винятком 9 , що позначає пробіл.

            W

загортає згенерований масив в однотонний масив, який потрібно буде додати до масиву, який ми зараз генеруємо.

              “|_/-\/\|‘Ė¤

працює так. ¤поєднує дві ланки зліва в ніладичний ланцюг. Перший - “|_/-\/\|‘дає кодові точки вказаних символів, поступаючись [124, 95, 47, 45, 92, 47, 92, 124] . Потім Ėперераховують кодові точки, отримуючи
[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . Пара [n, c] означає, що n- й обведення буде символом ASCII з кодовою точкою c .

             ;

об'єднує згенеровані масиви. Результат - масив
[[9,6,7,9,6,2,2,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@\

виконує кумулятивне (тобто, показуючи всі проміжні кроки) зменшення, використовуючи транслітерацію ( y) із заміненими аргументами ( @). На першому кроці, наприклад, ми замінюємо кожен 1 в початковому масиві на 124 , що є кодовою точкою символу | .

                             FỌ

вирівнює результат і замінює всі кодові точки відповідними символами ASCII. На всіх кроках це створить кілька недрукованих символів з кодовими точками від 1 до 9 .

                               »⁶

приймає максимум символів з символом пробілу, замінюючи всі недруковані символи пробілами.

                                 s4Y

розбиває згенеровану рядок на шматки довжиною чотири і з'єднує їх з подачею рядків як роздільник.


2
Ого. Просто просто вау. +1
ElPedro

Але чекайте, це байти?
Лейф Віллерс

1
@LeifWillerts Так. Щоб уникнути недрукувальних символів, Jelly використовує користувацьку кодову сторінку, що кодує 256 символів, які вона розуміє, як один байт кожен. Посилання байтів у заголовку вказує на нього.
Денніс

Вибачте, що не з'ясували, щоб натиснути це посилання: D
Leif Willerts

Це виграє стільки ж за пояснення, скільки нічого. Повага.
ElPedro

13

Javascript (ES6), 119 116 96 92 91 байт

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


Гарна відповідь. У мене було відчуття, що Javascript буде там або там :-)
ElPedro

Вибачте за кілька змін. Я не повинен дописувати до 2-ї кави.
Арнольд

Кілька змін добре. Приємно бачити, як кількість байтів знижується.
ElPedro

Чи є у вашій відповіді дві однакові копії коду?
Ніл

@Neil - я збережу лише одну, доки не знайду вагомих причин мати два з них. ^^
Арнольд

9

Партійна, 356 344 341 337 байт

@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

|Правила цитування Stupid Batch ... якщо вам потрібна |змінна, вам потрібно процитувати її з трьома ^с, тому дешевше використовувати @замість цього і замінити її на виході, хоча для цього я повинен почати з лівої стінки. Перша лінія має простір. echo(використовується тому, щоr , що змінні,, cі fзмінні можуть бути порожніми, і ми не хочемо ECHO is off.друкувати.

Редагувати: Збережено 12 байт, використовуючи перехід для останньої частини. Збережено 3 байти, використовуючи forцикл для друку кожної частини, це означає, що я тепер використовую |s у своїх змінних, що робить код трохи легшим для читання. Збережено 4 байти, використовуючи явні @символи замість @echo off. Я думаю, що для початку з лівої стіни потрібні найменші байти.


2
Можливо, це не найкоротше, але отримує нагороду від мене за те, що насправді вдалося зробити це у
пакетній групі

echo:стандартніше, але echo(схоже, що ви зловживаєте мовною функцією, тому +1.
wizzwizz4

@ wizzwizz4 echo:виходить з ладу в деяких незрозумілих крайових випадках, але я не знаю жодних випадків відмов для echo(.
Ніл

@ wizzwizz4 Якщо у вас є файл foo.batу поточному каталозі, echo(\..\foo.batлунає, \..\foo.batале echo:\..\foo.batвиконується foo.bat.
Ніл

@Neil Чи знаєте ви, чому це так? Здається echo:.\foo.bat, натомість це матиме такий ефект. Це через глюк стека каталогів, де "UP" з кореневого каталогу є поточним каталогом?
wizzwizz4

7

C, 118 байт

main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}

Вражає! Приємна перша відповідь, і ласкаво просимо на сайт!
DJMcMayhem

1
Щоб зберегти 3 байти: char*p(немає місця) та змініть'B' та 'J'їх ASCII - кодів.
Рівень Рівер Сент

Дякую за відповідь. Я не очікував, що C навіть змагатиметься. Це насправді вражає, і це вартує +1
ElPedro

6

/// , 112 байт

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

Спробуйте в Інтернеті!


Я не розумію жодного байта 112, але я спробував це в Інтернеті, і він робить саме те, що написано на
бляшанці,

1
@ElPedro Спробуйте натиснути посилання на заголовку, ви можете зрозуміти поняття, але, якщо ні, то поверніться до мене. Я хочу, щоб все більше людей могли зрозуміти мову, і, якщо ви цього не зробите, це сумний факт. Я знаю, що я не можу просто зрозуміти /// (деякі люди просто хочуть їжі та води, /// і PPCG далеко від цього, хоча і неможливо).
Ерік Аутгольфер

Спасибі. Є так багато мов, щоб вивчити! Я обов'язково погляну. Я все ще займаюся гольфом у Python та Lotus Formula, але отримую більше. Більше мов - веселіше. Ще раз дякую за ваш внесок :)
ElPedro

2

PHP, 98 95 байт

натхненний рішенням Арнальда

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

Примітка. У першому рядку коду є пробіл.


Хороший @Titus. Додаткові місця доступні.
ElPedro

@ElPedro: я просто знаю деяких людей, які налаштували там редакторів, щоб вони автоматично обрізали їх; саме тому я це згадав.
Тит

1

PHP з GD, 348 338 байт (не конкурує)

не саме те, що просили, але ...

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);

зберегти у файл, зателефонувати у браузері

зламатися

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);

Щоб намалювати будинок більшого розміру, змініть $w=9потрібну ширину.


І я даю цьому +1 також. Незважаючи на те, що це не стосується прямого виклику, він охоплює запропоновані вами вдосконалення та виглядає дуже круто :)
ElPedro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.