ที่นั่งในโรงภาพยนตร์ฟินแลนด์


52

คุณได้รับแผนที่โรงภาพยนตร์เป็นเมทริกบูลีน: 0 หมายถึงที่นั่งฟรี 1 - ที่ถูกครอบครอง แต่ละคนฟินน์ที่เดินในเลือกที่นั่งห่างไกล ( ระยะทางยุคลิด ) จากที่ใกล้ที่สุดครอบครองหนึ่งหรือถ้าหลายอยู่เช่น - ครั้งแรกในหมู่พวกเขาในการสั่งซื้อแถวที่สำคัญ เอาท์พุทเมทริกซ์ที่แสดงคำสั่งซื้อที่นั่งจะถูกครอบครองในที่สุด นั่นคือแทนที่ 0s ด้วย 2, 3, 4, ฯลฯ

// 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

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


6
@Mego ในฐานะที่เป็นคนต่อต้านสังคมฉันสามารถยืนยันได้ว่าฉันจะนั่งสองที่นั่งด้านข้างหรือสองที่นั่งด้านหลังใครสักคนมากกว่านั่งในแนวทแยงมุมหนึ่งที่นั่งด้านหลังและด้านข้าง
Pavel

17
@Mego พื้นที่ส่วนบุคคลที่มีการคำนวณระยะทางแบบยุคลิด :)
Angs

2
@Pavel Asocial ไม่ใช่ต่อต้านสังคม?
Chromatix

2
@ Chromatix Nope ฉันต้องการสังคมที่จะเผาไหม้ : P
Pavel

12
@Pavel infernosocial :)
NGN

คำตอบ:


11

MATL , 37 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด คุณอาจต้องการเห็นโรงภาพยนตร์ที่เต็มไปด้วยศิลปะ ASCII

คำอธิบาย

!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 ไบต์

บันทึกแล้ว 18 ไบต์ขอบคุณ @ l4m2

นั่นเป็นจำนวนมาก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

ลองออนไลน์!

แสดงความคิดเห็น

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|ไม่จำเป็นเพราะถ้าเป็นเช่นvนั้นb=0
l4m2

3

Haskell , 216 213 185 184 ไบต์

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

รับอินพุตเป็นอาร์เรย์ อินพุตและเอาต์พุตอยู่ในลำดับย้อนกลับ สินเชื่อเพื่อมายากลจุดคงที่จะLaikoni

ลองออนไลน์!


1
180 ไบต์ด้วยuntil((==)=<<f)f
ovs

3

Python 2 , 200 187 ไบต์

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

ลองออนไลน์!

-13 ไบต์ขอบคุณไปยังเคล็ดลับจากไม่ใช่ว่า Charlesโดยการลบการตรวจสอบที่ไม่จำเป็นสำหรับเซลล์ที่เป็น 0


ฉันมีวิธีแก้ปัญหาเกือบเหมือนกัน แต่ Python3, ฟังก์ชั่นและ 194 ไบต์
ไม่ใช่ว่า Charles

แทนที่จะโพสต์ของฉันการประหยัดหลักคือฉันเพิ่มลง,v,uในส่วนท้ายของเครื่องกำเนิดไฟฟ้าภายในmaxและคุณไม่จำเป็นต้องทำif a[v][u]<1เพราะมันจะเป็น0ค่าสูงสุด โดยทั่วไปแล้วสายของฉันคือ*_,y,x=max((min(...),-v,-u,v,u)for v,u in P)
ไม่ใช่ว่า Charles

รหัสที่คล้ายกันอย่างน่าอัศจรรย์แม้ว่า ว้าว.
ไม่ใช่ชาร์ลส์ที่

โดยสุจริตฉันไม่แน่ใจว่าการเพิ่ม*,v,uตัวละครจะไม่ประหยัดกับ--คุณ :)
ไม่ใช่ Charles

@Not ว่าชาร์ลส์: ดีโดยสิ้นเชิงพลาดว่าif a[v][u]<1จะซ้ำซ้อน (ตั้งแต่เซลล์ที่ไม่ใช่ศูนย์จะมีmin()ของ0)
Chas Brown






1

Clojure 247 ไบต์

#(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)))

การป้อนข้อมูลเป็น vec ของ vecs Mซึ่งมีการแก้ไขในโดยloop assoc-inเมื่อไม่พบจุดว่าง ( if-let) จะส่งคืนผลลัพธ์


1

เยลลี่ , 35 33 30 29 ไบต์

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

ลองออนไลน์!

แทนที่×ı+ด้วยæị(คอมเพล็กซ์รวมกัน) ซึ่งเป็น dyad ใหม่ที่สร้างj.จาก J บันทึกเป็นไบต์

นี่คือรุ่นที่มีประสิทธิภาพมากขึ้นสำหรับ TIO ลองออนไลน์!

คำอธิบาย

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

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