O prelúdio é uma linguagem de programação esotérica, com poucas restrições, mas incomuns, sobre o que constitui um programa válido. Qualquer bloco de texto ASCII imprimível ("bloco" significa que as linhas de ASCII imprimíveis são separadas por novas linhas - 0x0A) é válido desde que:
- Cada coluna (vertical) de texto contém no máximo um de
(
e)
. - Ignorando sua posição vertical,
(
e)
são equilibradas, ou seja, cada uma(
é emparelhada com exatamente uma)
à direita e vice-versa.
Escreva um programa ou função que, dada uma sequência contendo ASCII imprimível e novas linhas, determine se constitui um programa Prelude válido. Você pode receber informações via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função. O resultado pode ser retornado ou impresso em STDOUT, usando quaisquer dois valores fixos de verdade / falsidade de sua escolha.
Você não deve assumir que a entrada é retangular.
Isso é código de golfe, então a submissão mais curta (em bytes) vence.
Exemplos
A seguir, são apresentados os programas Prelude válidos (na verdade, são mesmo programas Prelude reais ):
?1-(v #1)-
1 0v ^(# 0)(1+0)#)!
(#) ^#1-(0 #
1(# 1) v # - 1+)
vv (##^v^+
? v-(0 # ^ #)
?
1+ 1-!
E aqui estão algumas entradas, todas inválidas :
#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)
fonte
)
e 2(
. Não deveria ser apenas 1 por linha?Respostas:
CJam,
5756 bytesMuito tempo, pode ser jogado muito. Explicação a ser adicionada assim que eu jogar.
Breve explicação
Existem duas verificações no código:
Number of "(" - Number of ")"
) deve estar se elogiando. Portanto, quando você os adiciona, deve resultar em 0. Qualquer parte que falhe nessa propriedade faz com que toda a entrada tenha colchetes não correspondentes.Number of "(" - Number of ")"
não pode ser negativo para o bloco do lado direito.Experimente online aqui
fonte
Python 2,
128119105 bytesVocê sabia que pode mapear None no Python 2?
Explicação
Queremos começar pela transposição do Prelude para que as colunas se tornem linhas. Normalmente faríamos isso com isso
zip
, mas comozip
trunca o menor comprimento de linha eitertools.zip_longest
é muito longo para o código-golfe, parece que não há uma maneira curta de fazer o que queremos ...Exceto pelo mapeamento
None
:Infelizmente (ou melhor, felizmente para todos os fins que não sejam de golfe), isso só funciona no Python 2.
Quanto
n
ev
:n
age como uma pilha, contando1 - <number of unmatched '(' remaining>
. Para cada coisa(
que vemos, subtraímos 1 e, para cada coisa)
que vemos, adicionamos 1. Portanto,n >= 2
a qualquer momento, vimos muitos)
seo programa é inválido. Sen
não terminar em 1, temos pelo menos um(
restante inigualável .v
verifica a validade e começa em 1. Se o programa for inválido (n >= 2
ouA+B >= 2
),v
será 0 para marcar a invalidez.Portanto, se o programa é válido, no final, devemos ter
n = 1, v = 1
. Se o programa for inválido, no final, devemos terv = 0
ouv = 1, n <= 0
. Portanto, a validade pode ser expressa sucintamente comon*v>0
.(Obrigado a @feersum por uma infinidade de boas sugestões que tiraram 14 bytes!)
Envio anterior e mais legível:
fonte
map
... #def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
or
em comparação encadeamento, mas eu não pensar em mudar|=
para*=
. Tirou outro byte, porém, fazendo as coisas ainda mais para trás :)J, 64 bytes
Entrada é uma sequência com uma nova linha à direita. A saída é 0 ou 1.
Exemplo de uso
O método é o seguinte
];.2
(
/)
/anything else
em1
/-1
/0
1 _1 0{~[:'()'&i.]
s=.+/@:
advérbio que adicionado a um verbo soma a saída da matriz de verbosadicionar valores em colunas
]s
()
saldo positivo em todos os prefixos[:(0>])s)[:+/\]
()
saldo igual em toda a lista (ou seja, no último prefixo)|@{:@]
adicione abs (valores) nas colunas e verifique cada elemento para um valor máximo de 1
(1<|s)s
como todas as verificações anteriores tiveram resultados positivos na falha, adicionamos e comparamos com 0 para obter a validade da entrada
0=]
fonte
J, 56 bytes
Essa é uma função anônima que aceita uma string com uma nova linha à direita e retorna 0 ou 1. Leitura da direita para a esquerda:
];.2 y
, como na outra submissão em J, corta a stringy
em todas as ocorrências de seu último caractere (é por isso que a entrada precisa de uma nova linha à direita) e cria uma matriz retangular cujas linhas são as peças, preenchidas com espaços, se necessário.'()'=/
compara cada caractere naquela matriz primeiro com(
e depois)
retornando uma lista de duas matrizes 0-1.+.^:_1]0|:
transforma essa lista de duas matrizes em uma única matriz de números complexos. Até agora, o programa transforma todos(
os dados da entrada em 1, todos os)
i e todos os outros caracteres em 0.b=.+/
atribui a soma das linhas dessa matriz complexab
.-.|b
faz uma lista de 1- | z | para cada z inb
. A condição de que cada coluna contém no máximo um parêntese único se traduz em todos esses números 1- | z | sendo não-negativo.+/\*:b
é o vetor de somas em execução dos quadrados dos números emb
. Se todas as colunas contiverem no máximo um parêntese, os quadrados dos númerosb
serão todos 0, 1 ou -1. O,
concatena esse vetor com o vetor de 1- | z | 's.Agora, tudo o que precisamos fazer é testar se as entradas do nosso vetor concatenado
v
são números reais não negativos, isso é quase*/0<:v
, exceto que isso causa um erro se algumas entradas dev
não forem reais, então substituímos<:
pelo<: ::0:
que apenas retorna 0 em caso de erro .fonte
0={:+/\*:b
por exemplo,(
não é válido.0=(-|)v
é 2 bytes mais curto para verificar reais não negativos. (Vamos bater o CJam!: P) #inv
vez de^:_1
salvar outro byte.3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'
.