Mais um problema de análise de Brainfuck, mas desta vez ... diferente.
Você está trabalhando na Infinite Monkeys Incorporated, a empresa que faz os programas Brainfuck, para resolver vários problemas interessantes (por acidente, nada menos - afinal, a empresa faz programas aleatórios). No entanto, parece que suas máquinas rápidas de Turing que executam apenas o Brainfuck têm um problema pequeno e caro com erros de sintaxe - crie uma e o computador exploda. Provavelmente é uma falha de design, mas ninguém se deu ao trabalho de descobrir por que isso acontece.
Como as máquinas de Turing (especialmente as mais rápidas) são caras (afinal de contas, elas têm RAM infinita que custa), seria melhor garantir que o programa não tenha nenhum erro de sintaxe antes de executar o código. Sua empresa executará muitos códigos, portanto a verificação manual não funcionará. Escreva um programa que leia o código STDIN para Brainfuck e saia com o status de saída definido como algo diferente de 0 (erro) se o programa tiver algum erro de sintaxe (por exemplo,
]
é um erro de sintaxe, porque não há correspondência[
). Saia com o status de saída definido como 0 se o programa estiver completamente correto.Verifique se o seu programa percebe corretamente os erros envolvidos
[]
. Você não gostaria que outro computador explodisse, queria? Ah, e verifique se é o mais curto possível - seu chefe paga por programas curtos (porque ele acha que eles são rápidos, ou algo assim). Ah, e você não precisa codificar no Brainfuck (na verdade, não pode, porque o Brainfuck não suporta códigos de saída) - seu código será executado no computador normal.
Portanto, como você pode ver, seu trabalho é verificar se o programa Brainfuck é "válido" (possui []
símbolos emparelhados ). Observe que os programas Brainfuck podem ter outros caracteres além de []
, portanto, não recuse o programa apenas porque possui outros comandos. O menor código vence, mas provavelmente você se importaria mais com upvotes.
fonte
GCD(a,b)
vez de0 != a || b
.Respostas:
GolfScript, 18 caracteres
Esse código é executado com êxito com o código de saída 0 (e imprime algum lixo em stdout) se os colchetes na entrada estiverem balanceados. Caso contrário, ele falhará com um código de saída diferente de zero e imprimirá uma mensagem de erro no stderr, por exemplo:
ou
Como o desafio não disse nada sobre saída para stdout / stderr, acho que isso se qualifica. Em qualquer caso, você sempre pode redirecioná-los para
/dev/null
.Explicação:
O código
{[]`?)},
retira tudo, exceto colchetes, da entrada e~
avalia o resultado como código GolfScript. A parte complicada é que colchetes desequilibrados são perfeitamente legais no GolfScript (e, de fato, meu código inclui um!), Portanto, precisamos de outra maneira de fazer com que o código falhe.O truque que estou usando é deixar uma cópia da entrada na parte inferior da pilha, coletar a pilha inteira em uma matriz (usando o desbalanceado
]
) e desativar o primeiro elemento. Neste ponto, três coisas podem acontecer:[
, tentar deslocar um elemento de uma matriz vazia trava o intérprete (que, nesse caso, é exatamente o que queremos!)]
ou uma abertura[
), será uma matriz.Minha entrada original de 14 caracteres comparou o valor alterado com uma string, que falharia se fosse uma matriz aninhada. Infelizmente, acontece que comparar uma matriz plana (ou, em particular, vazia) com uma string também é legal no GolfScript, então tive que mudar de direção.
Minha submissão atual, em vez disso, usa um método de força bruta para diferenciar matrizes de strings: desvaloriza-as e tenta encontrar a primeira ocorrência de
[
(código ASCII 91), que será zero se e somente se as não avaliadas A variável era uma matriz. Nesse caso, dividir o zero consigo dispara a falha desejada.Ps. Duas outras soluções de 18 caracteres são:
e
Infelizmente, ainda não encontrei uma maneira mais curta de resolver o "problema do array vazio".
fonte
][
(ou seja, não é falhar em seu programa?)[[]
; Corrigi-o agora, ao custo de 4 caracteres, e passa todos os meus testes agora.1+
transformará uma matriz vazia em uma matriz não vazia, uma matriz não vazia em uma matriz não vazia e uma sequência em uma sequência..{[]`?)},~](n<
. Eu tentei o seu1+
, mas parece que o array precisa conter algo diferente de um número (presumivelmente para que o intérprete falhe quando ele tenta comparar recursivamente um caractere com um array / string). O uson+
também não funciona, uma vez que força a matriz a uma string;[n]+
faz o trabalho, mas ainda me coloca em 18 caracteres.Brainfuck 76 bytes
Isso desaparece se os colchetes estiverem desequilibrados, tornando o interpretador / compilador bf com falha no tempo de execução e alguns deles possuem códigos de saída para refletir isso.
requer eof = 0, valores de quebra automática e número finito de células
No Ubuntu você pode usar o intérprete
bf
(sudo apt-get install bf
)fonte
Brainfuck
é Turing completo sem E / S, pois você pode executar um programa que calcula qualquer cálculo e vê o resultado inspecionando sua memória após a execução. O BF sem E / S tornaria as pessoas menos interessadas, pois seria difícil criar utilitários. Por exemplo, eu nunca poderia ter feito meu intérprete de Lisp .Befunge 98 -
26312019 caracteresLivre-se de alguns condicionais massivos. Agora o programa funciona da seguinte maneira:
q
sai do programa e exibe o valor superior como um valor de erro. O valor do erro será-11 se houver muitos]
, 0 se estiverem equilibrados e negativopositivose houver muitos[
. Se o número for negativopositivo, serão necessáriosmuitosdo valor absoluto desse número]
para equilibrar o programa.Editar: incremento e decréscimo comutado.
[
usado para incrementar o contador e]
decrementá-lo. Ao alterná-lo, eu salvo 1 caractere, porque para a condição de saída, só tenho que verificar se o contador é positivo, e não negativo.Versão antiga
Este código funciona da seguinte maneira:
Edit: percebeu que isso aceita entradas como
][
, agora termina sempre que a contagem fica negativa, usandofonte
[
e]
para fazer a comparação com ambos.J (
3835)Explicação:
1!:1[3
: leia stdin'[]'=/
: crie uma matriz em que a primeira linha seja uma máscara de bit do[
s na entrada e a segunda linha é os]
s.1 _1*
: multiplique a primeira linha por 1 e a segunda linha por -1.+/
: soma as colunas da matriz, fornecendo recuo delta por caractere+/\
: crie um total atual, fornecendo nível de recuo em cada caractere({:+.<./)
: retorna o GCD do elemento final ({:
) e o menor elemento (<./
). Se todas as chaves coincidirem, ambas devem ser,0
portanto, isso retornará0
. Se os colchetes não corresponderem, ele retornará um valor diferente de zero.exit
: defina o valor de saída como esse e saia.fonte
rubi (64)
anteriormente (68) era:
Outra solução equivalente usa
não pode usar
size
sozinho porque daria falsos negativos (!!!) quando o número total de colchetes desequilibrados for múltiplo de 256fonte
=
operador.0
lata podem ir.Perl, 30 caracteres
Sua regex recursiva básica do Perl para o resgate:
Para aqueles que não estão familiarizados com os argumentos de linha de comando usados aqui:
-0
permite definir o caractere de final de linha para fins de entrada de arquivo; usar-0
sem argumento define o caractere de final de linha como EOF.-n
lê automaticamente a entrada (neste caso, o arquivo inteiro) em$_
antes.Se o regex corresponder, ele retornará um valor verdadeiro, que é negado a 0 para o código de saída. Caso contrário, o valor de retorno falso produzirá um código de saída 1.
fonte
festança (tr + sed) - 42
Se você não se importa com as mensagens de erro, pode remover o último espaço entre
`
e]
obter o comprimento 41.fonte
cat
e$()
também"[]"
pode ser escrito como[]
). Aceitei esta resposta, mas até ver melhorias no comprimento, não vou votar mais, pois, embora curta, pode ser muito menor para o bash.$()
com acentos graves e fez o"[]"
->[]
você sugeriu.Perl (56 caracteres)
A solução Perl óbvia: um regex recursivo. Infelizmente, é uma construção bastante detalhada.
fonte
Haskell (143)
to jgon: Usar 2 guardas parece ser mais denso do que se-então-outro. Além disso, não acho que o seu verifique se os colchetes estão na ordem correta ("] [" passa)
fonte
C,
7364 caracteresGraças às sugestões da breadbox (embora isso provavelmente exija pouco trabalho):
Como funciona:
i
é inicializado como 0c
torna-se um int implícito que é obtidoargc
(inicializado como 1, mas não nos importamos, desde que os bits mais altos não estejam definidos)read(0,&c,1)
lê um único caractere no byte baixo de c (em arquiteturas little-endian) e retorna 0 no EOF;i+1 != 0
a menos que a cotação entre colchetes seja -1; multiplicá-los juntos funciona como um booleano (seguro) E que leva um caractere a menos do que&&
c==91
avalia como 1 para'['
ec==93
avalia como 1 para']'
. (Pode haver algum truque minucioso que seria menor, mas não consigo pensar em nada.)return i
sai com o código de status 0 se estiver equilibrado, diferente de zero se não estiver. Retornar -1 tecnicamente viola o POSIX, mas ninguém se importa com isso.Versão anterior:
fonte
getchar()
vez de ler reduzirá o código e permitirá que você use (implícito) emint
vez dechar
para sua variável. Lembre-se também de que as globais são automaticamente inicializadas em zero.c;
define um int global.][
? Tenho certeza que não está equilibrado. Você não precisa acompanhar se é negativo pelo menos uma vez?Lua, 56
fonte
"^%b[]$"
o que é isso? Você pode explicar? Certamente, isso não é regex?^
), conjunto equilibrado de[
e]
com qualquer coisa entre (%b[]
) e final da string ($
).GTB , 55
Sente falta
[]
Use
0
para parar.fonte
MATEMÁTICA, 88 caracteres
fonte
s name like
RegularExpression` eStringLength
nunca consigo ganhar o contexto de golfe com código de texto com o Mathematica! :)ToCharacterCode
é muito mais demorado doord
que isso ... PS: Que tal definir um código de saída?Length[StringCases[s,"["|"]"]//.{x___,"[","]",y___}:>{x,y}]
Rubi,
59.58Procura entre colchetes de abertura e fechamento, contando
[
como 1 e]
como -1, e sai se a contagem cair abaixo de 0.fonte
exit 1
em branco depois , caso você pergunte).Hássio , 104 bytes
Expandido completo (a nota não funciona no intérprete online, pois a entrada () está desativada) aqui
fonte
Código da máquina de Turing,
286276 bytesMais uma vez, estou usando a sintaxe da tabela de regras definida aqui.
Termina no estado
halt
para aceitar a entrada ehalt-err
rejeitá-la.fonte
halt-err
pode ser mais curto, comohalt*
por exemplo.Pitão, 25 bytes
Experimente online!
Tradução Python 3:fonte
Haskell (
167, 159)Fiz isso principalmente por diversão, se alguém tiver alguma sugestão de como reduzi-lo, ficaria feliz em ouvi-los :)
Editar: Corrigido um problema apontado para mim nos comentários (adicionado 11 bytes).
Edit 2: Função auxiliar criada para testar predicados usando proteções inspiradas no user13350, removendo 8 bytes.
fonte
][
( fora apontado por user13350 )Stax ,
1411 caracteresExecute e depure
Crédito para @recursive por -3 bytes.
Equivalente ASCII:
Remova todos os caracteres
[]
, exceto e remova[]
até que a sequência não seja mais alterada. Retorne1
se a sequência final estiver vazia.fonte
.[]|&
para filtrar os caracteres e, em seguida, re-utilizar o literal para 11