Намалюйте велику косу рису X


21

Враховуючи невід'ємне ціле число, роздрукуйте Xтаке велике. X- це вихід для введення 0, і ви додасте косої риски, що дорівнює вводу в кожному напрямку, щоб розширити Xдля великих входів.

Випробування

0

X

1

\ /
 X
/ \

2

\   /
 \ /
  X
 / \
/   \

...

10

\                   /
 \                 /
  \               /
   \             /
    \           /
     \         /
      \       /
       \     /
        \   /
         \ /
          X
         / \
        /   \
       /     \
      /       \
     /         \
    /           \
   /             \
  /               \
 /                 \
/                   \

Правила

Ви можете або надрукувати вихід, або повернути рядок або список рядків з функції. Дозвільна нова лінія, а також додаткові внутрішні пробіли, які не впливають на появу, дозволені.

Це , тому найкоротша відповідь у байтах виграє!



6
... Я просто зачекаю рішення на байті 1-байтного вугілля.
Leaky Nun

@LeakyNun Я був би здивований, якщо деревне вугілля може легко впоратися з Xсерединою (частина чому я його додав), але хто знає: D
Стівен


Відповіді:


6

Полотно , 3 байти

╵\┼

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

половина розміру відповіді Деревне вугілля: D

╵    increment the input
 \   create a diagonal that long
  ┼  and quad-palindromize, mirroring what's required, with 1 overlap;
     This overlaps the `/` and `\`, resulting in `X`

Данг, який короткий.
ділнан

: ||||||| +1 для гольфізму
лише

також мені цікаво, чи мови на основі стека в основному завжди перевершують інші мови?
Лише ASCII

@ ASCII лише желе
Оккс

@Okx * на основі стека / мовчазно
лише для ASCII

22

Вугілля деревне , 6 байт

PX⁺¹NX

Ваші дурниці мене не зупиняють;)

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


2
TIO виглядає ... цікаво, коли ви вкладаєте в нього дійсно велику кількість
Стівен

@StephenS Тільки через обгортання.
Okx

Я знаю, просто інтуїтивно зрозуміло, що всі загорнуті `вирівнюються ліворуч (оскільки пробіли не загортаються)
Стівен

5 символів (виклик після публікації), щоб трохи наблизитися до Canvas
лише для ASCII

16

JavaScript (ES6), 79 байт

Використовує рекурсивну функцію g, яка проходить через сітку і будує вихідний символ за символом.

n=>(g=x=>`/\\ X
`[~x?x-y?x+y-w&&2:x-n?1:3:4]+(~y?g(~x--?x:y--&&w):''))(y=w=n*2)

Як?

Обидві змінні x і y повторюють від 2n до -1 , де n - вхід.

Для кожної позиції (x, y) в сітці ми вибираємо одного з цих символів:

  • 0: /
  • 1: \
  • 2: простір
  • 3: X
  • 4: новий рядок

використовуючи наступні тести:

  • ~x: Falsy, якщо x == -1 : ми досягли кінця рядка.
  • x-y: Falsy, якщо x == y : ми знаходимося на антидіагоналі.
  • x+y-w: Falsy, якщо x + y == w : ми знаходимося по діагоналі.
  • x-n: Неправдиво, якщо x == n : оскільки цей тест виконується лише тоді, коли x == y , це означає, що ми розташовані в точному центрі сітки.

та наступне дерево рішень:

decision tree

Демо


4
Це ... JavaScript? Що сталося з тобою, старий друже.
roberrrt-s

13

MATL , 16 байт

'\/X 'iEQXytEP+)

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

Розглянемо вклад 2як приклад. Стек показаний тут догори дном, тобто нижчі елементи - це ті, які останнім часом висуваються.

'\/X '  % Push this string
        %   STACK: '\/X '
iEQ     % Input a number, n. Multiply by 2, add 1: gives 2*n+1
        %   STACK: '\/X '
                   5
Xy      % Identity matrix of that size
        %   STACK: '\/X '
                   [1 0 0 0 0;
                    0 1 0 0 0;
                    0 0 1 0 0;
                    0 0 0 1 0;
                    0 0 0 0 1]
tEP     % Duplicate, multiply each entry by 2, flip vertically
        %   STACK: '\/X '
                   [1 0 0 0 0;
                    0 1 0 0 0;
                    0 0 1 0 0;
                    0 0 0 1 0;
                    0 0 0 0 1]
                   [0 0 0 0 2;
                    0 0 0 2 0;
                    0 0 2 0 0;
                    0 2 0 0 0;
                    2 0 0 0 0]
+       % Add the two matrices
        %   STACK: '\/X '
                   [1 0 0 0 2;
                    0 1 0 2 0;
                    0 0 3 0 0;
                    0 2 0 1 0;
                    2 0 0 0 1]
)       % Index into the string. Indexing is 1-based and modular, so 1 picks
        % the first character ('\'), ..., 0 picks the last (space)
        %   STACK: ['\   /';
                    ' \ / ';
                    '  X  ';
                    ' / \ ';
                    '/   \']
        % Implicit display

Я хотів зробити щось подібне в Октаві, але ти перебив мене до цього, і в MATL це навіть коротше, ніж Октава, така велика робота!
Міхтан

@Michthan Дякую! Версію Octave, безумовно, варто також опублікувати. Моя атемпація становить 38 байт, що у вас?
Луїс Мендо

Я думав про це цілі вихідні і не зміг знайти більш ефективного способу, ніж той, який ви тут використовуєте. Тож усі кредити повинні надходити до вас на октавну версію.
Міхтан

6

C, 108 106 байт

a;g(n){for(int b=2*n,i=1,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);}

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

(−2 гольфу завдяки MD XF)

Він друкує два символи (спочатку, c = 47що є косою рисою, і c + 45яка є зворотною косою рисою; потім вони змінюються місцями) з динамічною шириною поля.

Ширина поля починається з 1та 2n, і при кожній ітерації перша ширина збільшується на 1, а друга зменшується на 2.

Коли ширина другого поля стає 0, вона виводить 'X'і новий рядок замість звичайних символів, і повертає напрямок збільшення ( i). Новий рядок друкується для всіх інших рядків окремо ( puts("")).


106 байт: a,b,i=1,c;g(n){for(b=2*n,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);} Спробуйте в Інтернеті!
MD XF

Дякую за ідею! Я використав лише частину, щоб переконатися, що код можна викликати двічі.
anatolyg

5

shortC , 111 байт

s(x){Wx--)R" ")}j;f(x){O;j<x;j++)s(j),P92),s((x-j)*2-1),R"/\n");s(x);R"X\n");Wj--)s(j),P47),s((x-j)*2-1),R"\\\n

На підставі мого C відповіді . Конверсії:

  • R -> printf(
  • P -> putchar(
  • W -> while(
  • O -> for(
  • Автоматичне вставлення закриття ");}

Для цього також використовуються коди ASCII для \та /.

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



5

C, 168 155 150 байт

-5 завдяки Computronium

#define p printf(
s(x){while(x--)p" ");}j;f(x){for(;j<x;j++)s(j),p"\\"),s((x-j)*2-1),p"/\n");s(x);p"X\n");while(j--)s(j),p"/"),s((x-j)*2-1),p"\\\n");}

Можна, звичайно, гольфу; Я так роблю. Спробуйте в Інтернеті!

Безголівки:

int space(int x)
{
    while (x--)
        putchar(' ');
}

int f(int x)
{
    for (int j = 0; j < x; j++) {
        space(j);
        printf("\\");
        space((x-j)*2-1);
        printf("/\n");
    }

    space(x);
    puts("X");

    while (j--) {
        space(j);
        putchar('/');
        space((x-j)*2-1);
        printf("\\\n");
    }
}

2
Ви можете втратити 5 символів, визначивши p на "printf (" замість "printf".
Computronium

3

V , 21 байт

éXÀñ>HÄÒ r\Á/YGpr/$r\

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

Hexdump:

00000000: e958 c0f1 3e48 c4d2 2072 5cc1 2f59 4770  .X..>H.. r\./YGp
00000010: 722f 2472 5c                             r/$r\

Пояснення:

éX                      " Insert an 'X'
  Àñ                    " Arg1 times:
    >H                  "   Add a space to every line.
                        "   Conveniently, this also puts us on the first line
      Ä                 "   Duplicate this line
       Ò                "   And replace the whole line with spaces
         r\             "   Replace the first char with '\'
           Á/           "   Append a '/' char
             Y          "   Yank this line
              G         "   Move to the last line
               p        "   And paste the line we yanked
                r/      "   Replace the first character with a '/'
                  $     "   Move to the end of the line
                   r\   "   And replace the last character with a '\'

По суті ми маємо Вставити X, n разів розширити косу рису .

Але це не так просто, тому що нам також доводиться додавати риски в перший раз. Якщо косої риси вже було, ми могли б написати розширення косої риски як:

>HÄX2pGÙX2p

Що врятувало б нам 6 байт.


3

C #, 157 122 120 байт

_=d=>"".PadLeft(d)
a=>{var s=_(a)+"X\n";for(int i=0;++i<=a;)s=$@"{_(a-i)}\{_(i*2-1)}/
{s+_(a-i)}/{_(i*2-1)}\
";return s;}

Негольована версія:

 Func<int, string> _ = (d) =>"".PadLeft(d);
        Func<int, string> func = a => {

            var s = _(a) + "X\n";

            for (int i = 0; ++i <= a;) {

                s = $@"{_(a - i)}\{_(i * 2 - 1)}/
{s + _(a - i)}/{_(i * 2 - 1)}\
";

            }
            return s;
        };

1
Ви можете перемістити іншу анонімну функцію з першої, а потім включити її як _=d=>new string(' ',d);(зауважте, немає необхідності в дужках навколо d). Ви можете зняти фігурні дужки навколо петлі for. Скористайтеся дословним рядком, щоб не потрібно було уникати всіх зворотних нахилів. Якщо ви встановите, i=0ви можете зробити ++i<a+1та видалити i++.
TheLethalCoder

Крім того, що для дослідних рядків вам не потрібно включати \nфактичну стрічку ліній, буде працювати, хоча я не впевнений, чи зможете ви потім зняти дужки навколо циклу for, вам слід спробувати.
TheLethalCoder

1
Після нанесення першого пропозиції щодо TheLethalCoder , ви можете також замінити ++i<a+1на ++i<=a EDIT Ви також можете зберегти більше 4 байта шляхом зміни Funcвід new string(' ',d)до"".PadLeft(d)
auhmaan

Дякую за рекомендації, @TheLethalCoder мені дозволяють оголосити дві функції так, чи не зробить це багато гольфу на C # коротшим, якщо ми можемо це зробити?
LiefdeWen

1
@StefanDelport Десь є мета-дискусія про це, але, як це існує, я вважаю, що ви можете, поки ви покажете ім'я функцій. У цьому випадку _.
TheLethalCoder

3

Математика, 71 байт

(Частково натхненний 104-байтним рішенням Jenny_mathy)

""<>#&/@(#"\\"+Reverse@#"/"&@IdentityMatrix[2#+1]/.{0->" ",a_+_->"X"})&

Повертає список рядків.

Пояснення: IdentityMatrix[2#+1]робить матрицю потрібного розміру з 1s по діагоналі та 0s в іншому місці. Далі, ми множимо його на "\\"(який втік зворотної косої межі), що робить його матриця зі зворотним косою рисою по діагоналі і 0s в інших місцях, так як , звичайно , 1 раз зворотна коса риска є зворотний слеш і 0 раз зворотна коса 0. Додамо , що це "/"час його зворотний зробити форма Х. Ми майже закінчили, за винятком того, що все ще є 0, а середина "\\" + "/". Зафіксуємо ці дві речі, замінивши " "на 0і "X"на a_+_, що відповідає будь-якій сумі двох речей (наприклад , _+_слід, крім Mathematica занадто розумна для свого власного блага , і трактує , що в 2 рази _). Нарешті, ""<>#&/@перетворює це на список рядків.


3

Java (OpenJDK 8) , 135 байт

i->{int k=0,j,l=2*i+1;String[]s=new String[l];for(;k<l;k++)for(s[k]="",j=0;j<l;j++)s[k]+=j==k?j==i?"X":"\\":j==l-1-k?"/":" ";return s;}

Вираз лямбда, який приймає і ціле, і повертає масив Strings

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

Безголівки:

i->{
    int k=0,j,l=2*i+1;                // Some variables to be used
    String[]s=new String[l];            // Return array (size 2*i+1)
    for(;k<l;k++)                       // For each array entry
        for(s[k]="",j=0;j<l;j++)        // Set each character to 
            s[k]+=j==k?j==i?"X":"\\"    // \ or X if it's the jth character of the jth row
                 :j==l-1-k?"/"          // / if it's the opposite char
                 :" ";                  // else blank
    return s;
}

3

T-SQL, 201 байт

DECLARE @ INT SELECT @=a FROM t DECLARE @i INT=@
WHILE @>0BEGIN PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'SET @-=1 END
PRINT SPACE(@i)+'X'WHILE @<@i BEGIN SET @+=1 PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'END

Відформатовано:

DECLARE @ INT 
SELECT @=a FROM t 
DECLARE @i INT=@
WHILE @>0
    BEGIN
        PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'
        SET @-=1 
    END
PRINT SPACE(@i)+'X'
WHILE @<@i 
    BEGIN 
        SET @+=1 
        PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'
    END

Введення здійснюється через колонки а в імені таблиці т , згідно з нашими правилами .


3

Рубін , 66 байт

Рекурсивна функція.

f=->x{?X[x]||"\\#{s=' '*(2*x-1)}/
#{f[x-1].gsub /^/,' '}
/#{s}\\"}

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

Пояснення

f=->x{                  # Start of recursive function named `f`
      ?X[x]||           # Return 'X' if x==0, otherwise the following:
"\\#{s=' '*(2x-1)}/     #  Top edge of the cross. Save no. of spaces needed
#{f[x-1]                #  Get result of f[x-1]
        .gsub /^/,' '}  #  Regex sub to left-pad every line w/ a space
/#{s}\\"                #  Bottom edge of cross (insert saved no. of spaces)

3

Желе , 24 17 байт

Ḥ‘=þ`µḤ+Uị“/\x ”Y

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

Як це працює

Ḥ‘=þ`µḤ+Uị“/\x ”Y   main link, input a
Ḥ‘                  input doubled and incremented
   þ                Make a table: Apply  
  =                 "equals"/ to      
    `               each element in range(2a+1) cartesian multiplied with itself.
                      eg. For input 1: [1=1,1=2,1=3],[2=1,2=2,2=3],[3=1,3=2,3=3]      
     µ              on this array:
       +            add: 
      Ḥ             double of it to
        U           its reverse (changes south-east to north-west)
         ị“/\x ”    index into the string "/\x " to get the right characters
                Y   join by newlines for the final output.

-6 байт завдяки @LeakyNun та -1 байт з додатковим поліпшенням



2

Пакет, 201 байт

@echo off
set s= /
for /l %%i in (2,1,%1)do call set s=  %%s%%
set s=\%s%
for /l %%i in (-%1,1,%1)do call:c
exit/b
:c
echo %s%
set s=%s:\ = \%
set s=%s:X =/\%
set s=%s:\/=X %
set s=%s: /=/ %

Починається зі створення верхнього рядка, потім після друку кожного рядка переміщується \ правий пробіл та /лівий раз пробіл, переконуючись, що вони роблять Xпосередині.



2

Сітківка , 74 байти

.+
$* X
+`^ ( *).( *)
$1\  $2/¶$&
+`¶ ( *).( *).?$
$&¶$1/  $2\
m` (\W)$
$1

Спробуйте в Інтернеті! Пояснення:

.+
$* X

Помістіть X.

+`^ ( *).( *)
$1\  $2/¶$&

Починаючи з X, працюючи вгору, \щоразу кладіть по діагоналі вліво. Помістіть ще /два пробіли після /останнього разу.

+`¶ ( *).( *).?$
$&¶$1/  $2\

Починаючи з X, працюючи вниз, /щоразу кладіть по діагоналі вліво. Помістіть ще \два пробіли після /останнього разу.

m` (\W)$
$1

Кількість пробілів між двома діагоналями має бути непарною, тому останній пробіл у кожному рядку (крім початкового Xрядка) видаляється.


2

Математика, 131 байт

(F[x_,y_]:=Table[x<>StringJoin@Table[" ",i]<>y,{i,1,#*2,2}];Column[Join[Reverse@F["\\","/"],{"X"},F["/","\\"]],Alignment->Center])&


Математика, 104 байти

ось ще один підхід із використанням Grid

(S=DiagonalMatrix[Table["\\",r=2#+1]];Table[S[[r+1-i,0+i]]="/",{i,r}];S[[#+1,#+1]]="X";Grid@S/. 0->" ")&

2

APL (Dyalog) , 25 байт

Потрібно, ⎕IO←0що для багатьох систем за замовчуванням.

' \/X'[(⊢+2×⌽)∘.=⍨⍳1+2×⎕]

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

' \/'[] Індексувати рядок за допомогою

 отримати вхід

 помножте на два

1+ додати одну

 ніж багато цілих чисел

∘.=⍨ таблиця рівності (тобто матриця ідентичності; діагональ NW-SE)

() Застосувати до цього наступну мовчазну функцію

   аргумент

  + плюс

   два рази

   аргумент горизонтального дзеркального відображення (тобто діагоналі NE-SW)


2

Баш , 138 байт

for i in `seq $1;seq $[$1-1] -1 1`
{ $[a++]
printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`
}|sed 's/22/X/'|tr 12 /\\

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

Дійсно довгий, нагрівальний пристрій "\ і /"

Менше гольфу

 for i in {1..10} {9..1};{
   $[a++];                      #argument as padding, prints 1 for \ and 2 for /
   printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`;
  }|sed 's/22/X/g' | tr 12 /\\



1

Perl 5, 110 + 1 = 111 байт

Використовує -nпрапор.

$x=$_;$,="\n";push@x,$"x($x-$_)."\\".$"x(2*--$_+1)."/"while$_>0;say@x,$"x$x."x";for(reverse@x){y!\\/!/\\!;say}

1

QBIC , 90 байт

~b=0|?@X`\[0,:-1|X=space$(a)┘Z=Z+X+@\`+space$((b-a)*2-1)+@/`+X+@┘`]Z=Z+space$(b)+A+_fZ

Як працює ця жахливість, залишається читачем як вправа ...

Вибірка зразка:

Command line: 3
\     /
 \   / 
  \ /  
   X
  / \  
 /   \ 
/     \

1

Visual Basic.Net , 454 450 байт

Option Strict Off
module m
sub main(a As String())
dim v=Convert.toInt32(a(0))
for i as Integer=v to 1 step -1
for j as Object=1 to v-i
w(" ")
next
w("\")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("/")
next
console.writeline(new String(" ",v)&"X")
for i as Object=1 to v
for j as Object=1 to v-i
w(" ")
next
w("/")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("\")
next
end sub
sub w(s)
console.write(s)
end Sub
end module

не впевнене в тому , що робить з FUNC для writelineзаощадять кілька байт завдяки Стівену S для вказівки на as ...видаленні також змінилися integerв object останнє редагування змінило першу один назад


Ви хоробрий :) Я вважаю, що ви можете видалити все as Types, тому що, якщо у вас є Option Strict Off, VB.NET діє як мова, що не вводиться.
Стівен

Наразі на Linux моно - анонім
polyglotrealIknow

моно не піклується про Варіант Строгий, або, принаймні, те, що я думаю
polyglotrealIknow

О, здавалося, functionщо ! = for loops Спасибі за гольф
polyglotrealIknow

Не Option Strictвимкнено за замовчуванням? Принаймні, це у Visual Studio
Стівен

1

05AB1E , 22 байти

F'\IN-úR.∞})Âí'Xs)˜.c»

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

Пояснення

F                        # for N in [0...input-1] do
 '\                      # push a backslash
   IN-ú                  # prepend input-N spaces
       R                 # reverse
        .∞               # mirror
          }              # end loop
           )             # wrap stack in a list
            Â            # bifurcate
             í           # reverse each item
              'Xs        # push an "X" between the 2 lists on the stack
                 )˜      # wrap in flattened list
                   .c    # pad lines to equal length
                     »   # join on newlines

Альтернативний 22-байтний розчин

F'\N·>ú'/ì})Âí'X¸«ì.c»


1

tcl, 134

proc P {x s b} {time {puts [format %[incr ::i $x]s%[expr ($::n-$::i)*2+2]s $s $b]} $::n}
P 1 \\ /
puts [format %[incr i]s X]
P -1 / \\

демонстрація

Поставте nна перший рядок.

Можливо, я можу більше пограти, використовуючи рекурсивний підхід


1

R , 75 72 байти

y=diag(b<-2*scan()+1);write(c(" ",'\\','/','X')[y+2*y[,b:1]+1],'',b,,'')

Натхненний цією відповіддю , генерує неявну матрицю і записує її в stdout; зчитує розмір зі stdin. Він повинен створити матрицю символів простору та використовує sep=''b / c, інакше у нього проблеми з інтервалом.

diag(b)                     # generates a main diagonal of 1, rest 0
2*diag(b)[,b:1]             # the other diagonal is 2
                            # [,b:1] reverses columns
                            # [b:1,] reverses the rows; they're equivalent
diag(b)+2*diag(b)[,b:1]     # sums, so we get 1 for main diagonal
                            # 2 for other diagonal, 3 for center
diag(b)+2*diag(b)[,b:1]+1   # add 1 since R is 1-indexed
                            # the result is indices for the vector
c(' ','\\','/','X')

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

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