จำกัด การเอียงในหนึ่งมิติ


32

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

ชิ้นเป็นไม่ว่างเปล่าลำดับ จำกัด ของศูนย์และคนที่จะเริ่มต้นและจบลงด้วยการอย่างใดอย่างหนึ่ง บางชิ้นที่เป็นไปได้1, 101, ,11111100101

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

ถ้าเรามองว่าวัตถุหนึ่งเป็น "วัสดุแข็ง" และศูนย์เป็น "หลุม" ชิ้นควรจะพอดีเพื่อที่จะยืดเดียวโดยไม่ต้องออกจากหลุมใด ๆ

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

ตัวอย่าง

ทั้งสามชิ้น101, 11, 101สามารถกระเบื้องดังแสดงในต่อไปนี้ซึ่งแต่ละชิ้นเป็นตัวแทนที่มีการเปลี่ยนแปลงที่จำเป็น:

  101
11
   101

ดังนั้นการปูกระเบื้องที่ได้รับคือ

111111

เป็นตัวอย่างที่สองชิ้น11011และ1001101ไม่สามารถปูกระเบื้อง โดยเฉพาะอย่างยิ่งการเปลี่ยนแปลง

 11011
1001101

ไม่ถูกต้องเพราะมีสองคนที่ปะทะกัน; และ

11011
  1001101

ไม่ถูกต้องเนื่องจากผลลัพธ์จะมีศูนย์

กฎเพิ่มเติม

การป้อนข้อมูลเป็นชุดของหนึ่งหรือมากกว่าหนึ่งชิ้น อนุญาตรูปแบบที่เหมาะสม ตัวอย่างเช่น:

  • รายการสตริงที่แต่ละสตริงสามารถมีอักขระที่สอดคล้องกันสองตัวที่ต่างกัน;
  • หลายอาร์เรย์ที่แต่ละอาร์เรย์มีตำแหน่งของชิ้นส่วน
  • รายการของจำนวนเต็ม (คี่) เช่นการเป็นตัวแทนไบนารีของแต่ละหมายเลขกำหนดชิ้นส่วน

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

โปรแกรมหรือฟังก์ชั่นที่ได้รับอนุญาตในการเขียนโปรแกรมภาษา ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

แต่ละอินพุตอยู่ในบรรทัดที่แตกต่างกัน

Truthy

1
111
1, 1
11, 111, 1111
101, 11, 1
101, 11, 101
10001, 11001, 10001
100001, 1001, 1011
10010001, 1001, 1001, 101
10110101, 11001, 100001, 1
110111, 100001, 11, 101
1001101, 110111, 1, 11, 1

Falsy

101
101, 11
1, 1001
1011, 1011
11011, 1001101
1001, 11011, 1000001
1001, 11011, 1000001, 10101


3
รุ่นที่ไม่มีที่สิ้นสุดของปัญหานี้อาจน่าสนใจเช่นกัน (เช่นว่าชุดของกระเบื้องสามารถเติมเต็มบรรทัด 1D โดยไม่ทับซ้อนกัน) ได้หรือไม่ จากนั้นสิ่งต่าง ๆ เช่น101101นั้นจะเป็นความจริงแม้ว่าจะไม่มีจำนวนที่แน่นอนของพวกเขาในบล็อกที่ต่อเนื่องกัน
Martin Ender

คำตอบ:



8

JavaScript (ES6), 74 73 70 ไบต์

รับอินพุตเป็นอาร์เรย์ของจำนวนเต็ม 32 บิต ส่งคืนบูลีน

f=([n,...a],x)=>n?[...f+''].some(_=>n&&!(x&n)&f(a,x|n,n<<=1)):!(x&-~x)

หรือ66 ไบต์ด้วยค่าความจริง / ค่าเท็จกลับด้าน:

f=([n,...a],x)=>n?[...Array(32)].every(_=>x&n|f(a,x|n,n*=2)):x&-~x

กรณีทดสอบ

อย่างไร?

f = (                       // f = recursive function taking:
  [n, ...a],                //   n = next integer, a = array of remaining integers
  x                         //   x = solution bitmask, initially undefined
) =>                        //
  n ?                       // if n is defined:
    [... f + ''].some(_ =>  //   iterate 32+ times:
      n &&                  //     if n is not zero:
        !(x & n)            //       if x and n have some bits in common,
        &                   //       force invalidation of the following result
        f(                  //       do a recursive call with:
          a,                //         the remaining integers
          x | n,            //         the updated bitmask
          n <<= 1           //         and update n for the next iteration
        )                   //       end of recursive call
    )                       //   end of some()
  :                         // else (all integers have been processed):
    !(x & -~x)              //   check that x is a continuous chunk of 1's

4

Husk , 16 ไบต์

V§=OŀF×+ṠṀṪ+oŀṁ▲

รับรายการของดัชนีที่ใช้ 1 ลองออนไลน์!

คำอธิบาย

V§=OŀF×+ṠṀṪ+oŀṁ▲  Implicit input, say x=[[1,3],[1]]
              ṁ▲  Sum of maxima: 4
            oŀ    Lowered range: r=[0,1,2,3]
        ṠṀ        For each list in x,
          Ṫ+      create addition table with r: [[[1,3],[2,4],[3,5],[4,6]],
                                                 [[1],[2],[3],[4]]]
     F×+          Reduce by concatenating all combinations: [[1,3,1],[1,3,2],...,[4,6,4]]
V                 1-based index of first list y
    ŀ             whose list of 1-based indices [1,2,...,length(y)]
 §=               is equal to
   O              y sorted: 2

3

เยลลี่ขนาด 16 ไบต์

FLḶ0ẋ;þ⁸ŒpS€P€1e

ลิงก์ monadic ที่ใช้รายการของรายการและค่าศูนย์ที่ส่งคืน1(ความจริง) หรือ0(falsey)

ลองออนไลน์! หรือดูชุดทดสอบ (สั้นลง - 6 คนแรกปลอมตามด้วยความจริงแปดคนแรกเนื่องจากความยาวสี่คนใช้เวลานานเกินกว่าที่จะรวมเนื่องจากการใช้ผลิตภัณฑ์คาร์ทีเซียน)

อย่างไร?

FLḶ0ẋ;þ⁸ŒpS€P€1e - Link: list of lists, tiles
F                - flatten (the list of tiles into a single list)
 L               - length (gets the total number of 1s and zeros in the tiles)
  Ḷ              - lowered range = [0,1,2,...,that-1] (how many zeros to try to prepend)
   0             - literal zero
    ẋ            - repeat = [[],[0],[0,0],...[0,0,...,0]] (the zeros to prepend)
       ⁸         - chain's left argument, tiles
      þ          - outer product with:
     ;           -   concatenation (make a list of all of the zero-prepended versions)

        Œp       - Cartesian product (all ways that could be chosen, including man
                 -   redundant ones like prepending n-1 zeros to every tile)
          S€     - sum €ach (good yielding list of only ones)
            P€   - product of €ach (good yielding 1, others yielding 0 or >1)
              1  - literal one
               e - exists in that? (1 if so 0 if not)



1

J , 74 ไบต์

f=:3 :'*+/1=*/"1+/"2(l{."1 b)|.~"1 0"_ 1>,{($,y)#<i.l=:+/+/b=:>,.&.":&.>y'

ฉันอาจพยายามทำให้มันเป็นนัยในภายหลัง แต่สำหรับตอนนี้มันเป็นคำกริยาที่ชัดเจน ฉันจะอธิบายเวอร์ชันที่ไม่ดี มันใช้เวลารายการของจำนวนเต็มชนิดบรรจุกล่องและผลตอบแทน1(จริง) หรือ0(เท็จ)

This will be my test case, a list of boxed integers:
   ]a=:100001; 1001; 1011                
┌──────┬────┬────┐
│100001│1001│1011│
└──────┴────┴────┘
b is the rectangular array from the input, binary digits. Shorter numbers are padded
with trailing zeroes:
   ]b =: > ,. &. ": &.> a   NB. Unbox each number, convert it to a list of digits 
1 0 0 0 0 1
1 0 0 1 0 0
1 0 1 1 0 0

l is the total number of 1s in the array: 
   ]l=: +/ +/ b             NB. add up all rows, find the sum of the resulting row)
7

r contains all possible offsets needed for rotations of each row: 
   r=: > , { ($,a) # < i.l  NB. a catalogue of all triplets (in this case, the list
has 3 items) containing the offsets from 0 to l:
0 0 0
0 0 1
0 0 2
0 0 3
0 0 4
 ...
6 6 3
6 6 4
6 6 5
6 6 6

m is the array after all possible rotations of the rows of b by the offsets in r. 
But I first extend each row of b to the total length l:
   m=: r |."0 1"1 _ (l {."1 b)  NB. rotate the extended rows of b with offsets in r,
ranks adjusted

For example 14-th row of the offsets array applied to b:
    13{r
0 1 6
   13{m
1 0 0 0 0 1 0
0 0 1 0 0 0 1
0 1 0 1 1 0 0

Finally I add the rows for each permutation, take the product to check if it's all 1, and
check if there is any 1 in each permuted array.
   * +/ 1= */"1 +/"2 m
1 

ลองออนไลน์!

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