Ghế trong rạp chiếu phim Phần Lan


51

Bạn được cung cấp bản đồ của một rạp chiếu phim dưới dạng ma trận boolean: 0 đại diện cho một chỗ ngồi miễn phí, 1 - chiếm. Mỗi Finn , những người đi bộ chọn chỗ ngồi xa nhất ( khoảng cách Euclide ) từ người chiếm chỗ gần nhất, hoặc nếu một số như vậy tồn tại - người đầu tiên trong số họ theo thứ tự chính . Xuất ra một ma trận hiển thị các ghế theo thứ tự cuối cùng sẽ bị chiếm giữ; nghĩa là thay thế số 0 bằng 2, 3, 4, v.v.

// in
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 1 1 0
// out
 2  8  3  9  1
10  5 11  6 12
 4 13 14 15  7
16 17  1  1 18

// in
0 0 0 0 0 0 0 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 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
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 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
// out
  5  43  17  44  45  46  18  47   8  48  49   6  50  19  51   2
 52  24  53  54   1  55  56  25  57  26  58  59  27  60  28  61
 20  62  63  29  64  65   1  66  30  67  68  21  69   9  70  71
 72  73   1  74  31  75  76  77  78   1  79  80  32  81  82  11
 12  83  84   1  85  86  87  13  88  89  90  14  91  92  33  93
 94  34  95  96  97  15  98  99  35 100  36 101 102   1 103  22
104 105  37 106  38 107  39 108 109  16 110  40 111 112  41 113
  4 114 115   7 116  23 117   3 118 119  42 120   1 121 122  10

// in
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// out
  2  38 39  26  40   6 41  42  12  43  44   7  45  46  27  47   3
 48  49 15  50  28  51 52  29  53  30  54  55  56  16  57  31  58
 32  59 60  33  61  62 17  63  64  65  18  66  67  68  34  69  35
 70  10 71  72  13  73 74  75   1  76  77  78  11  79  80  14  81
 82  83 36  84  85  86 21  87  88  89  22  90  91  37  92  93  94
 19  95 96  97  23  98 99 100  24 101 102 103  25 104 105 106  20
107 108  4 109 110 111  8 112 113 114   9 115 116 117   5 118 119

Định dạng I / O linh hoạt trong các tiêu chuẩn đánh gôn được thiết lập cho ngôn ngữ của bạn. Bạn có thể giả sử đầu vào là chính xác, có kích thước tối thiểu 3x3 và không bao gồm hoàn toàn cùng một giá trị boolean. Viết một hàm hoặc một chương trình hoàn chỉnh. Giải pháp ngắn nhất cho mỗi ngôn ngữ được coi là người chiến thắng; không có câu trả lời sẽ được chấp nhận Sơ hở tiêu chuẩn bị cấm.


6
@Mego Là một người chống đối xã hội, tôi có thể xác nhận rằng tôi thà ngồi hai ghế sang một bên hoặc hai ghế sau một ai đó thay vì theo đường chéo một ghế phía sau và sang một bên.
Pavel

17
Không gian cá nhân @Mego được tính bằng khoảng cách euclide :)
Angs

2
@Pavel Asocial, không chống xã hội?
Chromatix

2
@Chromatix Không. Tôi muốn xã hội bùng cháy. : P
Pavel

12
@Pavel infernosocial :)
ngn

Câu trả lời:


11

MATL , 37 byte

!t~z:Q"@yX:gG&n:!J*w:+X:&-|w/X<&X>(]!

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm . Bạn cũng có thể muốn xem rạp chiếu phim được lấp đầy trong nghệ thuật ASCII.

Giải trình

!t        % Implicit input: M×N matrix of zeros and ones. Transpose and duplicate.
          % The transpose is needed because MATL uses column-major (not row-major)
          % order. It will be undone at the end
~z        % Number of zeros, say Z
:Q        % Range, add 1 element-wise: gives the array [2, 3, ..., Z+1]. These are
          % the new values that will be written into the matrix
"         % For each k in that array
  @       %   Push k. Will be written in a position to be determined
  y       %   Duplicate from below: pushes a copy of the current matrix, that has
          %   values up to k-1 already written in
  X:      %   Linearize into an (R*C)×1 vector, in column-major order
  g       %   Convert to logical: this replaces non-zero values by 1 
  G&n     %   Push input size as two separate numbers: M, N
  :!      %   Range, transpose: gives the column vector [1; 2; ...; N]
  J*      %   Multiply by imaginary unit, 1j, element-wise
  w:      %   Swap, range: gives the row vector [1, 2, ..., M]
  +       %   Add, with broadcast. Gives an N×M complex matrix defining a grid of
          %   coordinates: [1+1j, ..., M+1j; 2+1j, ... 2+1j; ...; N+1j, ..., N+Mj]
  X:      %   Linearize into an (M*N)×1 vector, in column-major order
  &-|     %   (M*N)×(M*N) matrix of absolute differences. This gives all distances
          %   between seats. Rows of this matrix represent currently used seats,
          %   and columns correspond to potential new positions
  w/      %   Swap, divide with broadcast. This divides the rows representing
          %   occupied seats by 1, and those with unocuppied seats by 0. So the
          %   latter rows are set to infinity, which effectively removes them for
          %   the subsequent minimization
  X<      %   Mimimum of each column: this gives the minimum distance to currently
          %   occupied seats for each potential new seat
  &X>     %   Argument maximum: gives the index of the first maximizing value
  (       %   Write value k at that position, using linear indexing
]         % End
!         % Transpose. Implicit display

11

JavaScript (ES6), 156 137 byte

Đã lưu 18 byte nhờ @ l4m2

Đó là khá nhiều map()...

f=(a,n=1)=>a.map(B=(r,y)=>r.map((_,x)=>a.map(b=q=>q.map(v=>b=b<(d=X*X--+Y*Y)|!v?b:d,X=x)&Y--,Y=y)|v|b<=B||(R=r,C=x,B=b)))|B?f(a,R[C]=++n):a

Hãy thử trực tuyến!

Đã bình luận

f = (a, n = 1) =>               // a = input array; n = seat counter
  a.map(B =                     // initialize B to a non-numeric value
    (r, y) =>                   // for each row r at position y in a[]:
    r.map((_, x) =>             //   for each target seat at position x in r[]:
      a.map(b =                 //     initialize b to a non-numeric value
        q =>                    //     for each row q in a[]:
        q.map(v =>              //       for each reference seat v in q[]:
          b = b < (             //         if b is less than d, defined as
            d = X * X-- + Y * Y //           the square of the Euclidean distance
          ) | !v ?              //           or the reference seat is empty
            b                   //             let b unchanged
          :                     //           else:
            d,                  //             update b to d
          X = x                 //         start with X = x
        ) & Y--,                //       end of q.map(); decrement Y
        Y = y                   //       start with Y = y
      ) |                       //     end of inner a.map()
      b <= B ||                 //     unless b is less than or equal to B,
      (R = r, C = x, B = b)     //     update B to b and save this position in (R, C)
    )                           //   end of r.map()
  ) | B ?                       // end of outer a.map(); if B was updated:
    f(a, R[C] = ++n)            //   update the best target seat and do a recursive call
  :                             // else:
    a                           //   stop recursion and return a[]


b=b<(d=X*X--+Y*Y)|!v?b:d
l4m2

v|b<=B v|là không cần thiết nếu vsau đób=0
l4m2

3

Haskell , 216 213 185 184 byte

import Data.Array
m a=[snd$maximum a|a/=[]]
f k=k//m[(r,((a,b),maximum(elems k)+1::Int))|s<-[assocs k],((a,b),0)<-s,r<-[minimum[(x-a)^2+(y-b)^2|((x,y),i)<-s,i>0]]]
(until=<<((==)=<<))f

Lấy đầu vào là một mảng. Đầu vào và đầu ra theo thứ tự ngược lại. Tín dụng cho ma thuật điểm cố định để Laikoni .

Hãy thử trực tuyến!


1
180 byte vớiuntil((==)=<<f)f
ovs

3

Python 2 , 200 187 byte

a=input()
z=len(a[0]);P=[divmod(i,z)for i in range(len(a)*z)];i=2
while 0in sum(a,[]):t,y,x=max((min((u-U)**2+(v-V)**2for V,U in P if a[V][U]),-v,-u)for v,u in P);a[-y][-x]=i;i+=1
print a

Hãy thử trực tuyến!

-13 byte thx đến một mẹo từ Không phải Charles bằng cách loại bỏ kiểm tra không cần thiết cho các ô là 0.


Tôi có gần như cùng một giải pháp, nhưng Python3, một hàm và 194 byte
Không phải là Charles

Thay vì đăng bài của tôi, khoản tiết kiệm chính là tôi thêm ,v,uvào phần cuối của trình tạo bên trong maxvà bạn không cần phải làm if a[v][u]<1vì những thứ đó sẽ 0và do đó không phải là tối đa. Vì vậy, dòng của tôi về cơ bản*_,y,x=max((min(...),-v,-u,v,u)for v,u in P)
Không phải là Charles

mã tương tự đáng kinh ngạc, mặc dù. ồ
Không phải Charles

Thành thật mà nói, tôi không chắc chắn việc thêm các *,v,uký tự KHÔNG phải là tiết kiệm so với những --gì bạn có. :)
Không phải Charles

@Not rằng Charles: Nice, hoàn toàn bị mất rằng if a[v][u]<1là không cần thiết (vì khác không tế bào sẽ có một min()số 0).
Chas Brown






1

Clojure, 247 byte

#(let[R(range(count %))C(range(count(% 0)))](loop[M % s 2](if-let[c(ffirst(sort-by last(for[x R y C :when(=((M x)y)0)][[x y](-(nth(sort(for[i R j C :when(>((M i)j)0)](+(*(- i x)(- i x))(*(- j y)(- j y)))))0))])))](recur(assoc-in M c s)(inc s))M)))

Đầu vào là một vec-of-vecs M, được sửa đổi trong một loopbởi assoc-in. Khi không tìm thấy điểm miễn phí ( if-let) thì kết quả được trả về.


1

Thạch , 35 33 30 29 byte

ZJæịþJFạþx¥F«/MḢṬ×FṀ‘Ɗo@FṁµÐL

Hãy thử trực tuyến!

Thay thế ×ı+bằng æị(kết hợp phức tạp), một dyad mới dựa trên j.từ J, tiết kiệm một byte.

Đây là một phiên bản hiệu quả hơn cho TIO. Hãy thử trực tuyến!

Giải trình

ZJæịþJFạþx¥F«/MḢṬ×FṀ‘Ɗo@FṁµÐL  Input: matrix M
Z                              Transpose
 J                             Enumerate indices - Get [1 .. # columns]
     J                         Enumerate indices - Get [1 .. # rows]
  æịþ                          Outer product using complex combine
                                 (multiply RHS by 1j and add to LHS)
      F                        Flatten
           F                   Flatten input
          ¥                    Dyadic chain
         x                       Times - Repeat each of LHS by each of RHS
       ạþ                        Outer product using absolute difference
            «/                 Reduce by minimum
              M                Indices of maximal values
               Ḣ               Head
                Ṭ              Untruth - Return a Boolean array with 1's at the indices
                 ×             Times
                     Ɗ         Monadic chain
                  F              Flatten input
                   Ṁ             Maximum
                    ‘            Increment
                      o@       Logical OR
                        F      Flatten input
                         ṁ     Mold - Reshape to match the input
                          µÐL  Repeat until result converges

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.