การขยายตัวของแบคทีเรีย


25

โคโลนีของแบคทีเรียที่ติดฉลาก1ผ่านการ9ถ่ายทอดสดบนส่วนของเซลล์ที่เว้นระยะเท่ากันโดยมีเซลล์ว่างที่ระบุโดย0

0 0 2 0 0 0 1 2 0 0 3 3 0 0

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

t=0:  0 0 2 0 0 0 1 2 0 0 3 3 0 0
t=1:  0 2 2 2 0 1 1 2 2 3 3 3 3 0
t=2:  2 2 2 2 2 1 1 2 2 3 3 3 3 3  

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

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

ที่เกี่ยวข้อง: ปกปิด zeroes ในรายการ (อาณานิคมกระจายไปทางขวาเท่านั้น)

กรณีทดสอบ:เอาต์พุตด้านล่างอินพุต

0 0 2 0 0 0 1 2 0 0 3 3 0 0
2 2 2 2 2 1 1 2 2 3 3 3 3 3

7 0 3 0 0 0 0 0 8 0 9 1
7 7 3 3 3 8 8 8 8 9 9 1

5 0 3 0 0 0
5 5 3 3 3 3

7 7 1
7 7 1

1 0 1
1 1 1

คำตอบ:


14

JavaScript (ES6), 66 62 ไบต์

a=>a.map(_=>a=a.map((c,i)=>c||Math.max(a[i-1]|0,a[i+1]|0)))&&a

คำอธิบาย

a=>                 // a = input as array of numbers
  a.map(_=>         // loop for the length of a, this ensures the end is always reached
    a=a.map((c,i)=> // update a after to the result of t, for each cell c of index i
      c||           // keep the cell if it is not 0
        Math.max(   // else set the cell to the max value of:
          a[i-1]|0, //     the previous cell (or 0 if i - 1 less than 0),
          a[i+1]|0  //     or the next cell (or 0 if i + 1 greater than the length of a)
        )
    )
  )
  &&a               // return a

ทดสอบ


10

Pyth, 18 ไบต์

um|@d1eSd.:++0G03Q

ชุดทดสอบ

รับอินพุตเป็นรายการจำนวนเต็ม

โดยพื้นฐานแล้วสิ่งนี้ใช้การใช้จนกระทั่งวงลู่, u. มันใช้การปรับปรุงโดยการสร้างรายการทั้งหมดของแต่ละเซลล์และทั้งสองเซลล์ที่ด้านใดด้านหนึ่งจากนั้นอัปเดตแต่ละเซลล์ zeroed เพื่อสูงสุดของเพื่อนบ้าน

um|@d1eSd.:++0G03Q
                      Implicit: Q = eval(input())
u                Q    Apply the following until convergence, starting with G = Q.
           ++0G0      Pad G with zeros on either side.
         .:     3     Form all 3 element substrings.
                      Now, for each element of G, we have a list of the form
                      [previous, current, next]
 m                    Map over this list
  |@d1                The current element, if it's nonzero
      eSd             Else the max of the list.

8

Mathematica, 77 ไบต์

ไม่ได้มีการแข่งขันสูงมากเมื่อเทียบกับ//.โซลูชันของ alephalpha แต่ฉันคิด ว่าความท้าทายของควรมีCellularAutomatonคำตอบ:

CellularAutomaton[{If[#2<1,Max@##,#2]&@@#&,{},1},{#,0},{{{l=Length@#}},l-1}]&

ฟังก์ชั่นใช้พารามิเตอร์เป็นตัน ... ลองตั้งชื่อให้:

CellularAutomaton[{f,n,r},{i,b},{{{t}},d}]

นี่คือสิ่งที่พวกเขาทำ:

  • rเป็นช่วงของกฎนั่นคือจะเป็นตัวกำหนดจำนวนเพื่อนบ้านที่ถูกพิจารณาสำหรับการอัพเดต 1เราต้องการหนึ่งเพื่อนบ้านในแต่ละด้านเพื่อให้เราใช้
  • nเป็นปกติตัวเลขหรือรายชื่อของสี (เซลล์ชนิดที่แตกต่างกัน) {}แต่ถ้าเราระบุกฎเป็นฟังก์ชั่นที่กำหนดเองแทนหมายเลขกฎนี้ควรจะเป็น
  • fเป็นฟังก์ชั่นที่กำหนดกฎการอัพเดท มันใช้เวลารายการของ 3 เซลล์ (ถ้าr = 1) และส่งกลับสีใหม่สำหรับเซลล์ตรงกลาง
  • iเป็นเงื่อนไขเริ่มต้น นั่นคืออินพุต
  • bเป็นพื้นหลัง หากไม่ได้รับให้CellularAutomatonใช้ขอบเขตเป็นระยะซึ่งเราไม่ต้องการ แทนที่จะใช้การ0กำหนดเงื่อนไขขอบเขตตาย
  • tคือจำนวนครั้งในการจำลอง t = Length@#เราไม่จำเป็นต้องทำตามขั้นตอนมากกว่าการป้อนข้อมูลที่กว้างเพราะหลังจากที่แบคทีเรียจะมีการแปรสภาพเพื่อให้ โดยปกติแล้วCellularAutomatonจะส่งคืนขั้นตอนกลางทั้งหมด เราสามารถหลีกเลี่ยงสิ่งนั้นได้ด้วยการห่อเป็นtสองรายการ
  • dกำหนดเซลล์ที่จะนำเสนอในการส่งออก โดยค่าเริ่มต้นเราจะได้รับเซลล์ทั้งหมดที่อาจได้รับผลกระทบจากกฎ (ซึ่งเป็นt*rเซลล์เพิ่มเติมที่ปลายด้านใดด้านหนึ่งของอินพุต) เราให้มันl-1เพราะนี่เป็นหนึ่งในไม่กี่สถานการณ์ใน Mathematica ที่ใช้ดัชนีแบบ zero-based

6

Haskell, 86 83 81 79 73 71 ไบต์

(0#r)l=max r l
(o#_)_=o
p!_=zipWith3(#)p(0:p)$tail p++[0] 
id>>=foldl(!)

ตัวอย่างการใช้งาน: ->id>>=foldl(!) $ [7,0,3,0,0,0,0,0,8,0,9,1][7,7,3,3,3,8,8,8,8,9,9,1]

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

แก้ไข: @Mauris พบ 6 ไบต์เพื่อบันทึกและ @xnor อีกสองรายการ ขอบคุณ!


คุณสามารถแทนที่h pด้วยp!_แล้วแทนที่(const.h)ด้วย(!)เพื่อบันทึก 6 ไบต์
Lynn

@Mauris: ฉลาด ขอบคุณมาก!
nimi

@nimi id>>=foldl(!)ผมคิดว่าบรรทัดสุดท้ายที่จะระบุตัวตน
xnor

@xnor: ใช่มันทำ! เห็นดี!
nimi

4

CJam, 27 24 ไบต์

{_,{0\0++3ew{~@e>e|}%}*}

ทดสอบที่นี่

สิ่งนี้จะผลักดันบล็อกที่ไม่มีชื่อซึ่งแปลงรายการในสแต็กเป็นรายการใหม่

คำอธิบาย

_,       e# Duplicate the input and get its length N.
{        e# Run this block N times (convergence won't take that long)...
  0\0++  e#   Wrap the list in two zeroes.
  3ew    e#   Get all sublists of length 3.
  {      e#   Map this block onto each sublist...
    ~    e#     Dump all three elements on the stack.
    @    e#     Pull up the left neighbour.
    e>   e#     Maximum of both neighbours.
    e|   e#     Logical OR between centre cell and maximum of neighbours.
  }%
}*

การรวมตัวกันของ Sidestepping เป็นกลลวงที่ดี
Luis Mendo

1
... ที่ฉันยืมอย่างไร้ยางอาย :-)
Luis Mendo

4

J, 24 23 ไบต์

(+=&0*(0,~}.)>.0,}:)^:_

การใช้งาน:

   ((+=&0*(0,~}.)>.0,}:)^:_) 0 1 5 0 0 0 6
1 1 5 5 6 6 6

วิธีนี้คล้ายกับโซลูชันของเมาริ

(                  )^:_ repeat until change
               0,}:     concat 0 and tailless input
      (0,~}.)           concat headless input and 0
             >.         elementwise maximum of the former two lists
  =&0*                  multiply by input_is_0 (zeroing out the list at nonzero input positions)
 +                       add to input

ลองออนไลน์ได้ที่นี่

บันทึก 1 ไบต์ขอบคุณ Zgarb


3

Mathematica, 77 74 66 62 ไบต์

บันทึก 12 ไบต์ด้วย Martin Büttner

#//.i_:>BlockMap[If[#2<1,Max@##,#2]&@@#&,Join[{0},i,{0}],3,1]&

3

J, 33 ไบต์

3 :'y+(y=0)*>./(_1,:1)|.!.0 y'^:_

นานกว่าที่ฉันจะชอบ

3 :'                         '^:_   Repeat a "lambda" until a fixed point:
                            y         The input to this lambda.
               (_1,:1)|.!.0           Shift left and right, fill with 0.
            >./                       Maximum of both shifts.
      (y=0)*                          Don't grow into filled cells.
    y+                                Add growth to input.

นั่นคือแตกต่างกันดังนั้นจากสิ่งที่ฉันมีฉันคิดว่าคุณควรโพสต์เป็นคำตอบ :)
ลินน์

3

Python 3.5, 83 ไบต์

ฟังก์ชั่นนี้ใช้รายการ Python ของจำนวนเต็ม ไม่แน่ใจว่ามีสนามกอล์ฟเหลืออีกมาก แต่ฉันชอบที่จะแข่งขันกับภาษาอื่นอย่างน้อย!

def b(s):
 for _ in s:s=[s[n]or max((0,*s)[n:n+3])for n in range(len(s))]
 return s

จากงูหลาม 3.5, PEP 448ช่วยให้เราแกะออกเป็นs 0,*sรุ่นก่อนหน้านี้ต้องการหนึ่งไบต์พิเศษเช่น:

def b(s):
 for _ in s:s=[s[n]or max(([0]+s)[n:n+3])for n in range(len(s))]
 return s

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


@ChrisH: มันไม่ทำงานบน Python 3.5 และผมไม่คิดว่ามันจะทำงานในรุ่นก่อนหน้านี้อย่างใดอย่างหนึ่งไม่ได้ว่าการย้ายreturnไปภายในfor _ in sห่วง?
ทิม Pederick

ลบความคิดเห็นแล้ว - ฉันลองทำกรณีทดสอบที่แก้ไขครั้งแรก
Chris H

3

Matlab, 90 ไบต์

แล้วความเชื่อมั่นล่ะ?

x=input('');for n=x;x=x+max(conv(x,[0 0 1],'same'),conv(x,[1 0 0],'same')).*~x;end;disp(x)

ตัวอย่าง

>> x=input('');for n=x;x=x+max(conv(x,[0 0 1],'same'),conv(x,[1 0 0],'same')).*~x;end;disp(x)
[7 0 3 0 0 0 0 0 8 0 9 1]
     7     7     3     3     3     8     8     8     8     9     9     1

3

Haskell, 66 65 ไบต์

f x=[maximum[[-j*j,a]|(j,a)<-zip[-i..]x,a>0]!!1|(i,_)<-zip[0..]x]

fนี้กำหนดฟังก์ชั่นที่เรียกว่า

คำอธิบาย

แทนที่จะคำนวณหุ่นยนต์เซลลูล่าร์ซ้ำฉันคำนวณค่าสุดท้ายโดยตรง ความหมายคือความเข้าใจในรายการเดียว ค่าiอยู่ในช่วงตั้งแต่0ถึงlength x - 1ตั้งแต่เราซิปxด้วยตัวเลขธรรมชาติ สำหรับแต่ละดัชนีiเราผลิตรายการของรายการ 2 องค์ประกอบ

[-(-i)^2, x0], [-(-i+1)^2, x1], [-(-i+2)^2, x2], ..., [-(-i+n)^2, xn]

!!1จากรายการนี้เราคำนวณองค์ประกอบสูงสุดที่มีการประสานงานที่สองไม่ใช่ศูนย์และใช้เวลาที่มีองค์ประกอบที่สอง นี้จะช่วยให้ค่าไม่ใช่ศูนย์ที่ใกล้เคียงกับดัชนีiความสัมพันธ์ทำลายโดยการใช้ค่าที่มีขนาดใหญ่


ยินดีด้วยกับการชนะรางวัล!
xnor

2

Lua, 133 ไบต์

สองลูปเทอร์รี่ซ้อนกัน ... ถ้าฉันต้องการตีกอล์ฟต่อไปฉันจะต้องหาวิธีอื่นในการทำ แต่ฉันไม่เห็นเลย

function f(a)for i=1,#a do b={}for j=1,#a do c,d=a[j+1]or 0,a[j-1]b[j]=0<a[j]and a[j]or(d or 0)>c and d or c end a=b end return a end

คำอธิบาย

function f(a)
  for i=1,#a                       -- this loop allow us to be sure the cycle is complete
  do
    b={}                           -- set a new pointer for b
    for j=1,#a                     -- loop used to iterate over all elements in a
    do
      c,d=a[j+1]or 0,a[j-1]        -- gains some bytes by attributing these expressions 
                                   -- to a variable
      b[j]=0<a[j]and a[j]or        -- explained below
            (d or 0)>c and d or c
    end
    a=b                            -- we are one cycle further, new value for a
  end                              -- which is our reference array
  return a
end

ส่วนที่

b[j]=0<a[j]and a[j]or(d or 0)>c and d or c 

จะถูกขยายเป็น

b[j]=0<a[j]and a[j]or(a[j-1] or 0)>(a[j+1] or 0) and a[j-1] or(a[j+1]or 0) 

ซึ่งสามารถแปลในที่ซ้อนกันifเป็น

if 0<a[j]
then
    value=a[j]          -- if the cell isn't at 0, it keeps its value
elseif (a[j-1] or 0)<(a[j+1] or 0)
--[[ x or y as the following truth table :
x | y ||x or y
------||-------
0 | 0 || false
0 | 1 ||   y
1 | 0 ||   x
1 | 1 ||   x
    -- It means that when j=1 (1-based) and we try to index a[j-1]
    -- instead of failing, we will fall in the case false or true
    -- and use the value 0
    -- the same trick is used for when we try to use an index > a:len
]]--
then
    value=a[j-1]        -- the left cell propagate to the cell j
else
    value=a[j+1] or 0   -- if j=a:len, we put 0 instead of a[j+1]
                        -- this case can only be reached when we are on the right most cell
                        -- and a[j-1]==0
end

1

Pyth, 17 ไบต์

meeSe#.e,_akdbQUQ

ใช้รายการสไตล์ Python จาก stdin, ส่งออกไปยัง stdout

คำอธิบาย

นี่เป็นการแปลคำตอบของ Haskell ของฉัน ฉันไม่เคยใช้ Pyth มาก่อนเลยยินดีต้อนรับคำแนะนำ

                   Implicit: Q is input list
m              UQ  Map over input index d:
      .e      Q     Map over input index k and element b:
        ,_akdb       The pair [-abs(k-d), b]
    e#              Remove those where b==0
 eeS                Take the second element of the maximal pair

1

APL (Dyalog)ขนาด 18 ไบต์

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

(⊢+~∘××3⌈/0,,∘0)⍣≡

ลองออนไลน์!

(... )⍣≡ ใช้ฟังก์ชัน tacit ต่อไปนี้จนกว่าผลลัพธ์จะเหมือนกับอาร์กิวเมนต์:

 อาร์กิวเมนต์

+ บวก

  ~ ไม่ Signum
  
  ×

× ครั้ง

3⌈/ ค่าสูงสุดในแต่ละกลุ่มของสามกลุ่ม

0, ศูนย์ตามด้วย

  , อาร์กิวเมนต์ตาม ศูนย์
  
  0


1

Java 8, 155 142 ไบต์

a->{for(int b[],i,l=a.length,p,n,f=l;f>0;)for(b=a.clone(),i=0,f=l;i<l;f-=a[i-1]>0?1:0)if(a[i++]<1)a[i-1]=(p=i>1?b[i-2]:0)>(n=i<l?b[i]:0)?p:n;}

แก้ไขอินพุตint[]แทนการส่งคืนใหม่เพื่อบันทึกไบต์

คำอธิบาย:

ลองที่นี่

a->{                   // Method with integer-array parameter and no return-type
  for(int b[],         //  Copy array
          i,           //  Index integer
          l=a.length,  //  Length of the array
          p,n,         //  Temp integers (for previous and next)
          f=1;         //  Flag integer, starting at 1
      f>0;)            //  Loop (1) as long as the flag is not 0 (array contains zeroes)
    for(b=a.clone(),   //   Create a copy of the current state of the array
        i=0,           //   Reset the index to 0
        f=l;           //   Reset the flag to the length of the array `l`
        i<l;           //   Inner loop (2) over the array
        f-=a[i-1]>0?   //     After every iteration, if the current item is not a zero:
            1          //      Decrease flag `f` by 1
           :           //     Else:
            0)         //      Leave flag `f` the same
      if(a[i++]<1)     //    If the current item is a 0:
        a[i-1]=        //     Change the current item to:
         (p            //      If `p` (which is:
           =i>1?       //        If the current index is not 0:
             b[i-2]    //         `p` is the previous item
            :          //        Else:
             0)        //         `p` is 0)
         >(n           //      Is larger than `n` (which is:
            =i<l?      //        If the current index is not `l-1`:
              b[i]     //         `n` is the next item
             :         //        Else:
              0)?      //         `n` is 0):
          p            //       Set the current item to `p`
         :             //      Else:
          n;           //       Set the current item to `n`
                       //   End of inner loop (2) (implicit / single-line body)
                       //  End of loop (1) (implicit / single-line body)
}                      // End of method

0

Ruby, 81 ไบต์

->(a){a.map{|o|a=a.map.with_index{|x,i|x!=0 ? x : a[[0,i-1].max..i+1].max}}[-1]}

ฉันคิดว่าด้านในmapสามารถเล่นกอล์ฟต่อไปได้


เพียงแค่รู้คำตอบของฉันนะเหมือนกับ@ user81655 's คำตอบ
Gupta Harsh

ฉันคิดว่าคุณสามารถลบช่องว่างใน ternary คือรอบและ? :
Alex A.

0

PHP - 301 291 289 288 264 ตัวละคร

ไม่ตอบคำถามอื่นก่อนลองทำเช่นนี้ อย่าตำหนิภาษานั้น, ตำหนิฉัน สนุกมากและท้าทายไม่ใช่น้อย คำแนะนำกอล์ฟรหัสทั้งหมดชื่นชมอย่างมาก

$a=explode(' ',$s);$f=1;while($s){$o=1;foreach($a as&$b){
if($b==0){$u=current($a);prev($a);$d=prev($a);if(!$o&&current($a)==0){end($a);$d=prev($a);}if(!$f){$f=1;continue;}if($u>$d)$b=$u;if($u<$d){$b=$d;$f=0;}}
$o=0;}if(!in_array(0,$a))break;}$r=join(' ',$a);echo$r;

อธิบาย

// Input
$s = '0 0 2 0 0 0 1 2 0 0 3 3 0 0';

// Create array
$a = explode(' ', $s);
// Set skip flag
$f = 1;
while ($s)
{
    // Set first flag
    $o = 1;
    // Foreach
    foreach ($a as &$b)
    {
        // Logic only for non zero numbers
        if ($b == 0)
        {
            // Get above and below value
            $u = current($a);
            prev($a);
            $d = prev($a);

            // Fix for last element
            if (! $o && current($a) == 0)
            {
                end($a);
                $d = prev($a);
            }

            // Skip flag to prevent upwards overrun
            if (! $f)
            {
                $f = 1;
                continue;
            }

            // Change zero value logic
            if ($u > $d)
                $b = $u;
            if ($u < $d)
            {
                $b = $d;
                $f = 0;
            }
        }

        // Turn off zero flag
        $o = 0;
    }

    // if array contains 0, start over, else end loop
    if (! in_array(0, $a))
        break;
}
// Return result
$r = join(' ', $a);
echo $r;(' ', $a);
echo $r;

1
อย่างจริงจัง? การเล่นกอล์ฟไม่เพียงแค่ลบช่องว่างในรหัสของคุณ นอกจากอัลกอริทึมที่นี่คือเคล็ดลับ: การใช้งาน1มากกว่าtrue, splitมากกว่าexplode, forมากกว่าwhile, joinมากกว่าimplodeลบวงเล็บปีกกาไร้ประโยชน์ ...
Blackhole

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

0

Python ขนาด 71 ไบต์

g=lambda l:l*all(l)or g([l[1]or max(l)for l in zip([0]+l,l,l[1:]+[0])])

zipสร้างทั้งหมดความยาว 3 0รายการย่อยขององค์ประกอบและเพื่อนบ้านรักษาเกินปลายทางเป็น กลางองค์ประกอบl[1]รายการย่อยlถ้าศูนย์จะถูกแทนที่ด้วยของประเทศเพื่อนบ้านด้วยmax ผลตอบแทนรายการเมื่อมันไม่มี'sl[1]or max(l)l*all(l)l0


0

Ruby, 74 ไบต์

->a{(r=0...a.size).map{|n|a[r.min_by{|i|[(a[i]<1)?1:0,(i-n).abs,-a[i]]}]}}

ทำงานโดยค้นหาตัวเลขที่ไม่เป็นศูนย์ที่ใกล้เคียงที่สุด


0

MATL , 38 ไบต์

การแปลโดยตรงของคำตอบ Matlab ของฉัน ใช้ภาษา / คอมไพเลอร์เวอร์ชันปัจจุบัน

it:"tttFFTo2X5I$X+wTFFo2X5I$X+vX>w~*+]

ตัวอย่าง

>> matl it:"tttFFTo2X5I$X+wTFFo2X5I$X+vX>w~*+]
> [7 0 3 0 0 0 0 0 8 0 9 1]
7 7 3 3 3 8 8 8 8 9 9 1

แก้ไข: ลองออนไลน์! ด้วยการX+แทนที่ด้วยY+และvโดย&vเนื่องจากการเปลี่ยนแปลงทำในภาษา

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