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 Sì e sì :)
— 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.