Desenhe este padrão de diamante

24

O padrão abaixo formará a base desse desafio.

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

Dada uma largura e altura de entrada, cada uma >=1produz o padrão de arte ASCII acima repetido várias vezes, unindo (e sobrepondo) os pequenos diamantes.

Por exemplo, aqui está uma entrada com width = 2e height = 1:

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

Aqui está uma entrada width = 3e height = 2:

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

Regras e E / S

  • A entrada e a saída podem ser fornecidas por qualquer método conveniente .
  • Você pode imprimi-lo em STDOUT ou retorná-lo como resultado de uma função.
  • Um programa completo ou uma função são aceitáveis.
  • Qualquer quantidade de espaço em branco estranho é aceitável, desde que os caracteres sejam alinhados adequadamente.
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
AdmBorkBork
fonte
11
Relacionado livremente
Luis Mendo

Respostas:

10

Tela , 26 25 24 21 18 bytes

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

Experimente aqui!

-3 bytes corrigindo a tela não repetida

Explicação:

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
dzaima
fonte
wow O_o canvas é muito curto
somente ASCII
6

JavaScript (ES8), 167 161 159 bytes

NB: Isso está codificando o padrão. Veja minha outra resposta para uma abordagem matemática mais curta.

Toma entrada como (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)

Experimente online!

Quão?

Codificamos a metade superior do padrão com dígitos:

  • 0 significa\
  • 1 significa/
  • n=2 a significa n - 1 espaços7n1

Isto dá:

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

Para a metade inferior, usamos as linhas 4,3,2,0 com /e \invertidas.

Arnauld
fonte
6

JavaScript (ES6), 139 bytes

Isso está usando uma abordagem bem diferente da minha resposta inicial, por isso estou postando isso separadamente.

Toma entrada como (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)

Experimente online!

Quão?

Dada a largura w e a altura h , desenhamos o caractere de saída por caractere sobre uma grade que é:

  • 10w+3 caracteres de largura
  • 10h+2 caracteres de altura

x10W+20 0y10h+109

W=3h=2

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

x=0 0

Para todas as outras células, calculamos:

  • uma=(x-y)mod10
  • d=(x+y)mod10

Desenhamos um "/"if:

((ymod10)>3 e d=5) ou ((ymod10)<6 e 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   | ....../........./........./.....

Desenhamos um "\"if:

((ymod10)>3 e uma=8) ou ((ymod10)<6 e uma=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   | .....\.........\.........\......

Ou desenhamos um espaço se nenhuma dessas condições for cumprida.

Arnauld
fonte
Isso é muito legal.
AdmBorkBork
@Arnauld Eu sabia que esta era sua resposta, apenas olhando para o código: D
flawr
6

C ++ (gcc) , 137 bytes

#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;}

Experimente online!

Explicação

_______________________________
   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
AZTECCO
fonte
11
Inválido, nem um programa completo nem uma função
somente ASCII
11
10/10, um método muito bom
somente ASCII
11
Quais respostas exatamente não são programas ou funções completos? (apenas perguntando, pode ter perdido) Observe que algumas linguagens (por exemplo, linguagens de script) não precisam de clichê para programas completos
somente ASCII
11
159 , mas não tenho certeza se a saída de uma função é válida (provavelmente é)
somente ASCII
4

Haskell , 179 bytes

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)$["\\/\\      /","   \\    / ","    \\  /  ","     \\/   ","     /\\   "]

Experimente online!


Haskell , 181 bytes

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)

Experimente online!

ovs
fonte
11
Usar reverse.map(map k)<>idover (++).reverse=<<map(map k)economiza 3 bytes nas duas soluções.
ბიმო
11
Ah, e no 2º map tpode-se tornar t<$>e take$10*x+2salvar outro byte também e, finalmente, você pode usar cycle"\\ /"!!nmais "\\ /"!!mod n 3- agora o segundo é mais curto :) Experimente online!
ბიმო
3

Carvão , 24 22 20 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

´\/↘²

Desenhe um oitavo do padrão original.

‖M↘L

Duplique três vezes para concluir o padrão original.

F⊖NCχ⁰

Copie o número de vezes necessário horizontalmente.

F⊖NC⁰χ

Copie o número de vezes necessário verticalmente.

Neil
fonte
3

Powershell, 146 bytes

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+$_]})}

Explicação

O padrão é 10x10 caracteres:

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

O script:

  • repete o padrão;
  • anexa colunas [0,1] ao final de cada linha;
  • acrescenta linhas [0,1] ao final da saída.

Duas coisas para o golfe:

  1. A matriz padrão mapeada para uma string com comprimento de 100 bytes;
  2. A cadeia reduzida por simples replace.
confuso
fonte
2

Perl 5 -p , 148 bytes

$_='3A3'x$_.$/.'3B3
3A3
2/2\\2
1/4\\1
A6A
B6B
1\\4/1
2\\2/2
3B3
3A3
'=~s/^.*$/$&x$_/mger x<>.'3B3'x$_;s|A+|/\\|g;s|B+|\\/|g;s/\d/$"x$&/ge;s|^ |  |gm

Experimente online!

Xcali
fonte
1

PHP, 159 bytes

padrão retirado de mazzy; traduzido para 1-2-3, convertido em base26 -> decodificado pelo programa

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,"\ /")),"
";

requer PHP 5.5 ou posterior. Corra com -nrou experimente online .

o cálculo pode ser mais curto (como foi para Arnauld). Eu posso olhar para isso.

Titus
fonte
1

Kotlin , 196 135 bytes

Economizou 61 bytes graças à sugestão do ASCII-only de usar o algoritmo C ++ do AZTECCO.

{h,w->var r=""
for(l in 9..h*10+10){for(c in 9..w*10+10){r+=when{(l%10+c%10)%8==5->'/'
(l%10-c%10+8)%8==4->'\\'
else->' '}}
r+='\n'}
r}

Experimente online!

JohnWells
fonte
11
136 , roubando a nova resposta C ++
somente ASCII
1

Python 3 , 194 192 187 127 bytes

@ Solução apenas ASCII:

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))

Experimente online!


Solução original

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]

Experimente online!

-2 bytes graças ao @Black Owl Kai, mostrando que as partes superior e inferior podem ser acessadas a partir da matriz gerada, e não em variáveis ​​separadas.

-5 mais bytes graças a @Black Owl Kai usando uma maneira mais criativa de armazenar os diamantes

Gera esta parte de cada diamante:

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

Um /\adicionado no final de cada linha para completá-lo. Em seguida, os /s e \s são trocados de modo a formar a parte superior de cada diamante, e a ordem das linhas é invertido para formar a metade inferior. Por fim, ele adiciona a linha superior de /\s e a linha inferior de \/s para completar a imagem.

Neil A.
fonte
192 bytes por não usar as variáveis ​​bec
Black Owl Kai
187 bytes removendo duas atribuições +=/ *=e invertendo todo o diamante de cabeça para baixo, facilitando o armazenamento da última corda
Black Owl Kai
181
somente ASCII
147 , usa solução c ++
somente ASCII
127
somente ASCII