Намалюйте великий ASCII X


20

Проблема

Натхненний попереднім викликом робити щось подібне

З урахуванням позитивного цілого введення nвиведіть форму, що відповідає цій схемі:

вхід n=1:

* *
 *
* *

вхід n=2:

**  **
 ****
  **
 ****
**  **

вхід n=3:

***   ***
 *** ***
  *****
   ***
  *****
 *** ***
***   ***

і так далі...

Він має такі властивості:

n*2+1 лінії високі

"руки" nширокі, за винятком випадків, коли вони зливаються

центральна лінія nширока

якщо nрівні лінії вище і нижче центру n*2широкі

якщо nнепарні лінії над і внизу від центру n*2-1широкі

Правила

  • Приймаються нові рядки
  • Застосовуються стандартні лазівки
  • Виграють найкоротші байти
  • Вихідним може бути друк або рядок або масив рядків

Правки

  • n=0 не потрібно обробляти
  • Дозволені пробіли

2
Чи добре, якщо вихід має 1замість місця, *а 0не пробіл?
JungHwan Min

Чи можна наші зразки індексувати 0?
Leaky Nun

@JungHwanMin Я дозволю це, але тоді вам заборонено перемагати, можливо, ви будете коливатися, якщо ви найбільше прихильні.
LiefdeWen

@LeakyNun 0 Індексовано добре
LiefdeWen

Відповіді:


9

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

Завдяки @ErikTheOutgolfer за байт

FN«PX⁺*×*Iθ→

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

Це моя перша в історії відповідь деревного вугілля, і я майже впевнений, що це не так добре, як могло б бути, але я подумав, що десь почну.

 FN«            # For input() (i in range(0,input()))
     P           # Print
       X          # In an 'X' shape
        ⁺*×*Iθ   # '*'+'*'*int(first_input)
               →  # Move the cursor right one


@EriktheOutgolfer Я знав, що повинен бути спосіб це зробити! Дякую!
nmjcman101

І так, це насправді здається таким самим гольф, як це може бути.
Ерік Аутгольфер

@EriktheOutgolfer Це було раніше, ніж ти все-таки
зібрався

1
@thomasrutter Charcoal має власну кодову сторінку з 256 байтами , де кожен із цих символів - 1 байт. Тому він не закодований в ASCII, де деякі з цих символів дійсно були б декількома байтами. nmjcman101 +1 btw. Спробував свою першу відповідь з деревним вугіллям також вчора, але насправді це не вийшло за кілька хвилин, які я мав перед тим, як піти додому з роботи. Так ти мене до цього побив. Я дізнався деякі речі з вашої відповіді, тому дякую за це.
Кевін Кройсейсен

13

MATL , 16 байт

EQXyG:Y+tP+g42*c

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

Пояснення

Розглянемо вклад 2як приклад. Вміст стеку показано нижче.

EQ    % Implicitly input n. Push 2*n+1
      %   STACK: 5
Xy    % Identity matrix of that size
      %   STACK: [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]
G:    % Push [1 2 ... n]
      %   STACK: [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],
                 [1 2]
Y+    % 2D convolution, extending size
      %   STACK: [1 2 0 0 0 0;
                  0 1 2 0 0 0;
                  0 0 1 2 0 0;
                  0 0 0 1 2 0;
                  0 0 0 0 1 2]
tP+   % Duplicate, flip vertically, add
      %   STACK: [1 2 0 0 2 1;
                  0 1 2 1 2 0;
                  0 0 1 4 0 0;
                  0 1 2 1 2 0;
                  1 2 0 0 1 2]
g     % Convert to logical
      %   STACK: [1 1 0 0 1 1;
                  0 1 1 1 1 0;
                  0 0 1 1 0 0;
                  0 1 1 1 1 0;
                  1 1 0 0 1 1]
42*   % Multiply by 42.
      %   STACK: [42 42  0  0 42 42;
                   0 42 42 42 42  0;
                   0  0 42 42  0  0;
                   0 42 42 42 42  0;
                  42 42  0  0 42 42]
c     % Convert to char. Char 42 is '*'. Char 0 is displayed as space
      %   STACK: ['**  **';
                  ' **** ';
                  '  **  ';
                  ' **** ';
                  '**  **']

Ти швидший за мене ...
Лина монашка

@LeakyNun Дуже рідко :-)
Луїс Мендо

Я б хотів, щоб у Джеллі було 2D згортки ... Я повинен був додати 0 у кожному рядку, а потім застосувати векторизовану суму ...
Leaky Nun


1
@LuisMendo В моєму серці ти переможець у використанні згортки, повертає такі приємні спогади.
LiefdeWen

9

Желе , 15 байт

Ḥ‘Ḷ⁶ẋ;€”*ẋ$»Ṛ$Y

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


Дуже хороша. На 8 байт мені менше.
Leaky Nun

@LeakyNun Відвертий підхід допомагає небагато.
Ерік Аутгольфер

Дуже приємний підхід
Джонатан Аллан

@JonathanAllan Так, особливо tfw ви дізнаєтеся »векторизовані ...
Ерік the Outgolfer

1
Мені дуже подобається ваше ім'я користувача! Але я б хотів, щоб ти використав "vi" або "vim", щоб ти міг вибрати "Ерік король vi" ... (фанат Монті Пітона тут ...)
Олів'є Дулак

4

V , 18 17 байт

Збережено байт завдяки вхідному трюку @ DJMcMayhem.

Àé*ÄJÀälÀñ2ÙÀl2x>

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

Пояснення

Àé*ÄJÀäl

Це вставки [n]*'*'+[n]*' '+[n]*'*'

        Àñ        ' [arg] times
          2Ù      ' Duplicate the current line down twice
            Àl    ' Move right [arg] times
              2x  ' Delete two characters
                > ' Indent this line one space

Кожна ітерація циклу, з якого йде буфер

|**   ***

До

***   ***
 |** ***
***   ***

Де |знаходиться курсор із *під ним


Ого. Ви waaay outgolfed мене. Хороша робота! Кілька порад: Ви можете зробити Àé*ÄJÀälзамість Àá*Àá Àá*, а можете зробити <M-c>, тобто ã(мнемонічне: центр ), щоб перейти до середини рядка, що на байт коротше, ніж Àl. Спробуйте в Інтернеті!
DJMcMayhem

@DJMcMayhem Я намагаюся поговорити з тобою у купі різних місць. Я збираюся вкрасти першу думку, яку я думаю, але <M-c>перерви на більші числа
nmjcman101

3

05AB1E , 18 байт

Å4bS{I·ƒDÂ~„ *èJ,À

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

Пояснення

Приклад для n=2

Å4                   # push a list of 4s with length as the input
                     # STACK: [4,4]
  b                  # convert each to binary
                     # STACK: [100, 100]
   S{                # split into digit list and sort
                     # STACK: [0, 0, 0, 0, 1, 1]
     I·ƒ             # input*2+1 times do
        D            # duplicate top of stack
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
         Â~          # or each item in the duplicate with its reverse
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 1, 1, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
           „ *èJ     # use the resulting binary list to index into the string " *"
                     # 1st iteration: [0, 0, 0, 0, 1, 1], "**  **"
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], " **** "
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], "  **  "
                ,    # print
                 À   # rotate list left

3

V , 23 байти

Àé*ÄJÀälÀñÙãlxx>ñyHæGVp

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

Hexdump:

00000000: c0e9 2ac4 4ac0 e46c c0f1 d9e3 6c78 783e  ..*.J..l....lxx>
00000010: f179 48e6 4756 70                        .yH.GVp

З будь-якої причини цей виклик значно важчий у V, ніж останній. З моменту нашого загального підходу n разів, зробіть "x" тут не спрацює, ми замість цього побудуємо верхню частину X, скопіюємо її і перевернемо, потім з'єднавши дві частини разом.

Пояснення:

Àé*ÄJÀäl                " Insert ('*' * n) + (' ' * n) + ('*' * n) 
                        " The obvious way would be 'Àé*ÀÁ ÀÁ*', but this 
                        " non-obvious way saves us a byte
        Àñ      ñ       " 'n' times:
          Ù             "   Duplicate this line (below us)
           ãl           "   Move to the center of this line
             xx         "   Delete two characters
               >        "   And indent this line with one space.

Виконання відступу в кінці циклу, дозволяє нам скористатися неявними закінченнями . Це також зручно створювати n + 1 рядків, що є точно верхньою половиною "X". Скажімо, вхід був 4. Тоді в цей момент буфер виглядає приблизно так:

****    ****
 ****  ****
  ********
   ******
    ****

І ми на останньому рядку. Тож ми:

                yH      " Copy the whole buffer and move to the first line
                  æG    " Reverse every line
                    Vp  " And paste what we just copied *over* the current
                        " line, deleting it in the process

Я теж робив цю ãxxсправу спочатку, але я думаю, що вона зламається, наприклад, n = 8?
nmjcman101

@ nmjcman101 Ага, ти маєш рацію. Це добре, якщо ви це робите ãl, або якщо ви відступаєте перед центром, проте це насправді не економить жодних байтів. Я не розумію, чому це працює для меншої кількості.
DJMcMayhem

3

C #, 139 130 115 байт

-1 байт, створивши рядок і викликавши WriteLine, таким чином зберігаючи чек на новий рядок.
-6 байт завдяки Кевіну та його майстру техніки гольфу!
-2 байти заміною n*3-nна n*2.
-15 байт після того, як Кевін люб'язно вказав мені в правильному напрямку: я можу просто повернути рядок замість того, щоб надрукувати її, таким чином зберегти виклик System.Console.WriteLine(). І деякі інші поради також ...

n=>{var s="";for(int i,j=0;j<=n*2;j++,s+='\n')for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>=n*2-j?'*':' ';return s;}

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

Безголівки:

class Program
{
    static void Main(string[] args)
    {
        System.Func<int, string> g = n =>
        {
            var s = "";
            for (int i, j = 0; j <= n*2; j++, s += '\n')
                for (i = 0; i < n*3;)
                    s += i >= j & i < j+n | i <= n*3-j-1 & i++ >= n*2-j ? '*' : ' ';
            return s;
        };

        System.Console.Write(f(1));
        System.Console.Write(f(2));
        System.Console.Write(f(3));
        System.Console.Write(f(5));
        System.Console.Write(f(8));

        System.Console.ReadKey();
    }
}

Він просто ітералізує уздовж рядків і стовпців місця, необхідного для друку великого X, і друкує або a, '*'або ' 'залежно від умови.


1
+1! Деякі дрібниці для гольфу. У цьому випадку все &&може бути &і ||може бути |. for(int j=0;можна, for(int j=0,i;і тоді ви можете зняти int передню частину iу внутрішній петлі. Крім того, після першої зміни &і |, ви також можете видалити i++внутрішню петлю for і змінити i==n*3-1?...на i++==n*3-1?....
Kevin Cruijssen

@KevinCruijssen дуже дякую! Я змінив внутрішній цикл і тепер створюю рядок, щоб я міг зателефонувати WriteLine, зберіг лише 1 байт. Тож зараз я не впевнений, що робити з вашою останньою порадою.
Чарлі

1
До речі, чому System.Console.WriteLine? Повернення рядка: n=>{string s="";for(int i,j=0;j<n*2+1;j++,s+="\n")for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>n*2-j-1?'*':' ';return s;}коротше [ 120 байт ] (а також позбавляється від дужок, помістивши все всередину for-loop. Ось TIO-посилання, щоб показати, що це працює. Також сміливо додайте це (або своє власне) TIO-посилання на вашу відповідь. :)
Кевін Круїйсен

1
@KevinCruijssen Я не знав, що TIO може обробляти код C #! Я додав WriteLineу код, тому що ОП попросив вивести великий X, а не просто повернути його, тому я відчув, що вихід X (шляхом виклику WriteLineметоду) повинен бути частиною коду. Тим не менш, я досі не звик до правил коду-гольфу, і не знаю, які ліцензії я можу взяти під час написання коду. Я щойно бачив, що деякі інші відповіді тут друкують X у коді, а деякі інші - у нижньому колонтитулі. Який у цьому випадку справедливий підхід?
Чарлі

1
Зазвичай повернення рядка, а також використання функції замість програми дозволяється за замовчуванням, якщо не вказано інше. Крім того, у запитанні зазначено " Вихід може бути роздрукований або рядок або масив рядків ", тому повернення рядка дозволено. :) О, і одне останнє, що можна пограти в гольф: j<n*2+1можна j<=n*2. Я також створив порт Вашої відповіді Java 8 з тим самим підрахунком байтів, звичайно, зараховуючи вашу дивовижну відповідь.
Кевін Кройсейсен



2

MATLAB, 153 126 байт (17,6% ↓)

Завдяки @ коментар LuisMendo, в функції disp()може виводити символи без одинарних лапок, таким чином , я міг би запобігти використанню fprintfзformats і пропустити кілька байт. Крім того, його коментар нагадує мені, що мені потрібно використовувати char(32)простір, а не char(0)(null).

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=10
disp([a+32 ''])

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

MATLAB, 153 байти

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1 
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=42
fprintf([repmat('%c',1,c),'\n'],char(a)')

Приклад результату: n = 10

**********          **********
 **********        ********** 
  **********      **********  
   **********    **********   
    **********  **********    
     ********************     
      ******************      
       ****************       
        **************        
         ************         
          **********          
         ************         
        **************        
       ****************       
      ******************      
     ********************     
    **********  **********    
   **********    **********   
  **********      **********  
 **********        ********** 
**********          **********

2

Пітон 2 , 93 90 89 83 байт

-3 байти завдяки Leaky Nun
-1 байт завдяки Zachary T
-6 байт завдяки xnor

n=input()
x=n*'*'+n*'  '
exec"print`map(max,x,x[::-1])`[2::5];x=' '+x[:-1];"*(n-~n)

[Спробуйте в Інтернеті!] [TIO-j3xwsktf]

Починається з рядка, як '*** 'для n=3, застосовуючи map/maxдля вибору *пробілів для кожної позиції, потім додайте пробіл та видаліть останній символ із рядка та зробіть це все заново.



Ви не можете замінити n*2*' 'їх n*' '?
Zacharý

map(maxМоже бути зроблено безпосередньо без zip. Також, n*2+1є n-~n.
xnor

1

Haskell , 70 байт

f n=[[last$' ':['*'|y<-[1..n],(c-n-y)^2==r^2]|c<-[1..3*n]]|r<-[-n..n]]

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

Виводить список рядків.

Для кожного положення рядка r, стовпця cвикористовується формула, щоб визначити, чи потрапляє вона в одну з двох діагональних смуг, і так *.



1

Javascript (ES2017), 155 157 байт

n=>[...e=[...Array(n+1)].map((a,i)=>[...d=((b=''.padEnd(n))[c='slice'](i)+'*'.repeat(n)+b[c](0,i))[c](n/2)].reverse().join``+d[c](n%1)),...e.reverse()[c](1)]

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

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

n=5
['*****     *****',
 ' *****   ***** ',
 '  ***** *****  ',
 '   *********   ',
 '    *******    ',
 '     *****     ',
 '    *******    ',
 '   *********   ',
 '  ***** *****  ',
 ' *****   ***** ',
 '*****     *****']

Безумовно

n => {
  e = [...Array(n+1)].map((a, i) => {   // Create and iterate over array with n+1 elements
    b = ''.padEnd(n)                    // String of n spaces
    d = (b.slice(i) + '*'.repeat(n) + b.slice(0, i)).slice(n/2) // Create row string
    return [...d].reverse().join`` + d.slice(1) // Mirror and combine row horizontally
  })
  return [...e,...e.reverse().slice(1)] // Mirror and combine vertically
}

Квадрант

n=5
   *****
  ***** 
 *****  
*****   
****    
***     

Дзеркальне відображення по горизонталі

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     

Дзеркальний вертикально

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     
    *******    
   *********   
  ***** *****  
 *****   ***** 
*****     *****

Це дає неправильний вихід для рівного n- центральна лінія не є nширокою.
Ніл

0

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

T=Table;(a=Join[T[T["*",i],{i,(n=#)+2,2n,2}],T[Join[t=T["*",n],T[" ",y],t],{y,1,n,2}]];Column[Row/@Join[Reverse@a,{T["*",n]},a],Alignment->Center])&

0

R, 102 байти

Код:

n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)

Тест:

> n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)
1: 10
2: 
Read 1 item
**********          **********
 **********        ********** 
  **********      **********  
   **********    **********   
    **********  **********    
     ********************     
      ******************      
       ****************       
        **************        
         ************         
          **********          
         ************         
        **************        
       ****************       
      ******************      
     ********************     
    **********  **********    
   **********    **********   
  **********      **********  
 **********        ********** 
**********          **********

0

CJam, 24 байти

{:T2*){S*T'**+}%_W%..e>}

Це блок, який бере число з стека і виводить список рядків до стеку.

Пояснення:

{                        e# Stack:           | 2
 :T                      e# Store in T:      | 2, T=2
   2*                    e# Multiply by 2:   | 4
     )                   e# Increment:       | 5
      {                  e# Map over range:  | [0
       S                 e#   Push space:    | [0 " "
        *                e#   Repeat string: | [""
         T               e#   Push T:        | ["" 2
          '*             e#   Push char '*': | ["" 2 '*
            *            e#   Repeat char:   | ["" "**"
             +           e#   Concatenate:   | ["**"
              }%         e# End:             | ["**" " **" "  **" "   **" "    **"]
                _        e# Duplicate:       | ["**" " **" "  **" "   **" "    **"] ["**" " **" "  **" "   **" "    **"]
                 W%      e# Reverse:         | ["**" " **" "  **" "   **" "    **"] ["    **" "   **" "  **" " **" "**"]
                   ..e>  e# Overlay:         | ["**  **" " ****" "  **" " ****" "**  **"]
                       } e# End

0

Python 2 , 110 байт

x=a=0
n=c=input()
while x<2*n+1:
    print ' '*a+'*'*n+' '*c+'*'*(2*n-2*a-c)
    x+=1
    a=n-abs(n-x)
    c=max(0, n-2*a)

Ця програма розбиває кожен рядок на 4 частини: перші пробіли, перші зірки, другі пробіли, а потім другі зірки. Для кожної горизонтальної лінії X він обчислює, скільки зірок або пробілів потрібно для кожного з 4 ділянок рядка, потім будує та друкує цей рядок.


0

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

.+
 $&$* $&$* $&
 
$`#$'¶
¶\d+$

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1
( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3
+` (# +#)
$1 
+` #...
#
##

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

.+
 $&$* $&$* $&

Додайте 2n + 1 пробіли перед вхідним значенням (по одному для кожного вихідного рядка).

$`#$'¶

Замініть кожен пробіл на а #та збирайте результати. Це дає діагональну лінію #s, пробіл з обох сторін, з введеним значенням суфіксом.

¶\d+$

Видаліть початкове вхідне значення, оскільки тепер у кожного рядка є копія.

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1

Створіть дві діагональні лінії n *s із розділовим стовпчиком nпробілів, загорнутим у пару #s.

( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3

На тих лініях, де *s ближче до середини, поміняйте дві половинки навколо. Це надає зовнішній вигляд, що нагадує > | | <.

+` (# +#)
$1 

Перемістіть | |s якомога далі вліво, надаючи свого роду >> > <зовнішній вигляд.

+` #...
#

Для кожного проміжку між #s видаліть три наступні символи. Це приєднується > <до X.

##

Видаліть зайві #с.

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