Выведите красивую коробочку

17

Ваша задача - точно вывести следующее поле:

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................

Ящик имеет высоту и ширину 50, пространства два ширины.

Вы должны написать функцию или программу, которая выводит или возвращает строку и не требует ввода.

Побеждает несколько байтов!

Павел
источник
4
Любая причина, почему самая внутренняя +коробка имеет только 1 слой сверху и снизу? Это сделает ответы на основе алгоритма несколько более длинными, поскольку это означает, что два самых внутренних слоя не совсем квадратные.
ETHproductions
@ Павел в порядке.
Цифровая травма
4
Почему ограничение на полную программу?
17
1
@ Павел, почему? Это действительно ничего не добавляет к проблеме.
Rɪᴋᴇʀ
1
@ Павел ..... нет. Я имею в виду, да, у некоторых это есть, но это далеко не требование / стандарт для вызовов КГ.
Rɪᴋᴇʀ

Ответы:

14

J , 25 байт

echo'. + '{~4|>./~2#|i:12

Попробуйте онлайн!

объяснение

echo'. + '{~4|>./~2#|i:12
                     i:12  Range from -12 to 12.
                    |      Take absolute values,
                  2#       duplicate every element,
                /~         compute "multiplication table"
              >.           using maximum,
            4|             take mod 4 of every element,
    '. + '{~               index into this string,
echo                       print char matrix for everyone to see.
Zgarb
источник
Я думаю, что вы можете оставить эхо.
Конор О'Брайен
@ ConorO'Brien О, правило вывода изменилось. ... Хм, но если я уберу echo, это будет даже не функция, а значение. Хотя у J все равно нет функций с нулевым аргументом.
Згарб
Я думаю, что это разрешено в соответствии с характером реплея J. В любом случае, постоянные функции могут рассматриваться как аргументы с нулевым аргументом.
Конор О'Брайен
11

C, 115 байтов

#define M(x,y)x<(y)?x:y
f(i){for(i=2549;i;i--)putchar(i%51?". + "[(M(i%51-1,M(50-i%51,M(i/51,49-i/51))))/2%4]:10);}

Определяет функцию f(вызов как f();), которая печатает строку в STDOUT.

Линн
источник
9

C, 535 478 477 байт

Теперь это много в гольф: - /

i;main(j){for(;++i<51;puts(""))for(j=0;++j<51;)putchar(i<3|i>48?46:j<3|j>48?46:i>4&i<47&j>4&j<47?i<7|(i>44&i<47)|(j>2&j<7)|(j>44&j<47)?43:j>8&j<43&((i>8&i<11)|(i>40&i<43))?46:i>9&i<41&((j>8&j<11)|(j>40&j<43))?46:i>13&i<37&((j>12&j<15)|(j>36&j<39))?43:((i>12&i<15)|(i>36&i<39))&j>12&j<39?43:i>17&i<33&((j>16&j<19)|(j>32&j<35))?46:((i>16&i<19)|(i>32&i<35))&j>16&j<35?46:i>21&i<29&((j>20&j<23)|(j>28&j<31))?43:((i>20&i<23)|(i>28&i<31))&j>20&j<31?43:i>24&i<27&j>24&j<27?46:32:32);}

Вот вывод;

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................
cleblanc
источник
2
Ебена мать. Я восхищаюсь вашей преданностью.
Rɪᴋᴇʀ
Я изменил ограничение, функции, которые возвращают строку, теперь разрешены.
Павел
Я только что понял, что могу сыграть несколько байтов, переписывая петли, for(;i++<51;и теперь я везде один: - /
cleblanc
@cleblanc++i
dkudriavtsev
MFW Я начал пытаться понять это: i.imgur.com/TLV9gJ4.png +1
Волшебная Урна Осьминога
6

Haskell, 72 байта

q=(\n->[n,n]).abs=<<[-12..12]
unlines[[". + "!!mod(max x y)4|y<-q]|x<-q]

Решение @ Zgarb в Haskell. Я также попытался создать коробку, добавив слои вокруг ядра ["..",".."], но она на 9 байт длиннее (81 байт).

e!b=e:e:b++[e,e];s#c=(c!)<$>(c<$s!!0)!s
unlines$foldl(#)["..",".."]" + . + . + ."
Ними
источник
5

Сложенный, неконкурентный, 35 байтов

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

ε'.'3$' + .'2*tostr*+$surroundfold

Ungolfed:

'' '.  ++  ..  ++  ..  ++  ..' $surround fold

Довольно просто. surroundэто функция, которая, ну, в общем, окружает объект с объектом заполнения. Например, (0) 1 surroundесть ((1 1 1) (1 0 1) (1 1 1)). $surroundв surroundкачестве функции, не оценивается. foldпринимает начальное значение, затем что-то, чтобы сложить, затем функцию. В этом случае, surroundбудет foldэды, окружающих первоначально пустая строку ''(эквив. ε) С каждым символом строки.

'.'3$' + .'2*tostr*+

Сначала создается строка символов $' + .', которая при умножении на число повторяет каждый символ. Это оставляет нас с: ++ ... Это тогда приведено к последовательности. Затем мы повторяем эту строку трижды и, наконец, добавляем a ., давая нам желаемую строку.


Другой подход для 39 байтов:

' .'3$' + .'2*tostr*+toarr$surround#\out

#\это вставка и принимает начальный символ строки в качестве начального значения. Это также работает только на массивах.

Конор О'Брайен
источник
Как это неконкурентоспособно, задача поднялась всего несколько часов назад.
Павел
@Pavel Я всегда работаю над этим
Конор О'Брайен
4

JavaScript (ES6), 117 байт

f=(n=12,c=`. + `[n%4],t=c.repeat(n*4+2))=>n?t+`
${t}
${f(n-1).replace(/^|$/gm,c+c)}
${t}
`+t:`..
..`
console.log(f())

Нерекурсивное решение заняло у меня 128 байт:

console.log([...Array(100)].map((_,i,a)=>a.map((_,j)=>`. + `[j=j>50?j-50:51-j,(i>j?i:j)%8>>1],i=i>50?i-50:51-i).join``).join`\n`)

Где \nпредставляет буквальный символ новой строки.

Нил
источник
4

C 97 байтов

i,x,y;main(){for(;i<2550;putchar(++i%51?". + "[(x*x<y*y?y:x)&3]:10))x=i%51/2-12,y=i/102-12;}
orlp
источник
3

Желе , 18 байт

12ŒRAx2»þ`ị“ + .”Y

Попробуйте онлайн!

Тот же подход, что и у J-ответа Згарба: 12ŒRAесть abs([-12 … 12]), x2повторяет каждый элемент дважды, »þ`создает таблицу максимумов, ị“ + .”циклически индексирует в строку и Yобъединяет их с помощью новых строк.

Линн
источник
3

05AB1E , 39 35 33 байта

•â3fM~•3B…012… .+‡.pvyD¤sg25s-׫«})«»

Попробуйте онлайн!

•â3fM~•3B                               # Push 1100220011002200110022001
         …012… .+‡                      # Push ..  ++  ..  ++  ..  ++  .
                  .p                    # All prefixes of the above string.
                    vy            }     # For each prefix.
                      D¤sg25s-×         # Repeat the last letter until length is 25.
                               «Â«      # Concat, bifurcate, concat.
                                   )«» # Wrap to array, bifurcate, concat, print.

33-байтовая версия, которая теперь круче, потому что Эминья прокомментировал сохранение 2 байта:

". + "DøJ3×'.«.pvy¤25yg-׫«})«»

Попробуйте онлайн!

Урна волшебного осьминога
источник
1
". + "DøJ3×'.«.pvy¤25yg-׫«})«»для 33 байтов.
Emigna
… .+•â3fM~•3BSè.pvy¤25yg-׫«})«»для 34 байтов на "более прохладной версии".
Emigna
Круто был не правильный выбор слова хаха. "Меньше гетто", может быть?
Волшебная Урна Осьминога
Мне очень нравится, что вы используете префиксную команду. Brilliant!
Emigna
1
@Emigna префиксы образуют треугольник, если вы транспонируете треугольник и поворачиваете его, а затем объединяете его с оригинальными префиксами, которые вы можете сбрить байты. Это был основной план, к которому я не мог прийти.
Волшебная Урна Осьминога
2

MATL , 21 байт

'. + '[]25:"TTYaQ]2/)

Попробуйте онлайн!

'. + '    % Push this string
[]        % Push empty array. This will be used as "seed"
25:"      % Do the following 25 times
  TTYa    %   Extend the array with a frame of zeros
  Q       %   Add 1 to each entry
]         % End
2/        % Divide by 2
)         % Index modularly into the string. Non-integer indices are rounded
          % Implicitly display
Луис Мендо
источник
2

Рубин, 77 байт

-623.upto(676){|i|print i%26>0?". + "[[(i%26-13).abs,(i/52).abs].max%4]*2:$/}
Уровень реки St
источник
Я думаю, что вы можете заменить выражение индекса на [i%26-13,i/52].map(&:abs).max%4(сохраняет байт)
Конор О'Брайен
1

Haskell, 385 байт

    b 0 = ["..", ".."]
b n = f:f:s:s:m (b (n - 1)) ++s:s:f:f:[]
    where f = replicate (8*n+2) $ d
          s = l++replicate ((8*n)-6) ' ' ++r
          m (x:xs) = map (\x -> l ++ x ++ r ) $ t
          l = d:d:' ':' ':[]
          r = reverse l
          t = b (n - 1)
          d :: Char
          d | n `mod` 2 == 0 = '.'
            | n `mod` 2 == 1 = '+'
main = mapM_ putStrLn $ b 6

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

Выход:

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................
брендер
источник
3
1) У вас есть тонны ненужных пробелов. 2) поместите все определения функций whereв одну строку и используйте ;для разделения. 3) f:f:[]is f:[f] and d: '': '': [] `is d:" ". 4) mпринимает параметр, но не использует его. Встроенный mи t. 5) определить новую функцию #для замены replicate: c#x=c<$[1..8*n+x]и назвать ее как d#2и ' '#(-6). 6) mod 2 == 0можно заменить evenили перевернуть тест и использоватьodd и гольфиста otherwise: 1<2. ...
Ними
2
... Вобщем: b n=f:f:s:s:map(\x->l++x++r)(b$n-1)++s:s:f:[f]where f=d#2;s=l++' '#(-6)++r;l=d:d:" ";r=reverse l;d|odd n='+'|1<2='.';c#x=c<$[1..8*n+x] .
nimi
1

Октава, 53 байта

 '.  ++  .'(mod(bsxfun(@max,x=[24:-1:0 0:24],x'),8)+1)

Создайте повторяющуюся последовательность от 1 до 8 от центра кнаружи и используйте его в качестве индекса для извлечения элементов . ++ .

Попробуйте онлайн!

rahnema1
источник
1

Баш, 191 байт

echo H4sIAGUcgFgAA73VOw7AIAyD4b2n6F6J+x+v6k5CnPy1F6ZPAvNaS80li4/cUvrkKWdGapOak3O5DDmVS5G8XI5k5ZIkLpclUbk02ZfLk125f5B4JIljLY59cZwxx31x3H3HO5aFIo7/pZIpqWZClHSJmg55AeBhTxb2CQAA|base64 -d|gunzip

Возможно, может стать меньше, но оказалось меньше, чем мои алгоритмические попытки.

throx
источник
1

C #, 203 байта

Полная читаемая программа:

using System;
public class P
{
    public static void Main(string[] a)
    {
        Func<string> f = () =>
        {
            var z = 25;
            var t = "";
            Func<int, string> c = (q) => q % 4 == 0 ? ".." : (q % 4 != 2 ? "  " : "++");
            for (var y = 0; y < z; y++)
            {
                var l = "";
                for (var x = 0; x < z; x++)
                        l += ((y > z / 2) ? (x >= y | x < z - y) : (x < y | x >= z - y)) ? c(x):c(y);
                l += "\n";
                t += l + l;
            }
            return t;
        };

        Console.Write(f());
        Console.ReadKey();
    }
}

Гольф- функция :

()=>{var z=25;var t="";Func<int,string>c=(q)=>q%4==0?"..":(q%4!=2?"  ":"++");for(var y=0;y<z;y++){var l="";for(var x=0;x<z;x++)l+=((y>z/2)?(x>=y|x<z-y):(x<y|x>=z-y))?c(x):c(y);l+="\n";t+=l+l;}return t;};
CSharpie
источник
1

05AB1E , 33 байта

14G" . +"NL¤¸13N-.׫€D¨Â«èD})¨Â«»

Попробуйте онлайн!

объяснение

14G                               # for N in [1 ... 13]
   " . +"                         # push this string
         NL                       # push range [1 ... N]
           ¤¸13N-.×               # push a list of 13-N repetitions 
                                  # of the last element of the above range
                   «              # concatenate the two ranges
                    €D            # duplicate each element
                      ¨           # remove the last element
                       «         # concatenate a reversed copy to the list
                         è        # use the elements of the list to index into the string
                          D       # duplicate the resulting string
                           }      # end loop
                            )     # wrap the strings in a list
                             ¨    # remove the last element
                              «  # concatenate a reversed copy
                                » # join the list on newlines
Emigna
источник
Объяснение приехать?
Павел
@Pavel: конечно! :)
Emigna
1

PowerShell , 171 151 байт

($x=(1..12|%{' . +'[$_%4]}|%{($a+=$_+$_)})+"$a."|%{$c=if(++$i%2){('+','.')[($b=!$b)]}else{' '};$_.PadRight(25,$c)}|%{,($_+-join$_[25..0])*2});$x[23..0]

Попробуйте онлайн!

Хо-хум ответ. Я уверен, что есть более короткий путь (учитывая длины других ответов, я уверен), но это показывает некоторые изящные уловки.

Объяснение:

1..12|%{' . +'[$_%4]} генерирует массив строк (длиной один символ) в нужном нам шаблоне. Попробуйте онлайн!

Затем мы добавляем, |%{($a+=$_+$_)})+"$a."который берет массив и расширяет его вбок на основе предыдущей строки. Попробуйте онлайн!

Затем эти строки отправляются в цикл |%{$c=if(++$i%2){('+','.')[($b=!$b)]}else{' '};$_.PadRight(25,$c)}. На каждой итерации мы выбираем правильный символ (плюс, точка или пробел), а затем используем .PadRightфункцию для заполнения нужного количества символов.Попробуйте онлайн!

Теперь у нас есть основание верхнего правого угла. Нам нужно перевернуть каждую строку |%{,($_+-join$_[($z=25..0)])*2}и добавить их вместе, чтобы мы могли получить верхнюю часть блока. Это делается с помощью -joinкоманды и индексации в обратном направлении 25..0. Кроме того, мы инкапсулируем строки в массив ,(...)и делаем их двойными*2 чтобы получить всю вершину. Попробуйте онлайн!

Все это хранится в $xпаренонах и инкапсулируется в них, поэтому строки помещаются в конвейер. Наконец, мы переворачиваемся $x(обязательно вырезаем дубликат-дубликат среднего ряда, иначе у нас будет четыре ..в середине) и оставляем их на конвейере. Неявный Write-Outputвводит новую строку между строками, поэтому мы получаем это бесплатно.

AdmBorkBork
источник