Bazı ASCII mücevherlerini kazın!


25

13 Mart , bu mücadelenin teması olan Ulusal Mücevher Günü olarak kabul edildi . Böylece, 0'dan büyük bir tam sayı nverildiğinde n, bir ASCII mücevheri oluşturun. Örneğin:

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

Tabanı, mücevherin en yüksek çifti için en alt kısmı olarak tanımlanır \/. Gerisi üst. Yukarıdaki örnekte, nerede n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Görüldüğü gibi, alt yapılmıştır n + 1tabakaları \/ile (1 * lines from the bottom) * 2bir maksimum arasındaki boşluklarda nmücevher altından hatları. İkinci mücevheri ( n = 2) alırsak, şunu görebiliriz:

 ____
/    \      
\    /  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 \/

En iyi bir çift yapılmış /\olan n*2ile arasında boşluk n*2üzerine çizgi.

kurallar

  • Kullanıcı girişi olarak sıfır olmayan pozitif tamsayılar alabilmelidir
  • Yukarıda tanımlanan özelliklere sahip bir mücevher oluşturmalı (burada yeniden düzenlenmiştir):
    • En iyi bir çift yapılmış /\olan n*2ile arasında boşluk n*2üzerine çizgi.
    • Alt yapılmıştır n + 1tabakaları \/ile (1 * lines from the bottom) * 2bir maksimum arasındaki boşluklarda nmücevher altından hatları.
  • Mücevherden sonra gelen yeni satırlara veya her satırdaki sondaki boşluklara izin verilir.
  • Standart boşluklara izin verilmez

Kazanma Kriterleri

En az bayt kazanır!


4
Açıkça konuşmak gerekirse "sıfır olmayan pozitif" gereksizdir - 0 eklemek isterseniz, "olumsuz olmayan" demeniz gerekir.
Fon Monica'nın Davası

Cevap PETSCII'de olabilir mi?
Shaun Bebbers

3
Sayı arttıkça "mücevherler" mücevherlere ve pizza dilimlerine daha az benzemeye başlar ya da belki öğle yemeği zamanı konuşur.
Marijn,

Yanıtlar:


27

Kömür , 17 bayt

Kod:

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

Açıklama:

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

Bir çok düzgün komuttur ‖Mhangi de otomatik aynalar, /içine \.

Kömür kodlamasını kullanır .

Çevrimiçi deneyin!


Bu ayna komutu gerçekten harika! Parantezleri ve diğer karakterleri de yansıtıyor mu? Ve bu davranışı geçersiz kılmanın bir yolu var mı?
DJMcMayhem

2
@DJMcMayhem Evet ve evet :)
Adnan

27
Lol, kömürden elmas yaptın!
SteeveDroz

8

05AB1E , 27 20 bayt

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

Çevrimiçi deneyin!

açıklama

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

Haha güzel! Sana değiştirebileceğine inanıyor D„/\„\/‡için Â.
Adnan

@Adnan: Evet, daha yeni bir gelişme üzerinde çalışırken kendimin farkına vardım: P
Emigna

8

Python 2, 101 98 95 bayt

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

Çevrimiçi Deneyin!

Olumlu bir tamsayı alan ve bir dize döndüren adsız işlev

Python 3.6, 92 bayt (Ben Frankel sayesinde)

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

Bu sürüm için çevrimiçi bir tercüman bulamadım, ancak v3.6'daki f-string'lerden dolayı biraz daha kısa


Python 3.6: 'da üç byte kaydedebilirsiniz lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). F-string'lerden yararlanmak.
Ben Frankel

Repl.it'in Python 3 için bir test paketi olduğundan eminim
Anthony Pham

@AnthonyPham repl.it ve TryItOnline kullanımı hem Python 3.5, ben kontrol ettim
matematik bağımlısı

Nihayet! Python'u bu kadar uzun süren merak ediyorum. Her dilde dize enterpolasyonu hak ediyor ...
Felix Dombek

7

PHP, 123 Bayt

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 Bayt ilk sürümü

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

Burada dene!


Bunu nereden deneyebilirim?
Anthony Pham

@AnthonyPham İşte .
Adnan

119 bayt yapabilirsiniz: ideone.com/RPCVZe
Tschallacka

@Tschallacka eğer sadece bir Linux Sytem kullandığımı varsayarsam
Jörg Hülsermann

Eh, notepad.exe ile düzenlemediğiniz sürece çoğu editörün linux satırı sonları vardır ... i.imgur.com/QZsmf4r.png pencere konsolu gerçek bir yeni satır olarak gösterilecektir. Yani evet, cevabınızın birkaç baytını tıraş edebilirsiniz.
Tschallacka

6

V , 28 27 26 bayt

1 bayt kullanarak @DJMcMayhem sayesinde kaydedilen >yerineÉ

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

<esc> olduğu 0x1b

Çevrimiçi deneyin!

HexDump:

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

açıklama

Üst:

À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

Alt:

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

Güzel cevap! Değişebilirsin É<space>için >bir makro sonunda örtük için doldurulmasında kullanılan>>
DJMcMayhem

@DJMcMayhem Güzel öneri! Yani, >girintiler bir sekme yerine bir boşluk bıraksın?
Kritixi Lithos

Evet! Bu benim var set expandtabveset shiftwidth=1
DJMcMayhem


5

JavaScript (ES6), 80 bayt

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 Bayt

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

Stdin'den int alır


3

MATL , 34 bayt

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

MATL Online'da deneyin !

açıklama

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 bayt

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

Not: Çevrimiçi örnek, tanıtım olarak bir miktar sarma içerir. Yürütmek için bir PoSH işlevine veya komut dosyasına yerleştirin.

Çevrimiçi deneyin!


PPCG'ye Hoşgeldiniz! Güzel ilk cevap ve çevresinde başka bir PowerSheller görmek güzel! Döngüdeki bir artan değişken kullanarak çift bayttan tasarruf edebilirsiniz - ' '*$i++yerine ' '*($n-$_).
AdmBorkBork

3

C, 131 bayt

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

Çevrimiçi deneyin!


Bunu nerede test edebilirim?
Anthony Pham

@AnthonyPham Tio bağlantısı eklendi.
Steadybox

Boşlukları doldurmak için printf genişliğini kullanarak hoş bir yaklaşım. Printf için bir makro oluşturursanız 9 bayt daha kaydedebilirsiniz, ilk i = 0'ı kaldırın ve ikinci çalıştırmada i'yi 0 ile yeniden başlatmak yerine yeni bir j değişkeni ekleyin: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 Teşekkürler, ancak o zaman işlev yalnızca ilk kez çağrıldığında doğru çıktıyı ve buradaki kurallara aykırı olan IIRC'yi üretecektir. Fonksiyon, kaç defa çağrıldığına bakılmaksızın çalışmalıdır.
Steadybox

@ Steadybox oh görüyorum, bunun için üzgünüm. Bu tüm codegolf soruları için geçerli mi? Sadece bu özel soruya baktığımızda, çoklu girdi istediği anlaşılmıyor.
Claudiu

2

Pyth, 44 Bayt

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

dene!

açıklama

Kod 3 bölümden oluşmaktadır:

+" "*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 bayt

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

Program, STDIN'den bir tamsayı alır ve mücevheri STDOUT'a geri döndürür.


2

bip , 43 bayt

42 byte kod, -nbayrak için +1 .

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

Komut satırı argümanı olarak girdi alır. Çevrimiçi deneyin!

açıklama

İlk iki satırı ayrı ayrı inşa eder, daha sonra mücevherin geri kalanını bir harita işlemiyle oluşturur:

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)

Başka bir çözüm

Ayrıca, 42 + 1 bayt, bu sefer -lbayrakla:

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

TIO



2

C, 115 bayt

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

Çevrimiçi deneyin!

C, 123 bayt

Mücadelenin gerektirmemesine rağmen, 8 bayt pahasına, fonksiyon yeniden kullanılabilir hale getirilebilir (ilk çözüm, küresel değişkenlerin örtük olarak başlatılmasına dayanarak 8 bayt tasarruf eder).

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

Çevrimiçi deneyin!


2

Toplu iş, 152 bayt

@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

Testler:

n = 1
 __
/  \
\  /
 \/

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

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

Bunu test etmek için bir test odasına ihtiyacım olacak.
Anthony Pham

2

C #, 187 bayt

Dışarıda daha kompakt bir çözüm olduğuna eminim ama bu benim ilk girişim

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

Çevrimiçi deneyin ..


Bunu test etmek için bir test odasına ihtiyacım olacak.
Anthony Pham

1

JavaScript (ES6), 93 bayt

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

gösteri



1

Perl 5 109 94 + 1 (bayrak için -p) = 95 Bayt

Çevrimiçi Deneyin!

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

Bu şekilde çalıştırılabilir:

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

açıklama

#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

Bunu herkesin tam olarak anlayamadığı veya bunu sizin belirttiğiniz gibi yürütme yeteneğine sahip olmadığı için denemek için bir test odasına ihtiyacım olacak
Anthony Pham

@AnthonyPham Çevrimiçi Deneyin linkini
ekledim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.