Vi khuẩn mở rộng


25

Thuộc địa của vi khuẩn được dán nhãn 1thông qua 9trực tiếp trên một phân đoạn của các tế bào bình đẳng-khoảng cách đều nhau, với các ô trống thể hiện bằng0

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

Mỗi giây, mỗi thuộc địa lan sang các ô trống liền kề. Nếu hai thuộc địa đạt đến một ô trống cùng một lúc, thuộc địa có nhãn lớn hơn sẽ lấy nó.

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  

Các thuộc địa không thể lan rộng ra ngoài ranh giới. Một thuộc địa không bao giờ bị thay thế bởi một thuộc địa khác, vì vậy một khi tất cả các ô trống được lấp đầy, không có gì thay đổi thêm.

Cho trạng thái ban đầu, đầu ra hoặc in trạng thái cuối cùng. Sử dụng bất kỳ danh sách hợp lý hoặc định dạng chuỗi. Bạn không nên xuất bất kỳ trạng thái trung gian. Đầu vào sẽ chứa ít nhất một thuộc địa vi khuẩn.

Liên quan: Che các số không trong một danh sách . (Các thuộc địa chỉ lan sang bên phải.)

Các trường hợp thử nghiệm: Đầu ra dưới đầu vào.

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

Câu trả lời:


14

JavaScript (ES6), 66 62 byte

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

Giải trình

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

Kiểm tra


10

Bình thường, 18 byte

um|@d1eSd.:++0G03Q

Bộ kiểm tra

Lấy đầu vào là một danh sách các số nguyên.

Về cơ bản, điều này sử dụng một vòng lặp áp dụng cho đến khi hội tụ , u. Nó áp dụng bản cập nhật bằng cách hình thành tất cả các danh sách của từng ô và hai ô ở hai bên, sau đó cập nhật từng ô bằng 0 lên tối đa các ô lân cận.

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

Toán học, 77 byte

Không cạnh tranh lắm so với //.giải pháp của alephalpha , nhưng tôi nghĩ rằng một thách thức nên có CellularAutomatoncâu trả lời:

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

Hàm này có rất nhiều tham số ... hãy đặt cho chúng một số tên:

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

Đây là những gì họ làm:

  • rlà phạm vi của quy tắc, nghĩa là, nó xác định có bao nhiêu hàng xóm được xem xét để cập nhật. Chúng tôi muốn một người hàng xóm ở mỗi bên, vì vậy chúng tôi sử dụng 1.
  • nthường là số hoặc danh sách các màu (các loại ô khác nhau), nhưng nếu chúng ta chỉ định quy tắc là một hàm tùy chỉnh thay vì số quy tắc, thì điều này sẽ là {}.
  • flà một hàm xác định quy tắc cập nhật. Nó nhận danh sách 3 ô (nếu r = 1) và trả về màu mới cho ô giữa.
  • ilà điều kiện ban đầu. Đó là đầu vào.
  • blà nền tảng. Nếu điều này không được đưa ra, hãy CellularAutomatonsử dụng các ranh giới định kỳ mà chúng ta không muốn. Thay vào đó sử dụng 0áp đặt một điều kiện ranh giới chết.
  • tlà số lần mô phỏng. Chúng ta không cần nhiều bước hơn đầu vào rộng, vì sau đó vi khuẩn sẽ hội tụ, vì vậy t = Length@#. Thông thường, CellularAutomatontrả về tất cả các bước trung gian. Chúng ta có thể tránh điều đó bằng cách gói ttrong hai danh sách.
  • dxác định các ô được trình bày trong đầu ra. Theo mặc định, chúng tôi sẽ nhận được tất cả các ô có khả năng bị ảnh hưởng bởi quy tắc (là t*rcác ô bổ sung ở hai đầu của đầu vào). Chúng tôi cung cấp cho nó l-1, bởi vì đây là một trong số ít các tình huống trong Mathicala nơi sử dụng chỉ mục dựa trên số không.

6

Haskell, 86 83 81 79 73 71 byte

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

Ví dụ sử dụng: 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].

Không có gì nhiều để giải thích: nếu một ô bằng 0, lấy tối đa các phần tử lân cận. Lặp lại thời gian đầu vào. Đối với điều này, tôi lặp đi lặp lại xqua foldlnhưng bỏ qua đối số thứ hai trong p.

Chỉnh sửa: @Mauris tìm thấy 6 byte để lưu và @xnor hai byte khác. Cảm ơn!


Bạn có thể thay thế h pbằng p!_sau đó thay thế (const.h)bằng (!)để lưu 6 byte.
Lynn

@Mauris: Khéo léo. Cảm ơn rất nhiều!
nimi

@nimi Tôi nghĩ dòng cuối cùng ẩn danh id>>=foldl(!).
xnor

@xnor: đúng vậy! Cũng phát hiện ra!
nimi

4

CJam, 27 24 byte

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

Kiểm tra nó ở đây.

Điều này đẩy một khối không tên làm biến đổi một danh sách trên ngăn xếp thành một danh sách mới.

Giải trình

_,       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.
  }%
}*

Hội tụ Sidestepping là một mẹo hay
Luis Mendo

1
... mà tôi đã xấu hổ mượn :-)
Luis Mendo

4

J, 24 23 byte

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

Sử dụng:

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

Phương pháp tương tự như giải pháp của Mauris .

(                  )^:_ 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

Hãy thử trực tuyến tại đây.

Lưu 1 byte nhờ Zgarb.


3

Mathicala, 77 74 66 62 byte

Đã lưu 12 byte nhờ Martin Büttner.

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

3

J, 33 byte

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

Một chút lâu hơn tôi muốn.

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.

Điều đó khác với những gì tôi có, tôi nghĩ bạn nên đăng nó như một câu trả lời :)
Lynn

3

Python 3.5, 83 byte

Hàm này lấy danh sách số nguyên Python. Không chắc chắn còn nhiều để chơi golf, nhưng tôi rất muốn có được nó cạnh tranh với ngôn ngữ khác ít nhất!

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

Từ Python 3.5, PEP 448 cho phép chúng tôi giải nén svào 0,*s. Các bản phát hành trước đó yêu cầu thêm một byte, như vậy:

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

Tín dụng cho giải pháp và giải thích của user81655 để giúp tôi nhận ra rằng tôi không cần kiểm tra xem danh sách đã ngừng thay đổi hay chưa; Tôi chỉ cần lặp lại đủ số lần để chắc chắn tất cả các số 0 phải được bảo hiểm. (Số lần lặp tối đa cần thiết là ít hơn một lần so với độ dài của danh sách; điều này thực hiện một lần lặp nhiều hơn thế, bởi vì điều đó tốn ít mã hơn.)


@ChrisH: Nó không làm việc trên Python 3.5, và tôi không nghĩ rằng nó sẽ làm việc trên các phiên bản trước đó một trong hai: không có di chuyển returnđến bên trong các for _ in svòng lặp?
Tim Pederick

bình luận đã bị xóa - Tôi tình cờ chỉ thử các trường hợp thử nghiệm giải quyết lần đầu tiên.
Chris H

3

Matlab, 90 byte

Làm thế nào về một số kết luận?

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

Thí dụ

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

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

Điều này định nghĩa một chức năng được gọi là f.

Giải trình

Thay vì lặp lại máy tự động di động, tôi tính trực tiếp các giá trị cuối cùng. Định nghĩa là một sự hiểu biết danh sách duy nhất. Giá trị idao động từ 0để length x - 1, vì chúng ta nén xvới các số tự nhiên. Đối với mỗi chỉ mục i, chúng tôi tạo ra danh sách các danh sách 2 yếu tố

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

Từ danh sách này, chúng tôi tính toán phần tử tối đa có tọa độ thứ hai là khác không và lấy phần tử thứ hai đó với !!1. Điều này mang lại giá trị khác không gần nhất cho chỉ mục i, phá vỡ các mối quan hệ bằng cách lấy giá trị lớn hơn.


Chúc mừng bạn đã giành được tiền thưởng!
xnor

2

Lua, 133 byte

Hai vòng lặp, chim nhạn lồng nhau ... Nếu tôi muốn chơi gôn hơn nữa, tôi sẽ phải tìm một cách khác để làm điều đó, nhưng tôi không thấy một.

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

Giải thích

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

Phần

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

sẽ được mở rộng thành

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) 

có thể được dịch trong lồng nhau 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

Bình thường, 17 byte

meeSe#.e,_akdbQUQ

Lấy danh sách kiểu Python từ stdin, xuất ra stdout.

Giải trình

Về cơ bản, đây là bản dịch câu trả lời Haskell của tôi. Tôi chưa thực sự sử dụng Pyth trước đây, vì vậy gợi ý được chào đón.

                   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 byte

Chức năng tiền tố ẩn danh.

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

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

(... )⍣≡ áp dụng các chức năng ngầm sau cho đến khi kết quả là giống với lập luận:

 tranh luận

+ thêm

  ~ không phải
   là
  × dấu hiệu

× lần

3⌈/ cực đại trên mỗi nhóm của ba

0, không theo sau bởi

  , đối số theo sau
   là
  0 số không


1

Java 8, 155 142 byte

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;}

Sửa đổi đầu vào int[]thay vì trả lại một cái mới để lưu byte.

Giải trình:

Hãy thử nó ở đây.

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 byte

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

Tôi nghĩ rằng bên trong mapcó thể được chơi gôn hơn nữa.


Chỉ cần nhận ra, câu trả lời của tôi giống hệt với câu trả lời của @ user81655 .
Harsh Gupta

Tôi nghĩ rằng bạn có thể loại bỏ các khoảng trống trong ternary, tức là xung quanh ?:.
Alex A.

0

PHP - 301 291 289 288 264 Nhân vật

Không đạt được các câu trả lời khác trước khi thử điều này. Đừng đổ lỗi cho ngôn ngữ, hãy đổ lỗi cho tôi. Rất thú vị và thách thức không phải là ít. Tất cả các lời khuyên golf mã đánh giá rất cao.

$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;

Giải thích

// 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
Nghiêm túc? Chơi gôn không chỉ xóa các khoảng trắng trong mã của bạn. Bên cạnh thuật toán, đây là một số mẹo: sử dụng 1thay vì true, splitthay vì explode, forthay vì while, jointhay vì implodexóa các dấu ngoặc nhọn vô dụng,
Thẻ

Tôi cứ nổ tung vì bị chia rẽ. Ngoài ra, tôi không biết cách viết vòng lặp while bằng cách sử dụng, vì vậy tôi giữ nó ngay bây giờ, trừ khi ai đó ở đây có thể chia sẻ kiến ​​thức của họ hoặc chia sẻ liên kết. Cảm ơn tất cả.
Ngỗng

0

Python, 71 byte

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

Việc ziptạo tất cả các danh sách dài 3 phần tử của một phần tử và các phần tử lân cận của nó, xử lý vượt ra ngoài các điểm cuối như 0. Phần tử trung tâm l[1]một danh sách con l, nếu bằng 0, được thay thế bởi các maxhàng xóm của nó bằng l[1]or max(l). Các l*all(l)lợi nhuận danh sách lkhi nó không có 0's.


0

Ruby, 74 byte

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

hoạt động bằng cách tìm số khác không gần nhất.


0

MATL , 38 byte

Bản dịch trực tiếp câu trả lời Matlab của tôi. Sử dụng phiên bản hiện tại của ngôn ngữ / trình biên dịch.

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

Thí dụ

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

EDIT: Hãy thử trực tuyến! được X+thay thế bởi Y+vbởi &v, do những thay đổi được thực hiện trong ngôn ngữ.

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.