Ayo Tessellate!

18

pengantar

Dari Wikipedia :

Sebuah tessellation dari permukaan datar adalah ubin dari pesawat menggunakan satu atau lebih geometris bentuk, disebut ubin, dengan tidak ada tumpang tindih dan tidak ada kesenjangan.

Tessellation yang cukup terkenal ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Rhombi dibuat dengan cara yang tidak menghasilkan tumpang tindih atau celah, dan mensimulasikan kolom-kolom kubus yang saling bertukar.

Tugas

Tugas Anda adalah menulis sebuah program yang memberi tahu rhombi seperti halnya gambar di atas. Input untuk program akan menjadi dimensi tessellation:, di height x widthmana lebar adalah jumlah kolom dan tinggi adalah jumlah baris.

Sebuah kubus tunggal yaitu 1 x 1(3 ubin rhombi) diwakili persis seperti itu:

    _____
  /\      \
 /  \      \
/    \ _____\ 
\    /      /
 \  /      /  
  \/_____ /   

Jadi, jika input / dimensi 3 x 2, ini harus menjadi output:

    _____
  /\      \
 /  \      \
/    \ _____\ _____
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
          \    /      /
           \  /      /
            \/_____ /

Seperti yang Anda lihat, ada 3 baris (tinggi), dan 2 kolom (lebar). Kolom saling menukar ke atas dan ke bawah. Program Anda juga harus melakukan ini dan mulai lebih tinggi. Misalnya, 3 x 3akan:

    _____               _____
  /\      \           /\      \
 /  \      \         /  \      \
/    \ _____\ _____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
          \    /      /
           \  /      /
            \/_____ /

Aturan

  • Hasilnya harus dikeluarkan, input dapat diambil dengan cara apa pun yang Anda suka tetapi harus sesuai dengan tinggi dan lebar
  • Trailing newlines diperbolehkan
  • Kolom tessellation selalu dimulai dari atas kemudian bergantian naik dan turun
  • Sisi tessellation harus dibagikan dan tessellation harus ditempatkan dengan benar di antara kolom lain tanpa celah
  • Kiriman Anda dapat berupa fungsi atau program lengkap
  • Program Anda harus mencetak dengan tepat keluaran di atas dengan input yang sama; dengan kata lain output harus mengikuti format yang sama untuk kubus / tessellations

Asumsi

  • Anda dapat mengasumsikan bahwa input akan selalu lebih besar daripada 1 x 1, jadi Anda tidak perlu kasus di mana nol dimasukkan

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang. Celah standar juga dilarang.

Andrew Li
sumber

Jawaban:

4

JavaScript (ES6), 243 byte

f=
(h,w)=>[...Array(h*6+4)].map((_,i)=>[...Array(w*9+3)].map((_,j)=>i&&(i+j+3)%6==0&&j%9<(i>3?6:3)&&(i>3|j<w*9)&&(j>2|i<h*6)?'/':i&&(i-j+2)%6==0&&j%9<(i>h*6?j<w*9?3:0:6)?'\\':i%3==0&&j>2&&(i*3+j+14)%18%(!i|i>h*6?18:12)<4?'_':' ').join``).join`
`
<div oninput=o.textContent=+h.value&&+w.value?f(h.value,w.value):''><input id=h type=number min=1><input id=w type=number min=1><pre id=o>

Langsung menghitung semua karakter yang diinginkan. Untuk /:

i&&                         Not on first row of output
(i+j+3)%6==0&&              Backward diagonals
j%9<                        Not on top (right) diamond of hexagons or
    (i>3?6:3)&&             empty spaces on top half row
(i>3|j<w*9)&&               Not on top right corner of output
(j>2|i<h*6)                 Not on bottom left corner of output

Untuk \:

i&&                         Not on first row of output
(i-j+2)%6==0&&              Forward diagonals
j%9<                        Not on bottom (right) diamond of hexagons or
    (i>h*6?                 empty spaces on bottom half row or
        j<w*9?3:0:6)        bottom right corner of output

Untuk _:

i%3==0&&                    Every third line
j>2&&                       Not on left two columns
(i*3+j+14)%18%              Every 18 characters
    (!i|i>h*6?18:12)<4      One or two groups
Neil
sumber
3

Befunge, 277 269 ​​byte

&6*4+00p&:55+*3+10p2%20pv@
6+5:g03%*54:::<<0+55p03:<<v%*54++55:\p04:**`+3g03g00`\g01+*3!g02\-*84g+3+!\%
48*+,1+:10g`!#^_$,1+:00g-|>30g:2+6%\3-!+3+g48*-\:2`\20g3*+10g\`*30g2`**40g!*+
  /\      \
 /  \      \
/    \ _____\
\    /      /
 \  /      /
  \/_____ /
    _____

Cobalah online!

Pertanyaan ini tampak mudah, tetapi kasus tepi ternyata lebih rumit dari yang saya perkirakan sebelumnya. Pendekatan terbaik yang bisa saya lakukan adalah dengan menangani kolom ganjil dan genap sebagai rendering terpisah, dan kemudian menggabungkan hasilnya.

Jadi untuk setiap koordinat x, y yang harus di-output, pertama-tama kita perlu menentukan karakter apa yang harus diberikan untuk kolom ganjil, dengan memetakan x , koordinat y output ke u , koordinat v dalam diagram kubus sebagai berikut:

u = x%20
v = (y+5)%6 + (y==0)

Penambahan (y==0)adalah untuk menangani kasus khusus dari baris pertama. Tetapi kita juga perlu memastikan bahwa kita tidak menampilkan beberapa baris terakhir di bagian bawah kolom, dan beberapa karakter terakhir di akhir setiap baris. Ini dicapai dengan mengalikan karakter keluaran dengan ekspresi:

(y > h-3) && (x > w-3*!(columns%2))

Perhitungan !(columns%2)dalam lebar adalah karena jumlah yang kita butuhkan untuk memotong ujung tergantung pada apakah jumlah kolom total genap atau ganjil.

Kami kemudian melakukan perhitungan kedua untuk menentukan karakter apa yang harus diberikan untuk kolom genap, memetakan u koordinat , v sebagai berikut:

u = (x+10)%20
v = (y+2)%6 + (y==3)

Ini adalah perhitungan dasar yang sama seperti yang digunakan untuk kolom ganjil, tetapi sedikit diimbangi. Dan seperti sebelumnya, kita perlu memastikan bahwa kita tidak membuat beberapa karakter pada batas - kali ini beberapa baris pertama di bagian atas kolom, serta beberapa karakter di awal dan akhir setiap baris. Ekspresi yang kami kalikan dalam hal ini adalah:

(y > 2) && (x > 2) && (x < w-3*(columns%2))

Setelah menghitung dua karakter output potensial ini, nilai akhir yang digunakan adalah:

char1 + (char2 * !char1) + 32

Dengan kata lain, jika char1 adalah nol kita perlu output char2 , kalau tidak kita output char1 . Jika keduanya bukan nol, kita hanya akan menghasilkan char1 , tapi itu tidak masalah karena keduanya tetap memiliki nilai yang sama. Juga perhatikan bahwa nilai karakter ini diimbangi oleh 32 (maka penambahan 32) sehingga nol akan selalu berakhir sebagai spasi.

James Holderness
sumber
2

Batch, 590 byte

@echo off
set c=call:c 
set b=\      \
set f=%b:\=/%
set s=       
set u=_____
set w=%2
%c%"   " " %u%" "%s%%s%"
%c%"  " "/%b%" "%s%    "
%c%" " "/  %b%" "%s%  "
%c%"" "/    \ %u%\" " %u% "
for /l %%i in (1,1,%1)do %c%"\" "    %f%" "%b%"&%c%" \" "  %f%" "  %b%"&%c%"  \" "/%u% /" "    \ %u%\"&if %%i lss %1 %c%"  /" "%b%" "    %f%"&%c%" /" "  %b%" "  %f%"&%c%"/" "    \ %u%\" "/%u% /"
%c%"   " "" "%s%\    %f%"
%c%"  " "" "  %s%\  %f%"
%c%" " "" "    %s%\/%u% /"
exit/b
:c
set o=%~1
for /l %%j in (%w%,-2,1)do call set o=%%o%%%~2&if %%j gtr 1 call set o=%%o%%%~3
echo(%o%

The :csubroutine mengambil tiga parameter; %3adalah perbedaan antara 1 dan 2 kolom, %2adalah perbedaan antara 2 dan 3 kolom, %1adalah awalan ekstra untuk kolom pertama, jadi satu kolom adalah %1%2, dua kolom %1%2%3, tiga kolom %1%2%3%2, empat kolom %1%2%3%2%3dll.

Neil
sumber
2

Python 2 , 329 326 319 byte

h,w=input()
a,R=[' '*10]*3,range
b='  /\      \  # /  \      \ #/    \ _____\#\    /      /# \  /      / #  \/_____ /  '.split('#')
c=['    _____    ']+b*h
e,o=c+a,a+c
k=len(e)
f=e[:]
o[3]=o[3][:10]
for x in R(1,w):
 for y in R(k):f[y]+=((e[y][3:],e[y])[y in R(4)],(o[y][3:],o[y])[y in R(k-3,k)])[x%2]
print'\n'.join(f)

Cobalah online!

Sebenarnya 21 24 31 byte lebih pendek dari posting salah saya sebelumnya. Membuat daftar untuk kolom ganjil dan genap kemudian menyatukannya untuk setiap kolom dengan lebar.

ElPedro
sumber
Kerja bagus, semoga sukses bermain golf
Andrew Li
1
Ada satu masalah dengan kiriman Anda. Kolom bergantian naik dan turun, tidak terus-menerus ke bawah
Andrew Li
1
Saya telah mengedit pertanyaan untuk menyertakan contoh untuk 3x3.
Andrew Li
Tentu saja, jawaban yang bagus!
Andrew Li