Tailler des bijoux ASCII!

25

Le 13 mars est reconnu comme la Journée nationale du bijou , qui est le thème de ce défi. Donc, étant donné un entier nnest supérieur à 0, créez un bijou ASCII. Par exemple:

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

Le bas est défini comme le bas du bijou jusqu'à la plus haute paire de \/. Le reste est le top. Pour l'exemple ci-dessus où n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Comme vous pouvez le voir, le fond est constitué de n + 1couches de \/avec des (1 * lines from the bottom) * 2espaces entre un maximum de nlignes à partir du bas du bijou. Si nous prenons le deuxième bijou ( n = 2), nous pouvons voir 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 partie supérieure est constituée d'une paire d' /\avec les n*2espaces entre les deux avec des n*2traits de soulignement sur le dessus.

Règles

  • Doit être capable de prendre des entiers positifs non nuls comme entrée utilisateur
  • Doit créer un bijou avec les spécifications définies ci-dessus (reformulées ici):
    • La partie supérieure est constituée d'une paire d' /\avec les n*2espaces entre les deux avec des n*2traits de soulignement sur le dessus.
    • Le fond est constitué de n + 1couches de \/avec des (1 * lines from the bottom) * 2espaces entre les deux avec un maximum de nlignes à partir du bas du bijou.
  • Les sauts de ligne après le bijou ou les espaces de fin sur chaque ligne sont autorisés.
  • Aucune échappatoire standard autorisée

Critères gagnants

Le moins d'octets gagne!

Anthony Pham
la source
4
Strictement parlant, "non nul positif" est redondant - si vous voulez inclure 0, vous devez dire "non négatif".
Fund Monica's Lawsuit
La réponse peut-elle être dans PETSCII?
Shaun Bebbers
3
À mesure que le nombre augmente, les «bijoux» commencent à ressembler moins à des bijoux et plus à des tranches de pizza, ou peut-être que ce n'est que l'heure du déjeuner.
Marijn Stevering

Réponses:

27

Fusain , 17 octets

Code:

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

Explication:

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

Une commande très soignée est ‖M, qui se reflète également automatiquement /dans \.

Utilise l' encodage Charcoal .

Essayez-le en ligne!

Adnan
la source
Cette commande miroir est vraiment cool! Reflète-t-il également les crochets et autres caractères? Et existe-t-il un moyen de remplacer ce comportement?
DJMcMayhem
2
@DJMcMayhem Oui et oui :)
Adnan
27
Lol, tu as fait des diamants avec du charbon!
SteeveDroz
8

05AB1E , 27 20 octets

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

Essayez-le en ligne!

Explication

ƒ                      # 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
la source
Haha, chouette! Je crois que vous pouvez changer D„/\„\/‡pour Â.
Adnan
@Adnan: Oui, je viens de réaliser que moi-même en travaillant sur une amélioration: P
Emigna
8

Python 2, 101 98 95 octets

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

Essayez-le en ligne!

Fonction anonyme qui prend un entier positif et renvoie une chaîne

Python 3.6, 92 octets (Merci à Ben Frankel)

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

Je n'ai pas pu trouver d'interprète en ligne pour cette version, mais il est un peu plus court en raison des chaînes f dans la v3.6

accro aux mathématiques
la source
Vous pouvez enregistrer trois octets en Python 3.6: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Profitant des f-cordes.
Ben Frankel
Je suis sûr que repl.it a une suite de tests pour Python 3
Anthony Pham
@AnthonyPham repl.it et TryItOnline utilisent tous deux Python 3.5, j'ai vérifié
math junkie
Whoa, enfin! Je me demande ce qui a pris autant de temps à Python. Chaque langue mérite une interpolation de chaînes ...
Felix Dombek
7

PHP, 123 octets

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 octets première version

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

Essayez-le ici!

Jörg Hülsermann
la source
Où puis-je essayer cela?
Anthony Pham
@AnthonyPham Ici .
Adnan
Vous pouvez le faire 119 octets: ideone.com/RPCVZe
Tschallacka
@Tschallacka si je suppose que j'utilise uniquement un système Linux
Jörg Hülsermann
Eh bien, tant que vous ne modifiez pas avec notepad.exe, la plupart des éditeurs ont des terminaisons de ligne linux ... La console Windows i.imgur.com/QZsmf4r.png s'affichera avec plaisir \ n comme une véritable nouvelle ligne. Alors oui, vous pouvez raser quelques octets de votre réponse.
Tschallacka
6

V , 28 27 26 octets

1 octets enregistrés grâce à @DJMcMayhem en utilisant > au lieu deÉ

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

<esc> est 0x1b

Essayez-le en ligne!

Hexdump:

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

Explication

Haut:

À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

Bas:

Ù                      " 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
la source
Bonne réponse! Vous pouvez modifier É<space>à >qui , à la fin d'une macro est implicitement rempli à>>
DJMcMayhem
@DJMcMayhem Belle suggestion! Donc, le >retrait d'un espace au lieu d'un onglet?
Kritixi Lithos
Oui! C'est parce que j'ai set expandtabetset shiftwidth=1
DJMcMayhem
5

Röda , 71 octets

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

Essayez-le en ligne!

fergusq
la source
5

JavaScript (ES6), 80 octets

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
la source
3

Python 3, 107 105 octets

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

Prend un int de Stdin

KarlKastor
la source
3

MATL , 34 octets

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

Essayez-le à MATL Online!

Explication

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
la source
3

PowerShell , 76 , 74 octets

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

Remarque: l'exemple en ligne contient un peu d'habillage comme démonstration. Placer dans une fonction ou un script PoSH à exécuter.

Essayez-le en ligne!

Herbert Origas
la source
Bienvenue chez PPCG! Belle première réponse, et agréable de voir un autre PowerSheller autour! Vous pouvez enregistrer quelques octets en utilisant une variable d'incrémentation dans la boucle - ' '*$i++au lieu de ' '*($n-$_).
AdmBorkBork
3

C, 131 octets

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

Essayez-le en ligne!

Steadybox
la source
Où puis-je tester cela?
Anthony Pham
Ajout du lien @AnthonyPham Tio.
Steadybox
Belle approche en utilisant la largeur de printf pour remplir les espaces. Vous pouvez enregistrer 9 octets supplémentaires si vous créez une macro pour le printf, supprimez le premier i = 0 et ajoutez une nouvelle variable j au lieu de réinitialiser i à 0 lors de la deuxième exécution: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 Merci, mais la fonction ne produirait une sortie correcte que lorsqu'elle est appelée pour la première fois, et IIRC est contraire aux règles ici. La fonction devrait fonctionner quel que soit le nombre de fois où elle est appelée.
Steadybox
@Steadybox oh je vois, désolé pour ça. Est-ce que cela s'applique à toutes les questions de codegolf? En regardant simplement cette question spécifique, il ne semble pas qu'elle veuille plusieurs entrées.
Claudiu
2

Pyth, 44 octets

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

essayez-le!

explication

Le code se compose de 3 parties:

+" "*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
la source
2

Python3, 104 octets

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

Le programme prend un entier de STDIN et renvoie le bijou dans STDOUT.

Josh
la source
2

Pépin , 43 octets

42 octets de code, +1 pour l' -nindicateur.

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

Prend l'entrée comme argument de ligne de commande. Essayez-le en ligne!

Explication

Construit les deux premières lignes séparément, puis le reste du bijou avec une opération de carte:

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)

Une autre solution

Aussi 42 + 1 octets, cette fois avec le -ldrapeau:

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

TIO

DLosc
la source
2

Pyth, 38 octets

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

C, 115 octets

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

Essayez-le en ligne!

C, 123 octets

Bien que le défi ne l'exige pas, au détriment de 8 octets, la fonction peut être rendue réutilisable (la première solution économise 8 octets en s'appuyant sur l'initialisation implicite des 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));}

Essayez-le en ligne!

Itay Grudev
la source
2

Lot, 152 octets

@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

Tests:

n = 1
 __
/  \
\  /
 \/

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

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/
Neil
la source
J'aurai besoin d'une suite de tests pour tester cela.
Anthony Pham
2

C #, 187 octets

Je suis sûr qu'il existe une solution plus compacte mais c'est ma première tentative:

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

Essayez-le en ligne ..

James Robertson
la source
J'aurai besoin d'une suite de tests pour tester cela.
Anthony Pham
1

JavaScript (ES6), 93 octets

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

Démo

Arnauld
la source
1

dc , 121 octets

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

Essayez-le en ligne!

R. Kap
la source
1

Perl 5 109 94 + 1 (pour le drapeau -p) = 95 octets

Essayez-le en ligne!

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

Peut être exécuté comme suit:

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

Non golfé

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

Explication

#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
la source
J'aurai besoin d'une suite de tests pour tester cela car tout le monde ne comprend pas tout à fait ou n'a pas la capacité de le faire comme vous l'avez dit
Anthony Pham
@AnthonyPham J'ai ajouté le lien Try It Online
CraigR8806