박테리아 콜로니 표지 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 개의 셀 목록 (ifr = 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이면 최대 인접 요소를 사용하십시오. 입력 시간을 반복하십시오. 이를 위해 x
via를 통해 반복 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]&