Resmin görsel çıkış diyagramı


22

Çerçeveli bir portre için resmin boyutlarını, paspas genişliğini ve kare genişliğini giren bir program yazın. Program X, resim, +paspas ve #çerçeve için sembolünü kullanarak bir diyagram çıkarmalıdır . Semboller boşlukla ayrılmalıdır. İzleyen boşluk, çıktı ölçütlerle görsel olarak eşleştiği sürece tamamdır. Girişler olabilir 0.

GİRİŞ: 3 2 1 2 (Genişlik, Yükseklik, Mat Genişlik, Çerçeve Genişliği)

ÇIKTI:

İlk 3 ve 2 resim genişliği ve yüksekliğidir.  1, etrafındaki mat genişliktir.  2, her şeyin etrafındaki çerçeve genişliğidir.

Metin biçiminde:

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

Kazanan kod, koşulları mümkün olan en az baytta tamamlar.


2
Güzel meydan okuma! Gelecekteki zorluklar için The Sandbox
MilkyWay90

2
girişin farklı bir sırada olup olmadığını dikkate alıyor musunuz?
vityavv

1
Dizelerin bir listesini verebilir miyiz?
MilkyWay90

5
Girişlerden herhangi biri sıfır olabilir mi?
Laikoni

1
Her satırın sonunda bir boşluk bırakabilir miyiz?
Luis Mendo

Yanıtlar:


5

Python 2 , 98 bayt

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)

Çevrimiçi deneyin!

Spesifikasyona kesinlikle uyarak, boşlukla ayrılmış bir ızgara yazdırır. Bunu eğlenerek *=dönüştürmek için kullanılır ave bdizeleri numaralardan.

Python 3, bazı baytları kaçınarak ' '.join, belki de f-string'ler ve atama ifadeleri kullanarak kaydedebilir . Jo King'e -2 bayt için teşekkürler.

Python 3 , 93 bayt

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]

Çevrimiçi deneyin!


Aşırı oldum! Güzel iş, oldukça golf gibi görünüyor
MilkyWay90

Güzel golf! Çok zeki.
George Harris

4

JavaScript (ES6),  118 113  107 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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

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

Giriş: Yükseklik, Genişlik, Mat Genişlik, Çerçeve Genişliği.

Çevrimiçi deneyin!

açıklama

&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

Kömür , 48 47 44 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Not: Sondaki boşluk. Düzenleme: Şimdi @ xnor algoritmasını kullanır. Açıklama:

≔×NXθ≔×NXη

Genişliği ve yüksekliği girin ve bunları Xs dizelerine dönüştürün .

FE+#×Nι

Karakter üzerinden döngü +ve #kalan iki giriş tarafından verilen bir uzunlukta dizileri dönüstürülmesi. Ardından bu iki dizenin üzerinden döngü yapın.

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

Resmin matlaştırma ve çerçeveleme için dizelerle ön eki ve sonekini ekleyin.

Eη⪫⭆θ⌊⟦ιλ⟧ 

Yatay ve dikey karakterlerin minimumunu alarak ve ardından satırları çift aralıklarla dizgilerle geçirerek her satırı kendi satırına örtülü olarak yazdırın.


2

05AB1E (eski) / 05AB1E --no-lazy , 32 31 bayt

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

Girişi sırayla alır height, width, matte, frame. Yarışmada belirtilen girdi sırası katıysa (doğrulama için hala OP bekliyor), s+1 bayt için bir satır başı (takas) eklenebilir.

--no-lazyElixir, 05AB1E'nin yeni sürümünde gerekli olan Elixir derleyici bayrağını gerektiriyor, çünkü Elixir, yuvalanmış haritalar / döngüler için tembel değerlendirme nedeniyle bazı garip davranışlar sergiliyor ( burada bu bayrak olmadan sonuç ).

Çevrimiçi olarak 05AB1E'nin eski sürümünde deneyin.
Eklenen --no-lazybayrakla birlikte 05AB1E'nin yeni sürümünde çevrimiçi olarak deneyin .

Açıklama:

и              # 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 (yayın öncesi) , 116 115 113 bayt

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

Çevrimiçi deneyin!

Golfe ilk girişimi, yakında geliştirilecektir. agenişlik, byükseklik, cmat genişlik ve dkare genişliktir.

-1 ile bayt :=tanımlamak için operatör holarake * d

Jo King sayesinde e-f parametrelerini çıkarmamı öneren -2 bayt

AÇIKLAMA:

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

eAtamayı kaldırmak, iki bayt kazandırır, fatama hiçbir şey kaydetmez
Jo King

@JoKing Oh vay, kısayolu keşfettikten sonra eve fatamaları kaldırmayı unuttumg
MilkyWay90

0

Javascript, 158 bayt

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

Muhtemelen biraz kesilmiş olabilir

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

Perl 6 , 98 bayt

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

Çevrimiçi deneyin!

Bu, xnor'ın Python cevabının limanı .

Perl 6 , 115 bayt

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

Çevrimiçi deneyin!

Perl 6'nın çok boyutlu liste atamasını kullanan, kabaca golf oyunu olan anonim kod bloğu. Örneğin, @a[1;2] = 'X';atayacaktır 'X'indeksi 1 ile listeden endeksi 2 ile elemana ve @a[1,2,3;3,4,5]='X'xx 9;endeksler ile tüm öğeleri yerini alacak 3,4,5endekslerine listelerin 1,2,3ile 'X'.

Açıklama:

İlk olarak, bir listeyi initialize a+2*(c+d)tarafından b+2*(c+d)bir dikdörtgen #s.

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

Sonra +s nin iç dikdörtgenini atarız.

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

Son olarak, Xs nin en içteki dikdörtgeni .

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

0

Jelly , 35 31 28 24 bayt

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

Çevrimiçi deneyin!

Sipariş karesinde girdiyi alır; mat, genişlik, yükseklik; virgülle ayrılmış. ASCII-art resmini kare ve mat olarak çıktılar. Giriş emri kesinse, daha fazla bayt eklemem gerekir (orijinal gönderim uyarınca).

EriktheOutgolfer'in cevabına dayanan birkaç golf sahası; Karakterlerin ASCII sırasına göre olduğunu fark ettim ama bundan en iyi şekilde faydalanmayı düşünmedim ve unutmuştum G. Onun hala yine de daha iyi bir cevap!


Jelly'i asla programlamam ama kesinlikle 43134,43234 ile sıkıştırılabilir mi? EDIT: Okumayı öğrenmeliyim, aslında her birinin 4 byte olarak kodlanabileceğini söylüyorsunuz. Ancak bu sayıların kodlanıp kodlanmayacağı ile ilgili girdi sırası nedir? : S
Kevin Cruijssen

@KevinCruijssen, iki byte sözdizimi kullanılarak kodlanabilen maksimum tamsayı 32250'dir; her ikisi de bittiğinden beri baytları kaydedemiyorum. Şimdilik bir şeyleri değiş tokuş edebileceğimi ve izin verilmezse geri dönebileceğimi farz edeceğim!
Nick Kennedy

Ah tamam, anladım. 431343 kodlama karakterine ihtiyaç duyacak, kodlama kodunun 5 bayt olacağını belirtmek için baştaki / sondaki karakter dahil Ve ikinci sayının birincisinden 100 büyük olması nedeniyle Jelly belki de bir tür kopyaya sahip midir? Jelly'in hareketlerinin 43134, çift, 100, artı, çiftlerin mümkün olup daha kısa olduğundan emin değil misiniz?
Kevin Cruijssen

@KevinCruijssen Başlangıçta, +0,100 kullanarak herhangi bir tasarruf sağlamadığını denedim. Niladda ³ değerinin 100 olduğu gerçeğini kullanmak için nilad zinciri kullanabileceğimi düşünüyorum, ancak girişleri yeniden sıralamama izin verirsem temel 250 tamsayıları daha iyidir
Nick Kennedy

0

Perl 5, 115 bayt

$_=(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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.