Давайте Tessellate!


18

Вступ

З Вікіпедії :

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

Нижче показана досить відома tessellation:

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

Ромби викладені плиткою в такий спосіб, що не призводить до перекриттів і прогалин, а також імітує взаємозамінні стовпчики кубів.

Завдання

Ваше завдання - написати програму, яка тесселює ромби так само, як це робить зображення вище. Вхідні дані для програми будуть розмірами тесселяції:, height x widthде ширина - кількість стовпців, а висота - кількість рядків.

Один куб, який є 1 x 1(3 плитки ромбі), представлений точно так:

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

Отже, якщо вхід / розміри є 3 x 2, це повинен бути вихід:

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

Як бачите, є 3 ряди (висота) та 2 стовпчики (ширина). Стовпці обмінюються вгору та вниз. Ваша програма повинна зробити це теж і почати вище. Наприклад, 3 x 3буде:

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

Правила

  • Результат повинен бути виведений, вхід може бути зроблений будь-яким способом, який вам подобається, але повинен відповідати висоті та ширині
  • Доступні нові рядки дозволені
  • Колонки тесселяції завжди починаються зверху, потім чергуються вгору і вниз
  • Сторони tessellations повинні бути спільними, а tessellations повинні бути правильно розміщені між іншими стовпцями без пропусків
  • Ваше подання може бути функцією або повноцінною програмою
  • Ваша програма повинна надрукувати точно вихід, поданий вище, з таким самим входом; Іншими словами, висновок повинен відповідати тому ж формату для кубів / tessellations

Припущення

  • Ви можете припустити, що вхід завжди буде більшим за 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
Я відредагував питання, щоб включити приклад для 3x3.
Ендрю Лі

Звичайно, все-таки чудова відповідь!
Ендрю Лі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.