¡Talla algunas joyas ASCII!

25

El 13 de marzo es reconocido como el Día Nacional de la Joya , que es el tema de este desafío. Entonces, dado un número entero ndonde nes mayor que 0, crea una joya ASCII. Por ejemplo:

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

La parte inferior se define como la parte inferior de la joya al par más alto de \/. El resto es la cima. Para el ejemplo anterior donde n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Como se puede ver, la parte inferior está hecha de n + 1capas de \/con (1 * lines from the bottom) * 2espacios en el medio con un máximo de nlíneas de la parte inferior de la joya. Si tomamos la segunda joya ( 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 \/

La parte superior está hecha de un par de /\con n*2espacios entre con n*2guiones en la parte superior.

Reglas

  • Debe ser capaz de tomar cualquier número entero positivo distinto de cero como entrada del usuario
  • Debe crear una joya con las especificaciones definidas anteriormente (actualizadas aquí):
    • La parte superior está hecha de un par de /\con n*2espacios entre con n*2guiones en la parte superior.
    • La parte inferior está hecha de n + 1capas de \/con (1 * lines from the bottom) * 2espacios entre con un máximo de nlíneas de la parte inferior de la joya.
  • Se permiten líneas nuevas después de la joya o espacios finales en cada línea.
  • No se permiten lagunas estándar

Criterios ganadores

¡Menos bytes gana!

Anthony Pham
fuente
44
Estrictamente hablando, "positivo distinto de cero" es redundante: si desea incluir 0, debe decir "no negativo".
Financia la demanda de Mónica el
¿Puede la respuesta estar en PETSCII?
Shaun Bebbers
3
A medida que el número aumenta, las "joyas" comienzan a parecerse menos a las joyas y más a las rebanadas de pizza, o tal vez sea solo la hora del almuerzo para hablar.
Marijn Stevering

Respuestas:

27

Carbón de leña , 17 bytes

Código:

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

Explicación:

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

Un muy ordenado comando es ‖M, que refleja también automáticamente /en \.

Utiliza la codificación de carbón .

Pruébalo en línea!

Adnan
fuente
¡Ese comando espejo es realmente genial! ¿Refleja los corchetes y otros caracteres también? ¿Y hay alguna forma de anular ese comportamiento?
DJMcMayhem
2
@DJMcMayhem y :)
Adnan
27
Lol, ¡hiciste diamantes de carbón!
SteeveDroz
8

05AB1E , 27 20 bytes

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

Pruébalo en línea!

Explicación

ƒ                      # 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
fuente
¡Jaja bueno! Creo que puedes cambiar D„/\„\/‡a Â.
Adnan
@Adnan: Sí, me di cuenta de eso mientras trabajaba en una mejora: P
Emigna
8

Python 2, 101 98 95 bytes

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

Pruébalo en línea!

Función anónima que toma un entero positivo y devuelve una cadena

Python 3.6, 92 bytes (Gracias a Ben Frankel)

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

No pude encontrar un intérprete en línea para esta versión, pero es un poco más corto debido a las cadenas f en v3.6

adicto a las matemáticas
fuente
Puede guardar tres bytes en Python 3.6: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Aprovechando las cuerdas f.
Ben Frankel
Estoy bastante seguro de que repl.it tiene un conjunto de pruebas para Python 3
Anthony Pham
@AnthonyPham repl.it y TryItOnline tanto el uso de Python 3.5, he comprobado
drogadicto de matemáticas
Whoa, por fin! Me pregunto qué tomó Python tanto tiempo. Cada idioma merece interpolación de cadenas ...
Felix Dombek
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";

143 Bytes primera versión

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";

Pruébalo aquí!

Jörg Hülsermann
fuente
¿Dónde puedo probar esto?
Anthony Pham
@AnthonyPham Aquí .
Adnan
Puede hacerlo 119 bytes: ideone.com/RPCVZe
Tschallacka
@Tschallacka si asumo que uso solo un sistema Linux
Jörg Hülsermann
Bueno, siempre que no edite con notepad.exe, la mayoría de los editores tienen terminaciones de línea de Linux ... i.imgur.com/QZsmf4r.png La consola de Windows se mostrará felizmente como una nueva línea real. Así que sí, puedes reducir algunos bytes de tu respuesta.
Tschallacka
6

V , 28 27 26 bytes

1 bytes guardados gracias a @DJMcMayhem utilizando en >lugar deÉ

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

<esc> es 0x1b

Pruébalo en línea!

Hexdump:

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

Explicación

Parte superior:

À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

Fondo:

Ù                      " 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
fuente
¡Buena respuesta! Puede cambiar É<space>a >cuál al final de una macro se rellena implícitamente>>
DJMcMayhem
@DJMcMayhem ¡Buena sugerencia! Entonces, ¿las >sangrías un espacio en lugar de una pestaña?
Kritixi Lithos
¡Sí! Eso es porque tengo set expandtabyset shiftwidth=1
DJMcMayhem
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
fuente
3

Python 3, 107105 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 un int de Stdin

KarlKastor
fuente
3

MATL , 34 bytes

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

¡Pruébalo en MATL Online!

Explicación

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
fuente
3

PowerShell , 76 , 74 bytes

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

Nota: el ejemplo en línea contiene un poco de envoltura como demostración. Coloque en una función PoSH o script para ejecutar.

Pruébalo en línea!

Herbert Origas
fuente
Bienvenido a PPCG! ¡Bonita primera respuesta, y agradable ver otro PowerSheller alrededor! Puede guardar un par de bytes utilizando una variable incremental en el bucle, en ' '*$i++lugar de ' '*($n-$_).
AdmBorkBork
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);}

Pruébalo en línea!

Steadybox
fuente
¿Dónde puedo probar esto?
Anthony Pham
Enlace @AnthonyPham Tio agregado.
Steadybox
Enfoque agradable usando el ancho de printf para completar los espacios. Puede guardar 9 bytes más si crea una macro para printf, elimina el primer i = 0 y agrega una nueva variable j en lugar de reiniciar i a 0 en la segunda ejecución: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 Gracias, pero la función produciría la salida correcta solo cuando se llama por primera vez, y IIRC está en contra de las reglas aquí. La función debería funcionar sin importar cuántas veces se llame.
Steadybox
@ Steadybox oh ya veo, lo siento por eso. ¿Se aplica esto a todas las preguntas de codegolf? Mirando solo esta pregunta específica, no parece que quiera múltiples entradas.
Claudiu
2

Pyth, 44 bytes

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

¡intentalo!

explicación

El código consta de 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
fuente
2

Python3, 104 bytes

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

El programa toma un número entero de STDIN y devuelve la joya a STDOUT.

Josh
fuente
2

Pip , 43 bytes

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

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

Toma entrada como un argumento de línea de comando. Pruébalo en línea!

Explicación

Construye las dos primeras líneas por separado, luego el resto de la joya con una operación 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)

Otra solución

También 42 + 1 bytes, esta vez con la -lbandera:

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

TIO

DLosc
fuente
2

Pyth, 38 bytes

j[*yQ\_j*yQpd"/\\"jm+*\ dj*\ y-Qd"\/"h
Steven H.
fuente
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));}

Pruébalo en línea!

C, 123 bytes

Aunque el desafío no lo requiere, a expensas de 8 bytes, la función puede volverse reutilizable (la primera solución ahorra 8 bytes al confiar en la inicialización implícita de variables globales).

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

Pruébalo en línea!

Itay Grudev
fuente
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

Pruebas:

n = 1
 __
/  \
\  /
 \/

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

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/
Neil
fuente
Necesitaré un conjunto de pruebas para probar esto.
Anthony Pham
2

C #, 187 bytes

Estoy seguro de que hay una solución más compacta, pero este es mi primer intento:

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

Pruébalo en línea ...

James Robertson
fuente
Necesitaré un conjunto de pruebas para probar esto.
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))

Manifestación

Arnauld
fuente
1

cc , 121 bytes

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

Pruébalo en línea!

R. Kap
fuente
1

Perl 5109 94 + 1 (para bandera -p) = 95 Bytes

Pruébalo en línea!

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

Se puede ejecutar así:

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

Sin golf

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

Explicación

#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
fuente
Necesitaré un conjunto de pruebas para probar esto, ya que no todo el mundo entiende o tiene la capacidad de ejecutarlo de la manera que usted ha dicho
Anthony Pham el
@AnthonyPham Agregué el enlace Pruébalo en línea
CraigR8806