บรรจุไม้ชิ้น


14

มีไม้สองชิ้น ทั้งสองประกอบด้วยตัวตรงและบล็อคเสริมบางส่วนใต้ร่างกาย ตัวอย่างชิ้นส่วนที่มีบล็อกเพิ่มเติมที่ตำแหน่ง (0 ที่จัดทำดัชนีไว้) ตำแหน่ง 0,4,7,9,10:

XXXXXXXXXXX
X   X  X XX

ชิ้นส่วนสามารถแสดงเป็น01ลำดับเลขฐานสองที่มีiอักขระ th แสดงว่ามีบล็อกที่iตำแหน่ง th 10001001011ตัวอย่างด้านบนสามารถแสดงเป็น

เราสามารถรวมสองชิ้นเข้าด้วยกันโดยการพลิกชิ้นที่สองในแนวตั้ง (และอาจพลิกในแนวนอนด้วย) หลังจากการพลิกเราสามารถหาการจัดตำแหน่งที่สามารถรวมสองชิ้นเข้าด้วยกันเพื่อให้มีความสูง 3

Two example pieces:

XXXXXXXXXXX   XXXXXXXX
X   X  X XX     XXX

Second piece flipped vertically and horizontally:

 XXXXXXXXXXX   
 X   X  X XX
  XXX
XXXXXXXX

Pieces put together:

 XXXXXXXXXXX   
 XXXXX  X XX
XXXXXXXX

ตัวอย่างส่งผลให้มีความกว้างทั้งหมด 12 บล็อก

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

อินพุต

  • สองสายประกอบด้วยตัวอักษรและ01
  • สตริงทั้งสองมีอักขระอย่างน้อยหนึ่งตัว
  • คุณอาจเลือกที่จะรับทั้งสองสายเป็นหนึ่งเข้าร่วมโดยช่องว่างเดียว

เอาท์พุต

  • จำนวนเต็มบวกเดียวความกว้างทั้งหมดทำได้น้อยที่สุด

ตัวอย่าง

0 0  =>  1

1 0  =>  1

1 1  =>  2

11 111  =>  5

010 0110  =>  5

0010 111  =>  5

00010 11011  =>  6

01010 10101  =>  5

1001 100001  =>  6

1110001100001 1100100101  =>  14

001101010000101 100010110000  =>  16

0010110111100 001011010101001000000  =>  21

0010110111100 001011010101001001100  =>  28

100010100100111101 11100101100010100100000001  =>  27

0010 10111  =>  5

0100 10111  =>  5

0010 11101  =>  5

0100 11101  =>  5

10111 0010  =>  5

10111 0100  =>  5

11101 0010  =>  5

11101 0100  =>  5

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ


ชิ้นส่วนในตัวอย่างแรกควรจะเป็นชิ้นที่ 1 ในส่วนที่สองของตัวอย่างหรือไม่ ถ้าเป็นเช่นนั้นหนึ่งในนั้นคือผิด
mdc32

@ mdc32 พวกเขาไม่ใช่ชิ้นเดียวกัน แต่เปลี่ยนอันแรกเพื่อหลีกเลี่ยงความสับสน
randomra

คำตอบ:


7

Pyth, 37 35 34 32 31 ไบต์

eSX0lM.zff-\1@VhY>eYT*Fm,d_d.z0

แยกอินพุตบรรทัดใหม่

สาธิต , เทียมทดสอบ

คำอธิบาย:

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

eSX0lM.zff-\1@VhY>eYT*Fm,d_d.z0

                            .z     The list of the two input strings.
                       m           Map to 
                        ,d_d       The pair of each string and its reverse.
                     *F            Take the cartesisan product of those lists.
         f                         Filter those pairs of a first string and a 
                                   second string, possibly reversed,
          -\1                      On the absence of the string "1" in
             @V                    The vectorized intersection (intersection
                                   of 0th position, 1st position, etc.) of
               hY                  the first string and
                 >eYT              the second string without the first T elements.
        f                    0     Starting at 0 and counting upwards, find the
                                   lowest T where the result is truthy. 
                                   (where anything passes the inner filter)
    lM.z                           Map the input strings to their lengths.
  X0                               Add the above result to the first entry.
eS                                 Take the maximum of the two values and print.

4

Pip , 72 70 48 ไบต์

Fp[aRVa]CP[bRVb]L#a+1{I2NI$+plAE:#$+^pp@1.:0}MNl

รับสองสตริงเป็นอาร์กิวเมนต์บรรทัดคำสั่ง จัดรูปแบบด้วยความคิดเห็น:

                     a, b initialized from cmdline args; l is [] (implicit)
F p [aRVa]CP[bRVb]   For each possible pair p of a/reverse(a) with b/reverse(b):
 L #a+1 {            Loop for each potential offset of bottom piece:
  I 2 NI $+p         If no 2's in the sum of p:
   l AE: # $+ ^p     Append the max width of elements of p to l (see below for explanation)
  p@1 .: 0           Append a 0 to bottom piece
 }
MNl                  The answer is min(l); print it (implicit)

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

   0010
    111
   0121

   0010
   111_
   1120

   0010
  111__
  11110

   0010
 111___
 111010

   0010
111____
1110010

เพื่อค้นหาความกว้างทั้งหมดเราแบ่งองค์ประกอบของpเป็นรายการของตัวละครและผลรวม การดำเนินการรายการที่ชาญฉลาดในรายการที่มีความยาวไม่สม่ำเสมอรักษาความยาวของรายการที่ยาวกว่าดังนั้นความยาวของผลรวมนี้จึงเป็นสิ่งที่เราต้องการ (การแยกเป็นสิ่งที่จำเป็นเพราะเพียงการรวมกันเป็นตัวเลขจะกำจัดศูนย์นำ: $+[0101 10] = 111แต่$+^[0101 10] = [0 1 1 1].)

C:\> pip.py woodPacking.pip 0010 111
5

3

ทับทิม 127 130

สิ่งนี้กลายเป็นเวลานานมาก ... :(

->m,n{[[m,n],[m,n.reverse],[n,m],[n,m.reverse]].map{|u,d|[(0..l=u.size).find{|i|(d.to_i(2)<<i)&u.to_i(2)<1}+d.size,l].max}.min}

การทดสอบ: http://ideone.com/te8XWk

ทับทิมที่อ่านได้:

def pack_length piece1, piece2
  min_possible_packed_length = [
    min_packed_length(piece1, piece2),
    min_packed_length(piece1, piece2.reverse),
    min_packed_length(piece2, piece1),
    min_packed_length(piece2, piece1.reverse)
  ].min

  min_possible_packed_length
end

def min_packed_length up_piece, down_piece
  x = up_piece.to_i 2
  y = down_piece.to_i 2

  # find the smallest shift for the piece placed down 
  # so that they fit together
  min_packed_shift = (0..up_piece.size).find{|i| (y<<i)&x<1 }

  # min pack length cannot be smaller than any of the 
  # two pieces
  [min_packed_shift + down_piece.size, up_piece.size].max
end

คุณสามารถทดสอบตัวอย่างที่เพิ่มเข้ามาใหม่ได้หรือไม่ ชิ้น[[m,n],[m,n.reverse],[n,m],[n,m.reverse]]ส่วนอาจไม่ถูกต้อง (ฉันไม่แน่ใจ แต่ฉันทำผิดพลาดเหมือนกัน)
สุ่ม

@ สุ่มแน่นอน! โปรดดูลิงค์ทดสอบ ฉันเพิ่มการทดสอบใหม่ที่นั่น
Cristian Lupascu

ขอบคุณขออภัยสำหรับความยุ่งยากที่เพิ่มขึ้น สัญชาตญาณของฉันคือคุณจะต้อง[n.reverse,m]แทนที่จะเป็น[n,m.reverse]แต่ฉันไม่รู้รูบี้
randomra

@randomra จริงที่ล้มเหลวในการทดสอบ'0010110111100', '001011010101001001100'คำพูดที่คาดหวัง: 28 ข่าว: 30 การทดสอบอื่น ๆ ทั้งหมดผ่าน ดังนั้นคุณทำได้ดีมากในการทดสอบเคสมุม :)
Cristian Lupascu

1

JavaScript ( ES6 ) 160

ไม่สามารถทำให้สั้นลง ...

F=(a,b,c=[...b].reverse(),
K=(a,b,t=a.length)=>{
for(e=i=-1;e&&i++<t;)for(e=j=0;u=b[j];j++)e|=u&a[j+i];
return t<i+j?i+j:t
})=>Math.min(K(a,b),K(a,c),K(b,a),K(c,a))

// test

out=x=>O.innerHTML += x+'\n'

test=[
 ['0', '0', 1],['1', '0', 1],['1', '1', 2],['11', '111', 5]
,['010', '0110', 5],['0010', '111', 5],['0010', '10111', 5]
,['00010', '11011', 6],['01010', '10101', 5],['1001', '100001', 6]
,['1110001100001', '1100100101', 14]
,['001101010000101', '100010110000', 16]
,['0010110111100', '001011010101001000000', 21]
,['0010110111100', '001011010101001001100', 28]
,['100010100100111101', '11100101100010100100000001', 27]
,['0010','10111', 5],['0100','10111', 5]
,['0010','11101', 5],['0100','11101', 5]
,['10111','0010', 5],['10111','0100', 5]
,['11101','0010', 5],['11101','0100', 5]
]

test.forEach(t=>{
  r = F(t[0],t[1]),
  out(
    (r==t[2]?'Ok':'Fail') 
    + ' A: '+t[0]+', B: '+t[1]
    + ', Result: '+r + ', Check:  '+t[2])
})
pre { font-size: 10px }
<pre id=O></pre>

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