Вихідна візуальна схема малюнка


22

Напишіть програму, яка вводить розміри картини, ширину матування та ширину рамки для обрамленого портрета. Програма повинна вивести схему, використовуючи символ Xдля картини, +для матування та #для обрамлення. Символи повинні бути розділені пробілом. Пробіл пробігу в порядку, якщо результат візуально відповідає критеріям. Входи можуть бути 0.

ВХОД: 3 2 1 2 (Ширина, Висота, Матова Ширина, Ширина рамки)

ВИХІД:

First 3 and 2 are painting width and height. 1 is the matte width around it. 2 is the frame width around the whole thing.

У текстовій формі:

# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

Код виграшу виконує умови в мінімально можливих байтах.


2
Приємний виклик! Для майбутніх проблем ви можете скористатися The Sandbox
MilkyWay90

2
Ви не заперечуєте, якщо введення буде в іншому порядку?
vityavv

1
Чи можемо ми повернути список рядків?
MilkyWay90

5
Чи може будь-який із входів дорівнювати нулю?
Лайконі

1
Чи можемо ми мати пробіл в кінці кожного рядка?
Луїс Мендо

Відповіді:


5

Python 2 , 98 байт

w,h,a,b=input()
a*='+'
b*='#'
for c in b+a+h*'X'+a+b:print' '.join(min(c,d)for d in b+a+w*'X'+a+b)

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

Друкує сітку, розділену пробілом, суворо дотримуючись специфікації. Мені *=цікаво, що використовується для перетворення aі bвід чисел до рядків.

Python 3 може зберегти деякі байти, уникаючи ' '.join, а може бути, більше, використовуючи f-рядки та вирази присвоєння. Завдяки Джо Кінгу за -2 байти.

Python 3 , 93 байти

def f(w,h,a,b):a*='+';b*='#';[print(*[min(c,d)for d in b+a+w*'X'+a+b])for c in b+a+h*'X'+a+b]

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


Я перевершив! Робота в NIce, здається, досить гольф
MilkyWay90

Гарний гольф! Дуже розумний.
Джордж Харріс

4

JavaScript (ES6),  118 113  107 байт

(w,h,M,F)=>(g=(c,n)=>'01210'.replace(/./g,i=>c(i).repeat([F,M,n][i])))(y=>g(x=>'#+X'[x<y?x:y]+' ',w)+`
`,h)

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

Прокоментував

(w, h, M, F) => (       // given the 4 input variables
  g = (                 // g = helper function taking:
    c,                  //   c = callback function returning a string to repeat
    n                   //   n = number of times the painting part must be repeated
  ) =>                  //
    '01210'             // string describing the picture structure, with:
    .replace(           //   0 = frame, 1 = matte, 2 = painting
      /./g,             // for each character in the above string:
      i =>              //   i = identifier of the current area
        c(i)            //   invoke the callback function
        .repeat         //   and repeat the result ...
        ([F, M, n][i])  //   ... either F, M or n times
    )                   // end of replace()
)(                      // outer call to g:
  y =>                  //   callback function taking y:
    g(                  //     inner call to g:
      x =>              //       callback function taking x:
        '#+X'           //         figure out which character to use
        [x < y ? x : y] //         according to the current position
        + ' ',          //         append a space
      w                 //       repeat the painting part w times
    )                   //     end of inner call
    + '\n',             //     append a line feed
  h                     //   repeat the painting part h times
)                       // end of outer call

3

MATL , 24 байти

&l,ithYaQ]'#+X'w)TFX*cYv

Вхід: висота, ширина, матова ширина, ширина рамки.

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

Пояснення

&l      % Take height and width implicitly. Push matrix of that size with all
        % entries equal to 1
,       % Do twice
  i     %   Take input
  th    %   Duplicate, concatenate: gives a 1×2 vector with the number repeated
  Ya    %   Pad matrix with those many zeros vertically and horizontally
  Q     %   Add 1 to each entry 
]       % End
'#+X'   % Push this string
w)      % Index into the string with the padded matrix
TF      % Push row vector [1 0]
X*      % Kronecker product. This inserts columns of zeros
c       % Convert to char again. Char 0 is will be displayed as space
Yv      % Remove trailing spaces in each line. Implicitly display


2

Деревне вугілля , 48 47 44 байт

≔×NXθ≔×NXηFE+#×Nι«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»Eη⪫⭆θ⌊⟦ιλ⟧ 

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Примітка: простір. Редагувати: тепер використовується алгоритм @ xnor. Пояснення:

≔×NXθ≔×NXη

Введіть ширину та висоту та перетворіть їх у рядки Xs.

FE+#×Nι

Проведіть петлю над символами +та #, перетворивши їх у рядки довжини, задані двома іншими входами. Потім переведіть петлю над цими двома рядками.

«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»

Префікс і суфікс картини рядками для матування та обрамлення.

Eη⪫⭆θ⌊⟦ιλ⟧ 

Проведіть петлю над рядками, взявши мінімум горизонтальних та вертикальних символів, а потім подвійно проклавши рядки, неявно друкуючи кожен рядок у своєму власному рядку.


2

05AB1E (спадщина) / 05AB1E --no-lazy , 32 31 байт

и'Xׄ+#vyI©×UεX.ø}®FDнgy×.ø]€S»

Приймає вхід у порядку height, width, matte, frame. Якщо порядок введення, вказаний у виклику, суворий (все ще чекає на ОП для перевірки), sдля +1 байт може бути доданий ведучий (своп).

Потрібен --no-lazyпрапор компілятора Elixir у новій версії 05AB1E, оскільки Elixir має деяку дивну поведінку через ледачу оцінку вкладених карт / циклів ( тут результат без цього прапора ).

Спробуйте в Інтернеті у застарілій версії 05AB1E.
Спробуйте в Інтернеті у новій версії 05AB1E з доданою--no-lazy прапором.

Пояснення:

и              # Repeat the second (implicit) input the first (implicit) input amount of
               # times as list
 'X×          '# Repeat "X" that many times
„+#v           # Loop `y` over the characters ["+","#"]:
    y          #  Push character `y`
     I         #  Push the next input (matte in the first iteration; frame in the second)
      ©        #  And store it in the register (without popping)
       ×       #  Repeat character `y` that input amount of times
        U      #  Pop and store that string in variable `X`
    εX.ø}      #  Surround each string in the list with string `X`
    ®F         #  Inner loop the value from the register amount of times:
      Dнg      #   Get the new width by taking the length of the first string
         y×    #   Repeat character `y` that many times
             #   And surround the list with this leading and trailing string
   ]           # Close both the inner and outer loops
    S         # Convert each inner string to a list of characters
      »        # Join every list of characters by spaces, and then every string by newlines
               # (and output the result implicitly)




1

Python 3.8 (передвипуск) , 116 115 113 байт

lambda a,b,c,d:"\n".join((g:=['#'*(a+2*c+2*d)]*d+[(h:='#'*d)+'+'*(a+c*2)+h]*c)+[h+'+'*c+'X'*a+'+'*c+h]*b+g[::-1])

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

Перша спроба гольфу, буде покращена незабаром. aє ширина, bвисота, cматова ширина, іd ширина рами.

-1 байт, використовуючи :=оператор для визначення hякe * d

-2 байти завдяки Джо Кінгу запропонував мені видалити параметри e та f

ПОЯСНЕННЯ:

lambda a,b,c,d:          Define a lambda which takes in arguments a, b, c, and d (The width of the painting, the height of the painting, the padding of the matte, and the padding of the frame width, respectively).
    "\n".join(                       Turn the list into a string, where each element is separated by newlines
        (g:=                         Define g as (while still evaling the lists)...
            ['#'*(a+2*c+2*d)]*d+       Form the top rows (the ones filled with hashtags)
            [(h:='#'*d)+'+'*(a+c*2)+h]*c Form the middle-top rows (uses := to golf this section)
        )+
        [h+'+'*c+'X'*a+'+'*c+h]*b+       Form the middle row
        g[::-1]                      Uses g to golf the code (forms the entire middle-bottom-to-bottom)
    )

Вилучення eзавдання заощаджує два байти, fприсвоєння нічого не економить
Джо Кінг,

@JoKing О, о, я забув видалити eі fзавдання, виявивши gярлик
MilkyWay90

0

Javascript, 158 байт

(w,h,m,f)=>(q="repeat",(z=("#"[q](w+2*(m+f)))+`
`)[q](f))+(x=((e="#"[q](f))+(r="+"[q](m))+(t="+"[q](w))+r+e+`
`)[q](m))+(e+r+"X"[q](w)+r+e+`
`)[q](h)+x+z)

Напевно, можна трохи порізати

f=

(w,h,m,f)=>(q="repeat",(z=("# "[q](w+2*(m+f))+`
`)[q](f))+(x=((e="# "[q](f))+(r="+ "[q](m))+(t="+ "[q](w))+r+e+`
`)[q](m))+(e+r+"X "[q](w)+r+e+`
`)[q](h)+x+z)

console.log(f(3,2,1,2))


0

Перл 6 , 98 байт

{map(&min,[X] map (($_='#'x$^d~'+'x$^c)~'X'x*~.flip).comb,$^a,$^b).rotor($b+2*($c+$d)).join("\n")}

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

Це порт відповіді Python xnor .

Perl 6 , 115 байт

->\a,\b,\c,\d{$_=['#'xx$!*2+a]xx($!=c+d)*2+b;.[d..^*-d;d..^a+$!+c]='+'xx*;.[$!..^*-$!;$!..^a+$!]='X'xx*;.join("
")}

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

Грубо розіграний анонімний кодовий блок, використовуючи багатовимірне призначення списку Perl 6. Наприклад, @a[1;2] = 'X';призначить 'X'елементу з індексом 2 зі списку з індексом 1, а @a[1,2,3;3,4,5]='X'xx 9;всі елементи індексів 3,4,5списків замінить індексами1,2,3 з'X' .

Пояснення:

По- перше, ми инициализируем список у вигляді a+2*(c+d)по b+2*(c+d)прямокутнику #с.

$_=['#'xx$!*2+a]xx($!=c+d)*2+a;
State:
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #

Тоді призначаємо внутрішній прямокутник +s

.[d..^*-d;d..^a+$!+c]='+'xx*;
State:
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

Нарешті, найпотаємніший прямокутник Xs.

.[$!..^*-$!;$!..^a+$!]='X'xx*;
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

0

Желе , 35 31 28 24 байт

Dịx@“#+X+#”
⁽-Fç«þ⁽-ȥç$G

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

Приймає вхід у рамку замовлення, матовий, ширину, висоту; Через кому. Виводить ASCII-художнє зображення з рамкою та матовою. Якщо порядок введення строгий, мені потрібно додати більше байтів (відповідно до моєї оригінальної публікації).

Пара гольфів на основі відповіді @ EriktheOutgolfer; Я зрозумів, що персонажі були в порядку ASCII, але не думав, як краще цим скористатися, і забув про це G. Його все ж краща відповідь!


Я ніколи не програмую в Jelly, але напевно 43134,43234 можна стиснути? EDIT: Мені потрібно навчитися читати, ви згадуєте, що вони дійсно можуть бути закодовані в 4 байти кожен. Але що стосується введення-порядку, чи можна ці числа кодувати чи ні? : S
Кевін Круїссен

@KevinCruijssen максимальне ціле число, яке можна закодувати за допомогою двох байтових синтаксисів, - 32250; оскільки обидва перевищують, що я не можу зберегти байти. Поки я припускаю, що я можу поміняти місцями і повернути назад, якщо це не дозволено!
Нік Кеннеді

Ну добре, я бачу. 43134знадобляться 3 символи кодування, у тому числі провідний / кінцевий символ, який вказує, що він закодований, також буде 5 байтів. А чи може у Джеллі якийсь дублікат, бо друге число на 100 більше, ніж перше? Не впевнені, якщо дії натискають 43134, дублюють, натискають 100, плюс, пара можлива і коротша в Jelly?
Кевін Кройсейсен

@KevinCruijssen Спочатку я спробував це, використовуючи +100, який не врятує жодного. Я думаю, що я міг би використати ланцюжок з ніладом, щоб використати той факт, що в nilad ³ 100, але якщо мені дозволено переупорядкувати входи, базові 250 цілих чисел краще
Нік Кеннеді,


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