Нарисуйте этот ромбовидный узор


24

Приведенная ниже схема станет основой этой проблемы.

     /\
     \/
     /\
    /  \
   /    \
/\/      \/\
\/\      /\/
   \    /
    \  /
     \/
     /\
     \/

При заданной ширине и высоте ввода каждый из них >=1выводит вышеупомянутый художественный шаблон ASCII, повторяемый столько раз, соединяясь (и перекрывая друг друга) с небольшими бриллиантами.

Например, здесь ввод с width = 2и height = 1:

     /\        /\
     \/        \/
     /\        /\
    /  \      /  \
   /    \    /    \
/\/      \/\/      \/\
\/\      /\/\      /\/
   \    /    \    /
    \  /      \  /
     \/        \/
     /\        /\
     \/        \/

Вот вход width = 3и height = 2:

     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/

Правила и ввод / вывод

  • Вход и выход могут быть заданы любым удобным способом .
  • Вы можете распечатать его в STDOUT или вернуть как результат функции.
  • Либо полная программа или функция приемлемы.
  • Любое количество посторонних пробелов является приемлемым, при условии, что символы выстраиваются соответствующим образом.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Ответы:


10

Холст , 26 25 24 21 18 байт

4/╬/╬⁰r:⤢n↷⁸{A×├m↷

Попробуй это здесь!

-3 байта за счет исправления неповторяющегося холста

Объяснение:

4/╬                 quad-palindromize a 4-long diagonal - big inner diamond
   /╬               quad-palindromize "/" - small diamond
     ⁰r             join the two vertically, centered
       :⤢n          overlap with transpose
           ↷        and rotate the thing clockwise
            ⁸{      for each input
              A×      times 10
                ├     plus 2
                 m    mold the canvas to that width
                  ↷   and rotate clockwise, setting up for the next iteration

Wow O_o холст слишком короткий
только для ASCII

6

JavaScript (ES8), 167 161 159 байт

NB: это кодирование шаблона. Смотрите мой другой ответ для более короткого математического подхода.

Принимает вход как (width)(height).

w=>h=>(g=h=>h?g(--h)+`
`+([4106,4016,31305,21504,17010]['0102344320'[h%=10]]+'').replace(/./g,c=>'\\/'[c^h>5]||''.padEnd(c-1)).repeat(w+1).slice(8):'')(h*10+2)

Попробуйте онлайн!

Как?

Мы кодируем верхнюю половину шаблона цифрами:

  • 0 означает\
  • 1 означает/
  • n=2 до означает n - 1 пробел7n1

Это дает:

0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
1  ···\/·····  -->  [3 spaces] [\] [/] [5 spaces]             -->  4016
0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
2  ··/··\····  -->  [2 spaces] [/] [2 spaces] [\] [4 spaces]  -->  31305
3  ·/····\···  -->  [1 space] [/] [4 spaces] [\] [3 spaces]   -->  21504
4  /······\/\  -->  [/] [6 spaces] [\] [/] [\]                -->  17010

Для нижней половины мы используем строки 4,3,2,0 с /и \перевернутые.


6

JavaScript (ES6), 139 байт

Это использует совершенно иной подход, чем мой первоначальный ответ, поэтому я публикую это отдельно.

Принимает вход как (width)(height).

w=>h=>(g=x=>y>8?` /\\
`[a=(x+y*9)%10,d=(x+y)%10,x?(y%10>3&&2*(a==8)|d==5)|(y%10<6&&2*(a==6)|d==7):3]+g(x--?x:--y&&w):'')(w=w*10+2,y=-~h*10)

Попробуйте онлайн!

Как?

Учитывая ширину w и высоту h , мы рисуем вывод за символом по сетке, которая:

  • 10w+3 символов ширина
  • 10h+2 символа

x10w+20y10h+109

w=3h=2

(32,30)(31,30)(0,30)(32,29)(31,29)(0,29)(32,9)(31,9)(0,9)

x=0

Для всех остальных ячеек мы вычисляем:

  • a=(xy)mod10
  • d=(x+y)mod10

Мы рисуем, "/"если:

((ymod10)>3 and d=5) or ((ymod10)<6 and d=7)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ...../........./........./......
 19 |    9   | ....../........./........./.....
 18 |    8   | ...../........./........./......
 17 |    7   | ..../........./........./.......
 16 |    6   | .../........./........./........
 15 |    5   | /./......././......././......./.
 14 |    4   | ./......././......././......././
 13 |    3   | ......../........./........./...
 12 |    2   | ......./........./........./....
 11 |    1   | ....../........./........./.....
 10 |    0   | ...../........./........./......
  9 |    9   | ....../........./........./.....

Мы рисуем, "\"если:

((ymod10)>3 and a=8) or ((ymod10)<6 and a=6)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ......\.........\.........\.....
 19 |    9   | .....\.........\.........\......
 18 |    8   | ......\.........\.........\.....
 17 |    7   | .......\.........\.........\....
 16 |    6   | ........\.........\.........\...
 15 |    5   | .\.......\.\.......\.\.......\.\
 14 |    4   | \.\.......\.\.......\.\.......\.
 13 |    3   | ...\.........\.........\........
 12 |    2   | ....\.........\.........\.......
 11 |    1   | .....\.........\.........\......
 10 |    0   | ......\.........\.........\.....
  9 |    9   | .....\.........\.........\......

Или мы рисуем пробел, если не выполняется ни одно из этих условий.


Это действительно круто.
AdmBorkBork


@Arnauld Я знал, что это был твой ответ, просто посмотрев на код: D
flawr

6

C ++ (gcc) , 137 байт

#include<cstdio>
auto p(int x,int y){int n=10,t=x=++x*n;for(++y*=n;y>8;)t>7?putchar(t<9?y--,n:t%n-y%n+4&7?t%n+y%n-5&7?32:47:92),t--:t=x;}

Попробуйте онлайн!

объяснение

_______________________________
   098765432109876.... 
   9    \/    .     factor =y%10 - x10
   8    /\    .     if factor = -4 || 4. Print --> '\'  47
   7   /  \   . 
   6  /    \  .     factor =x%10+y%10;  
   5\/      \/*-.   if factor = 5 || 13 --> /  92
   4/\      /\   `.
   3  \    /       `->  * is 9,5 => \
   2   \  /      
   1    \/   
   0    /\       
   9

1
Неверная, не полная программа и не функция
только ASCII

1
Но 10/10 очень хороший метод
только ASCII

1
Какие именно ответы не являются полными программами или функциями? (просто спрашиваю, возможно, пропустил это) Обратите внимание, что некоторым языкам (например, языкам сценариев) не требуется шаблон для полных программ
только ASCII


1
159 , но не уверен, что вывод из функции действителен (вероятно, так и есть)
только ASCII

4

Haskell , 179 байт

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$["\\/\\      /","   \\    / ","    \\  /  ","     \\/   ","     /\\   "]

Попробуйте онлайн!


Haskell , 181 байт

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$map t[49200,36058,31630,30010,29038]
t 0=""
t n="\\ /"!!mod n 3:t(div n 3)

Попробуйте онлайн!


1
Использование reverse.map(map k)<>idover (++).reverse=<<map(map k)экономит 3 байта в обоих решениях.
ბიმო

1
Ах, а во 2-ом map tможно стать t<$>и take$10*x+2сохранить еще один байт, и, наконец, вы можете использовать cycle"\\ /"!!nболее "\\ /"!!mod n 3- теперь второй короче :) Попробуйте онлайн!
18:00

3

Древесный уголь , 24 22 20 байт

\/↘²‖M↘LF⊖NCχ⁰F⊖NC⁰χ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

´\/↘²

Нарисуйте одну восьмую оригинального рисунка.

‖M↘L

Дублируйте его три раза, чтобы завершить исходный шаблон.

F⊖NCχ⁰

Скопируйте необходимое количество раз по горизонтали.

F⊖NC⁰χ

Скопируйте необходимое количество раз по вертикали.


3

Powershell, 146 байт

param($w,$h)0..9*$h+0,1|%{$y=$_
-join(0..9*$w+0,1|%{('3  /\33  \/33  /\33 /  \3  /3 \ /\/33\\/\33/3\3 /3  \  /33 \/3'-replace3,'   ')[$y*10+$_]})}

объяснение

Шаблон массива 10х10 символов:

     /\   
     \/   
     /\   
    /  \  
   /    \ 
/\/      \
\/\      /
   \    / 
    \  /  
     \/   

Сценарий:

  • повторяет шаблон;
  • добавляет столбцы [0,1] в конец каждой строки;
  • добавляет строки [0,1] в конец вывода.

Две вещи для гольфа:

  1. Массив шаблонов отображается в строку длиной 100 байт;
  2. Строка сводится к простому replace.


1

PHP, 159 байт

узор взят из маззи; переведено в 1-2-3, преобразовано в base26 -> декодировано программой

while($y<$argv[2]*10+2)echo str_pad("",$argv[1]*10+2,strtr(base_convert([jng1,jnnb,jng1,jofn,k333,"1h4p5",23814,k94d,k02h,jnnb][$y++%10],26,4),312,"\ /")),"
";

требует PHP 5.5 или выше. Запустите -nrили попробуйте онлайн .

расчет может быть короче (как это было для Арно). Я могу посмотреть на это.



1

Python 3 , 194 192 187 127 байтов

Решение @ ASCII-only:

lambda w,h,n=10:"\n".join("".join([" /","\\"][(j%n-i%n)%8==4][(j%n+i%n)%8==5]for i in range(-1,w*n+1))for j in range(-1,h*n+1))

Попробуйте онлайн!


Оригинальное решение

n="\n"
def f(w,h):a=[r"     /\   "*w,r"     \/   "*w,r"    \  /  "*w,r"   \    / "*w,r"\/\      /"*w+r"\/"];return a[0]+n+n.join(([i.translate({47:92,92:47})for i in a]+a[::-1])*h)+n+a[1]

Попробуйте онлайн!

-2 байта благодаря @Black Owl Kai, показывающему, что вершины и впадины могут быть доступны из сгенерированного массива, а не в отдельных переменных.

-5 больше байтов благодаря @Black Owl Kai, который использует более креативный способ хранения бриллиантов

Создает эту часть каждого алмаза:

     /\
     \/
    \  /
   \    /
\/\      /\/

/\Добавляется в конце каждой строки , чтобы завершить его. Затем /s и \s меняются местами для формирования вершины каждого ромба, и порядок линий меняется на обратный, чтобы сформировать нижнюю половину. Наконец, он добавляет самый верхний ряд /\s и самый нижний ряд \/s, чтобы завершить изображение.


192 байта , не используя переменные b и c
Black Owl Кай

187 байт , удалив два +=/ *=назначения и перевернув весь бриллиант вверх ногами, упрощая хранение последней строки
Black Owl Кай


147 , использует решение c ++
только для ASCII

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