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


10

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

  _
 / \
{   }
 \_/

Как вы можете видеть, каждая сторона состоит из одного символа (или {, }, /, \, или _). Если n2:

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

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


Если nэто один:

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

n это 2:

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

n это 3:

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

Если nэто 4:

     ____
    /    \
   /      \
  /        \
 /          \
{            }=======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-only за сохранение шести байтов и благодаря @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

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

1
@Steadybox 30 байтов:Nη↖ηG←η_↙↙η{↓↘ηM↑×η_↗η}×⁺³η=P0
только ASCII

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

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>

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

Я сократил столько, сколько мог, но это был предел с этим методом.

РЕДАКТИРОВАТЬ: это не было - дополнительно в гольф @ programmer5000


Отличный первый ответ! Добро пожаловать в Программирование головоломок и Code Golf!
Энтони Фам

Это было здорово? Я имею в виду, что это заняло гораздо больше времени, чем следовало бы, и даже не очень мало - но все равно спасибо!
Золтан Шмидт

Вам следует посетить вопрос о советах по игре в гольф для Javascript
Энтони Фам,

Не знал, что есть советы - спасибо!
Золтан Шмидт

2
Добро пожаловать в PPCG. Для меня любой ответ, который показывает некоторые усилия и серьезную попытку решить проблему, является хорошим ответом и заслуживает одобрения. Удачи с подсказками и подсказками. Мой первый совет: перестаньте думать, как программист, с которым вы хотели бы работать над проектом, и начните делать все то, что вы ненавидите, когда берете на себя чужой код (переменные из одной буквы, операторы быстрого вызова if и т. Д.). .) :)
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

Python 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 из стандартного ввода, 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 байта - Как я этого не увидел? :П

Редактировать 4: -2 байта - замена '\ n' на ';'


Похоже, что первая строка ниже средней линии не должна быть там, когда я пробую это локально. попробовал это для ввода 4 и 3, и это выглядит неправильно. Я не откажусь от ответа, пока у вас не будет времени, чтобы просмотреть, объяснить или исправить. Я виноват в том, что не выглядел достаточно усердно :)
ElPedro

Спасибо за указание на это ElPedro .
Исправил

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 =знаки, затем a 0. Это осталось на конвейере.

Если $nбольше чем 1, то $n-1верно, поэтому мы входим в условное, где мы зацикливаем другое направление, чтобы сформировать дно кастрюли. Если $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)>

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.