Роздрукуйте кубичну сітку заданого розміру


26

Виклик

Враховуючи розмір s, надрукуйте сітку куба такого розміру з хеш-символів ( #) та пробілів ( ).

Приклади:

1:
  #
# # #    
  #
  #

2:
    # #
    # #
# # # # # #
# # # # # #
    # #
    # #
    # #
    # #

3:
      # # #
      # # #
      # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
      # # #
      # # #
      # # #
      # # #
      # # #
      # # #

Насправді сітка може бути будь-якою дійсною кубиковою сіткою, яку можна скласти в куб, наприклад такі:

    # #
    # #
# # # # # # # #
# # # # # # # #
    # #
    # #

    # # # #
    # # # #
    # #
    # #
    # #
    # #
# # # #
# # # #

Правила

  • Отримана сітка повинна бути геометрично дійсною (складною в куб)
  • Стандартні лазівки заборонені
  • Уважно читайте правила
  • Це , найкоротший виграш відповіді, але не буде обраний

1
Чи можуть бути провідні / відстані пробіли / нові рядки?
Kritixi Lithos

@KritixiLithos Так
dkudriavtsev

13
Для довідки, всі 11 куб сіток .
xnor

3
Що робити, якщо я ретельно не читаю правила?
steenbergh

1
@steenbergh Тоді ваше рішення недійсне
dkudriavtsev

Відповіді:


23

Python 2, 47 байт

n=input()
for c in 1,4,1:exec"print'# '*c*n;"*n

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

Друкує цю мережу, вибрану за те, що вона обгрунтована ліворуч:

# # 
# # 
# # # # # # # # 
# # # # # # # # 
# # 
# # 

У рядках є nабо 4*nкопії '# '. Для кожного з них 1,4,1ми друкуємо nраз стільки копій, скільки nразів робимо для nрядків. Мати execцикл всередині forциклу здається марним, але я не бачив кращого.

Я випробував альтернативи:

lambda n:('# '*n*3+'\n')*n+('  '*n+'# '*n+'\n')*3*n

lambda n:('# '*n*3+'\n')*n+(' '*4*n+'# '*n*3+'\n')*n

def f(n):
 for c in[3]*n+[1]*3*n:print('# '*c*n).center(6*n)

def f(n):
 for c in[4]*n+[0]*n:print' '*c*n+'# '*n*3

def f(n):
 for c in[1]*n+[4]*n+[1]*n:print'# '*c*n

def f(n):
 c=1;exec("print'# '*c*n;"*n+"c^=5;"*n)*3

def f(n):
 for i in range(3*n):print'# '*[1,4,1][i/n]*n

def f(n):
 for c in 1,4,1:print('# '*c*n+'\n')*n,

def f(n):
 for c in 1,4,1:exec"print'# '*c*n;"*n

(Усі програми defможуть бути коротшими як програма.)


8

Октава, 58 44 42 32 байт

@(n)[z=repmat('# ',n);z,z,z,z;z]

частково надихнув відповідь пітона @xnor.

z=repmat('# ',n);

створює схему squre '#' для введення 2 результатів таку схему:

# #             
# # 

y=[z,z,z,z];

чотири zs з'єднані горизонтально:

# # # # # # # # 
# # # # # # # # 

[z;y;z]

zі yі zзчіплюються вертикально

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

# #             
# #             
# # # # # # # # 
# # # # # # # # 
# #             
# #             

Попередня відповідь:

@(n){h(1:n,1:2:n*6)=1;h(1:n*4,n*2+1:2:4*n)=1;' #'(h+1)}{3}

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

Створює Т-образну форму

# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      

6

Математика, 77 60 52 байти

Дякуємо Мартіну Ендеру за те, що гольф на 8 байтах!

{±s_:=s~Table~#;b=±{a=±"# ","
"},±{a,a,a,a,"
"}}<>b&

Безіменна функція, що приймає позитивний цілий аргумент #і повертає рядок з новими рядками (включаючи зворотний новий рядок); у кожному рядку також є пробіл. Спочатку ми визначаємо ±як функцію, яка повторює свої вхідні #часи; то aвизначається як ±"# "(це #символ, а не вхід!), а з цього bвизначається набір #коротких ліній, а ±{a,a,a,a}<>nнабір #довгих рядків. (В обох випадках між відповідними лапками є пряма передача <>bрядків .) Кінцевий зв'язує отриманий список рядків з другою копією набору коротких рядків. Приклад виведення, коли #=2(відповідь xnor навчив мене, що ця орієнтація є гравцем):

# #     
# #     
# # # # # # # # 
# # # # # # # # 
# #     
# #     

Попередня версія цієї реалізації:

""<>(±s_:=s&~Array~#;{b=±{a=±"# ",n="\n"},±{a,a,a,a}<>n,b})&

Оригінальне подання:

""<>If[(m=n~Mod~t)==0,"\n",If[n<t#||#<m<=2#,"# ","  "]]~Table~{n,4(t=3#+1)#}&

Створює рядок відмови від 4*(3#+1)частини, кожна з яких є або "# ", " "або "\n"; просто обчислює, які частини використовувати на основі індексу n. Приклад виведення, коли #=2:

# # # # # # 
# # # # # # 
    # #     
    # #     
    # #     
    # #     
    # #     
    # #     

5

JavaScript (ES6), 59 байт

f=
n=>`141`.replace(/./g,m=>`${`# `.repeat(n*m)}\n`.repeat(n))
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Вихідні дані містять пробіл у кінці кожного рядка та кінцевий новий рядок.


5

Рубін, 36 байт

f=->n{puts (t=[s="# "*n]*n)+[s*4]*n+t}

Використання:

f=->n{puts (t=[s="# "*n]*n)+[s*4]*n+t}
f[3]
# # #
# # #
# # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # #
# # #
# # #

Рубін, 38 байт

У Рубі ця форма довша, але, мабуть, є деякі мови, де вона коротша.

->n{puts [s="# "*n*3]*n+[" "*n*4+s]*n}

Використання:

g=->n{puts [s="# "*n*3]*n+[" "*n*4+s]*n}
g[3]
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
            # # # # # # # # #
            # # # # # # # # #
            # # # # # # # # #

Обидва відповіді можуть бути коротшими, якщо дозволено повертати (бажано) масив рядків або (менш бажано) одну рядок замість друку.


Повернення рядка вважається допустимою формою виводу.
dkudriavtsev


4

JavaScript (ES6), 71

n=>((z='# '[R='repeat'](n))[R](3)+`
`)[R](n)+('  '[R](n)+z+`
`)[R](n*3)

Тест

f=
n=>((z='# '[R='repeat'](n))[R](3)+`
`)[R](n)+('  '[R](n)+z+`
`)[R](n*3)

function update() {
  O.textContent=f(I.value)
}

update()
<input id=I type=number value=3 oninput='update()'><pre id=O></pre>


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

@KritixiLithos uh, це зрозуміло. Дякуємо
edc65


4

V , 24 23 20 18 20 байт

Ài# ddÀpLyGïp3PGïp

З усіма показаними прихованими символами

Ài# ^[ddÀp^VLyGïp3PGoïp

^[є 0x1b(літер утечі символу) і ^Vє 0x16( C-v)

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

Мені довелося збільшити кількість рахунків, тому що Äкоманда баггі в цій новій V тязі

Виходи у такому форматі:

# 
# # # # 
# 

з провідним новим рядком

Hexdump:

00000000: c069 2320 1b64 64c0 7016 4c79 47ef 7033  .i# .dd.p.LyG.p3
00000010: 5047 ef70                                PG.p

Пояснення

Ài# ^[              " Argument times insert "# "
ddÀp                " Argument times duplicate line

Тепер, коли одне обличчя мережі завершено, ми повинні створити сітку

^VLy                " Copy the face
Gïp                 " Paste it at the end of buffer
3P                  " Paste 3 times (these form the line)
Gïp                 " Paste at end of buffer again

Альтернативне рішення, якщо ми не виводимо пробіли:

21 20 18 16 18 байт

Àé#ddÀpLyGïp3pGïp

(з тієї ж причини, що і в головному рішенні, ця посилання TIO змінена)

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


4

V , 14 байт (не конкуруючий)

Ài# 5Ù4JjòÀÄk

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

00000000: c069 2320 1b35 d934 4a6a f2c0 c46b       .i# .5.4Jj...k

З будь-якої причини цей виклик виявив численні помилки. Тепер, коли вони все виправлено, ця версія, на жаль, є неконкурентоспроможною, але приємно бачити, як має виглядати відповідь V на цей виклик, коли не потрібно додавати тонни байтів, щоб не відставати від мого неохайного кодування.

Пояснення:

À                   " Arg 1 times:
 i# <esc>           "   Insert the string "# "
         5Ù         " Make 5 copies of this line, and put the cursor on the second copy
           4J       " Join four of these lines together
             j      " Move down to the last line
              ò     " Recursively:
               ÀÄ   "   Make Arg 1 copies of this line
                 k  "   And move up a line

Справедливості, Jпроблема кодування AFAIK не була неохайною, я вважаю, що це просто nvim за замовчуванням?
nmjcman101

Так, це правда. Але оператор-дублікат напевно був неохайним. На щастя, ця нова версія набагато простіша.
DJMcMayhem

4

Желе , 20 19 байт

”#xẋ³Wẋ³K€Y
141DÇ€Y

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

-1 завдяки 44874 (Стінберг).

Я НЕ МОЖУ ВІДХОДИТИ МУДІФІШУ!

Це гольф ??? 20 19 байт просто здається занадто великим , бачачи посилання 1.

Пояснення:

”#xẋ³Wẋ³K€Y Helper link. Arguments: z
”#          Character #.
            y (implicit)
  x         Repeat each element of y x times.
    ³       1st command-line argument.
   ẋ        Repeat x y times.
     W      Wrap z.
       ³    1st command-line argument.
      ẋ     Repeat x y times.
        K   Join z on spaces.
         €  Map this link on x.
          Y Join z on newlines.

141DÇ€Y Main link. Arguments: 0
141     Integer 141.
   D    Convert z to base 10.
    Ç   The above link as a monad.
     €  Map this link on x.
      Y Join z on newlines.

Це V проти Желі зараз :)
Kritixi Lithos

@KritixiLithos Не, ваше рішення було першим.
Ерік Атголфер

V зараз на 18 байтах :)
Kritixi Lithos

Ви можете залишити байт, не використовуючи , @але помінявши операнди xсебе: ”#xẋ³Wẋ³K€Y.
steenbergh

3

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

NλG↑λ←×⁶λ↓λ# DM×⁴λ← 

Код закінчується пробілом. Спробуйте в Інтернеті!

Пояснення

Деревне вугілля - мова, що спеціалізується на мистецтві ASCII. Це також неповне, баггі та недодокументоване. Досить сказати, що для того, щоб зробити те, що потрібно, було потрібно чимало спроб і помилок.

  • Nλвводить число в λ.
  • - це команда багатокутника, яку ми використаємо тут, щоб намалювати прямокутник. ↑λ←×⁶λ↓λвказує межу полігону: вгору λкроки, вліво 6 разів λкроки та вниз λкроки. (Це три з λдопомогою λблоків бік про бік.) Нижній край прямокутника виводиться. Потім багатокутник заповнюється рядком # .
  • скидає поточне полотно в stdout, в результаті чого виходить щось подібне:
 # # # # # # # # # #
 # # # # # # # # # #
 # # # # # # # # # #
  • Після команди курсор знаходиться в нижньому лівому куті полотна. M×⁴λ←переміщує його вліво в 4 рази λкроків (еквівалентно двом з λдопомогою λблоків).
  • виводить пробіл там, розширюючи полотно зліва на потрібну кількість.
  • В кінці програми полотно (знову) надсилається до stdout:
             # # # # # # # # # #
             # # # # # # # # # #
             # # # # # # # # # #

Складіть їх разом, і у вас є кубикова сітка.


Нічого собі, тоді вам справді довелося боротися! (Продовження не було додано до декількох тижнів.)
Ніл

2

Утиліти Bash / Unix, 72 69 68 66 байт

b()(yes `dc<<<2o4d$n^$1^3/p`|tr 01 ' #'|head -$n);n=$1;b 1;b 4;b 1

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

Це працює, використовуючи той факт, що [4 ^ k / 3], коли записано в базі 2, дорівнює 10101010 ... 01, з k 1's. (Квадратні дужки позначають функцію підлоги.)


2

Пайк, 16 байт

uAD,sXF**"# 

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

Дорівнює

1 4 1]3AD,sXF**"# 

Через недруковані матеріали

Для зменшення кількості байтів використовується кілька прийомів:

  • Для представлення списку він використовує деякі недруковані версії [1, 4, 1]
  • XF автоматично скидає вихід у стек
  • Рядок "#в кінці заміняється останнім *, тобто закриття "не потрібно. Це відбувається неявно, коли останній маркер - це рядок.


u                -      [1, 4, 1]
     AD          -     apply(*, ^, input)
       ,         -    zip(^)
        s        -   sum(^)
          F**"#  -  for i in ^:
           *     -    ^ * input
            *    -   ^ * v
             "#  -    "# "
         X       - splat(^)

2

Python 2 , 68 71 65 байт

-6 з подякою @sagiksp

def f(i,c=1):
 print(' '*i*4,'')[c>i]+'# '*i*3
 if i*2>c:f(i,c+1)

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

За відсутності пошуку способу перемогти @xnor, я опублікую свою рекурсивну функцію просто як альтернативний підхід. Для друку f (5)

                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 

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


2
Де пробіли?
dkudriavtsev

1
Без пробілів у висновку це не вірно.
Мего

Моя помилка +3, щоб додати пробіли. Оновлено.
ElPedro

1
Насправді навіщо вам навіть j? Ви можете переглянути все з точки зору i та зберегти ~ 6 байт!
sagiksp

@sagiksp - Дякую Оновлено за допомогою вашої пропозиції.
ElPedro

2

PHP, 64 62 байти

Збережено 2 байти завдяки Крістофу .

while($a="282"[$i++/$s=$argv[1]]*$s)echo str_pad("
",$a,"# ");

Друкує мережу так:

# #
# #
# # # # # # # #
# # # # # # # #
# #
# #

(з ведучим новим рядком)


1
while($a="282"[$i++/$s=$argv[1]]*$s)echo str_pad("\n",$a,"# ");економить 2 байти.
Крістоф

1

Пакет, 111 байт

@set s=
@set i=@for /l %%i in (1,1,%1)do @
%i%call set s=%%s%% #
%i%echo%s%
%i%echo%s%%s%%s%%s%
%i%echo%s%


1

Сітківка , 39 37 байт

Це вперше я використовую Retina, я все ще намагаюся зрозуміти, як робити справи.

.+
$*#
#
# 
\`# 
$_¶
G`.
)*%`^
$_$_$_

(з двома пробілами після 4-го та 5-го рядків)

Дякуємо Мартіну Ендеру за те, що виграли у 2 байти!

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


@MartinEnder Дякую, я не помітив цієї вимоги, тепер вона повинна бути правильною. Чи є у вас якісь пропозиції щодо того, як я повинен спробувати це в гольф?
Лев

Не маючи великої кількості геніальних ідей, але tio.run/nexus/… економить два байти. Ви можете уникнути кінцевих каналів рядків, загорнувши все в групу, яка має свій вихідний прапор (а оскільки ця група є останньою справою програми, прапор виводу за замовчуванням не відповідає тиші). Інший байт уникає четвертого $_внизу, перемикаючи деякі речі навколо, видаляючи порожній рядок. tio.run/nexus/… - це те саме число байтів, але трохи потворніше.
Мартін Ендер

@MartinEnder Дякую за поради, і дякую також за цю мову, це дійсно приємно!
Лев

Дякую за добрі слова. :) Для нього є чат, якщо у вас є якісь питання або хочете обговорити речі. Наразі це досить тихо, але я намагаюся зберігати його не замороженим, якщо у людей виникають запитання (і ви повинні мати можливість пінгнути мене там будь-коли).
Мартін Ендер

1

QBIC , 52 67 40 байт

Повне переписування:

:[a*3|G=G+@#`][a*2|G=G+@ `][a|?G][a|?_fG

Тепер використовується ця модель:

###--
--###

Там, де -заповнені пробіли.

:        Read 'a' from the command line        > Assume 3
[a*3|    Create 3 segments times 'a' filling   > 3*3 = 9
G=G+@#`] Define A$ to be '#' and add this to G > G = "#########" 
[a*2|    Create 2 segments times 'a' spacer
G=G+@ `] Define B$ to be ' ' and add this to G > G = "#########       " 
[a|      FOR d == 1; d <= a; d++
?G]      Display G$:
            "#########       " 
            "#########       " 
            "#########       " 
[a|      FOR e == 1; e <= a; e++
?_fG     Display G$ in reverse (_f...|):
            "      #########" 
            "      #########" 
            "      #########" 
         (For loop and function call to Flip impicitly closed by QBIC)


@EriktheOutgolfer Оновлено.
steenbergh

2
Відповідна назва мови для виклику!
FlipTack

1

Піп , 28 17 16 байт

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

"# "Xa*_RLaM141

Приймає розмір як аргумент командного рядка. Спробуйте в Інтернеті!

Пояснення

                 a is 1st cmdline arg
       _         Build a lambda function
     a*          (a) times argument
"# "X            Repeat string "# " that many times
        RLa      Wrap in a list and repeat list (a) times
           M141  Map that function to the characters of 141
                 Autoprint (-n flag separating list items with newlines)

Далі не зовсім так, як дані змінюються, але це дає основну думку (для a=2):

141

[1;4;1]

[2;8;2]

["# # ";"# # # # # # # # ";"# # "]

[["# # ";"# # "];["# # # # # # # # ";"# # # # # # # # "];["# # ";"# # "]]

# # 
# # 
# # # # # # # # 
# # # # # # # # 
# # 
# # 

0

05AB1E , 13 байт

D141S×S*„# ×»

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

Пояснення

Приклад введення n=2

D              # duplicate input
               # STACK: 2, 2
 141S          # push the list [1,4,1]
               # STACK: 2, 2, [1,4,1]
     ×         # repeat each item in the list input_no times
               # STACK: 2, [11, 44, 11]
      S        # split into list of digits
               # STACK: 2, [1, 1, 4, 4, 1, 1]
       *       # multiply each digit with input
               # STACK: [2, 2, 8, 8, 2, 2]
        „# ×   # repeat the string "# " for each item in the list
               # STACK: ['# # ','# # ','# # # # # # # # ','# # # # # # # # ','# # ','# # ']
            »  # join by newlines
               # OUTPUT: # # 
                         # # 
                         # # # # # # # # 
                         # # # # # # # # 
                         # # 
                         # # 

0

C #, 152 байти

n=>{var m="";foreach(int c in new[]{1,4,1})for(int i=0,j;i++<n;){for(j=0;j++<c;)m+=new System.Text.StringBuilder().Insert(0,"# ",n);m+="\n";}return m;};

0

SmileBASIC, 57 50 байт

INPUT S
E$=("#"*S*3+CHR$(10))*S?E$SCROLL-S*2,-1?E$

Пояснили:

INPUT SIZE
PART$=("#"*SIZE*3+CHR$(10))*S 'generate half of the pattern
PRINT PART$ 'print half the pattern
SCROLL SIZE*-2,-1 'scroll the text 2 squares right (and 1 character down)
PRINT PART$ 'print half the pattern again

Після першого PRINT (розмір = 2, @ позиція курсору):

######
######

@ 

Після SCROLL:

    ######
    ######
@

Після другого друку:

    ######
    ######
######
######
@

У цьому випадку ви можете пропустити пробіли
dkudriavtsev

0

Лист звичайний, 83 81 79 байт

(lambda(x)(format t"~v@{~v@{# ~}~:*~%~}~v@{~vt~0@*~v{# ~}~%~}"x(* x 3)(* x 2)))

Використання:

(funcall #'(lambda(x)(format t"~v@{~v@{# ~}~:*~%~}~v@{~vt~0@*~v{# ~}~%~}"x(* x 3)(* x 2)))2)

Вихід:

# # # # # #
# # # # # #
    # # 
    # # 
    # # 
    # #       
    # # 
    # #           

Як це працює?

in format there is control string (inside "") and arguments after it
certain commands in string can use arguments (for example ~a displays argument)
~v{~} - takes argument and does commends inside {~} number of times 
                                      (number is given by argument)
       we can write text in loop body - it'll get displayed. Even if
       in loop body there are none commends to use arguments loop itself                 
       will consume one argument (it doesn't matter what it'll be -
       it doesn't seem to affect output)
~% - newline
~n* - jump n arguments forward (relative)
~n:* - jump n arguments backwards (relative)
~n@* - jump to argument n (global, counting from 0)

~v@{~v{# ~}~%~1@*~} <--- we make x rowns, 3x columns of string "# ". 
                         ~1@* is used during looping, it also means we end on argument 1. 
                         (second argument: (* x 3))
~v@{~vt~0@*~v{# ~}~%~} <--- we now make 3x rows, x columns of "(spaces)# "
                         ~vt - is used to move to accurate column. 
                         Here it takes argument (* x 2) - this is 
                         minimal number of columns to display. It uses
                         space as default character for missing characters
                         (when string inside <~> is shorter than min 
                         number of columns). I use it to make (* x 2) spaces, 
                         by giving it no text.
      ~0@* <--- after making spaces we have no new arguments, we go back to
                argument number zero - it is used to determine number of columns in our block

Ідеї ​​для вдосконалення вітаються.

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