Nhà của ông già Noel


16

Nhà của ông già Noel

Lưu ý: Đây là thử thách đầu tiên mà tôi đã cố gắng đặt ra. Nó đã được thông qua Sandbox tuy nhiên nếu bạn thấy có gì đó không ổn, vui lòng không chỉ downvote mà hãy để lại nhận xét để tôi có thể cải thiện nó.

Lý lịch

Có một câu đố trẻ con cũ, trong đó thử thách là vẽ một cái hộp có mái và một cây thánh giá ở giữa mà không nhấc bút của bạn ra khỏi tờ giấy hoặc đi qua bất kỳ dòng nào hai lần.

Ở Đức, nó được gọi là "das Haus des Nikolaus" hoặc "Nhà của ông già Noel". Tôi thực sự không thể nhớ những gì chúng ta thường gọi nó. Đối với bất cứ ai không quen thuộc với câu đố, chi tiết đầy đủ có sẵn ở đây .

Dưới đây là một đại diện nghệ thuật ASCII của ngôi nhà.

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

Thử thách

Viết chương trình hoặc chức năng để vẽ Nhà của ông già Noel bằng bất kỳ ngôn ngữ nào bạn chọn.

Nghe có vẻ quá dễ? Vâng đây là cái bẫy. Nó cũng phải xuất ra từng giai đoạn của bản vẽ và tuân thủ các quy tắc của câu đố. Chương trình của bạn không bắt buộc phải có bất kỳ đầu vào. Nhà đã hoàn thành phải nhìn chính xác như hình trên.

Theo các trang web trên có 44 giải pháp có thể. Bạn có thể sử dụng bất kỳ một trong số họ. Đây là một thách thức nghệ thuật ASCII, do đó bạn không bắt buộc phải tính toán giải pháp mà chỉ cần vẽ nó.

Đầu ra

Một ví dụ về đầu ra cần thiết từ một trong 44 giải pháp được hiển thị bên dưới:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

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

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

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

Quy tắc

  • Tôi đã thêm 1 dòng mới giữa mỗi đầu ra dự kiến ​​để cố gắng làm cho các yêu cầu rõ ràng hơn. Đây là tùy chọn. Bất kỳ số lượng dòng trống giữa mỗi đầu ra được cho phép.
  • Đầu ra của bạn chỉ bao gồm các ký tự /, \, -, _ và khoảng trắng như được hiển thị ở trên. Không gian lưu trữ được cho phép.
  • Mỗi dòng trong bản vẽ của bạn phải tiếp tục từ cuối dòng trước đó và bạn không được lặp lại bất kỳ dòng nào.
  • Sơ hở tiêu chuẩn bị cấm.
  • Bạn không bắt buộc phải xuất vần được đề cập trong liên kết trên.
  • Đây là mã golf nên câu trả lời ngắn nhất tính bằng byte sẽ là người chiến thắng.

Kết quả

Một số câu trả lời tuyệt vời và cảm ơn và tôn trọng tất cả những người đã đăng. Tôi đã nói số byte thấp nhất nhưng tôi đã đánh dấu là câu trả lời hàng đầu không chỉ cho điều đó mà còn cho lời giải thích tuyệt vời của mã. Đẹp một @Dennis.


Điều này có thể đã dành một chút thời gian trong hộp cát . Hãy thử thêm một tham số cho kích thước của ngôi nhà - hoặc số lượng nhà được nối (hoặc cả hai). Tôi thấy nó quá dễ dàng như nó là. Bạn cũng có thể muốn thêm vần vào đầu ra ví dụ của mình - hoặc không đề cập gì cả. Tôi thấy gif này tốt, hoặc cái này .
Tít


4
@Titus Cảm ơn bạn đã phản hồi. Ý định của tôi không phải là tạo ra một thử thách đặc biệt khó khăn mà là tạo ra một thử thách khá dễ thực hiện và khuyến khích càng nhiều người càng tốt để đề xuất giải pháp. Tôi sẽ đưa ra đề nghị của bạn trên tàu cho nỗ lực tiếp theo của tôi.
ElPedro

1
Lỗi của tôi; Tôi đã mong đợi những điều quá phức tạp cho nghệ thuật ascii. :) Nhưng tôi vẫn thích gifs.
Tít

Các gifs rất tuyệt và tôi cũng thích ý tưởng bao gồm cả vần điệu trong một lựa chọn ngôn ngữ :)
ElPedro

Câu trả lời:


10

Thạch , 40 39 36 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

“ḥ%DtƊVḍI’

là một cơ sở phỏng đoán - 250 chữ; mỗi ký tự tương ứng với điểm mã của nó trong trang mã của Jelly . Kết quả là số nguyên 13192938935380491074 .

          ḃ9

chuyển đổi số nguyên được tạo thành cơ sở sinh học 9, thu được mảng số nguyên
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Các số nguyên tương ứng với thứ tự của đột quỵ, ngoại trừ 9 , chỉ ra một khoảng trắng.

            W

kết thúc mảng được tạo thành một mảng đơn, sẽ được yêu cầu để thêm nó vào mảng chúng ta sẽ tạo ngay bây giờ.

              “|_/-\/\|‘ˤ

hoạt động như sau. ¤kết hợp hai liên kết bên trái thành một chuỗi niladic. Cái đầu tiên, “|_/-\/\|‘mang lại các điểm mã của các ký tự được chỉ định, mang lại [124, 95, 47, 45, 92, 47, 92, 124] . Sau đó, Ėliệt kê các điểm mã, thu được
[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . Cặp [n, c] có nghĩa là nét thứ n sẽ là ký tự ASCII có điểm mã c .

             ;

nối các mảng được tạo ra. Kết quả là mảng
[[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@\

thực hiện giảm tích lũy (nghĩa là hiển thị tất cả các bước trung gian), sử dụng chuyển ngữ ( y) với các đối số được hoán đổi ( @). Trong bước đầu tiên, ví dụ, chúng ta thay thế mỗi 1 trong mảng ban đầu bằng 124 , là điểm mã của ký tự | .

                             FỌ

làm phẳng kết quả và thay thế tất cả các điểm mã bằng các ký tự ASCII tương ứng. Trong tất cả các bước, điều này sẽ tạo ra một số ký tự không thể in được với các điểm mã từ 1 đến 9 .

                               »⁶

lấy tối đa ký tự thông minh bằng ký tự khoảng trắng, thay thế tất cả các ký tự không thể in bằng dấu cách.

                                 s4Y

chia chuỗi được tạo thành các đoạn có độ dài bốn và nối chúng với một dòng cấp dưới dạng dấu phân cách.


2
Ồ Đơn giản chỉ là wow. +1
ElPedro

Nhưng chờ đã, đó là những byte nào?
Leif Willerts

1
@LeifWillerts Có. Để tránh các ký tự không thể in được, Jelly sử dụng trang mã tùy chỉnh mã hóa 256 ký tự mà nó hiểu là một byte đơn lẻ. Các liên kết byte trong tiêu đề trỏ đến nó.
Dennis

Xin lỗi sau đó vì đã không tìm ra để nhấp vào liên kết đó: D
Leif Willerts

Nó thắng nhiều cho lời giải thích như bất cứ điều gì. Sự tôn trọng.
ElPedro

13

Javascript (ES6), 119 116 96 92 91 byte

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


Câu trả lời tốt đẹp. Tôi có cảm giác rằng Javascript sẽ ở đó hoặc ở đó :-)
ElPedro

Xin lỗi vì nhiều chỉnh sửa. Tôi không nên đăng bài trước cà phê thứ 2.
Arnauld

Nhiều chỉnh sửa là tốt. Rất vui khi thấy số byte đi xuống.
ElPedro

Có bất kỳ điểm nào trong việc có hai bản sao mã giống hệt nhau trong câu trả lời của bạn không?
Neil

@Neil - Tôi sẽ chỉ giữ một cho đến khi tôi tìm thấy một lý do chính đáng để có hai người trong số họ. ^^
Arnauld

9

Batch, 356 344 341 337 byte

@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

|Quy tắc trích dẫn hàng loạt ngu ngốc ... nếu bạn muốn có |một biến, bạn cần trích dẫn nó bằng ba ^giây, vì vậy sẽ rẻ hơn khi sử dụng @thay thế và thay thế nó ở đầu ra, mặc dù để đạt được điều này, tôi phải bắt đầu bằng bức tường bên trái. Dòng một có một không gian dấu. echo(được sử dụng bởi vì r, cfcác biến thể được sản phẩm nào và chúng tôi không muốn ECHO is off.in.

Chỉnh sửa: Đã lưu 12 byte bằng cách sử dụng dự phòng cho phần cuối cùng. Đã lưu 3 byte bằng cách sử dụng một forvòng lặp để in từng phần, điều này có nghĩa là bây giờ tôi sử dụng |s trong các biến của mình, điều này làm cho mã dễ đọc hơn một chút. Đã lưu 4 byte bằng cách sử dụng các @ký tự rõ ràng thay vì @echo off. Tôi nghĩ rằng bắt đầu với bức tường bên trái vẫn cần ít byte nhất.


2
Có thể không phải là ngắn nhất nhưng nhận được sự ủng hộ từ tôi vì đã thực sự quản lý để thực hiện nó trong Batch +1
ElPedro

echo:là tiêu chuẩn hơn nhưng có echo(vẻ như bạn đang lạm dụng một tính năng ngôn ngữ, vì vậy +1.
wizzwizz4

@ wizzwizz4 echo:thất bại trong một số trường hợp cạnh tối nghĩa, nhưng tôi không biết trường hợp thất bại nào echo(.
Neil

@ wizzwizz4 Nếu bạn có một tập tin foo.battrong thư mục hiện tại, echo(\..\foo.batechos \..\foo.batnhưng echo:\..\foo.batthực thi foo.bat.
Neil

@Neil Bạn có biết tại sao không? Có vẻ như echo:.\foo.batsẽ có hiệu ứng đó thay thế. Có phải vì một trục trặc thư mục, trong đó "LÊN" từ thư mục gốc là thư mục hiện tại?
wizzwizz4

7

C, 118 byte

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

Ấn tượng! Câu trả lời đầu tiên tốt đẹp, và chào mừng đến với trang web!
DJMcMayhem

1
Để lưu 3 byte: char*p(không có khoảng trắng) và thay đổi 'B''J'mã ASCII của chúng.
Cấp sông St

Cảm ơn câu trả lời. Tôi không mong đợi C sẽ cạnh tranh. Điều này thực sự ấn tượng và rất đáng giá +1
ElPedro

6

/// , 112 byte

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

Hãy thử trực tuyến!


Tôi không hiểu một byte đơn của 112 nhưng tôi đã thử trực tuyến và nó thực hiện chính xác những gì nó nói trên tin nên +1
ElPedro

1
@ElPedro Hãy thử nhấp vào liên kết trên tiêu đề, bạn có thể hiểu khái niệm này, nhưng, nếu không, hãy quay lại với tôi. Tôi muốn ngày càng có nhiều người có thể hiểu một ngôn ngữ, và nếu bạn không, đó là một thực tế đáng buồn. Tôi biết tôi không thể khiến mọi người hiểu /// (một số người chỉ muốn thức ăn và nước uống, /// và PPCG cách xa điều đó, mặc dù không phải là không thể).
Erik the Outgolfer

Cảm ơn. Có rất nhiều ngôn ngữ để học! Tôi chắc chắn sẽ xem xét. Tôi vẫn đang chơi gôn trong Python và Lotus Formula nhưng hiểu sâu hơn về nó. Nhiều ngôn ngữ là niềm vui hơn. Cảm ơn một lần nữa vì sự đóng góp của bạn :)
ElPedro

2

PHP, 98 95 byte

lấy cảm hứng từ giải pháp Arnauld hè

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

Lưu ý: Dòng mã đầu tiên có khoảng trắng ở cuối.


Đẹp một @Titus. Không gian lưu trữ được cho phép.
ElPedro

@ElPedro: Tôi chỉ biết một số người đã cấu hình các trình soạn thảo để tự động cắt chúng; đó là những lý do tại sao tôi đề cập đến nó.
Tít

1

PHP với GD, 348 338 byte (không cạnh tranh)

không chính xác những gì đang được yêu cầu, nhưng ...

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

lưu vào tập tin, gọi trong trình duyệt

phá vỡ

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

Để vẽ một ngôi nhà lớn hơn, thay đổi $w=9theo chiều rộng mong muốn của bạn.


Và tôi cũng cho cái này là +1. Mặc dù nó không giải quyết được thách thức trực tiếp nhưng nó bao gồm các cải tiến được đề xuất của bạn và trông rất tuyệt :)
ElPedro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.