Rumah Santa Claus

16

Rumah Santa Claus

catatan: Ini adalah tantangan pertama yang saya coba set. Sudah melalui Sandbox namun jika Anda menemukan sesuatu yang salah dengan itu jangan hanya downvote tetapi tinggalkan komentar sehingga saya bisa memperbaikinya.

Latar Belakang

Ada teka-teki anak-anak tua di mana tantangannya adalah menggambar sebuah kotak dengan atap dan salib di tengah tanpa mengangkat pena Anda dari kertas atau melewati garis apa pun dua kali.

Di Jerman dikenal sebagai "das Haus des Nikolaus" atau "The House of Santa Claus". Jujur saya tidak ingat apa yang kita sebut itu. Bagi siapa pun yang tidak terbiasa dengan teka-teki, detail lengkap tersedia di sini .

Berikut adalah representasi seni rumah ASCII.

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

Tantangan

Tulis program atau fungsi untuk menggambar House of Santa Claus dalam bahasa pilihan Anda.

Kedengarannya terlalu mudah? Nah inilah tangkapan. Ini juga harus keluaran setiap tahap gambar dan mematuhi aturan dari teka-teki. Program Anda tidak diperlukan untuk mengambil masukan apapun. Rumah jadi harus terlihat persis seperti yang ditunjukkan di atas.

Menurut situs di atas ada 44 kemungkinan solusi. Anda dapat menggunakan salah satu dari mereka. Ini adalah tantangan seni ASCII sehingga Anda tidak diharuskan menghitung solusinya tetapi hanya menggambarnya.

Keluaran

Contoh dari output yang diperlukan dari salah satu dari 44 solusi ditunjukkan di bawah ini:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

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

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

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

Aturan

  • Saya telah menambahkan 1 baris baru ekstra antara setiap output yang diharapkan untuk mencoba membuat persyaratan lebih jelas. Ini opsional. Sejumlah baris kosong di antara setiap output diizinkan.
  • Output Anda hanya terdiri dari karakter /, \, -, _, dan spasi seperti yang ditunjukkan di atas. spasi diperbolehkan.
  • Setiap baris dalam gambar Anda harus berlanjut dari akhir baris sebelumnya dan Anda tidak boleh mengulangi garis apa pun.
  • Celah standar dilarang.
  • Anda tidak diharuskan untuk mengeluarkan sajak yang disebutkan dalam tautan di atas.
  • Ini adalah kode golf sehingga jawaban terpendek dalam byte akan menjadi pemenang.

Hasil

Beberapa jawaban yang bagus dan terima kasih dan hormat untuk semua yang diposting Saya memang mengatakan jumlah byte terendah tetapi saya telah menandai sebagai jawaban teratas tidak hanya untuk itu tetapi juga untuk penjelasan kode yang bagus. @Dennis bagus.

ElPedro
sumber
Ini bisa menghabiskan waktu di kotak pasir . Coba tambahkan parameter untuk ukuran rumah - atau jumlah rumah berpasangan (atau keduanya). Saya merasa terlalu mudah. Anda mungkin juga ingin menambahkan sajak ke output contoh Anda - atau tidak menyebutkannya sama sekali. Saya menemukan gif ini bagus, atau yang ini .
Titus
4
@Itus Terima kasih atas umpan baliknya. Niat saya bukanlah untuk menciptakan tantangan yang sangat sulit, tetapi untuk menciptakan tantangan yang cukup mudah dilakukan dan mendorong sebanyak mungkin orang untuk mengusulkan solusi. Saya akan menerima saran Anda untuk upaya saya berikutnya.
ElPedro
1
Salahku; Saya mengharapkan hal-hal yang terlalu rumit untuk seni ascii. :) Tapi aku masih suka gif.
Titus
Gif-gif itu keren dan saya juga suka ide memasukkan sajak juga dalam pilihan bahasa :)
ElPedro

Jawaban:

10

Jelly , 40 39 36 byte

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

Cobalah online!

Bagaimana itu bekerja

“ḥ%DtƊVḍI’

adalah basis bijektif-250 literal; setiap karakter sesuai dengan titik kode di halaman kode Jelly . Hasilnya adalah bilangan bulat 13192938935880491074 .

          ḃ9

mengubah bilangan bulat yang dihasilkan menjadi basis bijective 9, menghasilkan array bilangan bulat
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Bilangan bulat sesuai dengan urutan goresan, dengan pengecualian 9 , yang menunjukkan spasi.

            W

membungkus array yang dihasilkan menjadi array tunggal, yang akan diperlukan untuk menambahkannya ke array yang akan kita hasilkan sekarang.

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

bekerja sebagai berikut. ¤menggabungkan dua tautan ke kiri menjadi rantai niladik. Yang pertama, “|_/-\/\|‘menghasilkan poin kode dari karakter yang ditentukan, menghasilkan [124, 95, 47, 45, 92, 47, 92, 124] . Lalu, Ėsebutkan poin kode, menghasilkan
[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . Pasangan [n, c] berarti bahwa pukulan ke- n akan menjadi karakter ASCII dengan titik kode c .

             ;

menggabungkan array yang dihasilkan. Hasilnya adalah array
[[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@\

melakukan pengurangan kumulatif (yaitu, menunjukkan semua langkah menengah), menggunakan transliterasi ( y) dengan argumen swapped ( @). Pada langkah pertama, misalnya, kita mengganti masing-masing 1 dalam array asli dengan 124 , yang merupakan titik kode dari karakter | .

                             FỌ

meratakan hasilnya dan mengganti semua titik kode dengan karakter ASCII yang sesuai. Dalam semua langkah, ini akan menghasilkan beberapa karakter yang tidak patut dicetak dengan titik kode 1 hingga 9 .

                               »⁶

menggunakan karakter spasi maksimal dengan karakter spasi, menggantikan semua karakter yang tidak patut dengan spasi.

                                 s4Y

membelah string yang dihasilkan menjadi potongan-potongan panjang empat dan bergabung dengan mereka dengan linefeed sebagai pemisah.

Dennis
sumber
2
Wow. Cukup wow. +1
ElPedro
Tapi tunggu, itu byte?
Leif Willerts
1
@LeifWillerts Ya. Untuk menghindari karakter yang tidak diinginkan, Jelly menggunakan halaman kode khusus yang mengkodekan 256 karakter yang dipahami sebagai masing-masing byte tunggal. The byte link dalam poin sundulan untuk itu.
Dennis
Maaf karena tidak mencari tahu untuk mengklik tautan itu: D
Leif Willerts
Ia memenangkan sebanyak penjelasan untuk apa pun. Menghormati.
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]))

Arnauld
sumber
Jawaban bagus. Saya punya perasaan bahwa Javascript akan berada di sana atau di sekitar :-)
ElPedro
Maaf atas beberapa pengeditan. Saya tidak boleh memposting sebelum kopi ke-2.
Arnauld
Banyak pengeditan yang baik. Senang melihat jumlah byte turun.
ElPedro
Apakah ada gunanya memiliki dua salinan kode yang identik dalam jawaban Anda?
Neil
@ Neil - Saya akan menyimpan hanya satu sampai saya menemukan alasan yang bagus untuk memiliki dua dari mereka. ^^
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

|Aturan mengutip Batch bodoh ... jika Anda ingin |dalam variabel, Anda perlu mengutipnya dengan tiga ^s, jadi lebih murah untuk menggunakan @dan menggantikannya pada output, meskipun untuk mencapai ini saya harus mulai dengan dinding kiri. Baris satu memiliki ruang tambahan. echo(digunakan karena r, c, dan fvariabel bisa menjadi kosong dan kami tidak ingin ECHO is off.dicetak.

Sunting: Disimpan 12 byte dengan menggunakan fallthrough untuk bagian terakhir. Disimpan 3 byte dengan menggunakan forloop untuk mencetak setiap bagian, ini berarti bahwa saya sekarang menggunakan |s dalam variabel saya yang membuat kode sedikit lebih mudah dibaca. Disimpan 4 byte dengan menggunakan @karakter eksplisit, bukan @echo off. Saya pikir mulai dengan dinding kiri masih membutuhkan byte paling sedikit.

Neil
sumber
2
Mungkin bukan yang terpendek tetapi mendapat dukungan dari saya untuk benar-benar berhasil melakukannya dalam Batch +1
ElPedro
echo:lebih standar tetapi echo(sepertinya Anda menyalahgunakan fitur bahasa, jadi +1.
wizzwizz4
@ wizzwizz4 echo:gagal dalam beberapa kasus tepi yang tidak jelas, tapi saya tidak tahu ada kasus kegagalan untuk echo(.
Neil
@ wizzwizz4 Jika Anda memiliki file foo.batdi direktori saat ini, echo(\..\foo.batgema \..\foo.battetapi echo:\..\foo.batdijalankan foo.bat.
Neil
@ Neil Apakah Anda tahu mengapa itu terjadi? Sepertinya echo:.\foo.batakan memiliki efek itu sebagai gantinya. Apakah karena kesalahan tumpukan direktori, di mana "UP" dari direktori root adalah direktori saat ini?
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]);}
Martin Rosenau
sumber
Impresif! Jawaban pertama yang bagus, dan selamat datang di situs!
DJMcMayhem
1
Untuk menyimpan 3 byte: char*p(tanpa spasi) dan ubah 'B'dan 'J'ke kode ASCII mereka.
Level River St
Terima kasih atas jawabannya. Saya bahkan tidak berharap C untuk bersaing. Ini benar-benar mengesankan dan bernilai +1
ElPedro
6

/// , 112 byte

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

Cobalah online!

Erik the Outgolfer
sumber
Saya tidak mengerti satu byte dari 112 tapi saya mencobanya secara online dan tidak persis seperti yang tertulis di kaleng jadi +1
ElPedro
1
@ ElPedro Coba klik tautan pada header, Anda mungkin memahami konsepnya, tetapi, jika tidak, maka kembalilah ke saya. Saya ingin semakin banyak orang dapat memahami suatu bahasa, dan, jika Anda tidak mengerti, itu adalah fakta yang menyedihkan. Saya tahu saya tidak bisa membuat semua orang mengerti /// (beberapa orang hanya ingin makanan dan air, /// dan PPCG jauh dari itu, walaupun bukan tidak mungkin).
Erik the Outgolfer
Terima kasih. Ada begitu banyak bahasa untuk dipelajari! Saya pasti akan melihatnya. Saya masih bermain golf dengan Formula Python dan Lotus tetapi lebih ke dalamnya. Lebih banyak bahasa lebih menyenangkan. Sekali lagi terima kasih atas kontribusi Anda :)
ElPedro
2

PHP, 98 95 byte

terinspirasi oleh solusi Arnauld

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

Catatan: Baris kode pertama memiliki spasi tambahan.

Titus
sumber
@Titus yang bagus. Ruang tambahan diizinkan.
ElPedro
@ ElPedro: Saya hanya tahu beberapa orang yang telah mengkonfigurasi editor di sana untuk secara otomatis memotongnya; itu sebabnya saya sebutkan itu.
Titus
1

PHP dengan GD, 348 338 byte (tidak bersaing)

tidak persis apa yang diminta, tapi ...

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

simpan ke file, panggil di browser

kerusakan

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

Untuk menggambar rumah yang lebih besar, ubah $w=9ke lebar yang Anda inginkan.

Titus
sumber
Dan saya memberikan yang ini +1 juga. Meskipun tidak mengatasi tantangan langsung, ini mencakup perbaikan yang disarankan dan terlihat sangat keren :)
ElPedro