Esculpir algumas jóias ASCII!

25

O dia 13 de março é reconhecido como o Dia Nacional da Jóia , que é o tema deste desafio. Assim, dado um inteiro nque né maior que 0, criar uma jóia ASCII. Por exemplo:

n = 1          n = 2             n = 3
                                       ______
                     ____             /      \
 __                 /    \            \      /
/  \                \    /             \    /
\  /                 \  /               \  /
 \/                   \/                 \/

O fundo é definido como o fundo da jóia até o par mais alto de \/. O resto é o topo. Para o exemplo acima, onde n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Como você pode ver, o fundo é feito de n + 1camadas de \/com (1 * lines from the bottom) * 2espaços entre com um máximo de nlinhas a partir da parte inferior da jóia. Se pegarmos a segunda jóia ( n = 2), podemos ver que:

 ____
/    \      
\    /  2 (or n) layers from the bottom with 1*2*2 or 4 spaces in between \/
 \  /   1 layer from the bottom with 1*1*2 or 2 spaces in between \/
  \/    The bottom (0 layers) with 1*0*2 spaces or 0 spaces in between \/

A parte superior é feita de um par de /\com n*2espaços entre com n*2sublinhados na parte superior.

Regras

  • Deve ser capaz de receber números inteiros positivos diferentes de zero como entrada do usuário
  • É necessário criar uma jóia com as especificações definidas acima (atualizadas aqui):
    • A parte superior é feita de um par de /\com n*2espaços entre com n*2sublinhados na parte superior.
    • A parte inferior é feito de n + 1camadas de \/com (1 * lines from the bottom) * 2espaços entre com um máximo de nlinhas a partir da parte inferior da jóia.
  • Linhas novas à direita após a jóia ou espaços à direita em cada linha são permitidos.
  • Não são permitidas brechas padrão

Critérios Vencedores

Menos bytes ganham!

Anthony Pham
fonte
4
A rigor, "positivo diferente de zero" é redundante - se você quiser incluir 0, precisará dizer "não negativo".
Fund Monica's Lawsuit
A resposta pode estar no PETSCII?
Shaun Bebbers 27/03
3
À medida que o número aumenta, as "jóias" começam a parecer menos jóias e mais fatias de pizza, ou talvez seja apenas a hora do almoço falando.
Marijn Stevering

Respostas:

27

Carvão , 17 bytes

Código:

NβG←β_↙↙¹→↘⁺β¹‖M→

Explicação:

Nβ                      # Place the input into β
   G←β_                 # Draw a line of length β with _ as the filling character
        ↙                # Move the cursor one down and one left
         ↙¹              # Draw a line from the cursor position to one position ↙
           →             # Move the cursor 1 to the right
             ⁺β¹         # Add one to the input and..
            ↘            # Create a line pointing ↘, with the size calculated above
                ‖M→     # Mirror to the right

É um comando muito elegante‖M , que também se reflete automaticamente /no \.

Usa a codificação de carvão vegetal .

Experimente online!

Adnan
fonte
Esse comando de espelho é muito legal! Também espelha colchetes e outros caracteres? E existe uma maneira de substituir esse comportamento?
DJMcMayhem
2
@DJMcMayhem Yes and yes :)
Adnan
27
Lol, você fez diamantes com carvão!
SteeveDroz 27/03
8

05AB1E , 27 20 bytes

ƒN·ð×…\ÿ/}¹·'_×)R.c

Experimente online!

Explicação

ƒ                      # for N in range[0 ... n]
 N·ð×                  # push N*2 spaces
     …\ÿ/              # push the string "\ÿ/" with "ÿ" replaced by the spaces 
         }             # end loop
          Â            # push a reversed copy of the top of the stack 
                       # (the largest row of the bottom of the diamond)
           ¹·'_×       # push input*2 underscores
                )      # wrap the stack in a list
                 R     # reverse the list
                  .c   # join the list on newlines, padding each row to equal length
Emigna
fonte
Haha, legal! Eu acredito que você pode mudar D„/\„\/‡para Â.
Adnan
@Adnan: Sim, eu acabei de perceber que, enquanto trabalhava em uma melhoria: P
Emigna
8

Python 2, 101 98 95 bytes

lambda n:'\n'.join([' '+'__'*n,'/'+'  '*n+'\\']+[' '*i+'\\'+'  '*(n-i)+'/'for i in range(n+1)])

Experimente Online!

Função anônima que recebe um número inteiro positivo e retorna uma string

Python 3.6, 92 bytes (Agradecimentos a Ben Frankel)

lambda n:f' {"__"*n}\n/{"  "*n}\\\n'+'\n'.join(' '*i+'\\'+'  '*(n-i)+'/'for i in range(n+1))

Não consegui encontrar um intérprete on-line para esta versão, mas é um pouco menor devido às seqüências de caracteres f na v3.6

viciado em matemática
fonte
Você pode salvar três bytes em Python 3.6: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Aproveitando as strings f.
Ben Frankel
Tenho a certeza repl.it tem um conjunto de testes para Python 3
Anthony Pham
@AnthonyPham repl.it e TryItOnline tanto para uso Python 3.5, eu verifiquei
matemática viciado em
Whoa, finalmente! Gostaria de saber o que levou Python tanto tempo. Toda linguagem merece interpolação de strings ...
Felix Dombek 28/03
7

PHP, 123 bytes

echo($s=str_pad)(" ",$z=1+2*$a=$argv[1],_).$s("\n/",$z+1," ")."\\\n";for($i=0;$i<=$a;)echo$s($s("",$i)."\\",$z-$i++)."/\n";

Primeira versão de 143 bytes

for(;$i<3+$a=$argv[1];$i++)echo 1-$i?str_pad("",$i?$i-2:1):"/",str_pad($i>1?"\\":"",$i<2?2*$a:2*($a-$i+2)+1,$i?" ":_),$i<2?$i?"\\":"":"/","\n";

Experimente aqui!

Jörg Hülsermann
fonte
Onde posso tentar isso?
Anthony Pham 26/03
@AnthonyPham Here .
Adnan
Você pode criar 119 bytes: ideone.com/RPCVZe
Tschallacka
@Tschallacka se eu assumir que eu uso apenas uma Sytem Linux
Jörg Hülsermann
Bem, contanto que você não edite com o notepad.exe, a maioria dos editores tem finais de linha linux ... i.imgur.com/QZsmf4r.png o console do Windows exibirá felizmente \ n como uma nova linha real. Então sim, você pode raspar alguns bytes da sua resposta.
Tschallacka
6

V , 28 27 26 bytes

1 bytes salvos graças a @DJMcMayhem usando em >vez deÉ

Ài__<esc>É ÙÒ r/Á\Ùr\$r/òÙlxx>

<esc> é 0x1b

Experimente online!

Hexdump:

00000000: c069 5f5f 1bc9 20d9 d220 722f c15c d972  .i__.. .. r/.\.r
00000010: 5c24 722f f2d9 6c78 783e                 \$r/..lxx>

Explicação

Topo:

Ài__<esc>              " Write argument times __
É<space>               " Prepend a space to the line
Ù                      " Duplicate line below cursor, cursor also moves down
Ò<space>               " Replace every character with a space
r/                     " Change the first character in the line to a /
Á\                     " Append a \ to the end of the line

Inferior:

Ù                      " Duplicate
r\                     " Change the first character in the line to a \
$r/                    " Replace the last character with a /
ò                      " Until a breaking error occurs do:
  Ù                    "  Duplicate
  lxx                  "  Remove 2 middle characters (spaces)
  >                    "  Indent by one space (implicit ending >)
                       " Implicit ending ò
Kritixi Lithos
fonte
Boa resposta! Você pode mudar É<space>para >que, no final de uma macro é implicitamente preenchidos para>>
DJMcMayhem
@DJMcMayhem Nice sugestão! Então, >recua um espaço em vez de uma guia?
Kritixi Lithos 26/03
Sim! Isso é porque eu tenho set expandtabeset shiftwidth=1
DJMcMayhem
5

Röda , 71 bytes

f n{a=" ";[a,"__"*n,"
/",a*2*n,`\
`];seq n,0|[a*(n-_),`\`,a*2*_1,"/
"]}

Experimente online!

fergusq
fonte
5

JavaScript (ES6), 80 bytes

f=
n=>` ${"_".repeat(n*2)}
/${s=" ".repeat(n)}${s}\\`+s.replace(/|/g,"\n$`\\$'$'/")
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Neil
fonte
3

Python 3, 107 105 bytes

n,s=int(input())," "
print(s+n*"__","/"+n*2*s+"\\",*[i*s+"\\"+2*(n-i)*s+"/"for i in range(n+1)],sep="\n")

Toma um int de Stdin

KarlKastor
fonte
3

MATL , 34 bytes

QE:qgOO(t~E3O(GQXy3*tPgEhv'_/\ 'w)

Experimente no MATL Online!

Explicação

QE:qg   % Create array [0 1 1 ... 1 1] of size2*(n+1)
OO(     % Turns last 1 into a 0: [0 1 1 ... 1 0]
t~      % Duplicate and negate: [1 0 0 ... 0 1]
E3O(    % Multiply by 2, turn last 2 into 3: [2 0 0 ... 0 3]
GQXy    % Push identity matrix of size n+1
3*      % Multiply by 3
tPgE    % Duplicate, flip, turn 3 into 2
h       % Concatenate the two matrices horizontally
v       % Concatenate all arrays vertically into a matrix
'_/\ '  % Push this string
w)      % Index (modular, 1-based) with the matrix into the string. Implicitly display
Luis Mendo
fonte
3

PowerShell , 76 , 74 bytes

param($n)" "+'_'*2*$n;"/$(' '*$n*2)\";$n..0|%{' '*($n-$_)+"\$(' '*$_*2)/"}

Nota: o exemplo online contém um pouco de quebra como demonstração. Coloque em uma função ou script PoSH para executar.

Experimente online!

Herbert Origas
fonte
Bem-vindo ao PPCG! Ótima primeira resposta e bom ver outro PowerSheller por perto! Você pode salvar alguns bytes usando uma variável de incremento no loop - em ' '*$i++vez de ' '*($n-$_).
AdmBorkBork 27/03
3

C, 131 bytes

i;f(n){for(printf(" ",i=0);i++<n*2;)printf("_");for(printf("\n/%*c\n",n*2+1,92,i=0);i++<n+1;)printf("%*c%*c\n",i,92,(n-i)*2+3,47);}

Experimente online!

Steadybox
fonte
Onde posso testar isso?
Anthony Pham 26/03
@AnthonyPham Tio link adicionado.
Steadybox 26/03
Boa abordagem usando a largura do printf para preencher os espaços. Você pode salvar mais 9 bytes se criar uma macro para o printf, remover o primeiro i = 0 e adicionar uma nova variável j em vez de reinicializar i para 0 na segunda execução:i,j;f(n){for(p(" ");i++<n*2;p("_"));for(p("\n/%*c\n",n*2+1,92);j++<n+1;p("%*c%*c\n",j,92,(n-j)*2+3,47));}
Claudiu
@ Claudiu Obrigado, mas a função produziria saída correta somente quando for chamada pela primeira vez, e o IIRC é contra as regras aqui. A função deve funcionar, não importa quantas vezes seja chamada.
Steadybox
@ Steadybox oh eu vejo, desculpe por isso. Isso se aplica a todas as perguntas do codegolf? Olhando apenas para esta pergunta específica, não parece que ele queira várias entradas.
Claudiu
2

Pyth, 44 Bytes

+" "*Q"__"++\/**2Qd\\jm+++*d\ \\**2-Qd\ \/hQ

tente!

explicação

O código consiste em 3 partes:

+" "*Q"__"               # pretty straightforward " "+input()*"__"
++\/**2Qd\\              # d is defined as " ":  "/"+2*input()*d+"\"
jm+++*d\ \\**2-Qd\ \/hQ  # The third part is a bit more complex so I'll explain it further:

jm                   hQ  # Map some lambda function onto range(input()+1) and join the result on newlines
  +++*d\ \\**2-Qd\ \/    # Here d is the lambda argument (so I can't use it for spaces -.-) 
  +++*d\ \\**2-Qd\ \/    # In Python: d*" "+"\\"+2*(Q-d)*" "+"/"
KarlKastor
fonte
2

Python3, 104 bytes

n=int(input());print(" "+"__"*n+"\n/"+"  "*n+"\\")
for i in range(n+1):print(" "*i+"\\"+"  "*(n-i)+"/")

O programa pega um número inteiro de STDIN e retorna a jóia para STDOUT.

Josh
fonte
2

Pip , 43 bytes

42 bytes de código, +1 para -nsinalizador.

Ps.'_Xa*2P"/\"JsXa*2sX_.'\.sXa-_X2.'/M,a+1

Recebe entrada como um argumento de linha de comando. Experimente online!

Explicação

Constrói as duas primeiras linhas separadamente e o restante da joia com uma operação de mapa:

Ps.'_Xa*2
      a*2  Cmdline arg, times 2
   '_X     That many underscore characters
 s.        Concatenated to a space character
P          Print (with newline)

P"/\"JsXa*2
        a*2  Cmdline arg, times 2
      sX     That many space characters
 "/\"J       Join the string "/\" with the above as the separator
P            Print (with newline)

sX_.'\.sXa-_X2.'/M,a+1
                  ,a+1  Numbers from 0 up to and including a
                 M      Map the following lambda function:
sX_                      Space, repeated (fn arg) times
   .'\                   Concatenate \
      .                  Concatenate:
       sXa-_              Space, repeated (a - (fn arg)) times
            X2            repeated twice
              .'/        Concatenate /
                         Print result list, newline separated (implicit, -n flag)

Outra solução

Também 42 + 1 bytes, desta vez com o -lsinalizador:

Ys.tAL'_.sX2+,a.0(yALRVyRXD1-_)R0'\R1'/ZDs

TIO

DLosc
fonte
2

Pitão, 38 bytes

j[*yQ\_j*yQpd"/\\"jm+*\ dj*\ y-Qd"\/"h
Steven H.
fonte
2

C, 115 bytes

#define p printf(
i;j;f(n){for(p" ");i++<n;p"__"));for(p"\n/%*c",2*n+1,92);j<=n;p"\n%*c%*c",++j,92,n*2-j*2+3,47));}

Experimente online!

C, 123 bytes

Embora o desafio não exija isso, às custas de 8 bytes, a função pode ser reutilizada (a primeira solução economiza 8 bytes, contando com a inicialização implícita de variáveis ​​globais).

#define p printf(
i;f(n){for(i=0,p" ");i++<n;p"__"));for(i=0,p"\n/%*c\n",2*n+1,92);i<=n;p"%*c%*c\n",++i,92,n*2-i*2+3,47));}

Experimente online!

Itay Grudev
fonte
2

Lote, 152 bytes

@set s=
@for /l %%i in (1,1,%1)do @call set s=  %%s%%
@echo  %s: =_%
@echo /%s%\
@set s=\%s%/
:l
@echo %s%
@if %s:~-2%==/ set s=%s:\  = \%&goto l

Testes:

n = 1
 __
/  \
\  /
 \/

n = 2
 ____
/    \
\    /
 \  /
  \/

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/
Neil
fonte
Vou precisar de um conjunto de testes para testar isso.
Anthony Pham 27/03
2

C #, 187 bytes

Tenho certeza de que existe uma solução mais compacta, mas esta é minha primeira tentativa:

var a=" "+new string('_',2*n)+"\n/"+new string(' ',2*n)+"\\\n";for(int i=n;i>0;i--){a+=new string(' ',n-i)+"\\"+new string(' ',2*i)+"/\n";}a+=new string(' ',n)+"\\/";Console.Write(a);

Experimente online ..

James Robertson
fonte
Vou precisar de um conjunto de testes para testar isso.
Anthony Pham
1

JavaScript (ES6), 93 bytes

n=>(` 0
/2\\`+`
1\\4/`.repeat(k=++n)).replace(/\d/g,c=>' _'[+!+c].repeat(c&1?k-n-2:+c+--n*2))

Demo

Arnauld
fonte
1

dc , 121 bytes

?d1+sa2*sb32P[0sq[lvPlq1+dsqlj>h]shlj0<h]srlbsj95svlrx2607Plbsj32svlrx[\]p0sd[ldsjlrx92Plbsjlrxlb2-sb[/]pld1+dsdla>k]dskx

Experimente online!

R. Kap
fonte
1

Perl 5 109 94 + 1 (para sinalizador -p) = 95 bytes

Experimente Online!

$l=$_*2;$s=" "."_"x$l."\n/"." "x$l."\\\n";$s.=" "x$_."\\"." "x($l-$_*2)."/\n"for 0..$_;print$s

Pode ser executado assim:

perl -p <name of file> <<< n

Ungolfed

$l=$_*2;
$s=" "."_"x$l."\n/"." "x$l."\\\n";
$s.=" "x$_."\\"." "x($l-$_*2)."/\n"for 0..$_;
print$s

Explicação

#Sets $l to twice the value of the input 'n'
$l=$_*2;  

#Top 2 rows of jewel adding $l underscores then newline  
#followed by '/' and $l spaces.  The '\\\n' is an escaped '\' and a newline
$s=" "."_"x$l."\n/"." "x$l."\\\n";

#The meat of the jewel generation.  It contains a for-loop
#that iterates from 0 to $_ (the input value 'n')
#The loop uses its iterator value ($_ (which overrides the outer $_))
#to determine how many leading spaces it needs to apply.
#Then it adds a '\' with '\\' followed by $l-$_*2 number of spaces
#(the inside of the jewel).  Again, while under the umbrella of the for-loop,
#the $_ refers to the iterator value of the for-loop.
#After the inner spaces, it goes on to add in the '/' and a new line
$s.=" "x$_."\\"." "x($l-$_*2)."/\n"for 0..$_;

#Lastly, it prints the compiled Scalar value $s.  (In Perl, Strings are Scalar values or references
print$s
CraigR8806
fonte
Vou precisar de um conjunto de testes para testar isso como nem todo mundo bastante entende ou tem a capacidade de executar essa a maneira que você têm afirmado
Anthony Pham
@AnthonyPham Adicionei o link Try It Online #
CraigR8806