บ้านของซานตาคลอส


16

บ้านของซานตาคลอส

หมายเหตุ:นี่เป็นความท้าทายแรกที่ฉันพยายามตั้งไว้ มันผ่านแซนด์บ็อกซ์แล้ว แต่ถ้าคุณพบว่ามีบางอย่างผิดปกติโปรดอย่าเพิ่งลงคะแนน แต่แสดงความคิดเห็นเพื่อที่ฉันจะได้ปรับปรุงได้

พื้นหลัง

มีปริศนาเด็กอายุที่ความท้าทายคือการวาดกล่องที่มีหลังคาและข้ามผ่านกลางโดยไม่ต้องยกปากกาของคุณจากกระดาษหรือข้ามเส้นใด ๆ สองครั้ง

ในประเทศเยอรมนีเป็นที่รู้จักกันในนาม "das Haus des Nikolaus" หรือ "The House of Santa Claus" ฉันจำสิ่งที่เราเคยเรียกมันไม่ได้ สำหรับใครที่ไม่คุ้นเคยกับปริศนาที่รายละเอียดทั้งหมดที่มีอยู่ที่นี่

นี่คือตัวแทนศิลปะ ASCII ของบ้าน

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

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นเพื่อวาด House of Santa Claus ในภาษาที่คุณเลือก

ฟังดูง่ายเกินไปหรือ นี่คือการจับ มันจะต้องส่งออกแต่ละขั้นตอนของการวาดภาพและปฏิบัติตามกฎของตัวต่อ โปรแกรมของคุณไม่จำเป็นต้องป้อนข้อมูลใด ๆ บ้านที่สร้างเสร็จจะต้องตรงตามที่แสดงด้านบน

ตามเว็บไซต์ข้างต้นมี 44 โซลูชั่นที่เป็นไปได้ คุณสามารถใช้หนึ่งในนั้น นี่เป็นความท้าทายของ ASCII ดังนั้นคุณไม่จำเป็นต้องคำนวณวิธีแก้ปัญหา แต่ใช้เพื่อวาดมันเท่านั้น

เอาท์พุต

ตัวอย่างของเอาต์พุตที่ต้องการจากหนึ่งใน 44 โซลูชันดังแสดงด้านล่าง:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

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

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

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

กฎระเบียบ

  • ฉันเพิ่มบรรทัดใหม่พิเศษ 1 บรรทัดระหว่างแต่ละเอาต์พุตที่คาดหวังเพื่อพยายามทำให้ข้อกำหนดชัดเจนขึ้น นี่เป็นทางเลือก อนุญาตให้มีจำนวนบรรทัดว่างระหว่างแต่ละเอาต์พุต
  • ผลลัพธ์ของคุณจะต้องประกอบด้วยอักขระ /, \, -, _ และช่องว่างดังที่แสดงด้านบน อนุญาตให้เว้นวรรคต่อท้าย
  • แต่ละบรรทัดในรูปวาดของคุณต้องดำเนินการต่อจากจุดสิ้นสุดของบรรทัดก่อนหน้าและคุณไม่สามารถทำซ้ำบรรทัดใด ๆ
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • คุณไม่จำเป็นต้องเอาท์พุทสัมผัสที่กล่าวถึงในลิงค์ด้านบน
  • นี่คือรหัสกอล์ฟดังนั้นคำตอบสั้น ๆ เป็นไบต์จะเป็นผู้ชนะ

ผลลัพธ์

บางคำตอบที่ดีและขอบคุณและเคารพทุกคนที่โพสต์ ฉันบอกว่านับไบต์ต่ำสุด แต่ฉันได้ทำเครื่องหมายเป็นคำตอบด้านบนไม่เพียง แต่นั้นสำหรับคำอธิบายที่ดีของรหัส Nice one @Dennis


เรื่องนี้อาจจะใช้เวลาบางส่วนในกระบะทราย ลองเพิ่มพารามิเตอร์สำหรับขนาดของบ้าน - หรือจำนวนบ้านที่ต่อกัน (หรือทั้งคู่) ฉันคิดว่ามันง่ายเกินไป คุณอาจต้องการเพิ่มสัมผัสถึงตัวอย่างของคุณ - หรือไม่พูดถึงมันเลย ฉันพบนี้ GIFดีหรือคนนี้
ติตัส


4
@Titus ขอบคุณสำหรับข้อเสนอแนะ ความตั้งใจของฉันคือการไม่สร้างความท้าทายที่ยากเป็นพิเศษ แต่เพื่อสร้างสิ่งที่ทำได้ง่ายพอสมควรและสนับสนุนให้ผู้คนจำนวนมากที่สุดเสนอแนวทางแก้ไข ฉันจะใช้คำแนะนำของคุณบนกระดานสำหรับความพยายามครั้งต่อไปของฉัน
ElPedro

1
ความผิดของฉัน; ฉันคาดหวังว่าสิ่งที่ซับซ้อนเกินไปสำหรับศิลปะ ASCII :) แต่ฉันก็ยังชอบ gif
ติตัส

gifs นั้นเจ๋งและฉันก็ชอบไอเดียของการรวมถึงการสัมผัสในภาษาที่เลือก :)
ElPedro

คำตอบ:


10

เจลลี่ , 40 39 36 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

“ḥ%DtƊVḍI’

เป็นฐาน bijective 250 ตัวอักษร; ตัวละครแต่ละตัวสอดคล้องกับจุดรหัสในหน้ารหัสของวุ้น ผลที่ได้คือจำนวนเต็ม13192938935880491074

          ḃ9

แปลงจำนวนเต็มที่สร้างขึ้นให้เป็นฐาน bijective 9 เพื่อให้ได้อาร์เรย์จำนวนเต็ม
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 8, 4, 4, 4, 4, 4] จำนวนเต็มสอดคล้องกับคำสั่งของสโตรกยกเว้น9ซึ่งบ่งชี้ช่องว่าง

            W

ล้อมอาเรย์ที่สร้างไว้ลงในอาเรย์เดี่ยวซึ่งจะต้องใช้ในการผนวกมันเข้ากับอาเรย์ที่เราจะสร้างตอนนี้

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

ทำงานดังนี้ ¤รวมสองลิงก์ไปทางซ้ายเข้าด้วยกันเป็นโซ่ niladic คนแรก“|_/-\/\|‘ถัวเฉลี่ยจุดรหัสของตัวละครที่ระบุน่วม[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 THจังหวะจะเป็นอักขระ ASCII กับจุดรหัสค

             ;

เชื่อมต่ออาร์เรย์ที่สร้างขึ้น ผลลัพธ์คืออาร์เรย์
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4,4,4], [1,124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8124]]

                          y@\

ดำเนินการลดการสะสม (เช่นแสดงขั้นตอนกลางทั้งหมด) โดยใช้การทับศัพท์ ( y) พร้อมอาร์กิวเมนต์ที่สลับ ( @) ในขั้นตอนแรกเช่นเราแทนที่1ในอาร์เรย์เดิมด้วย124ซึ่งเป็นจุดรหัสของอักขระ| .

                             FỌ

ทำให้แบนของผลลัพธ์และแทนที่จุดโค้ดทั้งหมดด้วยอักขระ ASCII ที่สอดคล้องกัน ในขั้นตอนทั้งหมดนี้จะสร้างตัวละครไม่สามารถพิมพ์บางคนที่มีจุดรหัส1ที่จะ9

                               »⁶

ใช้อักขระสูงสุดด้วยอักขระเว้นวรรคแทนที่อักขระที่ไม่สามารถพิมพ์ได้ทั้งหมดด้วยช่องว่าง

                                 s4Y

แยกสตริงที่สร้างขึ้นเป็นส่วนของความยาวสี่และรวมกับ linefeed เป็นตัวคั่น


2
ว้าว. เพียงแค่ว้าว +1
ElPedro

แต่เดี๋ยวก่อนนั่นเป็นจำนวนไบต์?
Leif Willerts

1
@LeifWillerts ใช่ เพื่อหลีกเลี่ยงอักขระที่ไม่สามารถพิมพ์ได้เจลลี่ใช้หน้ารหัสที่กำหนดเองซึ่งเข้ารหัสอักขระ 256 ตัวที่เข้าใจเป็นไบต์เดียว ไบต์เชื่อมโยงในจุดที่ส่วนหัวของมัน
Dennis

ขออภัยที่ไม่คิดว่าจะคลิกลิงก์นั้น: 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
Arnauld

การแก้ไขหลายรายการทำได้ดี ยินดีที่ได้เห็นจำนวนไบต์ลดลง
ElPedro

มีจุดใดบ้างในการมีรหัสสองชุดที่เหมือนกันในคำตอบของคุณ?
Neil

@ Neil - ฉันจะเก็บไว้เพียงหนึ่งจนกว่าฉันจะพบเหตุผลที่ดีที่จะมีสองคน ^^
Arnauld

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 ... หากคุณต้องการ a |ในตัวแปรคุณต้องอ้างมันด้วยสาม^s ดังนั้นมันจึงถูกกว่าที่จะใช้@แทนและแทนที่มันในเอาต์พุตแม้ว่าจะต้องทำสิ่งนี้ให้สำเร็จฉันต้องเริ่มต้นด้วยกำแพงด้านซ้าย บรรทัดหนึ่งมีช่องว่างต่อท้าย echo(ถูกนำมาใช้เพราะr, cและfตัวแปรที่อาจจะเป็นที่ว่างเปล่าและเราไม่ต้องการECHO is off.พิมพ์

แก้ไข: บันทึก 12 ไบต์โดยใช้ fallthrough สำหรับส่วนสุดท้าย บันทึก 3 ไบต์โดยใช้การforวนซ้ำเพื่อพิมพ์แต่ละส่วนซึ่งหมายความว่าตอนนี้ฉันใช้|s ในตัวแปรของฉันซึ่งทำให้รหัสอ่านง่ายขึ้นเล็กน้อย ที่บันทึกไว้ 4 ไบต์โดยใช้อย่างชัดเจนตัวอักษรแทน@ @echo offฉันคิดว่าเริ่มจากกำแพงด้านซ้ายยังคงต้องใช้จำนวนไบต์ที่น้อยที่สุด


2
อาจไม่ใช่สั้นที่สุด แต่ได้รับ upvote จากฉันสำหรับการจัดการที่จะทำใน Batch +1
ElPedro

echo:เป็นมาตรฐานมากขึ้น แต่echo(ดูเหมือนว่าคุณกำลังใช้ภาษาในทางที่ผิดดังนั้น +1
wizzwizz4

@ wizzwizz4 echo:ล้มเหลวในบางกรณีที่ไม่ชัดเจน แต่ฉันไม่ทราบว่ามีกรณีecho(ใดบ้าง
Neil

@ wizzwizz4 ถ้าคุณมีไฟล์foo.batในไดเรกทอรีปัจจุบันecho(\..\foo.batสะท้อน\..\foo.batแต่รันecho:\..\foo.bat foo.bat
Neil

@ 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

1
@ElPedro ลองคลิกที่ลิงก์ในส่วนหัวคุณอาจเข้าใจแนวคิด แต่ถ้าไม่เป็นเช่นนั้นเพียงแค่กลับมาหาฉัน ฉันต้องการคนมากขึ้นเพื่อให้สามารถเข้าใจภาษาและถ้าคุณทำไม่ได้มันเป็นความจริงที่น่าเศร้า ฉันรู้ว่าฉันไม่สามารถทำให้ทุกคนเข้าใจ /// (บางคนแค่ต้องการอาหารและน้ำ /// และ PPCG อยู่ไกลจากนั้นแม้ว่าจะเป็นไปไม่ได้)
Erik the Outgolfer

Thanks. There are so many languages to learn! I'll definitely take a look. I'm still golfing in Python and Lotus Formula but getting into it more. More languages is more fun. Thanks again for your contribution :)
ElPedro

2

PHP, 98 95 bytes

inspired by Arnauld´s solution

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

Note: The first code line has a trailing space.


Nice one @Titus. Trailing spaces are allowed.
ElPedro

@ElPedro: I just know some people who have configured there editors to automatically trim them; that´s why I mentioned it.
Titus

1

PHP with GD, 348 338 bytes (not competing)

not exactly what was being asked for, but ...

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

save to file, call in a browser

breakdown

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

To draw a larger house, change $w=9 to your desired width.


And I give this one a +1 as well. Even though it does not address the direct challenge it covers your suggested improvements and looks very cool :)
ElPedro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.