Окружить строку хешами


24

Я уже сделал это в Python, но кажется, что это может быть значительно сокращено:

txt = input("Type something.. ")
c = "#"
b = " "
print(c * (len(txt) + 4))
print(c, b * len(txt), c)
print(c, txt, c)
print(c, b * len(txt), c)
print(c * (len(txt) + 4))

Так что, если пользователь вводит:

Hello World

Программа печатает:

###############
#             #
# Hello World #
#             #
###############


Побеждает меньше всего байтов - и, конечно, ответ может быть написан на любом языке.



1
Не так сильно отличается: codegolf.stackexchange.com/questions/57442/show-tree-rings-age/...
edc65

1
Входная строка не будет содержать разрывы строк, верно?
Flodel

2
@ edc65 Я не согласен, этот вызов сильно отличается
бета-распад

10
Я бы рекомендовал подождать хотя бы неделю, прежде чем принять ответ. Хотя на самом деле не имеет значения, планируете ли вы обновить принятый ответ, если поступит более короткая заявка, будут люди, которые будут жаловаться на ранее принятый ответ или даже понизят его. Также будут люди, которые не будут заинтересованы в публикации ответа, если он уже принят.
Мартин Эндер

Ответы:


17

CJam, 22 20 байт

qa{4/3*' +f+W%z}8/N*

Проверьте это здесь.

объяснение

Как вы оборачиваете двумерную сетку символов в один слой пробелов (или любого другого символа)? Правильно: четыре раза вы добавляете пробел к каждой строке, а затем поворачиваете сетку на 90 градусов. Это именно то, что я делаю здесь с восемью поворотами: четыре для пробелов, четыре для #:

qa      e# Read the input and wrap it in an array, to make it a 2D grid.
{       e# Execute this block for each value from 0 to 7.
  4/3*  e#   Divide by 4, multiply by 3. Gives 0 for the first four iterations and
        e#   and 3 for the other four.
  ' +   e#   Add the result to a space character (space + 3 == #).
  f+    e#   Append this to each line of the grid.
  W%z   e#   Reverse the lines, then transpose the grid - together these rotate it.
}8/
N*      e# Join the lines of the grid by newlines.

1
Какое изящное решение!
Джошпаррон

1
Я люблю объяснения :-D
Джон Дворжак

13

vim, 28 27 нажатий клавиш

I# <esc>A #<esc>Y4PVr#G.kwv$3hr kk.

Предполагается, что ввод осуществляется в виде одной строки текста в текущем открытом файле.

Объяснение:

I# <esc>        put a "#" and space at the beginning of the line
A #<esc>        put a space and "#" at the end of the line
Y4P             copy the line 4 times
Vr#             replace the entirety of the first line with "#"s
G.              do the same for the last line
kwv$3hr<space>  replace middle of the fourth line with spaces
kk.             do the same for the second line

Это также можно запустить как «программу», например так:

echo 'Hello World' | vim - '+exe "norm I# \<esc>A #\<esc>Y4PVr#G.kwv$3hr kk."'

Что немного запутано, но это работает.


1
Это лучший ответ, потому что он работает как мой разум.
tchrist

12

pb - 89 байт

v[4]w[Y!-1]{b[35]^}w[B!0]{t[B]vvv>>b[T]^^^<}v>>>w[Y!4]{b[35]v}w[X!0]{b[35]^[Y]b[35]v[4]<}

Это такой вызов, для которого был создан pb! Не то, чтобы он был конкурентоспособен для такого рода вызовов или чего-то еще. Это все еще ужасный язык гольфа. Тем не менее, такие проблемы гораздо сложнее решить, чем другие. Поскольку pb обрабатывает свой вывод как 2D-холст и может записывать любые координаты, все, что связано с позиционированием текста / рисованием вокруг текста (т.е. это вызов), обрабатывается довольно интуитивно.

Наблюдайте за ходом:

эта визуализация была создана с помощью находящейся в разработке версии pbi, интерпретатора pb. Строка с синим фоном - это место Y=-1, где хранятся входные данные при запуске программы. Прямоугольник с красным фоном является текущим местоположением кисти. Прямоугольники с желтым фоном везде, где символ 32 ascii (пробел) явно записан на холсте. Любые пробелы без этого фона на самом деле имеют значение 0, которое преобразуется в пробел.

Вот код с комментариями, которые я использовал при написании, с некоторыми тематически соответствующими заголовками разделов;)

################################
#                              #
# Handle first column oddities #
#                              #
################################
v[4]           # Start from Y=4 and go up (so we land on input afterwords)
w[Y!-1]{       # While we're on the visible part of the canvas
    b[35]^         # Write "#", then go up
}

#########################
#                       #
# Insert text of output #
#                       #
#########################

w[B!0]{        # For each character of input
    t[B]           # Save input char in T
    vvv>>          # Down 3 + right 2 = where text part of output goes
    b[T]^^^<       # Write T and go to next char
}

###############################
#                             #
# Handle last column oddities #
#                             #
###############################

v>>>           # Go to Y=0, X=(X of last text output's location + 2)
w[Y!4]{        # Until we reach the last line of output
    b[35]v         # Draw "#", then go down
}

###########################
#                         #
# Loop to finish Y=0, Y=4 #
#                         #
###########################

w[X!0]{        # Until we've gone all the way left
    b[35]^[Y]      # Print "#" at Y=4, go to Y=0
    b[35]v[4]      # Print "#" at Y=0, go to Y=4
    <              # Move left, printing until output is complete
}

3
Not that it's competitive... It's still a horrible golf language.Я говорю это, но сейчас я привязан только к последнему. Я ожидал быть последним прямо. : D
подземный монорельс

9

брейкфук - 156 байт

++++++++++>,[>>+++++[<+++++++>-],]<....[.---<<]>>+++>>+++.---.[.>>]<<.+++.[<]>.>>+++.---.<[.>>]<<<.>>.---[<]>.--->>+++.---[.>>]<<..+++.---[<]>[+++.>>]<<....

Это, вероятно, гольф. В некоторых местах я не знал, будет ли лучше хранить значение где-то для повторного использования или переделывать его / иди получать его из другого места на ленте. Вместо того, чтобы делать работу, чтобы понять это, я этого не делал. : D

С комментариями:

++++++++++>              Place a 10 (\n) at the beginning of the tape

,[>>+++++[<+++++++>-],]  Place a byte of input; place a 35 (#); repeat until end of input

<....                    Print the last cell (35; #) 4 times

[.---<<]                 Print every noninput cell on the tape in reverse (one # for each byte of input; then \n)
                         After printing each cell; decrease it by 32

>>+++                    Increase the 7 back up to 10

>>+++.---.               Increase a 32 (space) back up to 35 (#); print it; put it back to 32 and print again

[.>>]                    Print every 32 on the tape (one for each byte of input)

<<.+++.                  Print the last space again; increase it by 3 and print the resulting #

[<]>.                    Go to the beginning of the tape and print the \n

>>+++.---.               Increase a 32 (space) back up to 35 (#); print it; put it back to 32 and print again

<[.>>]                   Print every byte of input

<<<.>>.---               Print a space; then print a 35 (#} that was left behind earlier; Set it back to 32 after

[<]>.---                 Go to the beginning of the tape and print the \n; decrease by 3

>>+++.---                Set a space to #; print it; set it back to space

[.>>]                    Print all spaces

<<..+++.---              Print a space twice more; set it to #; print it again; set it back to space

[<]>                     Go to the "newline" (currently a 7 instead of 10)

[+++.>>]                 Increase by 3; print; do the same for all spaces (to set them to # before printing)

<<....                   Print the last # 4 more times

5

К, 21 байт

4(|+"#",)/4(|+" ",)/,

Включите строку, добавьте пробел ко всем четырем сторонам строки, затем добавьте восьмиугольник к каждой стороне строки. В бою:

  4(|+"#",)/4(|+" ",)/,"Hello."
("##########"
 "#        #"
 "# Hello. #"
 "#        #"
 "##########")

Работает в ок, коне и к5.

В одном символе длины существует довольно много вариаций, которые устраняют избыточность в вышеприведенном, но, похоже, ни один из них не сломается, даже когда нам нужно только выполнить операцию «обтекания» дважды:

{x{|+x," #"y}/&4 4},:
{x{|+x,y}/,/4#'" #"},:
{x{|+x,y}/" #"@&4 4},:
{|+x,y}/[;" #"@&4 4],:

3

Pyth, 31 байт

Js[K\#*d+2lzKb*K+4lz)_Jjd[KzK)J

Благодаря тому, что люди в комментариях давали советы о том, как дальше играть в гольф, я действительно плохо знаю язык, как вы можете (вероятно) сказать.


2
Пара подсказок: "#"равно \#. Если вам нужно объединить много объектов, вам лучше использовать j""[список объектов, который равен jk[.
orlp

1
Еще несколько подсказок. s[равно jk[для массивов строк. Кроме того, вы также можете назначить Kна лету, как jk[K\#, и просто отбросить первоначальное назначение. Назначение lzна Jне помогает, если используется только дважды, так что сэкономьте Jна чем-то другом. При этом, если вы подкачки Zдля Jвас можно удалить =. Наконец, вы можете назначить Jна лету. Код выглядит следующим образом:_Js[K\#*d+2lzKb*K+4lz)jd[KzK)J
PurkkaKoodari

3

Python 3, 88 байт

Спасибо @WorldSEnder

s=" ";n=s+input()+s
b=len(n)
h="#";x=h*(b+2);y=h+s*b+h;z="\n"
print(x+z+y+z+h+n+h+z+y+z+x)

Пример ввода / вывода:

This is a test
##################
#                #
# This is a test #
#                #
##################

s=" "в начале экономит 1 байт в целом, я думаю.
WorldSEnder

Зачем использовать ;вместо новых строк кстати? Оба должны быть одного байта, верно?
JeromeJ

3
@JeromeJ Я знаю, что это не имеет значения, но выглядит короче, если вы поместите его в одну строку;)
Beta Decay

3

Perl, 43 76 байт

Преобразуйте каждую строку ввода текста, как указано:

s/.*/($x=("#"x(4+($z=length))))."\n".($y="#"." "x(2+$z)."#\n")."# $& #\n$y$x"/e

Например:

echo surround a long string with pounds | 
perl -ple's/.*/($x=("#"x(4+($z=length))))."\n".($y="#"." "x(2+$z)."#\n")."# $& #\n$y$x"/e' 
######################################
#                                    #
# surround a long string with pounds #
#                                    #
######################################

Вот как можно увидеть, что он на самом деле делает:

perl -MO=Deparse,-p,-q,-x9 -ple '($x=("#"x(4+($z=length))))."\n".($y="#"." "x(2+$z)."#\n")."# $& #\n$y$x";'
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined(($_ = <ARGV>))) {
    chomp($_);
    (((($x = ('#' x (4 + ($z = length($_))))) . "\n") . ($y = (('#' . (' ' x (2 + $z))) . "#\n"))) . (((('# ' . $&) . " #\n") . $y) . $x));
}
continue {
    (print($_) or die((('-p destination: ' . $!) . "\n")));
}
-e syntax OK

Так что-то вроде этого:

((  
      (($x =  ('#' x (4 + ($z = length($_))))) . "\n")
    .  ($y = (('#' . (' ' x (2 + $z))) . "#\n"))
  )  
    .  (((('# ' . $&) . " #\n") . $y) . $x)
)   

Должен быть ряд пробелов до и после строки. Взгляните на пример выходных данных вопроса ... но приятно видеть, что вы отправляете ... особенно в Perl: D
rayryeng - Восстановите Монику

@rayryeng Мне стало грустно, что никто не подает в Perl.
tchrist

Если честно, я был удивлен. Это, конечно, кажется проблемой, подходящей для этого :).
rayryeng - Восстановить Монику

@rayryeng Исправлено в следующей версии. :)
tchrist

1
На самом деле, теперь, когда я думаю об этом, если вы разделите все на отдельные заявления, вы можете просто переместить их за пределы замещения и уронить eмодификатор ... но если вы сделаете это, вы можете также просто уронить замену вообще: $x="#"x(4+($z=y!!!c));$y="#".$"x(2+$z)."#\n";$_="$x\n$y# $_ #\n$y$x". Используйте фактические символы новой строки вместо, \nи это только 65 байтов, плюс 2 для -lp.
ThisSuitIsBlackNot

2

JavaScript (ES6), 73

Тяжело используя строку шаблона, 2 новых строки значимы и считаются.

Попробуйте запустить приведенный ниже фрагмент в любом браузере, совместимом с EcmaScript 6 (FireFox и последняя версия Chrome, возможно, Safari).

f=s=>(z=c=>`*${c[0].repeat(s.length+2)}*
`)`*`+z` `+`* ${s} *
`+z` `+z`*`

// Less golfed

U=s=>(
  z=c=>'*' + c.repeat(s.length+2) + '*\n',
  z('*') + z(' ') + '* ' + s + ' *\n' + z(' ') + z('*')
)

// TEST

O.innerHTML=f('Hello world!')
<pre id=O></pre>

Это намного короче, чем моя первая попытка, полученная из этой другой задачи :

f=s=>(q=(c,b,z=c.repeat(b[0].length))=>[z,...b,z].map(r=>c+r+c))('*',q(' ',[s])).join`\n`

Не бежит за мной (канарейка).
Mynxomaτ

@minxomat что такое канарейка?
edc65

Работает в Chrome 45.0.2454.85 м, Windows 7
edc65

Canary - это всегда последняя сборка Chrome . Не работает и в моей Chrome Stable. Редактировать: работает в FireFox, хотя.
Mynxomaτ

(Является ли законным присвоение глобального zв качестве побочного эффекта?)
Нил

2

Python 2, 74

s='# %s #'%input()
n=len(s)
b='\n#'+' '*(n-2)+'#\n'
print'#'*n+b+s+b+'#'*n

Принимает ввод в кавычках, как "Hello World".

  • Третья строка - это вход, заключенный в # _ # .
  • Вторая и четвертая строки b являются# # с правого ряда пространств, окруженных символами новой строки в обе стороны , чтобы заботиться о всех четырех новых строк.
  • Первая и пятая строки #умножаются на длину ввода

Строки соединяются и печатаются.


2

MATLAB, 93 91 байт

Не самая красивая, но она выполняет свою работу.

t=[32 input('','s') 32];m='#####'.';n=repmat('# ',numel(t),1)';disp([m [n;t;flipud(n)] m])

Код Объяснение

Шаг 1

t=[32 input('','s') 32];

Прочитайте строку из STDIN и поместите в нее начальный и конечный пробел. 32 - это код ASCII для пробела и чтение во входных данных, когда строковый тип объединяет 32 в пробелы.

Шаг 2

m='#####'.';

Объявите массив символов из 5 хеш-символов в векторе столбца.

Шаг 3

n=repmat('# ',numel(t),1)'

Создайте двухрядную символьную матрицу, которая сначала заполняется знаками хеша, а затем пробелом. Количество символов - это длина входной строки плюс 2, чтобы мы могли разместить пробел до и после строки.

Шаг № 4

disp([m [n;t;flipud(n)] m])

Мы собираемся собрать все вместе. Мы помещаем первый столбец из 5 хешей, за которым следует центральная часть, а затем еще один столбец из 5 хешей. Центральная часть состоит из двухстрочной символьной матрицы, созданной на шаге № 3, самой входной строки, которая имеет конечный и начальный пробел, за которой следует двухстрочная символьная матрица, но обратная.

Примеры запусков

>> t=[32 input('','s') 32];m='#####'.';n=repmat('# ',numel(t),1)';disp([m [n;t;flipud(n)] m])
This is something special for you
#####################################
#                                   #
# This is something special for you #
#                                   #
#####################################
>> t=[32 input('','s') 32];m='#####'.';n=repmat('# ',numel(t),1)';disp([m [n;t;flipud(n)] m])
Hello World
###############
#             #
# Hello World #
#             #
###############
>> t=[32 input('','s') 32];m='#####'.';n=repmat('# ',numel(t),1)';disp([m [n;t;flipud(n)] m])
I <3 Code Golf StackExchange!
#################################
#                               #
# I <3 Code Golf StackExchange! #
#                               #
#################################

2

Perl 5.14+, 57 56 байт

perl -lpe '$_=join"#
#",($_=" $_ ",y// /cr,"#".y//#/cr)[2,1,0..2]'

54 байта + 2 байта для -lp(если ввод не заканчивается новой строкой, -lможет быть сброшен для сохранения одного байта).

Принимает ввод на STDIN:

$ echo Hello World | perl -lpe '$_=join"#
#",($_=" $_ ",y// /cr,"#".y//#/cr)[2,1,0..2]'
###############
#             #
# Hello World #
#             #
###############

Как это работает

Ядром программы является фрагмент списка:

($_=" $_ ",y// /cr,"#".y//#/cr)[2,1,0..2]'

Это обеспечивает компактный способ хранения трех уникальных строк выходных данных (первые две строки ограничивающего прямоугольника совпадают с двумя последними, только отражаются). Для входной строки fooрезультаты среза будут:

index   value
--------------
  2    "######"
  1    "     "
  0    " foo "
  1    "     "
  2    "######"

Соединение этих значений с #\n#дает нам нашу коробку.

Обратите внимание, что Perl 5.14+ требуется для использования неразрушающего rмодификатора для оператора транслитерации y///.


2

PHP, 95 93 байта

Не совсем блестящий или что-то подобное, но это было на самом деле весело!

$l=strlen($s=" $argv[1] ");printf("#%'#{$l}s#
#%1\${$l}s#
#$s#
#%1\${$l}s#
#%1\$'#{$l}s#",'');

Не совсем красиво или что-то, но это работает блестяще!


Спасибо @Titus за сохранение 2 байта.


Вы можете сохранить два байта, используя $argvвместо $_GETи -r.
Тит

1

C ++, 198 байт

#include <iostream>
#include <string>
int i;int main(){std::string t,n,o;std::getline(std::cin,o);t="\n#";o="# "+o+" #";for(;i<o.size();i++){n+="#";if(i>1)t+=" ";}t+="#\n";std::cout<<n+t+o+t+n;}

Мой первый удар в Codegolf, и хотя я узнал, что C ++, вероятно, не лучший язык для игры в гольф, я чувствовал, что сделал прилично (?) Для своей первой попытки.

Ungolfed

#include <iostream>
#include <string>

int i;                              //globals default to a value of 0

int main()
{
    std::string t, n, o;
    std::getline(std::cin, o);

    t = "\n#";                      // t needs hashes at start and end, places hash at start here
    o = "# " + o + " #";            // put hash at each end of input

    for(; i < o.size(); i++) {
        n += "#";                   // fills n with hashes
        if(i > 1) {
            t += " ";               // fill t with spaces between hashes, has two fewer spaces than n has hashes
        }
    }
    t += "#\n";                     // puts final hash at end of t

    std::cout << n + t + o + t + n; // final output
}

n, o и t представляют собой полностью хэшированные строки, входные данные (с хэш-кодами на каждом конце) и строки между входными и хэшированными строками соответственно.


1

> <> , 106 104 байта

У меня такое ощущение, что> <> может быть не лучшим языком для этого, но я зашел слишком далеко, чтобы сдаться и не публиковать это. В *конце строки 4 предполагается пробел. Тебе не нравится, как невероятно гротескно выглядит этот код? Попробуйте онлайн .

<v?(0:i
v>~" ## "}}l:::
>"#"o1-:?!v02.>~a"#"oo
"-2ooa"#"~<.31v!?:-1o" 
7v?=3loroo"#"a<.4
.>";^"e3pa2p093

Вот версия, в которой нет ничего, кроме смены направления, чтобы дать представление о том, как движется указатель (обратите внимание, что я пропустил операторы "teleport", т.е. .).

Направление потока:

<v
v>
>         v   >
          <   v 
 v            <
 >           

объяснение

Моя визуализация стека будет основана на вводе input. > <> - это двумерный язык, поэтому обратите внимание на то, где указатель перемещается между строками, так как он выполняет код под ним (в этом коде <>v^в основном используются для изменения направления). Я начну свои объяснения, откуда начинается указатель. Обратите внимание, что повторятся две строки, так как указатель перемещается назад после пятой строки.

Что мне всегда нравится в <>, так это его способность изменять собственный исходный код, и я использую его в этой программе. Строки 3 и 4 используются повторно для печати последних двух строк путем изменения символа в каждой.

Строка 1: входной цикл

<v?(0:i
<        change direction to left
   (0:i  checks if input is less than 0 (no input defaults to -1)
 v?      change direction to down if so

стек: [-1,t,u,p,n,i]


Строка 2: генерирует третью строку вывода

v>~" ## "}}l:::  
 >~" ## "}}      remove -1 (default input value) from stack and pads with # and spaces
           l:::  push 4 lengths of padded input

стек: [9,9,9,9,#, ,t,u,p,n,i, ,#]


Строка 3: печатает первую строку вывода

>"#"o1-:?!v02.>~a"#"oo
>"#"o                   print "#"
     1-                 subtract 1 from length (it's at the top of the stack)
       :?!v             move down if top of stack is 0

стек: [0,9,9,9,#, ,t,u,p,n,i, ,#]

Выход:

#########

Строка 4: печатает вторую строку вывода

"-2ooa"#"~<.31v!?:-1o"*
 -2ooa"#"~<              pops 0, prints newline, "#", then decrements length by 2
"                   o"*  prints space (* is supposed to be space char)
                  -1     decrements top of stack
           .31v!?:       changes direction to down if top of stack is 0, else jumps back to "

стек: [0,9,9,#, ,t,u,p,n,i, ,#]

Выход ( *представляет пространство):

#########
#*******

Строка 5: печатает третью строку вывода

7v?=3loroo"#"a<.4
        oo"#"a<    prints "#",newline
       r           reverses stack
7v?=3lo        .4  outputs until stack has 3 values, then changes direction to down

стек: [9,9,0]

Выход:

#########
#       #
# input #

Строка 6: настраивается для печати четвертой и пятой строк вывода

.>";^"e3pa2p093
 >";^"           push ";",then "^"
      e3p        place "^" as the fifteenth character on line 4
         a2p     place ";" as the eleventh character on line 3
            0    push a value (value doesn't matter -- it will be deleted)
.            93  jump to the tenth character on line 4

стек: [0,9,9,0]


Строка 4: печать четвертой строки вывода

"-2ooa"#"~<.31^!?:-1o"*
   ooa"#"~<              delete 0 (unnecessary value pushed), then print newline,"#"
 -2                      subtract two from value on top of stack (length)
"          .31^!?:-1o"*  print space until top of stack is 0, then change direction to up

стек: [0,9,0]

Выход ( *представляет пространство):

#########
#       #
# input #
#*******

Строка 3: печать последней строки вывода

"#"o1-:?!;02.>~a"#"oo
             >~a"#"oo  pop top of stack, print "#", newline
"#"o1-:?!;02.          print "#" until top of stack is 0, then terminate

стек: [0,0]

Выход:

#########
#       #
# input #
#       #
#########

1

PHP, 93 91 байт

$b=str_pad("",$e=strlen($s=" $argv[1] "));echo$h=str_pad("",2+$e,"#"),"
#$b#
#$s#
#$b#
$h";

Принимает данные из аргумента командной строки; пробелы или использовать одинарные кавычки. Беги с -r.


1

Пайк (неконкурентоспособный), 6 байт

.X".X#

Попробуй это здесь!

Пайк был написан после испытания и поэтому неконкурентоспособен.

.X"    - surround string in spaces
   .X# - surround string in hashes

.Xпринимает строку и строковую константу arg и окружает строку этой группой символов. Константа arg может содержать до 8 символов и оказывать различное влияние на окружение строки.



1

C # - 142 байта (тело метода - 104)

class P{static void Main(string[]a){for(int i=0;++i<6;)System.Console.Write("#{0}#\n",i==3?$" {a[0]} ":new string(" #"[i%2],a[0].Length+2));}}

Ungolfed:

class P
{
    static void Main(string[] a)
    {
        for (int i = 0; ++i < 6;)
            System.Console.Write("#{0}#\n", i == 3 ? $" {a[0]} " : new string(" #"[i%2], a[0].Length + 2));
    }
}

0

PowerShell, 84 82 байта

$l=$input.length+4;$p='#'*$l;$s=' '*$l;$p,$s,"  $input  ",$s,$p-replace'^ | $','#'

0

Луа, 90 байт

a=arg[1]h="#"s=" "t="\n"..h c=h:rep(#a+4)..t..s:rep(#a+2)..h..t..s print(c..a..c:reverse())

0

Рубин, 83 байта

Я думаю, что это может быть дальше, но, так как пока нет ответа Ruby, вот оно:

s=ARGV[0]
n=s.size
r="#"*(n+4)
t="\n#"+" "*(n+2)+"#\n"
puts r+t+"\n# "+s+" #\n"+t+r

0

Ракетка 172 байта

(λ(s)(let((n(string-length s))(p #\space)(g(λ(l c)(make-string l c))))(display(string-append
(g(+ 4 n)#\#)"\n#"(g(+ 2 n)p)"#\n# "s" #\n#"(g(+ 2 n)p)"#\n"(g(+ 4 n)#\#)))))

Ungolfed:

(define (f s)
  (let ((n (string-length s))
        (p #\space)
        (g (λ (l c) (make-string l c))))
    (display (string-append (g (+ 4 n) #\#)
                            "\n#"
                            (g (+ 2 n) p)
                            "#\n# "
                            s
                            " #\n#"
                            (g (+ 2 n) p)
                            "#\n"
                            (g (+ 4 n) #\#)
                            ))))

Тестирование:

(f "This is a test" )

Выход:

##################
#                #
# This is a test #
#                #
##################

0

C #, 116 110 байтов

s=>{string r="\n".PadLeft(s.Length+5,'#'),p="#".PadRight(s.Length+3,' ')+"#\n";return r+p+"# "+s+" #\n"+p+r;};

Ungolfed:

s=>
{
    string r = "\n".PadLeft(s.Length + 5, '#'),         //the first line, made of '#'s
        p = "#".PadRight(s.Length + 3, ' ') + "#\n";    //the second line
    return r + p + "# " + s + " #\n" + p + r;           //output is simmetrical
};

Первоначальный вариант:

s=>{int l=s.Length;string r=new string('#',l+4)+"\n",p="#"+new string(' ',l+2)+"#\n";return r+p+"# "+s+" #\n"+p+r;};

Полная программа с тестовыми примерами:

using System;

namespace SurroundStringWithHashes
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,string>f= s=>{int l=s.Length;string r=new string('#',l+4)+"\n",p="#"+new string(' ',l+2)+"#\n";return r+p+"# "+s+" #\n"+p+r;};

            Console.WriteLine(f("Hello World"));
            Console.WriteLine(f("Programming Puzzles & Code Golf"));
        }
    }
}

Используйте varвместо string.
Yytsi

Не поможет в этом случае, так как у меня есть 2 строки и каждое varключевое слово допускает только одно объявление.
Adrianmp

Ой, не видел второй: D
Yytsi

0

C (gcc) 165 байт

f(*s){i,j;c='#';for(j=0;j<5;j++){if(j==0||j==4){for(i=0;i<strlen(s)+2;i++)printf("#");}else if(j==2) printf("#%s#",s);else printf("#%*c",(strlen(s)+1),c);puts("");

Неуправляемая версия

void  f(char *s)
{
    int i,j;
    char c='#';

    for(j=0;j<5;j++)
    { 
       if(j==0||j==4)
       { 
         for(i=0;i<strlen(s)+2;i++)
           printf("#");
       }
       else
        if(j==2)
         printf("#%s#",s);
      else
        printf("#%*c",(int)(strlen(s)+1),c);

   puts("");
}

0

SmileBASIC, 73 байта

LINPUT S$L=LEN(S$)+2O$="#"+" "*L+"#
T$="#"*(L+2)?T$?O$?"# ";S$;" #
?O$?T$
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.