Виріжте кілька коштовностей ASCII!


25

13 березня визнано Національним днем ​​коштовності , що є темою цього виклику. Отже, дано ціле число nкудиn більше 0, створіть коштовність ASCII. Наприклад:

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

Дно визначається як саме дно коштовності до найвищої пари \/. Решта - верх. Для наведеного вище прикладу деn = 1 :

Bottom: \  /    Top:   __
         \/           /  \

Як бачите, дно зроблене з n + 1шарів \/з (1 * lines from the bottom) * 2проміжками між ними, максимум nліній від нижньої частини коштовності. Якщо ми візьмемо другу коштовність ( n = 2), ми можемо побачити, що:

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

Верх зроблений з однієї пари /\з n*2проміжками між ними, n*2підкресленнями зверху.

Правила

  • Потрібно мати можливість приймати будь-які ненульові додатні цілі числа як введення користувача
  • Потрібно створити коштовність із зазначеними вище специфікаціями (переглянуто тут):
    • Верх зроблений з однієї пари /\з n*2проміжками між ними, n*2підкресленнями зверху.
    • Дно зроблене з n + 1шарів \/з (1 * lines from the bottom) * 2проміжками між ними, максимум nліній знизу коштовності.
  • Допускаються обведення нових рядків після коштовності або пробіли на кожній лінії.
  • Не допускаються стандартні лазівки

Критерії виграшу

Найменший байт виграє!


4
Суворо кажучи, "ненульовий позитивний" є зайвим - якби ви хотіли включити 0, вам доведеться сказати "негативно".
Фонд позову Моніки

Чи можна відповісти в PETSCII?
Shaun Bebbers

3
Зі збільшенням кількості «коштовності» починають виглядати менш як коштовності і більше нагадують шматочки піци, а може, це лише час обіду.
Marijn Stevering

Відповіді:


27

Деревне вугілля , 17 байт

Код:

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

Пояснення:

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

Дуже акуратно команда ‖M, яка також автоматично дзеркала /в\ .

Використовується кодування деревного вугілля .

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


Ця дзеркальна команда справді класна! Чи це дзеркальні дужки та інші символи? І чи є спосіб перекрити таку поведінку?
DJMcMayhem

2
@DJMcMayhem Так і так :)
Adnan

27
Лол, ти зробив алмази з вугілля!
SteeveDroz

8

05AB1E , 27 20 байт

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

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

Пояснення

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

Ха-ха, приємно! Я вважаю , що ви можете змінити D„/\„\/‡в Â.
Аднан

@Adnan: Так, я просто зрозумів, що сам працюю над вдосконаленням: P
Emigna

8

Python 2, 101 98 95 байт

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

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

Анонімна функція, яка приймає додатне ціле число і повертає рядок

Python 3.6, 92 байти (завдяки Бен Франкель)

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

Я не зміг знайти інтерпретатора для цієї версії, але він трохи коротший через f-рядки в v3.6


Ви можете зберегти три байта в Python 3.6: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Користуючись f-струнами.
Бен Франкель

Я впевнений, що repl.it має тестовий набір для Python 3
Ентоні Фам

@AnthonyPham repl.it і TryItOnline використовують Python 3.5, я перевірив
математика наркоман

О, нарешті! Цікаво, що так довго займав Python. Кожна мова заслуговує на строкову інтерполяцію ...
Фелікс Домбек

7

PHP, 123 байт

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 байт перша версія

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

Спробуйте тут!


Де я можу спробувати це?
Ентоні Фам

@AnthonyPham Тут .
Аднан

Ви можете зробити це 119 байтів: ideone.com/RPCVZe
Чашаллака

@Tschallacka, якщо припустити, що я використовую лише Linux Sytem
Jörg Hülsermann,

Ну, доки ви не редагуєте за допомогою notepad.exe, у більшості редакторів є закінчення рядків Linux ... i.imgur.com/QZsmf4r.png Windows консоль із задоволенням відображатиме \ n як справжній новий рядок. Отже, ви можете поголити кілька байтів вашої відповіді.
Цхаллачка

6

V , 28 27 26 байт

1 байт збережено завдяки @DJMcMayhem, використовуючи >замістьÉ

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

<esc> є 0x1b

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

Hexdump:

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

Пояснення

Вгору:

À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

Знизу:

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

Гарна відповідь! Ви можете змінити, É<space>до >якого в кінці макросу неявно заповнюється>>
DJMcMayhem

@DJMcMayhem Приємна пропозиція! Отже, >відступи - один пробіл, а не одна вкладка?
Kritixi Lithos

Так! Ось чому я маю set expandtabіset shiftwidth=1
DJMcMayhem


5

JavaScript (ES6), 80 байт

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

Пітон 3, 107 105 байт

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

Бере інт зі Стдіна


3

MATL , 34 байти

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

Спробуйте в MATL Online!

Пояснення

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 байти

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

Примітка: приклад в Інтернеті містить трохи обгортання як демонстрацію. Розмістіть у виконанні функцію або сценарій PoSH.

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


Ласкаво просимо до PPCG! Приємна перша відповідь, і приємно бачити ще один PowerSheller! Ви можете зберегти пару байтів, використовуючи змінну приріст у циклі - ' '*$i++замість ' '*($n-$_).
AdmBorkBork

3

C, 131 байт

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

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


Де я можу це перевірити?
Ентоні Фам

Посилання @AnthonyPham Tio додано.
Steadybox

Хороший підхід з використанням ширини printf для заповнення пробілів. Ви можете зберегти ще 9 байт, якщо створити макрос для printf, видаліть перший i = 0 і додайте нову змінну j замість повторної ініціалізації i до 0 під час другого запуску: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 Спасибі, але тоді функція дала б правильний вихід лише тоді, коли він викликається вперше, і IIRC, що суперечить правилам тут. Функція повинна працювати незалежно від того, скільки разів вона називається.
Steadybox

@Steadybox о, бачу, вибачте за це. Чи це стосується всіх питань кодогольфа? Дивлячись тільки на це конкретне питання, не здається, що він хоче кілька входів.
Клавдіу

2

Піт, 44 байт

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

Спробуй це!

пояснення

Код складається з 3 частин:

+" "*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 байти

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

Програма бере ціле число від STDIN і повертає коштовність у STDOUT.


2

Піп , 43 байти

42 байти коду, +1 для -nпрапора.

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

Вводиться як аргумент командного рядка. Спробуйте в Інтернеті!

Пояснення

Побудуйте перші два рядки окремо, потім решту коштовності за допомогою операції з картою:

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)

Ще одне рішення

Також 42 + 1 байт, на цей раз із -lпрапором:

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

ТІО



2

C, 115 байт

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

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

C, 123 байти

Хоча виклик цього не вимагає, за рахунок 8 байт функцію можна зробити багаторазовою (перше рішення економить 8 байт, спираючись на неявну ініціалізацію глобальних змінних).

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

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


2

Пакетна, 152 байти

@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

Тести:

n = 1
 __
/  \
\  /
 \/

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

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

Мені знадобиться тестовий набір, щоб перевірити це.
Ентоні Фам

2

C #, 187 байт

Я впевнений, що є більш компактне рішення, але це моя перша спроба:

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

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


Мені знадобиться тестовий набір, щоб перевірити це.
Ентоні Фам



1

Perl 5 109 94 + 1 (для прапора -p) = 95 байт

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

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

Можна запустити так:

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

Безумовно

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

Пояснення

#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

Мені знадобиться тестовий набір, щоб перевірити це, оскільки не всі цілком розуміють чи мають змогу це виконати так, як ви заявили
Ентоні Фам

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