Teflon kadar pürüzsüz


10

Kelimenin tam anlamıyla! 6 Nisan , Teflon kaplı tavalarla (ne yapacağız) kutlanan Ulusal Teflon Günü . Bu nedenle, pozitif bir tamsayı verildiğinde nbir Teflon tava oluşturun. Tencerenin "tava" bölümü, her biri kenarlarından nkarakterlerden oluşan bir sekizgendir; bu karakter, {veya karakterini kullanan kenarlar hariç} hangi tarafa bağlı olarak değişecektir . Bu tarafların karakter uzunluğu her zaman bir olacaktır. Eğer n1'dir:

  _
 / \
{   }
 \_/

Gördüğünüz gibi, her tarafı bir karakter oluşur (ya {, }, /, \, veya _). Eğer n2'dir:

   __
  /  \
 /    \
{      }
 \    /
  \__/

Tanıtıcı n+3 ='s ile oluşturulur ve sıfır ( 0) ile biter .


Eğer nbir:

  _
 / \
{   }====0
 \_/

n 2:

   __
  /  \
 /    \
{      }=====0
 \    /
  \__/  

n 3:

    ___
   /   \
  /     \
 /       \
{         }======0
 \       /
  \     /
   \___/  

Eğer n4'tür:

     ____
    /    \
   /      \
  /        \
 /          \
{            }=======0
 \          /
  \        /
   \      /
    \____/  

Kurallar ve Kriterler

  • Boşluğa izin verilmez

  • Tutamak sağ taraftan çıkıyor ( }karakterin yapılmış tarafı )

  • Girdi pozitif bir tamsayıdır

  • Yan ibaret değilse ya {ya }(değil sol veya sağ tarafı), onlar oluşacaktır nilgili karakterler:

                _
               / \
    Left side {   } Right side
               \_/
    
  • Bu , en kısa kod kazanır!

Daha fazla test örneği ekleyebilir misiniz?
xnor

@xnor İki kişi daha ekledi
Anthony Pham

N = 3 ve n = 4 için test
senaryolarında

@ fəˈnɛtɪk Teşekkürler! Bu düzeltildi
Anthony Pham

Düğme Oyerine alabilir miyim 0?
Titus

Yanıtlar:


9

Kömür ,  41 38 36 30 28 bayt

@Emigna'ya iki bayt tasarruf etmeye yardımcı olduğu için, @ ASCII sayesinde sadece altı bayt tasarrufu için ve @Neil'e iki bayt tasarrufu için teşekkürler!

Nη↙η↑←×_η↖η↗{↗η×_η↓↘η}×=⁺³η0

Çevrimiçi deneyin!

Açıklama:

Nη                 // Take the size of the pan as input.
↙η                 // Draw a line of η '\'s going down to the left.
↑←×_η              // Move one step up and print η underscores to the left.
↖η↗{↗η             // Print a line of η '\'s going up to the left.
                   // Then move one step north-east and print '{'.
                   // Then print a line of η '/'s going up to the right.
×_η↓               // Print '_' η times and move one step down.
↘η}                // Draw a line of η '\'s going down to the right, then print '}'.
×=⁺³η              // Print '=' η+3 times.
0                  // Print '0'

1
Kömürde başlangıç ​​noktasının sola hareket edebilirsin, değil mi? Eğer öyleyse, sapın ucundan başlamak, zaten yazdırılmış alanı geri izlemek zorunda kalmadan birkaç bayt tasarruf etmelidir.
Emigna

@Emigna Teşekkürler, bunu bilmiyordum. Daha önce hiç Charcoal kullanmamıştım.
Steadybox

1
@Steadybox 30 bayt:Nη↖ηG←η_↙↙η{↓↘ηM↑×η_↗η}×⁺³η=P0
Sadece ASCII sadece

1
28 bayt: Nη↙η↑←×_η↖η↗{↗η×_η↓↘η}×=⁺³η0( Gereksiz hale getirmek için öncelikle tepsinin alt yarısını yazdırarak 1 bayt ×ve gereksiz hale getirmek için parametreleri ters çevirerek 1 bayt kaydedildi .)
Neil

7

JavaScript (ES6), 171 bayt

f=
n=>(r=s=>s[0][0].repeat(n-1)+s)`  `+r`_
`+r` `.replace(/ /g," $'/$' $`$`$`\\\n")+`{`+r` `+r` `+r` }`+r`====0`+r` `.replace(/ /g,"\n $`\\$` $'$'$'/").replace(/ +\/$/,r`_/`)
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

Tüm pizza tavası çok tekrarlıdır, bu nedenle r işlevi (etiketli bir şablon hazır bilgisi olarak tasarlanmıştır) girişinin ilk karakterini n kez tekrarlar. Bu, tavanın üst ve orta ve çizgilerini işler. Geri kalanlar bir dizi boşluk değiştirilerek tekrarlanır; $`ve $'subsitutions otomatik olarak böylece konumlandırma artan ve boşlukları sayısındaki azalmanın uygun /ve \uygun bir şekilde. Son olarak _s, bu açıdan ikinci satırdan çok farklı olduğu için son satırda doldurulur.


7

JavaScript + HTML, 575 bayt (yalnızca 451 bayt JS) 376 bayt (yalnızca 482 bayt JS)

y=document,y.y=y.getElementById,a=(b,c)=>{w="";for(z=0;z<b;z++)w+=c;return w},d=_=>{n=Number(y.y("n").value);s="";u=" ";j="<br>",m="\\",o="/";for(i=-2;i<=2*n;i++)-2==i?s+=a(n+1,u)+a(n,"_")+j:i<n-1?s+=a(n-i-1,u)+o+a(2*(i+1)+n,u)+m+j:i==n-1?s+="{"+a(3*n,u)+"}"+a(n+3,"=")+"0"+j:i+1==2*n?s+=a(n,u)+m+a(n,"_")+o:i+1<2*n&&(s+=a(i-n+1,u)+m+a(5*n-2*i-2,u)+o+j);y.y("p").innerHTML=s};
<input type="number" id='n'><button onclick='d()'>Do</button><p id='p' style='font-family:monospace;'></p>

Karmaşık bir yaklaşım değil: kabın beş farklı kısmı için koşulları kullanan birkaç dizi birleşimi: en üstteki, en alt ve orta çizgiler ve üst ve alt yarılar.

Mümkün olduğunca kısalttım, ancak bu yöntemle sınır vardı.

EDIT: değildi - ek olarak @ programmer5000 tarafından golf


Harika ilk cevap! Programlama Bulmacaları ve Kod Golf hoş geldiniz!
Anthony Pham

Harika mıydı? Demek istediğim, olması gerekenden çok daha fazla zaman aldı ve gerçekten kısa değil - ama yine de teşekkürler!
Zoltán Schmidt

Javascript
Anthony Pham

İpuçları da olduğunu bilmiyordum - teşekkürler!
Zoltán Schmidt

2
PPCG'ye hoş geldiniz. Benim için biraz çaba gösteren ve zorluğu aşmaya yönelik ciddi bir girişim gösteren herhangi bir cevap iyi bir cevaptır ve bir oylamayı hak ediyor. İpuçları ve ipuçları ile iyi şanslar. İlk ipucum, bir projede çalışmak isteyeceğiniz türden bir programcı gibi düşünmeyi bırakıp birinin kodunu ele geçirdiğinizde nefret ettiğiniz her şeyi yapmaya başlamanızdır (bir harf değişkeni, ifade kısayolu vb.). .) :)
ElPedro

4

PHP, 174 bayt

echo($p=str_pad)("",-$i=-1-$n=$argn),$p(_,$n,_);for(;$i++<$n;)echo$p("
",1+$a=abs($i)),$i?$p("\/"[$i<0],1+$n*3-$a*2,"_ "[$i<$n])."\/"[$i>0]:$p("{",$n*3).$p("} ",5+$n,"="). 0;

STDIN'den girdi alır; ile çalıştırın -nRveya çevrimiçi test edin .

Yıkmak

// first line
echo($p=str_pad)("",-$i=-1-$n=$argn),$p(_,$n,_);
// loop $i from -$n to $n
for(;$i++<$n;)echo
    $p("\n",1+$a=abs($i)),                  // 1. left padding
$i?                     // if not middle line:
    $p("\/"[$i<0],1+$n*3-$a*2,"_ "[$i<$n])  // 2. left edge and inner padding
    ."\/"[$i>0]                             // 3. right edge
:                       // else:
    $p("{",$n*3)                            // 2. left edge and inner padding
    .$p(" }",5+$n,"=")                      // 3. right edge
    . 0                                     // 4. knob
;

4

Python 3, 196 bayt

n=int(input())
p=print
s=' '
def m(i,f,b,c=s):p(s*(n-i)+f+c*(n+2*i)+b)
p(s*n+s+'_'*n)
for i in range(n):m(i,*'/\\')
p('{'+s*n*3+'}'+'='*(n+3)+'0')
for i in range(n-1,0,-1):m(i,*'\\/')
m(0,*'\\/_')

Kodu kısaltmak için birkaç değişken kullandım, ancak çoğunlukla basit. İşte daha uzun, daha okunabilir bir versiyon:

n = int(input())

def middle_part(i, first_slash, second_slash, middle_char=' '):
    print(' ' * (n-i) + first_slash + middle_char * (n + 2*i) + second_slash)

print(' ' * (n+1) + '_' * n)

for i in range(n):
    middle_part(i, '/', '\\')

print('{' + ' ' * n*3 + '}' + '=' * (n+3) + '0')

for i in range(n-1, 0, -1):
    middle_part(i, '\\', '/')

middle_part(0, '\\', '/', middle_char='_')

Düzenleme: stdin'den n olarak okunur, 181 → 196 bayt


3

Python 2 , 180 178 bayt

s,i=' ',input();R=range(i)
print'\n'.join([s+s*i+'_'*i]+[s*(i-a)+'/'+s*(i+a*2)+'\\'for a in R]+['{'+s*i*3+'}'+'='*(i+3)+'0']+[s*(i-c)+'\\'+'_ '[c>0]*(i+c*2)+'/'for c in R[::-1]])

Çevrimiçi deneyin!


3

Python 2.7, 194 195 191 187 185 bayt

n=input();s=' ';a='\\';z='/'
def m(f,b,i,c=s):print(n-i)*s+f+c*(n+2*i)+b
m(s,s,0,'_')
for i in range(n):m(z,a,i)
print'{'+s*n*3+'}'+'='*(n+3)+'0';exec"m(a,z,i);i-=1;"*(n-1);m(a,z,0,'_')

Çevrimiçi deneyin!

Daha küçük yapmak için önerileri düzenlemek üzere açın. :)

Edit 1: +1 byte - Kodda 1 bayt daha uzun bir hata olduğunu göstermek için ElPedro'ya verilen krediler .

Edit 2: -4 bytes - Gereksiz argümanları kaldırmak için piyush-ravi kredileri .

Düzenleme 3: -4 bayt - Bunu nasıl görmedim? : P

Düzenle 4: -2 bayt - '\ n' yerine ';'


Görünüşe göre yerel olarak denediğimde orta çizginin altındaki ilk satır orada olmamalı. Giriş 4 ve 3 için denedim ve yanlış görünüyor. Eğer gözden geçirmek ve açıklamak ya da düzeltmek için zaman vardı kadar yukarı oyu geri çekmeyecek. Yeterince sert görünmüyor benim hatam :)
ElPedro

ElPedro'ya işaret ettiğin için teşekkürler .
Çözüldü

2

PowerShell , 165 bayt

param($n)($a=' '*$n)+" "+($b='_'*$n);$n..1|%{' '*$_+"/"+' '*($n+2*$i++)+"\"};"{$($a*3)}$('='*($n+3))0";if($n-1){1..($n-1)|%{' '*$_+"\"+' '*($n+2*--$i)+"/"}};"$a\$b/"

Çevrimiçi deneyin!

Girdiyi alır $n, $abir grup boşluğa, $bbir grup alt çizgiye ayarlar ve dize bunu bir boşlukla birleştirir. Boru hattında kaldı.

Aşağıdan $nyukarı döngüler 1. Eğer $n=1bu yalnızca bir kez yürütülür. Her yinelemede boşluklar, a /, sayaçlı daha fazla boşluk $ive a \. Bunların hepsi boru hattında kaldı.

Sonra saplı orta kısım geliyor tesadüfen sahip $a*3ortasında boşluk ve $n+3 =ardından bir belirti, 0. Boru hattında kaldı.

Eğer $ndaha büyükse 1, o $n-1zaman doğrudur, bu yüzden tava tabanını oluşturmak için diğer yönü döngüye aldığımız koşulluya gireriz. Eğer $n=1öyleyse, çizgilerin nasıl çalıştığı nedeniyle bu bölüme ihtiyacımız yok. Bunların hepsi boru hattında kaldı. Boşluklarla bitiriyoruz $a\$b/ve tencerenin alt kısmı ile altını çiziyoruz .

Boru hattındaki tüm bu dizeler, Write-Outputöğeler arasında yeni satırlarla yazdırılan örtük yoluyla gönderilir .


2

JavaScript + HTML - 346 bayt

JavaScript - 314 bayt, HTML - 32 bayt

function o(a){a=parseInt(a),String.prototype.r=String.prototype.repeat;c=console.log,d=" ".r(a),e="_".r(a);c(" "+d+e);for(f=a-1,g=a;f>=0;f--,g+=2)c(" ".r(f+1)+"/"+" ".r(g)+"\\");c("{ }=0".replace(" "," ".r(3*a)).replace("=","=".r(a)));for(f=0,g=3*a;f<a-1;f++,g-=2)c(" ".r(f+1)+"\\"+" ".r(g-2)+"/");c(d+"\\"+e+"/")}
<input id=n onkeyup=o(n.value)>

Un-golfed

function o(sides) {

  String.prototype.r = String.prototype.repeat;
  var middle = '{ }=0',
  log = console.log,
  ss = ' '.r(sides),
  u = '_'.r(sides),
  sides = parseInt(sides);

  // top
  log(' ' + ss + u);

  // top mid
  for (var i = sides - 1, j = sides; i >= 0; i--, j += 2) {
    log(' '.r(i + 1) + '/' + ' '.r(j) + '\\');
  }

  // mid
  log('{ }=0'.replace(' ', ' '.r(sides * 3)).replace('=', '='.r(sides)));

  // bottom mid
  for (var i = 0, j = sides * 3; i < sides - 1; i++, j -= 2) {
    log(' '.r(i + 1) + '\\' + ' '.r(j - 2) + '/');
  }

  // bottom
  log(ss + '\\' + u + '/');

}
<input id="n" onkeyup="o(n.value)">


0

C, 249 bayt

o(c,a){for(;a--;)putchar(c);}s;p(n){o(32,n+1);o(95,n);o(10,1);for(s=0;s<n;s++)o(32,n-s),o(47,1),o(32,n+s*2),o(92,1),o(10,1);o(123,1);o(32,n*3);o(125,1);o(61,3+n);o(48,1);o(10,1);for(s=n-1;s>-1;s--)o(32,n-s),o(92,1),o(s?32:95,n+s*2),o(47,1),o(10,1);}

Çevrimiçi deneyin

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.