Виведіть гарненьку коробку


17

Ваше завдання полягає в тому, щоб точно вивести наступне поле:

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

Коробка висотою та шириною 50, проміжки - два широкі.

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

Виграє найменше байтів!


4
Будь-яка причина, чому найпотужніший +ящик має лише 1 шар вгорі та внизу? Це зробить відповіді на основі алгоритму дещо довшими, оскільки це означає, що найпотужніші два шари не є прямокутними.
ETHproductions

@Pavel ОК. Закрите голосування відкликається :)
Digital Trauma

4
Чому обмеження на повну програму?
Rɪᴋᴇʀ

1
@Pavel чому? Це справді нічого не додає до виклику.
Rɪᴋᴇʀ

1
@Pavel ..... ні. Я маю на увазі, так, у деяких це є, але це далеко не вимога / стандарт для викликів КГ.
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.

Я думаю, ти можеш залишити відлуння.
Conor O'Brien

@ ConorO'Brien О, правило виводу змінилося. ... Хм, але якщо я видалю echo, це не буде навіть функцією, а лише значенням. Хоча J у будь-якому випадку не має функцій з нульовим аргументом.
Згарб

Я думаю, що це дозволено відповідно до характеру відштовхування J. У будь-якому випадку постійні функції можна вважати нульовим аргументом.
Conor O'Brien

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(call as 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);}

Ось вихід;

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

2
Святе лайно. Я захоплююся вашою відданістю.
Rɪᴋᴇʀ

Я змінив обмеження, функції, які повертають рядок, зараз дозволені.
Павло

Я щойно зрозумів, що можу переграти кілька байтів, щоб переписати петлі, for(;i++<51;і тепер я скрізь одній: - /
cleblanc

@cleblanc++i
dkudriavtsev

MFW Я почав намагатися зрозуміти це: i.imgur.com/TLV9gJ4.png +1
Magic Octopus Urn

6

Haskell, 72 байти

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

@ Рішення Згарба в Хаскеллі . Я також намагався побудувати поле, додавши шари навколо ядра ["..",".."], але це на 9 байт довше (81 байт).

e!b=e:e:b++[e,e];s#c=(c!)<$>(c<$s!!0)!s
unlines$foldl(#)["..",".."]" + . + . + ."

5

Складено, неконкурентоспроможне, 35 байт

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

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

Безумовно:

'' '.  ++  ..  ++  ..  ++  ..' $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 Я завжди працюю над цим
Conor O'Brien

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;}

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 байт.
Емінья

… .+•â3fM~•3BSè.pvy¤25yg-׫«})«»на 34 байти на "кулерній версії".
Емінья

Класний не був правильним вибором слова ха-ха. "Менше гетто", можливо?
Чарівний восьминога Урна

Я дуже люблю ваше використання команди префікса. Блискуче!
Емінья

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:$/}

Я думаю, що ви можете замінити вираз індексу на [i%26-13,i/52].map(&:abs).max%4(зберігає байт)
Conor O'Brien



1

Хаскелл, 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:[]є f:[f] and d: '': '': [] `є 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. ...
nimi

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].
німі

1

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

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

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

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


1

Баш, 191 байт

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

Можливо, може бути менше, але було менше, ніж мої алгоритмічні спроби.


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;};

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

Пояснення прийти?
Павло

@Pavel: звичайно! :)
Емінья

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вставляється нова лінія між рядками, тому ми отримуємо це безкоштовно.

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