Saya Ingin Honeycomb

39

Tulis program terpendek yang mencetak bagian seni ASCII ini dari ubin heksagonal atau sarang lebah :

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • Tidak ada input yang harus diambil.
  • Output ke stdout atau alternatif terdekat bahasa Anda.
  • Alih-alih sebuah program, Anda dapat menulis fungsi bernama yang tidak mengambil parameter dan mencetak hasilnya secara normal atau mengembalikannya sebagai string.
  • Output mungkin memiliki sejumlah baris utama dan / atau trailing dan setiap baris dalam output dapat memiliki sejumlah ruang memimpin dan / atau trailing (selama pola berbaris dengan benar.)
  • Kode terpendek dalam byte menang.
Hobi Calvin
sumber
13
Apakah Anda banyak bermain Catan?
user3490
@ user3490 Sebenarnya saya lakukan ^^
Calvin Hobbies
2
Minggu depan di PCG: tulis generator papan Catan?
user3490
7
Seharusnya memiliki input IMO, dalam kasus Anda itu harus 3.
user3819867
3
@ user3819867 Saya memang mempertimbangkan itu tetapi lebih suka ini. Sudah terlambat untuk berubah tetapi belum terlambat bagi siapa pun untuk membuat tantangan terkait.
Hobi Calvin

Jawaban:

33

CJam, 45 43 42 41 40 byte

741e8 36+Ab"\__/  "38*21/.{G2$-<\S*.e<N}

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

"\__/  "38*21/

mengulangi pola \__/ 38 kali dan membaginya menjadi potongan-potongan dengan panjang 21 . Jika potongan dipisahkan oleh umpan baris, ini akan menjadi hasilnya:

\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  

Ini jelas mengandung honeycomb yang diinginkan. Yang tersisa untuk dilakukan adalah mengganti beberapa karakter dengan spasi, memotong beberapa karakter lainnya dan benar-benar memperkenalkan umpan baris.

741e8 36+Ab

menghasilkan integer 74 100 000 036 dan mengubahnya menjadi array [7 4 1 0 0 0 0 0 0 3 3] . Setiap elemen array mengkodekan jumlah karakter utama dari baris yang sesuai yang harus diganti dengan spasi. Dengan mengurangi angka ini dari 16 , kami juga mendapatkan panjang yang benar untuk baris ini.

.{            } e# Execute for each pair of a digit D and a line L:
  G2$-<         e#   Chop off L after 16 - D characters.
       \S*      e#   Push a string of D spaces.
          .e<   e#   Compute the vectorized minimum.
             N  e#   Push a linefeed.

Karena spasi memiliki titik kode yang lebih rendah daripada karakter L lainnya dan operator vektor membuat karakter string yang lebih panjang yang tidak sesuai dengan salah satu yang lebih pendek tidak tersentuh, .e<menggantikan karakter D pertama dengan spasi.

Dennis
sumber
2
Ini brilian. Kerja bagus.
Alex A.
28

Python 2, 73

i=0
exec"k=max(7-i,i-24,0);print' '*k+('\__/  '*9)[i:][k:16-k];i+=3;"*11

Lihat berlari.

Untuk masing-masing dari 11 baris keluaran, hitung jumlah ruang terdepan ksebagai maksimum dari tiga fungsi linier yang membentuk amplop sisi kiri segi enam. Karena garis diagonal memiliki kemiringan 3dan -3, lebih baik untuk mengindeks nomor baris sebagai i=0,3,...30.

Untuk membuat mesh segi enam, pertama-tama kita harus memasang cukup unit '\__/ '. Kemudian, menggeser [i:]luruskan kembali dengan 3 untuk baris aneh. Akhirnya, kami mengambil porsi yang dibutuhkan [k:16-k], meninggalkan margin kdi kiri dan kanan.

Tidak
sumber
22

CJam, 65 56 55 byte

"Ý6TNð*¯5"303b4b["/\_")"_ "4*S]f=sB/z{_W%"\/"_W%erN}/

Cobalah online di juru bahasa CJam .

Ide

Bagian kanan dari setiap baris adalah salinan terbalik dari bagian kiri dengan garis miring dan garis miring terbalik. Oleh karena itu, cukup untuk menyandikan bagian kiri sarang lebah:

       _
    __/ 
 __/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
   \__/ 
      \_

Daripada menganalisis pola ini baris demi baris, kita dapat menganalisisnya kolom demi kolom:

   /\/\/\  
  _ _ _ _  
  _ _ _ _  
  /\/\/\/\ 
 _ _ _ _ _ 
 _ _ _ _ _ 
 /\/\/\/\/\
_ _ _ _ _ _

Pola yang jelas muncul:

  • Tali _ _ _ _muncul lima kali.
  • Setiap /diikuti oleh a \.

Dengan mengganti setiap /\, _, _ _ _ _dan ruang dengan nomor dari 0 sampai 3, kita dapat mengkonversi array yang dihasilkan dari basis 4 nomor untuk basis yang lebih tinggi dan menyimpan pola lengkap secara kompak.

Kode

"Ý6TNð*¯5"303b4b  e# Convert the string from base 303 to base 4.
["/\_")"_ "4*S]f= e# Replace each resulting digit by the corresponding item of the array
                  e# ["/\" "_" "_ _ _ _ " " "].
sB/               e# Split into strings of length 11.
z                 e# Zip: transpose rows with columns.
{             }/  e# For each string:
 _W%              e#     Push a reversed copy.
    "\/"_W%er     e#     Swap slashes and backslashes.
             N    e#     Push a linefeed.
Dennis
sumber
10

C, 148 144 140 byte

k,r,c,d,p;f(){for(;k<187;k++){r=k/17;c=k%17;d=c+r%2*3;p=3*r+c-7<33u&3*r-c+8<33u;putchar(c==16?10:p&(d+5)%6<2?95:p&d%6==3?47:!p|d%6?32:92);}}

Dengan spasi putih, tanpa peringatan kompiler, dan sebelum beberapa kode tweak untuk menyimpan beberapa byte:

#include <stdio.h>

int k, r, c, d, p;

void f() {
    for ( ; k < 187; k++) {
        r = k / 17;
        c = k % 17;
        d = c + 3 * (r % 2);
        p = 3 * r + c - 7 < 33u && 3 * r - c + 8 < 33u;
        putchar(
            c == 16 ? 10 :
            p && (d + 5) % 6 < 2 ? 95 :
            p && d % 6 == 3 ? 47 :
            p && d % 6 == 0 ? 92 :
            32);
    }
}

Pendekatan ini tidak menggunakan tabel karakter / string. Itu loop atas semua 187 (11 baris, 17 kolom termasuk baris baru), dan memutuskan karakter mana yang akan dicetak untuk setiap posisi, berdasarkan kombinasi kondisi.

Kondisi termasuk tes untuk berada di dalam / di luar 4 sudut, menggunakan 4 persamaan garis, dengan hasil disimpan dalam variabel p. Sisanya sebagian besar berulang setiap 6 karakter, dengan baris ganjil digeser oleh 3 karakter relatif ke baris genap.

Reto Koradi
sumber
2
Untuk yang golf, Anda bisa menggunakan impl-int dan drop int .
luser droog
Beberapa perbaikan mikro:k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
Dennis
7

Ruby - 78 Bytes

(-5..5).map{|i|puts' '*(j=[i.abs*3-i/6-9,0].max)+('/  \__'*4)[j+i%2*3,16-j*2]}

Transkripsi solusi xnor (69 Bytes):

11.times{|i|puts' '*(j=[7-i*=3,i-24,0].max)+('\__/  '*9)[i+j,16-j*2]}
primo
sumber
1
11.timesmenghemat 2 byte
Mitch Schwartz
6

JavaScript (ES6), 129 130

Itu string murni ganti / ganti / ganti ... tidak memanfaatkan properti geometris apa pun.

Menggunakan string template, semua baris baru signifikan dan diperhitungkan.

Jalankan cuplikan di Firefox untuk menguji

f=_=>`70
405
 055
9992 3051
6301`[R='replace'](/9/g,`55123
30551
`)[R](/5/g,1230)[R](/\d/g,n=>['__','/',,'\\'][n]||' '.repeat(n))

// TEST

O.innerHTML = f()
<pre id=O></pre>

edc65
sumber
6

PHP - 139 137 107 101 91 87 byte

Saya tidak tahu apakah ini cara terbaik untuk bermain golf tetapi ini adalah percobaan saya:

30 36 46 -50 bytes berkat Ismael Miguel

Uji secara online di sini

<?='       __
    __',$a='/  \__',"
 __$a$a
",$c="$a$a/  \
\__$a$a/
","$c$c   \__$a/
      \__/";

<script src="http://ideone.com/e.js/WHWEZS" type="text/javascript" ></script>

kode lama:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";
Timo
sumber
Selamat datang di Programming Puzzles and Code Golf. Kode PHP Anda dapat dikurangi lebih banyak. Anda dapat menggunakan <?alih-alih <?phpmenyimpan 3 byte. Alih-alih $c=$a.$a."/ \\\n\__".$a.$a."/\n";, Anda dapat menulis $c="$a$a/ \\\n\__.$a$a/\n";(karena PHP memperluas variabel dalam string). Anda dapat menerapkan logika yang sama ke echountuk lebih mengurangi panjangnya. Selain itu, Anda tidak perlu ruang antara echodan string.
Ismael Miguel
1
Terima kasih, saya belajar sesuatu yang baru setiap kali saya mencoba bermain golf hehe.
Timo
Sama sama. Berikut adalah solusi panjang 99-byte: ideone.com/WHWEZS . Terlihat berantakan, tetapi jauh lebih pendek. Alih-alih menggunakan \n, Anda dapat meletakkan baris baru nyata dan menyimpan 1 byte per baris.
Ismael Miguel
Sementara itu, saya sudah menguranginya 2 byte. Sekarang ia memiliki 97 byte.
Ismael Miguel
1
Berikut ini adalah satu-kapal: <?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";. Ingatlah untuk mengganti \tdengan karakter tab dan \ndengan baris baru yang sebenarnya.
Ismael Miguel
4

Lua 146

T="       __\n    __/  \\__\n __/  \\__/  \\__\n"
S="/  \\__/  \\__/  \\\n\\__/  \\__/  \\__/\n"
B="   \\__/  \\__/\n      \\__/"
io.write(T,S,S,S,B)

(baris baru ditambahkan untuk kejelasan)

Kyle Kanos
sumber
1
Bukankah kode ini lebih panjang dari output yang diinginkan karena hanya berisi output plus hal-hal yang lolos dan penanganan string?
Caleb
6
@ Caleb: Saya menduga Anda tidak benar-benar masuk hitungan & hanya menebak dalam membuat komentar itu. Menurut editor teks saya, ada 165 karakter dalam kisi (termasuk baris baru). Saya memiliki 19 karakter lebih sedikit karena mengulangi Stiga kali.
Kyle Kanos
2
Tetapi Anda benar bahwa pelarian dan baris baru membatasi kemampuan kode saya untuk bersaing dalam permainan khusus ini. Tetapi menang juga bukan alasan saya melakukan ini, ini untuk kesenangan & pembelajaran.
Kyle Kanos
3

Dart - 113

main({r:"/  \\__"}){print("       __\n    __$r\n __$r$r\n${"$r$r/  \\\n\\__$r$r/\n"*3}   \\__$r/\n      \\__/");}

Solusi interpolasi string murni, tidak ada yang mewah. Operasi string seperti "substring" terlalu bertele-tele untuk bersaing dalam praktik.

Jalankan di DartPad .

Tuan
sumber
3

Javascript ( ES7 Draft ), 96 94 93 byte

Inspirasi diambil dari beberapa solusi di sini ...

Edit: -1 dari edc65

f=z=>[for(x of[741e6]+36)' '.repeat(x)+'/  \\__'.repeat(4,z^=3).slice(+x+z,16-x+z)].join(`
`)

// For snippet demo:
document.write('<pre>'+f()+'</pre>');

Berkomentar:

f=z=>[                                 
        for(x of [741e6] + 36)        // for each character "x" in "74100000036"
            ' '.repeat(x) +           // x spaces
            '/  \\__'.repeat(4,       // build pattern string
            z ^= 3).                  // toggle z offset (3) for even lines
            slice(+x + z, 16 - x + z) // get appropriate substring
    ].join(`                          // join with newlines
    `)
nderscore
sumber
Bagus .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65
@ edc65 tangkapan bagus!
nderscore
Pertanyaan cepat: Mengapa ini +xbukan hanya x?
Nic Hartley
1
@QPaysTaxes Ini xuntuk menggunakan nomor. Tanpa itu, itu akan menyatukanz
nderscore
2

Python 3, 100 87 byte

n=0x85208e08e08dd445
while n:l=n>>2&15;print(' '*(8-l)+('\__/  '*4)[n&3:n&3|l*2]);n>>=6

Dan versi kode yang dapat dibaca di bawah ini. Idenya adalah untuk membuat hardcode interval (mulai, panjang) dan kemudian pad dengan jumlah ruang yang tepat untuk menempatkan interval.

hexagon_string = '\__/  ' * 4
for i in range(11):
    # Pick the begin and length of the i-th interval using hardcoded numbers
    b = (0x00030303111 >> 4*i) & 3   # n is a combination of these two numbers
    l = (0x25888888741 >> 4*i) & 15  #
    # Print the interval with appropriate whitespace in front of it
    spaces = ' ' * (8-l)
    print(spaces + hexagon_string[b : b+l*2])
Matty
sumber
2

Retina , 66 byte

<empty line>
sss __<LF>ssa__<LF> aa__<LF>lll dau<LF>ssdu
l
/daa<LF>\aau<LF>
a
ud
u
__/
d
s\
s

Setiap baris harus menuju ke file sendiri dan <LF>berarti baris baru yang sebenarnya dalam file. 1 byte per file tambahan ditambahkan ke byte-count.

Anda dapat menjalankan kode sebagai satu file dengan -sbendera, menjaga <LF>spidol dan mungkin mengubahnya menjadi baris baru di output agar mudah dibaca jika diinginkan.

Algoritma ini adalah 5 langkah pengganti sederhana (mengubah konten garis ganjil menjadi konten baris genap) mulai dari string input kosong. Hasil setelah setiap langkah yang (dibatasi oleh ='s):

sss __
ssa__
 aa__
lll dau
ssdu
============
sss __
ssa__
 aa__
/daa
\aau
/daa
\aau
/daa
\aau
 dau
ssdu
============
sss __
ssud__
 udud__
/dudud
\ududu
/dudud
\ududu
/dudud
\ududu
 dudu
ssdu
============
sss __
ss__/d__
 __/d__/d__
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
 d__/d__/
ssd__/
============
sss __
ss__/s\__
 __/s\__/s\__
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
 s\__/s\__/
sss\__/
============
       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
randomra
sumber
1

Javascript, 154 151 byte

b="\n",c="\t",d="/  \\",f="__",g="\\",h="/",a=f+d,j=a+a,i=d+j+b+g+j+f+h+b,k="   ";console.log(c+k+f+b+c+a+f+b+" "+j+f+b+i+i+i+k+g+a+f+h+b+c+"  "+g+f+h)
SuperJedi224
sumber