Распечатать сетку куба указанного размера


26

Вызов

При заданном размере s выведите сетку кубов такого размера, состоящую из хеш-символов ( #) и пробелов ( ).

Примеры:

1:
  #
# # #    
  #
  #

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

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

Сеть может фактически быть любой действительной сетью куба, которая может сложиться в куб, например:

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

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

правила

  • Полученная сеть должна быть геометрически правильной (складывается в куб)
  • Стандартные лазейки запрещены
  • Внимательно прочитайте правила
  • Это , самый короткий ответ выигрывает, но не будет выбран

1
Могут ли быть начальные / конечные пробелы / переводы строк?
Kritixi Lithos

@KritixiLithos Да
dkudriavtsev

13
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 на python.

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

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

Эта форма длиннее в Ruby, но я ожидаю, что в некоторых языках она короче.

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

Использование:

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

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


Возвращение строки считается допустимой формой вывода.
дкудрявцев


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 ну, понял. Спасибо
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

В , 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 default?
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 Нет, ваше решение было первым.
Эрик Outgolfer

V теперь в 18 байтах :)
Kritixi Lithos

Вы можете оставить байт, не используя , @но поменяв операнды xсебя: ”#xẋ³Wẋ³K€Y.
Steenbergh

3

Древесный уголь , 20 байтов

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

Код заканчивается пробелом. Попробуйте онлайн!

объяснение

Древесный уголь - это язык, специализирующийся на искусстве ASCII. Он также неполный, содержит ошибки и недостаточно документирован. Достаточно сказать, что потребовалось немало проб и ошибок, прежде чем он сделал то, что должен был.

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

Положите их вместе, и вы получите сетку для кубов.


Вау, ты действительно должен был бороться тогда! (Продолговатый был добавлен только через несколько недель.)
Нил

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. (Квадратные скобки здесь обозначают функцию пола.)


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
Где места?
дкудрявцев

1
Без пробелов в выводе это недопустимо.
Mego

Моя ошибка +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 Обновлено.
Стинберг

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

После первой ПЕЧАТИ (размер = 2, @ - позиция курсора):

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

@ 

После СВИТОКА:

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

После второй ПЕЧАТИ:

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

В этом случае вы можете пропустить пробелы
dkudriavtsev

0

Common Lisp, 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.