テッセレーションしましょう!


18

前書き

ウィキペディアから:

平面のテッセレーションとは、タイルと呼ばれる1つ以上の幾何学的形状を使用した平面のタイル張りで、重なりや隙間はありません。

かなりよく知られているテッセレーションを以下に示します:

ここに画像の説明を入力してください

菱形は、重なりや隙間がないようにタイル状に並べられ、キューブの列の交換をシミュレートします。

仕事

あなたの仕事は、上記の画像と同じように菱形をテッセレーションするプログラムを書くことです。プログラムへの入力は、テッセレーションの次元になりますheight x width。ここで、幅は列の量で、高さは行の量です。

単一のキューブ1 x 1(3タイルの菱形)は、次のように正確に表されます。

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

したがって、入力/次元がの3 x 2場合、これは出力になります。

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

ご覧のとおり、3行(高さ)と2列(幅)があります。列は上下に入れ替わっています。あなたのプログラムもこれを行い、より高く起動する必要があります。たとえば、次のように3 x 3なります。

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

ルール

  • 結果を出力する必要があり、入力は任意の方法で取得できますが、高さと幅に対応する必要があります
  • 末尾の改行が許可されます
  • テッセレーション列は常に上から始まり、上下に交互になります
  • テッセレーションの側面を共有し、テッセレーションを他の列の間に隙間なく正しく配置する必要があります
  • あなたの提出物は、機能または完全なプログラムである可能性があります
  • 同じ入力が与えられた場合、プログラムは上記の出力を正確に印刷する必要があります。言い換えれば、出力はキューブ/テッセレーションの同じ形式に従う必要があります

仮定

  • 入力は常により大きいと想定できる1 x 1ため、ゼロが入力される場合は必要ありません

得点

これはであるため、バイト単位の最短コードが優先されます。標準的な抜け穴も禁止されています。

回答:


4

JavaScript(ES6)、243バイト

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>

必要なすべての文字を直接計算します。のために/

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

のために\

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

のために_

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

3

Befunge、277 269バイト

&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!*+
  /\      \
 /  \      \
/    \ _____\
\    /      /
 \  /      /
  \/_____ /
    _____

オンラインでお試しください!

この質問は一見簡単に見えましたが、エッジケースは私が当初予想していたよりも複雑であることが判明しました。思いついた最善のアプローチは、奇数列と偶数列を別々のレンダリングとして処理し、結果をマージすることでした。

したがって、出力する必要がある各x、y座標について、まず、次のようにxy出力座標をキューブダイアグラムのuv座標にマッピングすることにより、奇数列にレンダリングする文字を決定する必要があります。

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

の追加は(y==0)、最初の行の特殊なケースを処理することです。ただし、列の最後の最後の数行、および各行の最後の最後の数文字をレンダリングしていないことも確認する必要があります。これは、出力文字に式を乗算することにより実現されます。

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

!(columns%2)我々は終わりをトリミングする必要がある量は、総列数が偶数か奇数かに依存しているので、幅の計算があります。

次に、2番目の計算を行って、偶数列にどの文字をレンダリングするかを決定し、次のようにuv座標をマッピングします。

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

これは奇数列に使用されるものと同じ基本的な計算ですが、わずかにオフセットされます。そして、以前と同様に、境界の一部の文字をレンダリングしないようにする必要があります。今回は、列の先頭の最初の数行、および各行の最初と最後のいくつかの文字です。この場合に乗算する式は次のとおりです。

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

これら2つの潜在的な出力文字を計算すると、使用される最終値は次のとおりです。

char1 + (char2 * !char1) + 32

つまり、char1がゼロの場合はchar2を出力する必要があり、そうでない場合はchar1を出力します。両方がゼロ以外の場合、char1を出力するだけですが、どちらも同じ値になるので問題ありません。また、これらの文字の値は32でオフセットされるため(32が追加されるため)、常にゼロはスペースになります。


2

バッチ、590バイト

@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%

:cサブルーチンは3つのパラメータを取ります。%3は1列と2列%2の差、2列と3列の差%1、最初の列の追加の接頭辞です。したがって、1列は%1%22列%1%2%3、3列は%1%2%3%24列、%1%2%3%2%3などです。


2

Pythonの2329の 326 319バイト

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)

オンラインでお試しください!

実際、以前の誤った投稿よりも21 24 31バイト短い。奇数列と偶数列のリストを作成し、幅の列ごとにそれらを連結します。


素晴らしい仕事、ゴルフの幸運
アンドリューリー

1
送信には1つの問題があります。ない連続ダウン列交互に上下、
アンドリュー・リー

1
3x3の例を含めるように質問を編集しました。
アンドリューリー

確かに、それでも素晴らしい答えです!
アンドリューリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.