Scolpisci alcuni gioielli ASCII!


25

Il 13 marzo è riconosciuto come National Jewel Day , che è il tema di questa sfida. Quindi, dato un numero intero ndove nè maggiore di 0, crea un gioiello ASCII. Per esempio:

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

Il fondo è definito come il fondo del gioiello alla coppia più alta di \/. Il resto è il massimo. Per l'esempio sopra dove n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Come puoi vedere, il fondo è composto da n + 1strati \/con (1 * lines from the bottom) * 2spazi in mezzo con un massimo di nlinee dal fondo del gioiello. Se prendiamo il secondo gioiello ( n = 2), possiamo vedere che:

 ____
/    \      
\    /  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 superiore è costituita da una coppia di /\con n*2spazi tra con n*2sottolineatura in cima.

Regole

  • Deve essere in grado di accettare qualsiasi numero intero diverso da zero come input dell'utente
  • Devi creare un gioiello con le specifiche sopra definite (riformulato qui):
    • La parte superiore è costituita da una coppia di /\con n*2spazi tra con n*2sottolineatura in cima.
    • Il fondo è composto da n + 1strati \/con (1 * lines from the bottom) * 2spazi in mezzo con un massimo di nlinee dal fondo del gioiello.
  • Sono consentite le sequenze di coda nuove dopo il gioiello o gli spazi di coda su ciascuna riga.
  • Non sono ammesse scappatoie standard

Criteri vincenti

Vince il minimo byte!


4
A rigor di termini "non zero positivo" è ridondante: se si desidera includere 0, si dovrebbe dire "non negativo".
Fondi Monica's Lawsuit,

La risposta può essere in PETSCII?
Shaun Bebbers,

3
Man mano che il numero aumenta, i "gioielli" iniziano a sembrare meno come gioielli e più come fette di pizza, o forse è solo l'ora di pranzo a parlare.
Marijn Stevering,

Risposte:


27

Carbone , 17 byte

Codice:

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

Spiegazione:

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 comando molto accurato è ‖M, che si riflette anche automaticamente /in \.

Utilizza la codifica Charcoal .

Provalo online!


Quel comando mirror è davvero fantastico! Rispecchia anche le parentesi quadre e altri caratteri? E c'è un modo per ignorare quel comportamento?
DJMcMayhem

2
@DJMcMayhem e :)
Adnan,

27
Lol, hai fatto diamanti con carbone!
SteeveDroz,

8

05AB1E , 27 20 byte

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

Provalo online!

Spiegazione

ƒ                      # 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

Ahah carino! Credo che tu possa cambiare D„/\„\/‡in Â.
Adnan,

@Adnan: Sì, mi sono appena reso conto che mentre lavoravo su un miglioramento: P
Emigna,

8

Python 2, 101 98 95 byte

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

Provalo online!

Funzione anonima che accetta un numero intero positivo e restituisce una stringa

Python 3.6, 92 byte (grazie a Ben Frankel)

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

Non sono riuscito a trovare un interprete online per questa versione, ma è un po 'più corto a causa delle f-string nella v3.6


È possibile salvare i tre byte in Python 3.6: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Sfruttare le stringhe f.
Ben Frankel,

Sono abbastanza sicuro che repl.it abbia una suite di test per Python 3
Anthony Pham il

@AnthonyPham repl.it e TryItOnline usano entrambi Python 3.5, ho controllato
drogato di matematica

Whoa, finalmente! Mi chiedo che cosa abbia impiegato Python a lungo. Ogni lingua merita interpolazione di stringhe ...
Felix Dombek,

7

PHP, 123 byte

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 byte prima versione

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

Provalo qui!


Dove posso provarlo?
Anthony Pham,

@AnthonyPham Qui .
Adnan,

Si può rendere 119 byte: ideone.com/RPCVZe
Tschallacka

@Tschallacka se presumo che io uso solo un Sytem Linux
Jörg Hülsermann

Bene, fintanto che non si modifica con notepad.exe la maggior parte degli editor ha terminazioni di linea linux ... i.imgur.com/QZsmf4r.png la console di Windows visualizzerà felicemente \ n come una vera newline. Quindi sì, puoi radere qualche byte della tua risposta.
Tschallacka,

6

V , 28 27 26 byte

1 byte salvato grazie a @DJMcMayhem usando >invece diÉ

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

<esc> è 0x1b

Provalo online!

hexdump:

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

Spiegazione

Superiore:

À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

Parte inferiore:

Ù                      " 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 ò

Bella risposta! Puoi cambiare É<space>a >quale alla fine di una macro è implicitamente compilato>>
DJMcMayhem

@DJMcMayhem Bel suggerimento! Quindi i >rientri di uno spazio anziché di una scheda?
Kritixi Lithos,

Sì! Ecco perché ho set expandtabeset shiftwidth=1
DJMcMayhem


5

JavaScript (ES6), 80 byte

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>


3

Python 3, 107 105 byte

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

Prende un int da Stdin


3

MATL , 34 byte

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

Provalo su MATL Online!

Spiegazione

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

3

PowerShell , 76 , 74 byte

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

Nota: l'esempio online contiene un po 'di wrapping come dimostrazione. Inserire in una funzione o script PoSH da eseguire.

Provalo online!


Benvenuti in PPCG! Bella prima risposta e bello vedere un altro PowerSheller in giro! È possibile salvare un paio di byte utilizzando una variabile incrementale nel ciclo, ' '*$i++anziché ' '*($n-$_).
AdmBorkBork

3

C, 131 byte

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

Provalo online!


Dove posso provarlo?
Anthony Pham,

Aggiunto il link @AnthonyPham Tio.
Steadybox,

Approccio piacevole usando la larghezza di printf per riempire gli spazi. Puoi salvare altri 9 byte se crei una macro per printf, rimuovi il primo i = 0 e aggiungi una nuova variabile j invece di reinizializzare i su 0 al secondo avvio: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 Grazie, ma poi la funzione produrrebbe un output corretto solo quando viene chiamata per la prima volta, e IIRC è contrario alle regole qui. La funzione dovrebbe funzionare indipendentemente da quante volte viene chiamata.
Steadybox

@Steadybox oh vedo, scusa per quello. Questo vale per tutte le domande su codegolf? Guardando solo a questa domanda specifica non sembra che voglia più input.
Claudiu,

2

Pyth, 44 byte

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

Provalo!

spiegazione

Il codice è composto da 3 parti:

+" "*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)*" "+"/"

2

Python3, 104 byte

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

Il programma prende un numero intero da STDIN e restituisce il gioiello in STDOUT.


2

seme , 43 byte

42 byte di codice, +1 per la -nbandiera.

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

Accetta input come argomento della riga di comando. Provalo online!

Spiegazione

Costruisce le prime due linee separatamente, quindi il resto del gioiello con un'operazione mappa:

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)

Un'altra soluzione

Anche 42 + 1 byte, questa volta con la -lbandiera:

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

TIO



2

C, 115 byte

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

Provalo online!

C, 123 byte

Sebbene la sfida non lo richieda, a spese di 8 byte la funzione può essere riutilizzabile (la prima soluzione salva 8 byte facendo affidamento sull'inizializzazione implicita delle variabili globali).

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

Provalo online!


2

Lotto, 152 byte

@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

test:

n = 1
 __
/  \
\  /
 \/

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

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/

Avrò bisogno di una suite di test per testarlo.
Anthony Pham,

2

C #, 187 byte

Sono sicuro che esiste una soluzione più compatta, ma questo è il mio primo tentativo:

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

Provalo online ..


Avrò bisogno di una suite di test per testarlo.
Anthony Pham,

1

JavaScript (ES6), 93 byte

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

dimostrazione


1

dc , 121 byte

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

Provalo online!


1

Perl 5 109 94 + 1 (per flag -p) = 95 byte

Provalo online!

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

Può essere eseguito in questo modo:

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

Spiegazione

#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

Avrò bisogno di una suite di test per testarlo perché non tutti capiscono o hanno la capacità di farlo nel modo che hai dichiarato
Anthony Pham,

@AnthonyPham Ho aggiunto il link Provalo online
CraigR8806,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.