Вырежьте несколько драгоценных камней 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?
Шон Бебберс

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 Да и да :)
Аднан

27
Lol, вы сделали алмазы из угля!
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)). Воспользовавшись е-струнами.
Бен Франкель

Я почти уверен, что у repl.it есть набор тестов для Python 3
Энтони Фам

@AnthonyPham repl.it и TryItOnline используют Python 3.5, я проверил
math

Вау, наконец-то! Интересно, что так долго занимало 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

@ 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

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

Принимает int от Stdin


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

@Claudiu Спасибо, но тогда функция выдаст корректный вывод только при первом вызове, а IIRC здесь противоречит правилам. Функция должна работать независимо от того, сколько раз она вызывается.
Steadybox

@Steadybox о, я вижу, извините за это. Это относится ко всем вопросам Codegolf? Глядя только на этот конкретный вопрос, не кажется, что он хочет нескольких входов.
Клаудиу

2

Pyth, 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

TIO



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

Ungolfed

$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.