Implementar um autômato estranho


11

Eu estava brincando com autômato celular e encontrei um que tinha algum comportamento interessante. Veja como funciona:

Ele lê uma sequência de caracteres binária da esquerda para a direita; se encontrar uma 1seguida por 2outros valores, anexará 0a ao resultado e continuará lendo. Se encontrar um 0(ou restarem menos de 3 valores), ele acrescentará o valor atual e a 1e continuará lendo. No final da string, ele acrescentará um único 1ao resultado.

Aqui está um exemplo elaborado de uma geração

01011111
^

Primeiro encontramos um, 0então anexamos 01ao nosso resultado

01011111
 ^
01

Agora encontramos um, 1então adicionamos um zero e pulamos os próximos dois valores

01011111
    ^
010

Encontramos outro, 1então fazemos o mesmo

01011111
       ^
0100

Agora temos outro 1espaço, mas não o suficiente, para pular, então anexamos a célula atual e um 1(neste caso 11)

01011111
        ^
010011

Estamos no final, então anexamos um single 1e encerramos esta geração

01011111
        ^
0100111

Tarefa

Dada a entrada em qualquer formato razoável, você deve criar uma função ou programa que calcule uma geração do autômato.

Esta é uma questão de para que as respostas sejam pontuadas em bytes, com menos bytes sendo melhores.

Implementação de amostra

Aqui está uma implementação de amostra no Haskell (define uma função d, mas o programa imprime uma iteração indefinidamente):

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

Experimente online!


Na sua pergunta, você declara : Agora temos outro 1, mas não há espaço suficiente para pular; portanto, anexamos a célula atual e um 1 ou 11 . É 1 ou 11?
caird coinheringaahing

2
Então, se temos um, 10ele deve imprimir 11011? Eu acho que mais alguns casos de teste seria útil
nmjcman101

2
@WheatWizard eu apreciaria uma explicação mais clara, talvez uma mesa, das regras
Alexander - Reintegrar Monica

2
Não acredito que seja realmente um autômato celular, mas fique à vontade para me esclarecer com uma definição dizendo que é.
feersum

2
@feersum De fato, ele não preserva o número de células. É um transdutor de estado finito .
Ørjan Johansen

Respostas:


5

V , 26 22 21 bytes

Graças ao @CowsQuack por 4 bytes, combinando regexes! E @ ØrjanJohansen por outro byte com algumas combinações de expressões regulares.

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

Experimente online!

Usa substituto várias vezes e acrescenta 1 no final. Nada muito chique. Eu tenho uma versão que remapeia 1e 0no modo de inserção para obter o efeito desejado, mas é um pouco mais longo.

(Versão de substituição múltipla: Experimente online! )


As segunda e terceira regexes podem ser mescladas em Ó1ü0/&1( üé \|)
user41805

@Cowsquack genius!
nmjcman101

É ainda mais curto, Ó./&1seguido de Ó31/0.
Ørjan Johansen

3

JavaScript (ES6), 56 bytes

Recebe a entrada como uma matriz de caracteres. Retorna uma string ou o número, 1se houver uma matriz vazia.

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

Demo

Versão animada

Exemplos de entradas estáveis: 0101, 010011111



2

Python 2 , 89 bytes

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]

Experimente online!

-4 bytes graças ao Rod
-6 bytes graças ao ovs
-1 byte graças ao micsthepick


[0]if v else[x[y],1]pode ser reescrita como [[x[y],1],[0]][v], mas você pode inverter o vvalor para atingir 96 bytes
Rod


Parênteses não são necessários para a declaração de impressão em python 2, assim você pode economizar um byte
micsthepick

2

Swift 3 , 147 bytes

-1 graças a @ Mr.Xcoder

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])}

Sem jogar, retornando o valor em vez de imprimir:

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
É possível substituir 3<=s.countcom 2<s.countpara -1 bytes .
Xcoder

@ Mr.Xcoder Obrigado! Eu também pode detectar 1s na entrada com 0 < elementao invés deelement == 0
Alexander - Reintegrar Monica

1

Python 2 , 81 bytes

Tanto a entrada quanto a saída são listas (graças a Erik, o Outgolfer)

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]

Experimente online!

Alguns casos

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

Python 2 , 85 bytes

Tanto a entrada quanto a saída são strings (solução inicial)

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'

Experimente online!

Alguns casos

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

Explicação É simplesmente um método recursivo de golfe.



@EriktheOutgolfer thanks :)
mdahmoune

Ah, e você pode fazer em 1>Z[0]vez de 0==Z[0].
Erik the Outgolfer


0

Scala , 131 + 29 = 160 bytes

Isso está dentro de uma função que toma a string acomo parâmetro e retorna a saída como uma string.

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"

Eu preciso import util.control.Breaks._, então preciso adicionar esses 28 bytes mais um avanço de linha à direita.

Experimente online!


0

C # (.NET Core) , 108 bytes

n=>{var t="";for(int i=0,b=n.Length;i<b;){if(n[i]>'0'&i+2<b){t+="0";i+=3;}else t+=n[i++]+"1";}return t+"1";}

Experimente online!

Entrada tomada como uma sequência e uma sequência é retornada como saída.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.