Гладкий, як тефлоновий


10

Буквально! 6 квітня - Національний день тефлону , який відзначається каструлями з тефлоновим покриттям (що ми будемо робити). Отже, задавши ціле число n, створіть тефлонову сковороду. Розділ «пан» каструлі - це восьмикутник, кожна з його сторін складається з nсимволів, які залежать від того, на якій стороні він знаходиться, крім сторін, що використовують символ {або }. Ці сторони завжди матимуть довжину символів. Якщо n1:

  _
 / \
{   }
 \_/

Як ви можете бачити, кожна сторона складається з одного символу (або {, }, /, \, або _). Якщо n2:

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

Ручка буде створена з n+3 ='s і закінчиться нулем ( 0).


Якщо nодин:

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

n є 2:

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

n становить 3:

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

Якщо n4:

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

Правила та критерій

  • Не допускаються лазівки

  • Ручка виходить з правого боку (сторона зроблена }символом)

  • Вхідне значення - додатне ціле число

  • Якщо сторона не перебуває з яких {або }(НЕ лівого або правого боку), вони будуть складатися з nвідповідних символів:

                _
               / \
    Left side {   } Right side
               \_/
    
  • Оскільки це , виграє найкоротший код!

Не могли б ви додати більше тестових випадків?
xnor

@xnor Додав ще двох
Ентоні

Тестові випадки для n = 3 та n = 4 не мають потрібної кількості символів у верхньому чи нижньому краї
fəˈnɛtɪk

@ fəˈnɛtɪk Дякую! Це було виправлено
Ентоні Фам

Чи можна взяти Oзамість 0ручки?
Тит

Відповіді:


9

Вугілля ,  41 38 36 30 28 байт

Дякуємо @Emigna за те, що він допомагає зберегти два байти, завдяки @ ASCII лише за збереження шести байтів, а також @Neil за збереження ще двох байтів!

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

Спробуйте в Інтернеті!

Пояснення:

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
Ви можете рухатись ліворуч від вихідної точки у вугіллі, чи не так? Якщо так, то, починаючи з кінчика ручки, слід зберегти кілька байтів, не потребуючи відхилення вже надрукованого простору.
Емінья

@Emigna Спасибі, я цього не знав. Я ніколи раніше не використовував вугілля.
Steadybox

1
@Steadybox 30 байт:Nη↖ηG←η_↙↙η{↓↘ηM↑×η_↗η}×⁺³η=P0
Лише ASCII

1
28 байт: Nη↙η↑←×_η↖η↗{↗η×_η↓↘η}×=⁺³η0(1 байт збережено, надрукувавши нижню половину каструлі, спочатку зробивши непотрібною, а 1 байт збереженою шляхом зміни параметрів, щоб ×зробити непотрібним.)
Ніл

7

JavaScript (ES6), 171 байт

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>

Вся сковорода для піци є дуже повторюваною, тому функція r (розроблена як букварний шаблон з буквами) повторює перший символ свого введення n разів. Це обробляє верхню і середину і лінії каструлі. Решта повторюється заміною рядка заготовок; то $`і $'subsitutions автоматично відповідають збільшення і зменшення числа заготовок , таким чином , позиціонування /і \належним чином . Нарешті _s заповнюються в останньому рядку, оскільки він тонко відрізняється від другого рядка в цьому відношенні.


7

JavaScript + HTML, 575 байт (лише 451 байт JS) 376 байт (лише 482 байти 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>

Не складний підхід: кілька струнних конкатенацій, використовуючи умови для п’яти різних частин сковороди: самої верхньої, нижньої та середньої лінії та верхньої та нижньої половини.

Я скоротив, наскільки міг, але це було межею цього методу.

EDIT: не було - додатково гольфував @ programmer5000


Чудова перша відповідь! Ласкаво просимо до головоломки програмування та коду для гольфу!
Ентоні Фам

Це було чудово? Я маю на увазі, на це знадобилося набагато більше часу, ніж це було, і навіть не дуже короткий - але все-таки спасибі!
Золтан Шмідт

Ви повинні відвідати питання про поради щодо гольфу для Javascript
Ентоні Фем

Не знав, що є й поради - дякую!
Золтан Шмідт

2
Ласкаво просимо до PPCG. Для мене будь-яка відповідь, яка демонструє певні зусилля та серйозну спробу вирішити виклик, є гарною відповіддю і заслуговує на репутацію. Удачі з підказками та порадами. Моя перша порада - перестаньте думати, як той програміст, з яким ви хотіли б працювати над проектом, і починайте робити все те, що ви ненавидите, коли переймаєте хтось код elses (одна змінна літера, ярлик, якщо заяви і т.д. .) :)
ElPedro

4

PHP, 174 байти

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; запустити -nRабо випробувати його в Інтернеті .

зламатися

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

Пітон 3, 196 байт

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,*'\\/_')

Я використовував кілька змінних для скорочення коду, але це здебільшого прямо. Ось довша, більш читаемая версія:

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='_')

Редагувати: змінено на читання n від stdin, 181 → 196 байт



3

Python 2.7, 194 195 191 187 185 байт

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,'_')

Спробуйте в Інтернеті!

Відкрийте для редагування пропозицій, щоб зменшити їх. :)

Редагувати 1: +1 байт - кредити ElPedro за вказівку на помилку в коді, що зробило його на 1 байт довше.

Редагувати 2: -4 байти - Кредити piyush-ravi для видалення непотрібних аргументів.

Редагувати 3: -4 байти - Як я цього не бачив? : P

Змінити 4: -2 байти - Заміна '\ n' на ';'


Схоже, перший рядок нижче середньої лінії не повинен бути там, коли я спробую це локально. спробував це для введення 4 і 3, і це виглядає неправильно. Не вилучимо оновлену заявку, поки не встигнете переглянути та пояснити чи виправити. Моя провина в тому, що я не шукаю досить важко :)
ElPedro

Дякуємо, що вказали на ElPedro . Виправлено :)
Koishore Roy

2

PowerShell , 165 байт

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

Спробуйте в Інтернеті!

Займає введення $n, встановлює $aкупу пробілів, $bкупу підкреслень та рядки, що з'єднують це з пробілом. Це залишилося на конвеєрі.

Петлі $nзнизу до 1. Якщо $n=1це буде виконано лише один раз. Кожною ітерацією ми робимо рядкове з'єднання пробілів, a /, більше пробілів з лічильником $i, a \. Ці всі залишилися на трубопроводі.

Потім йде середня частина з ручкою, яка по збігу має $a*3місце в середині, і $n+3 =ознаки, то 0. Це залишилося на конвеєрі.

Якщо $nвона більша за 1, то $n-1це truthy, тому ми входимо до умовного, де ми петлюємо в іншому напрямку, щоб сформувати дно каструлі. Якщо $n=1тоді ця частина нам не потрібна через те, як працюють лінії. Ці всі залишилися на трубопроводі. Закінчуємо пробілами і підкреслюємо $a\$b/дном каструлі.

Усі ці рядки з конвеєра надсилаються через неявні, Write-Outputякі друкують їх новими рядками між елементами.


2

JavaScript + HTML - 346 байт

JavaScript - 314 байт, HTML - 32 байти

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

Без гольфу

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.