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


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


Хорошая работа, удачи в гольфе
Эндрю Ли

1
Есть одна проблема с вашим представлением. Колонны чередуются вверх и вниз, а не непрерывно вниз
Эндрю Ли

1
Я отредактировал вопрос, чтобы включить пример для 3х3.
Эндрю Ли

Конечно, отличный ответ, тем не менее!
Эндрю Ли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.