เอาท์พุทแผนภาพภาพของภาพ


22

เขียนโปรแกรมที่ป้อนขนาดของภาพวาดความกว้างการปูและความกว้างของเฟรมสำหรับภาพบุคคลที่มีกรอบ โปรแกรมควรแสดงแผนภาพโดยใช้สัญลักษณ์Xสำหรับการทาสี+การปูและ#การกำหนดกรอบ สัญลักษณ์จะต้องคั่นด้วยช่องว่าง ช่องว่างต่อท้ายไม่เป็นไรตราบใดที่เอาต์พุตตรงกับเกณฑ์ 0ปัจจัยการผลิตสามารถ

อินพุต: 3 2 1 2 (ความกว้าง, ความสูง, ความกว้างเคลือบ, ความกว้างของกรอบ)

เอาท์พุท:

3 และ 2 แรกคือความกว้างและความสูงของการทาสี  1 คือความกว้างด้านรอบตัวมัน  2 คือความกว้างของเฟรมโดยรวม

ในรูปแบบข้อความ:

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

รหัสที่ชนะจะเป็นไปตามเงื่อนไขอย่างน้อยที่สุด


2
ท้าทายมาก! สำหรับความท้าทายในอนาคตคุณอาจต้องการใช้The Sandbox
MilkyWay90

2
คุณจะรังเกียจไหมถ้าอินพุตอยู่ในลำดับที่ต่างกัน?
vityavv

1
เราสามารถส่งคืนรายการสตริงได้หรือไม่?
MilkyWay90

5
อินพุตใด ๆ สามารถเป็นศูนย์ได้หรือไม่?
Laikoni

1
เรามีที่ว่างตอนท้ายของแต่ละบรรทัดได้ไหม?
Luis Mendo

คำตอบ:


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-strings และนิพจน์การกำหนด ขอบคุณ Jo King สำหรับ -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]

ลองออนไลน์!


ฉันโตขึ้นแล้ว! งานที่ดีดูเหมือนว่าจะสวยกอล์ฟ
MilkyWay90

กอล์ฟดี! ฉลาดมาก.
George Harris

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จะเข้าในการสั่งซื้อหากคำสั่งซื้อที่ระบุในการท้าทายมีความเข้มงวด (ยังคงรอการตรวจสอบ OP อยู่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 ไบต์ขอบคุณ Jo King ที่แนะนำให้ฉันลบพารามิเตอร์ 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มอบหมายนั้นไม่ได้ช่วยอะไรคุณเลย
King King

@ โจกิ้งโอ้ว้าวฉันลืมที่จะลบ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

Perl 6 , 98 bytes

{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("
")}

ลองออนไลน์!

codeblock แบบไม่ระบุชื่อที่ตีกอล์ฟอย่างหยาบใช้การกำหนดรายการหลายมิติของ 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'ด้วย

คำอธิบาย:

อันดับแรกเรา initialise รายการเป็นa+2*(c+d)โดยb+2*(c+d)สี่เหลี่ยมผืนผ้า#s

$_=['#'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? แก้ไข: ฉันต้องเรียนรู้ที่จะอ่านคุณพูดถึงพวกเขาสามารถเข้ารหัสในแต่ละ 4 ไบต์ แต่อินพุทสั่งทำจะทำอย่างไรกับว่าตัวเลขเหล่านี้สามารถเข้ารหัสได้หรือไม่? : S
Kevin Cruijssen

@KevinCruijssen จำนวนเต็มสูงสุดที่สามารถเข้ารหัสได้โดยใช้ไวยากรณ์ไบต์คู่คือ 32250 เนื่องจากทั้งสองเกินกว่าที่ฉันไม่สามารถบันทึกไบต์ได้ ตอนนี้ฉันจะสมมติว่าฉันสามารถสลับสิ่งต่าง ๆ รอบและย้อนกลับหากไม่ได้รับอนุญาต!
Nick Kennedy

อ่าฉันเข้าใจแล้ว 43134จะต้องมีอักขระเข้ารหัส 3 ตัวซึ่งรวมถึงอักขระนำหน้า / ต่อท้ายเพื่อระบุว่ามีการเข้ารหัสจะมีขนาด 5 ไบต์เช่นกัน และเยลลี่อาจจะมีอะไรที่ซ้ำซ้อนบ้างเพราะตัวเลขที่สองนั้นใหญ่กว่า 100 อันดับแรก? ไม่แน่ใจว่าการกระทำที่ผลัก 43134 ซ้ำกันกด 100 บวกทั้งคู่เป็นไปได้และสั้นลงในเยลลี่
Kevin Cruijssen

@KevinCruijssen ฉันเคยลองใช้ +0,100 ซึ่งไม่ได้บันทึกใด ๆ ฉันคิดว่าฉันสามารถใช้ nilad chain เพื่อใช้ความจริงที่ว่าใน nilad ³คือ 100 แต่ถ้าฉันได้รับอนุญาตให้เรียงลำดับอินพุตจำนวนเต็ม 250 ฐานจะดีกว่า
Nick Kennedy


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.