태그 보관물: cellular-automata

cellular-automata

세균성 확장 2 3 3

박테리아 콜로니 표지 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
    var QUESTION_ID=64812,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/67346/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
    body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


답변

자바 스크립트 (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

테스트

var solution = a=>a.map(_=>a=a.map((c,i)=>c||Math.max(a[i-1]|0,a[i+1]|0)))&&a
Cell numbers separated by spaces = <input type="text" id="input" value="7 0 3 0 0 0 0 0 8 0 9 1" />
<button onclick="result.textContent=solution(input.value.split(' ').map(n=>+n)).join(' ')">Go</button>
<pre id="result"></pre>

답변

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.

답변

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의 몇 가지 상황 중 하나이기 때문에 제공합니다 .

답변

하스켈, 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는 다른 두 개를 찾았습니다. 감사!


답변

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

답변

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 바이트가 절약되었습니다.


답변

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

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

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