이상한 오토 마톤 구현


11

나는 셀룰러 오토 마톤으로 놀고 있었고 흥미로운 행동을하는 것을 발견했습니다. 작동 방식은 다음과 같습니다.

왼쪽에서 오른쪽으로 이진 문자열을 읽습니다. 1뒤에 2다른 값이 있으면 0결과에 a 를 추가 하고 계속 읽습니다. 값이 발견되면 0(또는 3 개 미만의 값이 남음) 현재 값을 추가하고 a 1를 계속 읽습니다. 문자열의 끝에는 1결과에 단일이 추가됩니다 .

다음은 한 세대의 예제입니다.

01011111
^

먼저 결과를 0추가 01하여 결과에 추가 합니다.

01011111
 ^
01

이제 우리 1는 0 을 만나고 다음 두 값을 건너 뜁니다.

01011111
    ^
010

우리는 다른 1것을 만나서 똑같이합니다

01011111
       ^
0100

우리는 이제 또 다른 1공간이 충분하지 않아서 현재 셀과 1(이 경우 11)를 추가합니다

01011111
        ^
010011

우리는 마지막에 있으므로 싱글을 추가 1하고이 세대를 종료합니다

01011111
        ^
0100111

직무

합리적인 형식으로 입력하면 자동 생성의 1 세대를 계산하는 함수 또는 프로그램을 작성해야합니다.

이것은 질문이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

샘플 구현

다음은 Haskell의 샘플 구현입니다 (함수를 정의 d하지만 프로그램은 반복적으로 무기한을 인쇄합니다).

d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)

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


귀하의 질문에 귀하 는 이제 우리는 또 다른 1이지만 점프 할 공간이 충분하지 않으므로 현재 셀과 1 또는 11을 추가합니다 . 1 또는 11입니까?
caird coinheringaahing

2
그렇다면 우리는 10그것을 인쇄해야 11011합니까? 몇 가지 테스트 사례가 더 도움이 될 것이라고 생각합니다
nmjcman101

2
@WheatWizard 나는 규칙에 대한 명확한 설명, 아마도 표에 감사하겠습니다
Alexander-Reinstate Monica

2
나는 이것이 실제로 셀룰러 오토 마톤이라고 믿지 않지만, 그것을 말하는 정의를 자유롭게 가르쳐주십시오.
feersum

2
@feersum 실제로, 그것은 세포의 수를 보존하지 않습니다. 그것은의 유한 상태 변환기 .
Ørjan Johansen

답변:


5

V , 26 22 21 바이트

정규식을 결합하여 4 바이트 동안 @CowsQuack에 감사드립니다! 그리고 @ ØrjanJohansen은 정규 표현식 조합으로 다른 바이트를 만듭니다.

Ó1../3
Ó./&1
Ó31/0
A1

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

대체를 여러 번 사용하고 끝에 1을 추가합니다. 너무 멋진 것은 없습니다. 원하는 효과를 얻기 위해 다시 매핑 1하고 0삽입 모드 의 버전이 있지만 꽤 오래 걸립니다.

(복수 교체 버전 : 온라인으로 사용해보십시오! )


두 번째와 세 번째 Ó1ü0/&1ü\|
정규 표현식

@Cowsquack 천재!
nmjcman101

Ó./&1뒤에 오는 것이 더 짧습니다 Ó31/0.
Ørjan Johansen

3

자바 스크립트 (ES6), 56 바이트

문자 배열로 입력을받습니다. 1빈 배열이 주어진 경우 문자열 또는 숫자를 반환합니다 .

f=([v,...a])=>v?(+v&&a[1]?a.splice(0,2)&&'0':v+1)+f(a):1

데모

애니메이션 버전

안정적인 입력 예 : 0101, 010011111



2

파이썬 2 , 89 바이트

x=input()
y=0
k=[]
while x[y:]:v=1-x[y]*(y<len(x)-2);k+=[x[y]]*v+[v];y+=3-2*v
print k+[1]

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

Rod 덕분에 -4 바이트
ovs 덕분에 -6 바이트 micsthepick 덕분에
-1 바이트


[0]if v else[x[y],1]로 다시 쓸 수 [[x[y],1],[0]][v]있지만 96 바이트v 에 도달 하도록 값을 반전시킬 수 있습니다
Rod


파이썬 2의 print 서술문에는 괄호가 필요하지 않으므로 1 바이트를 절약 할 수 있습니다
micsthepick

2

스위프트 3 , 147 바이트

@ Mr.Xcoder 덕분에 -1

func g(i:[Int]){var r=[Int]();var s=ArraySlice(i);while let e=s.popFirst(){if 0<e&&2<s.count{r+=[0];s=s.dropFirst(2)}else{r+=[e,1]}};print(r+[1])}

ungolfed, 인쇄하는 대신 값을 반환 :

func iterate(state: [Int]) -> [Int] {
    var result = [Int]()

    var inputSlice = ArraySlice(state)

    while let element = inputSlice.popFirst() {
        if 0 < element && 2 < inputSlice.count { 
            result += [0]
            inputSlice = inputSlice.dropFirst(2)
        }
        else {
            result += [element, 1]
        }

        //debugPrint(result.map(String.init).joined(separator: ""))
    }

    return result + [1]
}

1
당신은 대체 할 수 있습니다 3<=s.count2<s.count대한 -1 바이트 .
Mr. Xcoder

@ Mr.Xcoder 감사합니다! 또한 감지 할 수 1와 입력에들 0 < element보다는element == 0
분석 재개 모니카 - 알렉산더

1

파이썬 2 , 81 바이트

입력과 출력은 모두 목록입니다 (Outgolfer Erik에게 감사합니다)

def f(Z):return Z and((1>Z[0]or 3>len(Z))and[Z[0],1]+f(Z[1:])or[0]+f(Z[3:]))or[1]

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

어떤 경우

[0,1,0,1,1,1,1,1] --> [0,1,0,0,1,1,1]
[0] ----------------> [0,1,1]
[1] ----------------> [1,1,1]
[] -----------------> [1]
[0,1] --------------> [0,1,1,1,1]
[1,0] --------------> [1,1,0,1,1]

파이썬 2 , 85 바이트

입력과 출력 모두 문자열입니다 (초기 솔루션)

def f(Z):return Z and(('0'==Z[0]or 3>len(Z))and Z[0]+'1'+f(Z[1:])or'0'+f(Z[3:]))or'1'

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

어떤 경우

'01011111'--> 0100111
'0'---------> 011
'1'---------> 111
''----------> 1
'01'--------> 01111
'10'--------> 11011

설명 그것은 재귀 방법의 단순한 골프입니다.


목록을 사용하는 것이 더 짧습니다.
Outgolfer Erik

@EriktheOutgolfer thanks :)
mdahmoune

아, 1>Z[0]대신 할 수 있습니다 0==Z[0].
Outgolfer Erik


0

스칼라 131 + 29 = 160 바이트

이것은 문자열 a을 매개 변수로 사용하고 출력을 문자열로 반환 하는 함수 안에 있습니다.

var s=""
var k=0
for(c<-0 to a.length-1)breakable{if(k>0){k-=1
break}
if(a(c)==49&c<a.length-3){s+="0"
k+=2}else s+=a(c)+"1"}
s+"1"

필자는 import util.control.Breaks._28 바이트와 후행 줄 바꿈을 추가해야합니다.

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


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