세균성 확장


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  

식민지는 경계를 넘어 퍼질 수 없습니다. 식민지는 다른 식민지로 대체되지 않으므로 빈 셀이 모두 채워지면 더 이상 변경되지 않습니다.

초기 상태가 주어지면 최종 상태를 출력하거나 인쇄합니다. 합리적인 목록 또는 문자열 형식을 사용하십시오. 중간 상태를 출력해서는 안됩니다. 투입물에는 적어도 하나의 박테리아 콜로니가 포함됩니다.

관련 : 목록에서 0을 가리십시오 . (식민지는 오른쪽으로 만 퍼졌다.)

테스트 사례 : 입력 아래 출력.

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

자바 스크립트 (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. 각 셀과 두 셀의 모든 목록을 한쪽에 형성 한 다음 각 제로화 셀을 이웃의 최대 값으로 업데이트하여 업데이트를 적용합니다.

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 개의 셀 목록 (if r = 1)을 가져 와서 가운데 셀의 새 색상을 반환합니다.
  • i초기 조건입니다. 그게 입력입니다.
  • b배경입니다. 이것이 주어지지 않으면 CellularAutomaton, 우리가 원하지 않는주기적인 경계를 사용합니다. 대신 사용 0하면 데드 바운더리 조건이 부과됩니다.
  • t시뮬레이션 횟수입니다. 우리는 입력이 넓은 것보다 더 많은 단계를 필요로하지 않습니다. 그 후에 박테리아가 수렴 될 것 t = Length@#입니다. 일반적으로 CellularAutomaton모든 중간 단계를 반환합니다. 우리는 t두 개의 목록 으로 감싸서 피할 수 있습니다 .
  • d출력에 표시 할 셀을 결정합니다. 기본적으로 규칙의 영향을받을 수있는 모든 셀 ( t*r입력의 양쪽 끝에있는 추가 셀)을 가져옵니다. l-1이것은 0부터 시작하는 인덱스가 사용되는 Mathematica의 몇 가지 상황 중 하나이기 때문에 제공합니다 .

6

하스켈, 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이면 최대 인접 요소를 사용하십시오. 입력 시간을 반복하십시오. 이를 위해 xvia를 통해 반복 foldl하지만의 두 번째 인수는 무시하십시오 p.

편집 : @Mauris는 6 바이트를 저장하고 @xnor는 다른 두 개를 찾았습니다. 감사!


당신은 대체 할 수 h pp!_다음 교체 (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.
  }%
}*

컨버전스를 피하는 것은 좋은 트릭
루이스 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

방법은 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

여기에서 온라인으로 사용해보십시오.

Zgarb 덕분에 1 바이트가 절약되었습니다.


3

매스 매 티카, 77 74 66 62 바이트

Martin Büttner 덕분에 12 바이트가 절약되었습니다.

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

그것은 내가 가진 것과는 매우 다릅니다, 나는 당신이 답으로 그것을 게시해야한다고 생각합니다 :)
Lynn

3

파이썬 3.5, 83 바이트

이 함수는 파이썬의 정수 목록을받습니다. 골프에 남은 것이 많지는 않지만 적어도 다른 언어와 경쟁하기를 원합니다!

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

Python 3.5부터 PEP 448을 사용 s하여 압축 을 풉니 다 0,*s. 이전 릴리스에는 다음과 같이 1 바이트가 더 필요합니다.

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의 솔루션 및 설명 나를 돕는 목록이 변경 중지 여부를 제가 테스트 할 필요가 없습니다 것을 깨닫게; 나는 모든 0을 덮 었는지 확인하기 위해 충분한 시간을 반복해야합니다. (필요한 최대 반복 횟수는 목록 길이보다 1이 적습니다. 코드를 덜 사용하기 때문에 반복 횟수가 1 회 더 많습니다.)


@ChrisH : 그것은 파이썬 3.5에 대한 작업을하지 않고, 나도 그 이전 버전에서 작동 것이라고 생각하지 않습니다 : (가) 움직이지 않는 return내부for _ in s 루프?
Tim 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

하스켈, 66 65 바이트

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

라는 함수를 정의합니다 f.

설명

셀룰러 오토 마톤을 반복하는 대신 최종 값을 직접 계산합니다. 정의는 단일 목록 이해입니다. 자연수로 압축하므로 값의 i범위는 0~ 입니다. 각 인덱스 에 대해 2 요소 목록을 생성합니다.length x - 1xi

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

이 목록에서 두 번째 좌표가 0이 아닌 최대 요소를 계산하고을 사용하여 두 번째 요소를 가져옵니다 !!1. 이것은 index에 가장 가까운 0이 아닌 값을 제공하고 i더 큰 값을 취함으로써 관계를 끊습니다.


현상금을 획득 한 것을 축하합니다!
xnor

2

루아, 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

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)⍣≡

온라인으로 사용해보십시오!

()⍣≡ 결과가 인수와 동일 할 때까지 다음 암묵적 기능을 적용하십시오.

 논쟁 거리

+ ...을 더한

  ~ 하지  부호 요소
  
  ×

× 타임스

3⌈/ 세 그룹의 각 그룹에 대한 최대

0, 다음에 0

  , 인수는 다음  제로
  
  0


1

자바 8, 155142 바이트

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

루비, 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의 대답 과 동일합니다 .
Harsh Gupta

난 당신이, 즉 주위, 삼항의 공백을 제거 할 수 있다고 생각 ?하고 :.
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, 쓸모 중괄호 제거는 ...
블랙홀

분할이 감가 상각되기 때문에 나는 계속 폭발했습니다. 또한 for 루프를 사용하여 while 루프를 작성하는 방법을 모르므로 여기 누군가가 지식을 공유하거나 링크를 공유 할 수 없다면 지금은 유지했습니다. 모두 감사합니다.
Goose

0

파이썬, 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와 그 이웃 l[1]or max(l). 이 없는 경우 l*all(l)목록을 반환합니다 .l0


0

루비, 74 바이트

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

0이 아닌 가장 가까운 숫자를 찾아서 작동합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.