Давай Тесселлате!

18

Вступление

Из Википедии :

Тесселяция плоской поверхности является разбиение плоскости с использованием одного или более геометрических фигур, называемых плиток, без каких - либо наложений и без пробелов.

Довольно хорошо известная тесселяция показана ниже:

введите описание изображения здесь

Ромбы выложены плиткой таким образом, чтобы не было перекрытий или разрывов, и имитирует чередующиеся столбцы кубов.

задача

Ваша задача - написать программу, которая создает тесселяцию ромбов так же, как на картинке выше. Входными данными для программы будут размеры тесселяции: 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, которая должна быть выведена, нам сначала нужно определить, какой символ должен отображаться для нечетного столбца, сопоставляя выходные координаты x , y с координатами u , v на диаграмме куба следующим образом:

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

Дополнение (y==0)заключается в обработке особого случая первой строки. Но нам также нужно убедиться, что мы не отображаем последние несколько строк в нижней части столбца и последние несколько символов в конце каждой строки. Это достигается путем умножения выходного символа на выражение:

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

!(columns%2)В расчет ширины , так как количество нам нужно обрезать конец зависит от того , общее количество столбец четным или нечетным.

Затем мы делаем второе вычисление, чтобы определить, какой символ должен отображаться для четного столбца, сопоставляя координаты u , v следующим образом:

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

Это тот же базовый расчет, что и для нечетных столбцов, но слегка смещенный. И, как и прежде, нам нужно убедиться, что мы не отображаем некоторые символы на границах - на этот раз первые несколько строк в верхней части столбца, а также некоторые символы в начале и конце каждой строки. Выражение, которое мы умножаем в этом случае:

(y > 2) && (x > 2) && (x < w-3*(columns%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это разница между 1 и 2 столбцами, %2это разница между 2 и 3 столбцами, %1это дополнительный префикс для первого столбца, поэтому один столбец %1%2, два столбца %1%2%3, три столбца %1%2%3%2, четыре столбца %1%2%3%2%3и т. д.

Нил
источник
2

Python 2 , 329 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 байт короче, чем мой предыдущий неправильный пост. Создает списки для нечетных и четных столбцов, затем объединяет их для каждого столбца по ширине.

ElPedro
источник
Хорошая работа, удачи в гольфе
Эндрю Ли
1
Есть одна проблема с вашим представлением. Колонны чередуются вверх и вниз, а не непрерывно вниз
Эндрю Ли
1
Я отредактировал вопрос, чтобы включить пример для 3х3.
Эндрю Ли
Конечно, отличный ответ, тем не менее!
Эндрю Ли