Wyjściowy schemat wizualny obrazu

22

Napisz program, który wprowadza wymiary obrazu, szerokość maty i szerokość ramki dla portretu w ramce. Program powinien wypisać schemat za pomocą symbolu Xmalowania, +maty i #kadrowania. Symbole muszą być oddzielone spacjami. Końcowe białe znaki są w porządku, o ile dane wyjściowe wizualnie spełniają kryteria. Dane wejściowe mogą być 0.

WEJŚCIE: 3 2 1 2 (szerokość, wysokość, szerokość matowa, szerokość ramki)

WYDAJNOŚĆ:

Pierwsze 3 i 2 to szerokość i wysokość malowania.  1 to matowa szerokość wokół niego.  2 to szerokość ramki wokół całej rzeczy.

W formie tekstowej:

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

Zwycięski kod spełnia warunki w możliwie najmniejszej liczbie bajtów.

George Harris
źródło
2
Niezłe wyzwanie! Do przyszłych wyzwań możesz użyć The Sandbox
MilkyWay90
2
masz coś przeciwko, jeśli dane wejściowe są w innej kolejności?
vityavv
1
Czy możemy zwrócić listę ciągów znaków?
MilkyWay90
5
Czy którekolwiek z danych wejściowych mogą wynosić zero?
Laikoni
1
Czy możemy mieć spację na końcu każdej linii?
Luis Mendo

Odpowiedzi:

5

Python 2 , 98 bajtów

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)

Wypróbuj online!

Drukuje siatkę oddzieloną spacjami, ściśle według specyfikacji. Jestem rozbawiony, który *=służy do konwersji ai bod liczb do ciągów.

Python 3 może zaoszczędzić niektóre bajty, unikając ' '.join, a może więcej, używając ciągów F i wyrażeń przypisania. Dzięki Jo King za -2 bajty.

Python 3 , 93 bajty

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]

Wypróbuj online!

xnor
źródło
Zostałem rozegrany! Dobra robota, wygląda na golfa
MilkyWay90
Niezły golf! Bardzo mądry.
George Harris
4

JavaScript (ES6),  118 113  107 bajtów

(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)

Wypróbuj online!

Skomentował

(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
Arnauld
źródło
3

MATL , 24 bajty

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

Dane wejściowe to: wysokość, szerokość, szerokość matowa, szerokość ramki.

Wypróbuj online!

Wyjaśnienie

&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
Luis Mendo
źródło
2

Węgiel drzewny , 48 47 44 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: końcowe miejsce. Edycja: Teraz używa algorytmu @ xnor. Wyjaśnienie:

≔×NXθ≔×NXη

Wprowadź szerokość i wysokość i przekonwertuj je na ciągi znaków Xs.

FE+#×Nι

Zapętlaj znaki +i #konwertując je na ciągi długości podane przez pozostałe dwa dane wejściowe. Następnie zapętlić te dwa ciągi.

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

Przedrostek i przyrostek obrazu za pomocą sznurków do matowania i kadrowania.

Eη⪫⭆θ⌊⟦ιλ⟧ 

Pętlę nad łańcuchami, biorąc minimum znaków poziomych i pionowych, a następnie podwójnie rozmieszczając rzędy, domyślnie drukując każdy wiersz na osobnej linii.

Neil
źródło
2

05AB1E (starsze) / 05AB1E --no-lazy , 32 31 bajtów

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

Pobiera dane wejściowe w kolejności height, width, matte, frame. Jeśli kolejność wprowadzania określona w wyzwaniu jest ścisła (nadal czeka na OP na weryfikację), można dodać wiodącą s(zamianę) dla bajtu +1.

Wymagało --no-lazykompilatora flagę Elixir w nowej wersji 05AB1E, ponieważ Elixir ma jakieś dziwne zachowanie ze względu na leniwe oceny dla zagnieżdżonych mapy / pętli ( tutaj wynik bez tej flagi ).

Wypróbuj online w starszej wersji 05AB1E.
Wypróbuj online w nowej wersji 05AB1E z dodaną --no-lazyflagą.

Wyjaśnienie:

и              # 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)
Kevin Cruijssen
źródło
1

Płótno , 24 bajty

X;«[lx*e⤢}
X×*+⁸#⁸ *J ×O

Wypróbuj tutaj!

Powinien być o 5 bajtów krótszy, ale nie dlatego, że płótno jest wadliwe.

dzaima
źródło
1

R 119 bajtów

function(w,h,m,f)write(Reduce(function(x,y)rbind(y,cbind(y,x,y),y),rep(c("+","#"),c(m,f)),matrix("X",w,h)),1,w+2*f+2*m)

Wypróbuj online!

Giuseppe
źródło
1

Python 3.8 (wersja wstępna) , 116 115 113 bajtów

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])

Wypróbuj online!

Pierwsza próba gry w golfa zostanie wkrótce ulepszona. aoznacza szerokość, bwysokość, cmatową szerokość i dszerokość ramki.

-1 bajtów przy użyciu :=operatora do zdefiniowania hjakoe * d

-2 bajty dzięki Jo Kingowi sugerującemu usunięcie parametrów e i f

WYJAŚNIENIE:

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)
    )
MilkyWay90
źródło
Usunięcie ezadania pozwala zaoszczędzić dwa bajty, fzadanie nie oszczędza niczego
Jo King
@JoKing O wow, zapomniałem usunąć zadania ei fzadania po odkryciu gskrótu
MilkyWay90
0

JavaScript, 158 bajtów

(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)

Prawdopodobnie można go nieco przyciąć

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))

vityavv
źródło
0

Perl 6 , 98 bajtów

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

Wypróbuj online!

To jest port odpowiedzi Xnora na Python .

Perl 6 , 115 bajtów

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

Wypróbuj online!

Z grubsza golfowy anonimowy blok kodu wykorzystujący wielowymiarowe przypisanie listy w Perl 6. Na przykład @a[1;2] = 'X';przypisze 'X'elementowi o indeksie 2 z listy o indeksie 1 i @a[1,2,3;3,4,5]='X'xx 9;zastąpi wszystkie elementy indeksami3,4,5 list o indeksach 1,2,3o'X' .

Wyjaśnienie:

Po pierwsze, możemy zainicjować listę postaci a+2*(c+d)przez b+2*(c+d)prostokąta #s.

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

Następnie przypisujemy wewnętrzny prostokąt +s

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

Wreszcie najbardziej wewnętrzny prostokąt Xs.

.[$!..^*-$!;$!..^a+$!]='X'xx*;
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #
Jo King
źródło
0

Galaretka , 35 31 28 24 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe w ramce zamówienia, matowy, szerokość, wysokość; oddzielone przecinkami. Wysyła obraz ASCII-art z ramką i matową. Jeśli kolejność wprowadzania jest ścisła, muszę dodać więcej bajtów (zgodnie z moim oryginalnym postem).

Kilka golfów w oparciu o odpowiedź @ EriktheOutgolfer; Zrozumiałem, że postacie są w porządku ASCII, ale nie zastanawiałem się, jak najlepiej to wykorzystać, i zapomniałem o tym G. Jego odpowiedź jest jednak lepsza!

Nick Kennedy
źródło
Nigdy nie programuję w Galaretce, ale na pewno 43134,43234 można skompresować? EDYCJA: Muszę nauczyć się czytać, wspominasz, że rzeczywiście można je zakodować w 4 bajtach każdy. Ale co ma kolejność wprowadzania z tym, czy te liczby można zakodować, czy nie? : S
Kevin Cruijssen
@KevinCruijssen maksymalna liczba całkowita, którą można zakodować przy użyciu składni dwubajtowej, to 32250; ponieważ oba przekraczają to, nie mogę zapisać bajtów. Na razie zakładam, że mogę wymieniać rzeczy i cofać, jeśli nie jest to dozwolone!
Nick Kennedy
Ach, ok, rozumiem. 43134będzie potrzebował 3 znaków kodujących, w tym znak wiodący / końcowy wskazujący, że jest zakodowany, będzie miał również 5 bajtów. A może Jelly ma jakiś duplikat, ponieważ druga liczba jest o 100 większa od pierwszej? Nie masz pewności, czy akcje push 43134, duplikaty, push 100, plus, para jest możliwa i krótsza w galaretce?
Kevin Cruijssen
@KevinCruijssen Początkowo próbowałem tego używając +0,100, który nie zapisuje żadnego. Myślę, że mógłbym użyć łańcucha nilad, aby użyć faktu, że w niladzie ³ wynosi 100, ale jeśli pozwolę sobie na zmianę kolejności danych wejściowych, 250 liczb całkowitych jest lepszych
Nick Kennedy
0

Perl 5, 115 bajtów

$_=(X x$F[0].$/)x$F[1];sub F{s,^|\z,/.*/;$_[0]x"@+".$/,ge,s/^|(?=
)/$_[0]/gm while$_[1]--}F('+',$F[2]);F('#',$F[3])

TIO

Nahuel Fouilleul
źródło
0

PowerShell , 132 bajty

param($w,$h,$m,$f)filter l{"$(,'#'*$f+,$_[0]*$m+,$_[1]*$w+,$_[0]*$m+,'#'*$f)"}($a=@('##'|l)*$f)
($b=@('++'|l)*$m)
@('+X'|l)*$h
$b
$a

Wypróbuj online!

mazzy
źródło