พิมพ์เมทริกซ์ Block-Diagonal Matrix


27

นี่คือรหัสกอล์ฟแบบง่ายๆขนาดกัด (ขนาดไบต์): เนื่องจากรายการจำนวนเต็มบวกที่ไม่ว่างน้อยกว่า 10 ให้พิมพ์เมทริกซ์บล็อกเส้นทแยงมุมที่รายการจะระบุขนาดของบล็อกตามลำดับ บล็อกจะต้องประกอบด้วยจำนวนเต็มบวกน้อยกว่า 10 ดังนั้นหากคุณได้รับเป็นอินพุต

[5 1 1 2 3 1]

ตัวอย่างเช่นผลลัพธ์ของคุณอาจเป็นเช่นนั้น

1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

หรือ

1 2 3 4 5 0 0 0 0 0 0 0 0
6 7 8 9 1 0 0 0 0 0 0 0 0
2 3 4 5 6 0 0 0 0 0 0 0 0
7 8 9 1 2 0 0 0 0 0 0 0 0
3 4 5 6 7 0 0 0 0 0 0 0 0
0 0 0 0 0 8 0 0 0 0 0 0 0
0 0 0 0 0 0 9 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 0 0 0 0
0 0 0 0 0 0 0 3 4 0 0 0 0
0 0 0 0 0 0 0 0 0 5 6 7 0
0 0 0 0 0 0 0 0 0 8 9 1 0
0 0 0 0 0 0 0 0 0 2 3 4 0
0 0 0 0 0 0 0 0 0 0 0 0 5

หรืออะไรทำนองนั้น องค์ประกอบในเมทริกซ์จะต้องคั่นด้วยช่องว่าง (เดี่ยว) และแถวคั่นด้วยบรรทัดใหม่ (เดี่ยว) ต้องไม่มีช่องว่างนำหน้าหรือต่อท้ายบนบรรทัดใด ๆ คุณสามารถหรือไม่พิมพ์บรรทัดใหม่ที่ต่อท้าย

คุณสามารถเขียนฟังก์ชั่นหรือโปรแกรมรับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันในรูปแบบสตริงหรือรายการที่สะดวก (ตราบใดที่ยังไม่ได้ประมวลผลล่วงหน้า) อย่างไรก็ตามผลลัพธ์จะต้องถูกพิมพ์ไปที่ STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) เมื่อเทียบกับฟังก์ชันที่ส่งคืนจากฟังก์ชัน

คุณต้องไม่ใช้ฟังก์ชันในตัวที่ออกแบบมาเพื่อสร้างเมทริกซ์บล็อกแนวทแยง

นี่คือรหัสกอล์ฟดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) จะชนะ

ลีดเดอร์

ฉันคาดหวังว่าภาษาที่ใช้อาเรย์ (เช่น J และ APL) จะมีความได้เปรียบที่นี่ แต่ฉันไม่ต้องการที่จะกีดกันผู้คนจากการพยายามทำเช่นเดียวกับที่พวกเขาสามารถทำได้ในภาษาที่พวกเขาเลือก ดังนั้นนี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา ดังนั้นทำไมไม่ลองและคว้าจุดหลัง?

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

คำตอบ:


20

J, 7 ไบต์

ขอบคุณสำหรับFUZxxlสำหรับการปรับปรุง 2 ไบต์

ภาษาที่ใช้อาร์เรย์ควรนับที่นี่ในการแข่งขันที่แตกต่างกันเนื่องจากมีข้อได้เปรียบอย่างมาก :)

   =/~@#<\

   (=/~@#<\) 3 1 1 2
1 1 1 0 0 0 0
1 1 1 0 0 0 0
1 1 1 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 0 0 0 1 1
0 0 0 0 0 1 1

อีก 7 ไบต์วิธี:

#]=@##\

คำอธิบายสำหรับเวอร์ชั่นเก่า([:=/~]#<\):

ขั้นตอนแรกคือการสร้างnชิ้นส่วนของสิ่งที่คล้ายกัน (ตัวเลขเช่น) nสำหรับองค์ประกอบทุกรายการ สิ่งเหล่านี้ควรแตกต่างจากองค์ประกอบอื่น ๆ เช่นใช้หมายเลขธรรมชาติจะกลายเป็น3 1 1 20 0 0 1 2 3 3

หากต้องการบันทึกเป็นไบต์เราใช้ส่วนนำหน้าของรายการ:

   ]#<\ 3 1 1 2
┌─┬─┬─┬───┬─────┬───────┬───────┐
│3│3│3│3 1│3 1 1│3 1 1 2│3 1 1 2│
└─┴─┴─┴───┴─────┴───────┴───────┘

ด้วย=/~คำกริยาที่เราสร้างตารางของผลิตภัณฑ์ Descartes คำนำหน้ากล่องเหล่านี้และแต่ละเซลล์จะเป็น1ถ้าทั้งสองรายการมีค่าเท่ากัน0เป็นอย่างอื่น


2
ฉันไม่คิดว่าวงเล็บ[:=/~]#<\ จะนับรวมคะแนนของคุณ นอกจากนี้=/~@#<\ สำหรับสองไบต์พิเศษที่ถูกตัดออก
FUZxxl

"อย่างไรก็ตามผลลัพธ์จะต้องพิมพ์ไปที่ STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) เมื่อเทียบกับฟังก์ชันที่ส่งคืนจากฟังก์ชัน " คุณอาจต้องการอินพุตที่ชัดเจน (ดังนั้นจึงไม่ใช่เพียงฟังก์ชัน) หรือเอาต์พุตที่ชัดเจน
marinus

@marinus J พิมพ์ผลลัพธ์ของนิพจน์เป็น stdout หากไม่ได้ผูกกับตัวแปร
FUZxxl

@FUZxxl: ใช่ แต่(=/~@#<\)เป็นเพียงฟังก์ชั่น คุณต้องนำไปใช้กับบางสิ่งเพื่อให้ได้นิพจน์ดังนั้นคุณต้องป้อนข้อมูลอย่างชัดเจน ( ".1!:1[1) หรือถ้าคุณต้องการส่งฟังก์ชั่นฟังก์ชั่นนั้นควรพิมพ์ค่าจริงและไม่เพียงแค่คืนค่า (เช่นecho@หรือบางสิ่งบางอย่าง) )
marinus

=/~&I.­­­­­­­
ngn

11

APL, 10

∘.=⍨∆/⍋∆←⎕

ตัวอย่าง:

      ∘.=⍨∆/⍋∆←⎕
⎕:
      5 1 1 2 3 1 
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

คำอธิบาย:

  • ∆←⎕: อ่านเข้าจัดเก็บใน
  • ⍋∆: ค้นหาการเรียงสับเปลี่ยนที่( เรียงตามนี้จะให้ค่าที่ไม่ซ้ำกันสำหรับแต่ละค่าในอินพุต)
  • ∆/: สำหรับค่าที่ไม่ซ้ำแต่ละค่าให้ทำซ้ำNครั้งโดยที่Nค่าที่สอดคล้องกันในอินพุต
  • ∘.=⍨: ทำให้เมทริกซ์ทำการเปรียบเทียบแต่ละค่าในรายการนั้นกับค่าอื่น ๆ

เพื่อทดสอบสิ่งนี้http://tryapl.orgคุณอาจต้องการใช้ dfn {∘.=⍨⍵/⍋⍵}เนื่องจากไซต์กรองการใช้ทั้งหมดของ(ยกเว้น⎕IOและสิ่งอื่น ๆ เช่นนั้น)
FUZxxl

1
@FUZxxl: มีข้อความว่า "อย่างไรก็ตามผลลัพธ์จะต้องพิมพ์ไปที่ STDOUT (หรือตัวเลือกอื่นที่ใกล้เคียงที่สุด) เมื่อเทียบกับฟังก์ชันที่ส่งคืนจากฟังก์ชัน " ดังนั้นจึง{∘.=⍨⍵/⍋⍵}ไม่ถูกต้อง คุณต้องการ{⎕←∘.=⍨⍵/⍋⍵}ซึ่งไม่เพียง แต่มีค่าใช้จ่ายตัวละครสองตัว แต่ยังคงไม่สามารถใช้งานได้กับ TryAPL (และโดยทั่วไป TryAPL มีข้อ จำกัด เกินกว่าที่จะเป็นประโยชน์)
marinus

ถ้ามันต้องพิมพ์ผลออกมาคุณจะไม่ต้องการมัน⎕←อยู่ดีแม้ว่าจะไม่มี dfn อยู่แล้ว?
FUZxxl

@FUZxxl: ไม่เอาต์พุตของนิพจน์จะถูกพิมพ์โดยอัตโนมัติหากไม่มีสิ่งใดทำกับมัน
marinus

อ่าฉันเข้าใจแล้ว ฉันรู้สึกว่ามันจะเกิดขึ้นเมื่อคุณใช้ล่ามแบบโต้ตอบเท่านั้น
FUZxxl

8

R, 69 63

function(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))

กรณีทดสอบ:

(function(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x)))(c(5,1,1,3,1))
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 0 
0 0 0 0 0 0 0 1 1 1 0 
0 0 0 0 0 0 0 1 1 1 0 
0 0 0 0 0 0 0 1 1 1 0 
0 0 0 0 0 0 0 0 0 0 1

ฟังก์ชั่นด้านนอกทำงานส่วนใหญ่ที่นี่จากนั้นเป็นเพียงแค่กรณีของการรับเอาต์พุตที่ถูกต้อง - ขอบคุณ @Vlo สำหรับความช่วยเหลือของเขา


ทางออกที่ดีมาก
MickyT

ทางออกที่ดี ไม่เคยคิดถึงการใช้-/+เพื่อบีบบังคับตรรกะ บันทึกไม่กี่ไบต์function(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))63
Vlo

6

Python 3, 103 97 82 78 76 ไบต์

def P(L,n=0):k,*L=L;exec("print(*[0]*n+[1]*k+[0]*sum(L));"*k);L and P(L,n+k)

การใช้เครื่องหมายเพื่อใช้ประโยชน์จากธรรมชาติของการแยกพื้นที่printด้วยบิตของการเรียกซ้ำ


6

Ruby, 86 90 83 ไบต์

กอล์ฟครั้งแรกของฉัน!

->l{n=l.reduce :+;s=0;l.map{|x|x.times{puts ([0]*s+[1]*x+[0]*(n-x-s))*" "};s+=x}}

รับอาร์เรย์ด้วยจำนวนเต็มพิมพ์ผลลัพธ์ที่ต้องการ:

$ (->l{n=l.reduce :+;s=0;l.map{|x|x.times{puts ([0]*s+[1]*x+[0]*(n-x-s))*" "};s+=x}}).call([5, 1, 1, 2, 3, 1])
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

แก้ไข:

ขอบคุณ Martin Büttnerที่ช่วยฉันย่อบางสิ่ง!


1
คุณสามารถบันทึกตัวอักษรบางอย่างเพิ่มเติม: สามารถ->(l) จะสั้นกว่า สามารถลงไป ->lmapeach.join(" ")*" "
Martin Ender

6

Matlab, 60 54 ไบต์

นี่จะเป็นเขตพิเศษของ Matlab ถ้าเราสามารถใช้ฟังก์ชั่น builtin ...

ขอบคุณ @sanchises สำหรับการแก้ไขข้อผิดพลาดที่ฉันพลาด

c=0;a=input('');for A=a;v=c+1:c+A;d(v,v)=1;c=c+A;end;d

Wooow มันเป็นจนถึงตอนนี้ที่ฉันสังเกตเห็นว่าข้อมูลโค้ด js นี้สร้างลีดเดอร์บอร์ด !!! ฉันไม่เคยสังเกตสิ่งนี้ได้อย่างไร ??? ขอบคุณที่
ชี้นำ

ฉันรู้ใช่มั้ย มันเจ๋งจริงๆ!
Alex A.

1
ฉันกำลังจะโพสต์คำตอบเดียวกันเกือบ :-)
Luis Mendo

เหมือนกันหรือบางสิ่งที่แตกต่างกันเล็กน้อย? =) (นอกเหนือจากชื่อตัวแปร)
ข้อบกพร่อง

คล้ายกันมากเกินไปสำหรับฉันที่จะโพสต์ :-)
Luis Mendo

6

Matlab, 53 ไบต์

แม้ว่าจะมีเพียงตัวอักษรตัวเดียวที่สั้นกว่าส่วน Matlab อื่น ๆ แต่ฉันคิดว่ารหัสนั้นแตกต่างกันมากพอที่จะรับประกันคำตอบใหม่:

d=[];a=input('');for A=a;v=1:A;d(end+v,end+v)=1;end;d

เคล็ดลับหลักของหลักสูตรคือการทำดัชนีนอกขอบเขต แต่รวมกับการใช้endเป็นตัวแปรเพื่อให้กะทัดรัดยิ่งขึ้น


1
ประณาม - ฉันใช้เวลาครึ่งชั่วโมงในการพยายามตีกอล์ฟend+1:end+vเพื่อกำจัดตัวแปร 'ตัวนับ' และฉันไม่ได้คิดถึงวิธีนี้
Sanchises

อันที่จริงแล้ว @Geobits พูดถึงการแก้ไขที่พยายามทำโดยผู้ไม่ประสงค์ออกนามblkdiagจะเป็นการละเมิดข้อกำหนด เพียงเพื่อการอ้างอิงฉันจะใส่หลักของมันที่นี่ต่อไป:blkdiag(A,ones(i))
Dennis Jaheruddin

4

CJam, 21

q~{T):Ta*~}%_f{f=S*N}

ลองที่http://cjam.aditsu.net/

คำอธิบาย:

q~          read and evaluate the input array
{…}%        transform each number using the block
    T):T    increment T (initially 0)
    a*      wrap T in an array and repeat it <number> times
    ~       dump the repeated numbers so they end up in a flat array
_           duplicate the array
f{…}        for each array item and the array
    f=      compare the current item with each item, resulting in an array of 1 and 0
    S*      join with spaces
    N       add a newline

4

Python 3, 79

def f(l,s=0):
 for x in l:r=[0]*sum(l);r[s:s+x]=[1]*x;s+=x;exec("print(*r);"*x)

ติดตามดัชนีซ้ายสุดของบล็อกเป็นsและสร้างxรายการหลังจากนั้นขนาดของบล็อกปัจจุบันจะอยู่1ที่ไหน xแถวนี้จะถูกพิมพ์xครั้ง งูหลาม 3 print(*r)เป็นสิ่งจำเป็นที่ต้องทำ


มันเป็นหนึ่งในถ่านสั้นเพื่อทำแสดงrเป็น[0]*s+[1]*x+[0]*(sum(l)-s-x)แต่ฉันยังคงมองหาวิธีที่ดีกว่า
xnor

4

Haskell, 118 116 ไบต์

(#)=replicate
f i=putStr$[e#(unwords$sum h#"0"++e#"1"++sum t#"0")|(h,e:t)<-map(`splitAt`i)[0..length i-1]]>>=unlines

การใช้งาน: f [2,1,1,3]

เอาท์พุท:

1 1 0 0 0 0 0
1 1 0 0 0 0 0
0 0 1 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 1 1
0 0 0 0 1 1 1
0 0 0 0 1 1 1

มันทำงานอย่างไร:

[0..length i-1]           for each index n of the input list i
(h,e:t)<-map(`splitAt`i)  split i at n and
                            let e be the element at index n
                            let h be the list of elements to the left of e
                            let t be the list of elements to the right of e
                          foreach triple h, e, t make a list of
sum h # "0" ++              sh copies of "0" (sh = the sum of the elements of h) followed by
e # "1" ++                  e copies of "1" followed by
sum t # "0"                 st copies of "0" (st = the sum of the elements of t)
unwords                   join those list elements with spaces inbetween
e #                       make e copies
>>=unlines                join those lists with newlines inbetween
putStr                    print

คุณสามารถบันทึกสองไบต์โดยทำ(h,e:t)<-map(`splitAt`i)[0..length i-1]เนื่องจากnไม่ได้ใช้ภายนอกการletรวม
Zgarb

@Zgarb: พบที่ดี ขอบคุณ!
nimi

3

Pyth, 23 21 ไบต์

ที่เก็บ GitHub สำหรับ Pyth

Ju+G*]GHQYFNJjdmsqdNJ

[3, 1, 1, 2]ป้อนข้อมูลคือรายการของจำนวนเต็มเช่น ลองใช้งานออนไลน์: Pyth Compiler / Executor

ใช้แนวคิดที่ค่อนข้างคล้ายกันกับรหัส J ของ randomra ส่วนแรกของรหัสJu+G*]GHQYสร้างnส่วนต่าง ๆ ของสิ่งที่คล้ายกัน สำหรับตัวอย่างอินพุต[3, 1, 1, 2]ผลลัพธ์จะเป็นดังนี้:

[
 [], 
 [], 
 [], 
 [[], [], []], 
 [[], [], [], [[], [], []]], 
 [[], [], [], [[], [], []], [[], [], [], [[], [], []]]], 
 [[], [], [], [[], [], []], [[], [], [], [[], [], []]]]
]

องค์ประกอบที่เหมือนกันสามประการแรกมากกว่าหนึ่งองค์ประกอบจากนั้นอีกหนึ่งองค์ประกอบอีกครั้งและในตอนท้ายสององค์ประกอบที่เหมือนกัน

Ju+G*]GHQY
 u      QY  reduce the input Q, start with empty list G=[]
            for each H in input, replace the value of G by:
  +G*]GH       G+[G]*H
J           store the result in J

ส่วนที่สองของรหัสคือการเปรียบเทียบองค์ประกอบของผลิตภัณฑ์คาร์ทีเซียนและการพิมพ์

FNJjdmsqdNJ
FNJ          for N in J:
     m    J     map each element d of J to
       qdN          the boolean value of d == N
      s             and convert it to an integer (0 = False, 1 = True)
   jd           print the resulting list seperated by d (=space)

3

C ++, 294 ไบต์

ใช้คอมไพเลอร์ - GCC 4.9.2

#include<bits/stdc++.h>
using namespace std;
#define F(a,b) for(a=0;a<b;a++)
#define V vector<int>
int n,i,j,s,o;
main(){V v;while(cin>>n)v.push_back(n),s+=n;vector<V> m(s,V(s,0));F(i,v.size()){F(j,v[i])F(n,v[i])m[j+o][n+o]=1;o+=v[i];}F(j,s){F(n,s)cout<<m[j][n]<<((n==s-1)?"":" ");cout<<"\n";}}

คำอธิบาย -:

#include<bits/stdc++.h>
using namespace std;
#define F(a,b) for(a=0;a<b;a++)
#define V vector<int>
int n, i, j, s, o;
/*
 n = Used to take inputs, and as an iterator after that
 i, j = Iterators
 s = sum of all the inputs
 o = offset ( used to find the location of the starting cell of the next matrix of 1's )
*/

main()
{
    V v;
    while ( cin >> n )  // Take input
    {
        v.push_back( n ), s += n;
    }

    vector<V> m( s, V( s, 0 ) ); // m is a matrix of size (s*s) with all elements initialized to 0
    F( i, v.size() )
    {
        F( j, v[i] )F( n, v[i] )m[j + o][n + o] = 1; // Assign 1 to the required cells
        o += v[i]; // Add the value of the current element to the offset
    }

    F( j, s )  // Output the matrix
    {
        F( n, s )cout << m[j][n] << ( ( n == s - 1 ) ? "" : " " ); // Prevent any trailing whitespace
        cout << "\n";
    }
}

3

K, 30 ไบต์

{"i"$,/x#',:',/'g=\:\:x#'g:<x}

โดยพื้นฐานแล้วขโมยคำตอบของ marinus

k){"i"$,/x#',:',/' g=\:\:x#'g:<x}5 1 1 2 3 1
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

2

Java, 163

a->{int n=a.stream().mapToInt(x->x).sum(),t=0,j,k;for(int i:a){for(j=0;j++<i;System.out.println("\b"))for(k=0;k<n;)System.out.print(k>=t&k++<t+i?"1 ":"0 ");t+=i;}}

Consumer ที่รับรายการจำนวนเต็ม

รุ่นที่อ่านได้พร้อมด้วยรหัสสำเร็จรูป:

java.util.function.Consumer<java.util.List<Integer>> c = a -> {
    int n = a.stream().mapToInt(x -> x).sum(), t = 0, j, k;
    for (int i : a) {
        for (j = 0; j++ < i; System.out.println("\b")) {
            for (k = 0; k < n;) {
                System.out.print(k >= t & k++ < t + i ? "1 " : "0 ");
            }
        }
        t += i;
    }
};

เรียกใช้โดย:

List list = Arrays.asList(5, 1, 1, 2, 3, 1);
c.accept(list);

2

Python 2, 163 114 ไบต์

gnibbler golfed พวงนี้

h=input()
r=range
l=len(h)
for i in r(l):
 for k in r(h[i]):print" ".join("01"[i==j]for j in r(l)for x in r(h[j]))

3
แล้วไงprint" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))ล่ะ
gnibbler

ฮ่า ! ฉันคิดว่าฉันสามารถทำอะไรแบบนั้นได้
KSFT

นี้ดูเหมือนว่าจะพิมพ์เฉพาะหนึ่งแถวของแต่ละบล็อก
XNOR

@xnor คุณพูดถูก ฉันซ่อมมัน.
KSFT

2

Python 3, 74

def f(a,p=0):n=a.pop(0);exec("print(*'0'*p+'1'*n+'0'*sum(a));"*n);f(a,p+n)

ไม่ยุติการนี้มีข้อผิดพลาด?
XNOR

@xnor ใช่มันทำ!
feersum

1
@feersum นั่นเป็นสิ่งที่อนุญาตหรือไม่? ฉันไม่เห็นโพสต์เมตาใด ๆ เกี่ยวกับเรื่องนี้ คุณคิดว่าไงมาร์ติน ถ้าได้รับอนุญาต Sp3000 สามารถบันทึกได้ 6 ตัวอักษรโดยกำจัดการandลัดวงจร
XNOR

@xnor ไม่ข้อผิดพลาดยุติโปรแกรมหรือเพียงโทรฟังก์ชั่นคืออะไร? ถ้าเรื่องนี้ยุติโปรแกรมแล้วไม่มีผมไม่คิดว่ามันได้รับอนุญาต ผมเคยแสดงความเห็นของผมเกี่ยวกับเรื่องนี้ที่นี่ในเมตา ฉันยังคิดว่าถ้า feersum มีความเห็นว่าสิ่งนี้ถูกต้องตามกฎหมายอย่างสมบูรณ์เขาจะระบุไว้ในคำตอบของเขาแทนที่จะหวังว่าจะไม่มีใครสังเกตเห็น
มาร์ตินเอนเดอร์

@ MartinBüttnerยุติโปรแกรมถ้าผมเข้าใจสิ่งที่คุณกำลังถาม หากคุณต้องทำf([1,2,3]);print("Done")ข้อผิดพลาดจะสิ้นสุดโปรแกรมหลังจากที่พิมพ์เมทริกซ์บล็อกและจะไม่พิมพ์ "เสร็จสิ้น"
XNOR

2

JavaScript (ES6) 103 107

103 ไบต์เป็นฟังก์ชั่นที่ไม่ระบุชื่อไม่นับF=( แต่คุณต้องนี้เพื่อทดสอบ)

F=l=>alert(l.map((n,y)=>(l.map((n,x)=>Array(n).fill(x==y|0))+'\n').repeat(n))
.join('').replace(/,/g,' '))

การทดสอบใน Firefox / คอนโซล FireBug

F([5,1,1,2,3,1])

เอาท์พุต

1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1


1

Pyth, 31 30

FbQVbjd++*]0Z*b]b*]0--sQbZ)~Zb

โปรแกรมที่ไร้เดียงสาสวยรับอินพุตบน stdin สิ่งนี้อาจจะสามารถเล่นกอล์ฟได้มากขึ้น;)

ขอบคุณ @Jakube ที่ชี้ให้เห็นว่าถ่านที่สูญเปล่า

ลองที่นี่


1

Perl, 69

#!perl -na
$j=s/./0 x$&/ger;print+($j|$i.1x$_)=~s/\B/ /gr x($i.=0 x$_,$_)for@F

ใช้อินพุตมาตรฐาน:

$ perl a.pl <<<"1 2 3"
1 0 0 0 0 0
0 1 1 0 0 0
0 1 1 0 0 0
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1

แปลกนี้ไม่ได้พิมพ์บรรทัดใหม่สำหรับฉันใน ideone นอกจากนี้ตามโพสต์นี้คุณควรเขียน Shebang ที่กำหนดเองเป็น 4 ไบต์ไม่ใช่สอง คุณสามารถแก้ไขได้โดยไม่ใช้ Shebag แต่ใช้การตั้งค่าสถานะบนล่ามและเรียกรหัสด้วย-eแทนที่จะเป็นจากไฟล์ (ดูตัวอย่างในเมตาโพสต์นั้น) นอกจากนี้ฉันคิดว่าคุณไม่จำเป็นต้องnตั้งค่าสถานะ - ตาม perldoc aกำหนดnโดยปริยาย
Martin Ender

โปรแกรมจะนำ eol ออกจากอินพุตมาตรฐาน การตั้งค่า ideone ของคุณจะทำงานเมื่อคุณเพิ่ม สำหรับการนับตัวละครฉันนับด้วยวิธีนี้ในคำตอบทั้งหมดของฉันและฉันได้เห็นคนอื่นทำเช่นนี้ด้วย ฉันเคยเห็นโพสต์ที่คุณเชื่อมโยงมาก่อน แต่ฉันไม่เข้าใจความหมายของ "นับความแตกต่างperl -nl file.pl" กฎ perlgolf ดั้งเดิมจะนับยัติภังค์ แต่ไม่เว้นวรรคดังนั้น 3 ตัวอักษรในกรณีนี้
nutki

@ MartinBüttnerมันเป็นที่สงสัยทั้งหมดอยู่แล้วว่าเป็นวิธีการ randomra -lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@Fจะช่วยให้การแก้ปัญหาที่สั้นมาก: BTW รุ่น Perl ของฉันไม่ได้ตั้งค่า-nด้วย-aมันจะต้องเป็นส่วนเสริมล่าสุด
nutki

1

R, 117 144 137 133 129 123 ไบต์

พูดอย่างมีเหตุผลในขณะนี้ ควรจะสามารถโกนหนวดออกมาได้อีกไม่กี่ รับจำนวนไบต์การจัดรูปแบบที่ถูกต้อง แต่บันทึกการแลกเปลี่ยนเมทริกซ์สำหรับอาร์เรย์

ขอบคุณ Alex สำหรับคำแนะนำในการแทนที่ sep ด้วย s และลบชื่อฟังก์ชัน

วางอาร์เรย์ลงอย่างสมบูรณ์และใช้ชุดตัวแทนเพื่อสร้างแต่ละบรรทัด

แม้ว่า Miff จะถูกทุบตีอย่างสมบูรณ์ แต่วิธีการแก้ปัญหาของเขาทำให้ฉันรู้ว่าฉันสามารถดรอป s = '' ได้ทั้งหมด

function(i){s=sum(i);i=cumsum(i);b=0;for(n in 1:s){d=i[i>=n][1];cat(c(rep(0,b),rep(1,d-b),rep(0,s-d)),fill=T);if(d==n)b=d}}

และการทดสอบ

> (function(i){s=sum(i);i=cumsum(i);b=0;for(n in 1:s){d=i[i>=n][1];cat(c(rep(0,b),rep(1,d-b),rep(0,s-d)),fill=T,s=' ');if(d==n)b=d}})(c(5,1,1,3,1))
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 1
> 

คุณสามารถบันทึก 2 ไบต์โดยใช้การจับคู่บางส่วนของพารามิเตอร์ฟังก์ชัน ในcat()เปลี่ยนsep=เป็นs=เนื่องจากไม่มีพารามิเตอร์ที่รู้จักอื่น ๆ สำหรับฟังก์ชันนั้นขึ้นต้นด้วย "s"
Alex A.

@ Alex ขอบคุณไม่ทราบว่า ยังอยู่ในช่วงการเรียนรู้
MickyT

คุณสามารถบันทึกอีก 2 f=โดยการเอา สิ่งนี้จะทำให้คุณมีฟังก์ชั่นวัตถุ หากคุณทำเช่นนั้นคุณจะต้องกำหนดว่ามันจะถูกกำหนดโดยใช้สิ่งที่ต้องการf=ก่อนที่จะใช้มัน ฉันไม่ได้ตระหนักว่ามันถูกต้องตามกฎหมายในการแข่งขันแบบนี้จนกระทั่งฉันเห็น Martin Büttnerทำกับ Ruby
Alex A.

1

รุ่นที่ - 226 ไบต์

@echo off&setLocal enableDelayedExpansion&set c=0&for %%a in (%*)do set/ac+=1&for /l %%b in (1,1,%%a)do (set l=&set d=0&for %%c in (%*)do (set/ad+=1&for /l %%d in (1,1,%%c)do if !d!==!c! (set l=!l!1)else set l=!l!0)
echo !l!)

รับอินพุตจาก stdin ( C:\>script.bat 5 1 1 2 3 1) และเอาต์พุตของ echo น่าเสียดายที่ฉันไม่สามารถรับเสียงสะท้อนสุดท้ายในบรรทัดเดียวกันไม่เช่นนั้นฉันอาจโทรไปที่ทั้งบรรทัดภายในcmd/von/cเพื่อหลีกเลี่ยงการเปิดใช้งานการขยายล่าช้า

ดีและเรียบร้อย - ไม่มีอะไรนอกจากงานเสี้ยงฮึดฮัด:

@echo off
setLocal enableDelayedExpansion
set c=0
for %%a in (%*) do (
    set /a c+=1
    for /l %%b in (1,1,%%a) do (
        set l=
        set d=0
        for %%c in (%*) do (
            set /a d+=1
            for /l %%d in (1,1,%%c) do if !d!==!c! (set l=!l!1) else set l=!l!0
        )
        echo !l!
    )
)

1

Haskell, 124

(%)=replicate
d l=fst$foldr(\x(m,n)->(m>>mapM_(\_->putStrLn$unwords$n%"0"++x%"1"++(sum l-n-x)%"0")[1..x],n+x))(return(),0)l

ผลิตออกโดยการรวมการกระทำ IO ผ่านและmapM_ foldrฟังก์ชั่นdควรได้รับรายชื่อของ ints


1

K (ngn / k) , 10 ไบต์

{x=\:x:&x}

ลองออนไลน์!

-19 ขอบคุณที่ ngn ... ทำให้การส่งของฉันต่ำกว่าฮ่าฮ่า


K (ngn / k) , 29 ไบต์

{,/d#',:'-':+\[d:x,0]>\:!+/x}

ลองออนไลน์!

แก้ไข: ตัวแบ่งสำหรับกรณีอินพุต 1 องค์ประกอบต้องการงาน

edit1: แก้ไขแล้ว +4 ไบต์ หุยฮา


1
{x=\:x:&x}­­­
ngn

@ngn โอ้มา ...
เขียน

ความท้าทายนี้ถูกกล่าวถึงในห้อง aplฉันรู้วิธีแก้ปัญหาจากที่นั่น :) k และ j มีข้อได้เปรียบที่นี่เพราะ "ที่" -s ( &ใน k หรือI.ใน j) ทำงานกับเวกเตอร์ int ในขณะที่ apl ทำงานเฉพาะกับ booleans .
ngn


0

STATA, 155 ไบต์

di _r(a)
forv x=1/wordcount($a){
gl b=word($a,`x')
gl c=_N+1
set ob _N+$b
forv y=$c/_N{
g d`y'=_n>=$c
}
}
forv z=1/_N{
replace d`z'=0 if d`z'>1
}
l,noo noh

ฉันสามารถทดสอบทางออนไลน์นี้ได้ที่ไหนสักแห่ง?
Martin Ender

@ MartinBüttner: เท่าที่ฉันรู้ไม่มีคอมไพเลอร์ออนไลน์สำหรับ Stata เนื่องจากเป็นกรรมสิทธิ์ ไปเหมือนกันสำหรับภาษาเช่น SAS
Alex A.

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