"Talk" é uma linguagem baseada em acumulador baroquificada criada em resposta à citação de Dennis no talk.tryitonline.net.
Waiting for someone to create an esolang called talk.
. O idioma "Talk" possui 4 comandos:
00
Se o acumulador for 0, defina o acumulador como 0.01
Se o acumulador for 0, defina o acumulador como 1.10
Se o acumulador for 1, defina o acumulador como 0.11
Se o acumulador for 1, defina o acumulador como 1.
Entrada:
A entrada pode ser obtida por qualquer método de entrada aceitável, de acordo com nossas regras de E / S padrão.
Existem duas entradas, o valor inicial do acumulador e o programa. Você pode mesclar essas duas entradas em uma entrada ou dividir sua entrada em comandos válidos (por exemplo, tomando-os como uma lista; por exemplo
[00, 01, 00]
), se desejar.
Resultado:
- No final de uma execução de comando, o acumulador é gerado implicitamente.
Regras:
- A entrada pode ser uma única cadeia ou lista de caracteres.
- Como esse é o código-golfe , a resposta mais curta, em bytes, vence.
- Tomamos dígitos ou strings / caracteres.
Casos de teste:
0 0001111101 -> 1
0 000100 -> 1
0 11001000 -> 0
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
lang.tryitonline.net
(agora étio.run/#lang
). Portanto, um idioma chamado Talk causaria confusão com o URL da sala de bate-papo criada recentemente, que étalk.tryitonline.net
Respostas:
Gelatina , 3 bytes
A entrada é uma lista única: o acumulador, seguido pelos pares.
Experimente online!
Como funciona
O
y
átomo realiza transliteração; [a, b]y
c substitui a por b , então retorna b se a = c e c se a ≠ c .y@/
dobra / reduz a entraday
com argumentos trocados, executando uma transliteração por par.fonte
Python 3 , 43 bytes
Experimente online!
A função usa uma única string como entrada, onde o primeiro caractere é o estado inicial e o restante da string representa os comandos. Essa solução pode ser facilmente transportada para outros idiomas que oferecem melhor suporte para expressões regulares.
A parte difícil é provar que a solução produz o resultado correto. Para ver isso, precisamos de uma análise profunda dos comandos. Primeiramente, podemos ver que os comandos têm as seguintes propriedades:
00
e11
mantém o estado do acumulador.01
e10
torna o estado do acumulador igual ao segundo bit, independentemente do seu estado original.Portanto, o estado final do acumulador é:
01
ou10
existir, o estado final é o mesmo que o estado inicial.10
ou01
comando.A seguir, mostraremos que a solução produz o resultado correto nos dois casos. Provaremos a afirmação para o estado final
0
e o estado final de1
pode ser provado analogamente. Se o estado final for0
a entrada, está em uma das seguintes formas:^0{2k+1}11(11|00)*
Para o Caso 1 , a sequência de entrada
s
deve começar com2k+1
0s, seguida por11
e00
comandos. Eliminar00
s e11
s produz um único0
, que é o estado final..+10{2k+1}11(11|00)*
Para Caso 2 , as extremidades de corda de entrada com um
10
comando, seguido de zero ou mais00
e11
s. Esse padrão é equivalente a um1
seguido por2k+1
0s e, em seguida, zero ou mais11
s e00
s. A eliminação de00
s e11
s deixa para trás o último dos2k+1
0s no final da sequência, que representa o estado final.Com base em tudo o que precede, após a eliminação
00
s e11
s simultaneamente em uma única passagem (01001
é um contra-exemplo se00
é eliminada em uma passagem e, em seguida,11
em uma outra passagem) a partir da entradas
, o último carácter é o estado final. Portanto, a correção da solução é comprovada.fonte
Perl 6 , 17 bytes
Experimente online!
Aproveita "Você pode mesclar essas duas entradas em uma entrada, se quiser", recebendo a entrada como o valor do acumulador concatenado com os comandos, por exemplo,
1,[00,11]
é10011
. Se isso não estiver correto, serão necessários apenas 5 bytes extrasf(accumulator, commands)
. Retorna um objeto de correspondência que pode ser coagido a uma sequência.Explicação:
Basicamente, isso funciona porque os comandos
00
e11
não fazem nada literalmente, enquanto os comandos01
e10
apenas definem o acumulador para o segundo dígito do comando. Se não houver comandos, será necessário o valor inicial do acumulador.fonte
Zsh , 33 bytes
A lista de caracteres é passada como argumentos, o valor inicial do acumulador é passado como stdin.
Experimente online!
39 bytes : se os comandos devem ser uma única sequência
A entrada é
accumulator
commands
como argumentos.Experimente online!
Por diversão, aqui está um TIO (one-liner recursivo) de 50 bytes :
fonte
Python 3 , 52 bytes
Experimente online!
Tipo de retorno inconsistente fixo graças a Chas Brown
Recebe entrada como duas strings; o acumulador e o código.
fonte
f(1,'11')==f(1,'01')
éFalse
; às vezes retorna umint
e às vezes umstr
. Então, talvez especificar que leva entrada acc como uma string?Braquilog ,
119 bytesExperimente online!
Como já se passou o tempo suficiente para esquecer a noção de imprimir o acumulador após cada comando , formulei uma solução significativamente menos ingênua com alguma inspiração da resposta Perl de Jo King.
Solução antiga:
Braquilog ,
1816 bytesExperimente online!
-2 bytes para alterar o formato de entrada.
fonte
JavaScript (ES6), 27 bytes
Aceita entrada como
(a)(code)
, onde o código é uma lista de números inteiros de 2 bits.Experimente online!
JavaScript (ES6),
4740 bytesAceita entrada como
(a)(code)
, onde código é uma sequência.Experimente online!
Como?
fonte
sed -E,
2619 bytesUm gritante -7 bytes do @Cowsquack ao perceber a remoção de todos os pares também funciona.
Aceita entrada concatenada em stdin. Inspirado pela resposta Perl de Jo King . Retirar
pares finaisRemova todos os pares e, em seguida, obtenha o último dígito.Experimente online!Experimente online!fonte
s/.*\B//
, mas de qualquer maneira, alterar a abordagem levemente gera 19 bytes ainda mais curtos. Experimente on-line!s/(.)\1//g
funcionaria, pois poderia remover o final de um par e o início do próximo, mas ainda funciona. Excelente!s/(.)\1//g
é equivalente aos/00|11//g
mostrado na minha solução.Retina 0.8.2 ,
1811 bytesExperimente online! O link inclui casos de teste. Aceita entrada concatenada. Economizou 6 bytes graças ao @CowsQuack por apontar que remover todos os caracteres duplicados e depois pegar o último caractere restante funciona, embora na verdade a porta da resposta original do @ JoKing pudesse ter sido alterada em 3 bytes, mesmo sem esse truque.
fonte
!`.$
e depois outros 4 bytes porque você não precisa limitar os pares à direita ...Python 3 , 38 bytes
Experimente online!
Baseado na solução de Joel . Recebe a entrada como uma lista do valor inicial do acumulador (comprimento-uma cadeia) seguido pelos comandos (comprimento-duas cadeias). Localiza o último comando com dois valores desiguais e gera seu segundo caractere.
Para fazer com que isso caia no valor inicial do acumulador quando não houver tais comandos, fazemos com que a cadeia de valor inicial de caractere único passe no teste. Fazemos isso verificando se uma lista de singleton com o último caractere é desigual para uma lista de todos os caracteres anteriores, que é passada por qualquer comprimento - uma string ou comprimento - two string com dois caracteres diferentes.
fonte
Perl 5
-p
,3733 bytesExperimente online!
A entrada tem duas linhas: a primeira linha é a sequência de comandos, a segunda é o acumulador.
fonte
Python 2 , 56 bytes
Experimente online!
fonte
Geléia ,
86 bytesExperimente online!
-2 bytes graças a Nick Kennedy, informando-me sobre uma alteração nas regras. (Seu golfe proposto
EÐḟFȯṪ
, parece um pouco mais inteligente, mas tem o mesmo tamanho que minha solução anterior menoss2
.) O formato de entrada agora assume os comandos como uma lista de cadeias de caracteres de dois caracteres, mas o rodapé do teste se traduz no formato antigo por conveniência.Traduzido da minha solução Brachylog mais recente.
Versão antiga:
Gelatina , 13 bytes
Experimente online!
Não tenho 100% de certeza de que isso esteja correto, mas é bem-sucedido nos três casos de teste. Toma os comandos como argumento esquerdo e o acumulador inicial como argumento correto.
fonte
EÐḟFȯṪ
a entrada como por exemplo[[0,0],[0,1],[1,1],[1,1],[0,1]]
.Haskell , 29 bytes
Define uma função sem nome na primeira linha com o tipo
(Foldable t, Eq b) => b -> t [b] -> b
. Para os propósitos deste código golf, podemos instancia-lo comoChar -> [String] -> Char
onde o primeiro argumento é o acumulador e o segundo é uma lista de cadeias de caracteres com cada cadeia sendo um único comando.Experimente online!
fonte
Python, 111 bytes
Ungolfed. EDIT: AHHH Alguém me venceu!
fonte
Haskell , 36 bytes
Experimente online!
Toma como local
f(string)(char)
onde o caractere é o acumulador e a string é a lista de comandos.fonte
05AB1E , 3 bytes
Experimente online!
Zip, despejo na pilha, substitua.
fonte
Stax , 3 bytes
Execute e depure
Para cada instrução, execute a tradução de caracteres.
fonte
Bash ,
5840 bytesAdicione um byte para um programa completo: altere
f
para$0
.58 bytesExperimente online!O ternário retornará falso quando
$1
definido como0
, mas,1
no final garante que o todo((expression))
retorne verdadeiro, exceto um erro de sintaxe.Quando todos os argumentos são consumidos, ocorre um erro de sintaxe e a recursão termina.
fonte
Carvão , 16 bytes
Experimente online! Link é a versão detalhada do código. Leva argumentos separados. Explicação:
Divida as instruções em pares de dígitos e faça um loop sobre eles.
Se o acumulador for igual ao primeiro dígito ...
... depois atribua o segundo dígito a ele.
Imprima o acumulador no final do loop.
fonte
MATL ,
1312 bytesRecebe a entrada como uma matriz de 2 colunas em que cada linha é um comando e um número
Experimente online! Ou verifique todos os casos de teste
fonte
Geléia , 7 bytes
Um link diádico que aceita o programa como uma lista de números inteiros à esquerda e o acumulador inicial à direita que produz um número inteiro.
Experimente online! Ou veja uma suíte de testes
fonte
PHP , 38 bytes
Experimente online!
Basicamente, porto da idéia de Jo King .
fonte
Encantos Rúnicos , 28 bytes
Experimente online!
Recebe entrada como uma série de bytes separados por espaço (o Runic não entende listas). O primeiro byte é o estado inicial e todos os outros bytes são o programa. Nenhuma validação é executada (ou seja, assume que apenas programas válidos são dados como entrada e não se importa com o valor usado para representar
0
e1
).fonte
Montagem x86, 33 bytes
Coloca o estado inicial do acumulador em
CL
(inteiro0
ou1
) e o endereço dos comandos como uma String ASCII terminada em zeroESI
. Deixa o estado final do acumulador emCL
.Aponte a instrução de chamada no deslocamento
0x1B
(etiquetainterpret
na Explicação).Explicação (Usando a sintaxe da Intel):
fonte
C (gcc) ,
4541 bytesExperimente online!
4 bytes eliminados graças a @ErikF!
fonte
Barril ,
-ir
, 16 bytesExperimente online!
Explicado:
Pega a entrada implícita e muda o valor dos acumuladores para a direita
Repita o seguinte (comprimento da pilha - 1 dividido por 2) vezes
2.1 Mude o acumulador de volta ao topo
2.2 Compare para igualdade com a primeira parte do comando
2.2.1 Se verdadeiro, substitua o acumulador, caso contrário, pop a substituição
A entrada é tomada como o valor acc inicial concatenado com a fonte. Por exemplo
fonte
Cristal , 46 bytes
Com comandos em um
Array(Tuple(Int32,Int32))
, como[{0,0}, {0,1}, {0,0}]
.def f(s,i);i.map{|c,v|s+=~(s^c)&(s^v)%2};s;end
Experimente online!
É muito simples de entender de uma forma mais legível:
A função percorre cada comando, descompactando automaticamente os valores da tupla em
c
ev
. Em seguida, define ostate
pela fórmulaa que cheguei principalmente por tentativa e erro. Depois que todos os comandos foram processados, ele retorna o valor do estado.
fonte
C (clang) ,
6862 bytesExperimente online!
Leva um ponteiro para o início da string de origem, um ponteiro para o final da string de origem (start + strlen (start)) e o valor inicial do acumulador.
Versão antiga (imprime ASCII 48/49 para 0/1):
fonte
Java (JDK) , 38 bytes
Experimente online!
As entradas são uma
int
e umaIntStream
de0
,1
,2
ou3
, o que corresponde a00
,01
,10
,11
a partir de binário.fonte