Escreva um programa que use uma sequência de quatro caracteres ()[]
que satisfaça esses pontos:
- Todo parêntese esquerdo
(
tem um parêntese direito correspondente)
. - Cada colchete esquerdo
[
tem um colchete direito correspondente]
. - Pares correspondentes de parênteses e colchetes não se sobrepõem. por exemplo,
[(])
é inválido porque os colchetes correspondentes não estão totalmente contidos nos parênteses correspondentes, nem vice-versa. - O primeiro e o último caracteres são um par correspondente entre parênteses ou colchetes. Então,
([]([]))
e[[]([])]
são válidos, mas[]([])
não são.
(Uma gramática para o formato de entrada é <input> ::= [<input>*] | (<input>*)
.)
Cada par de parênteses e colchetes correspondentes é avaliado como um número inteiro não negativo:
- Os valores dos pares entre parênteses são todos somados . A correspondência vazia
()
tem valor0
. - Os valores dos pares entre colchetes são todos multiplicados . A correspondência vazia
[]
tem valor1
.
(A soma ou o produto de um número é o mesmo número.)
Por exemplo, ([](())([][])[()][([[][]][][])([][])])
pode ser dividido e avaliado como 9
:
([](())([][])[()][([[][]][][])([][])]) <input>
(1 (0 )(1 1 )[0 ][([1 1 ]1 1 )(1 1 )]) <handle empty matches>
(1 0 2 0 [(1 1 1 )2 ]) <next level of matches>
(1 0 2 0 [3 2 ]) <and the next>
(1 0 2 0 6 ) <and the next>
9 <final value to output>
Outro exemplo:
[([][][][][])([][][])([][][])(((((([][]))))))] <input>
[(1 1 1 1 1 )(1 1 1 )(1 1 1 )((((((1 1 ))))))]
[5 3 3 (((((2 )))))]
[5 3 3 ((((2 ))))]
[5 3 3 (((2 )))]
[5 3 3 ((2 ))]
[5 3 3 (2 )]
[5 3 3 2 ]
90 <output>
Seu programa precisa avaliar e imprimir o número inteiro representado por toda a cadeia de entrada. Você pode assumir que a entrada é válida. O código mais curto em bytes vence.
Em vez de um programa, você pode escrever uma função que pega uma string e imprime ou retorna o número inteiro.
code-golf
arithmetic
balanced-string
recursion
Passatempos de Calvin
fonte
fonte
Respostas:
CJam, 23
Com grandes créditos para Dennis! Experimente online
Explicação:
O programa converte a entrada em uma expressão CJam e a avalia.
[…]
torna-se[…1]:*
(acrescente 1 e multiplique)(…)
torna-se[…0]:+
(acrescente 0 e adicione)fonte
q"])(""1]:*0]:+["4/ers~
Lisp comum - 98
(
por(+
[
por(*
]
por)
Isso requer que a
cl-ppcre
biblioteca seja carregada na imagem lisp atual.Explicação
Funções
*
e+
são variadas e retornam seu valor neutro quando não recebem argumentos. Para seus exemplos, o formulário lisp avaliado é o seguinte:e
Sem regexes - 183 bytes
Vamos lá, Lisp - 16 bytes (experimental)
Outras línguas são tão concisas que sou tentado a criar minha própria linguagem de golfe com base no Common Lisp, para manipulações mais curtas de cordas. Atualmente, não há especificações e a função eval é a seguinte:
Testes:
s
e duas pilhas,p
eq
.p
.<
: sai dep
e empurra paraq
.r
: substitui ins
(deve ser uma string) de caracteresq
para caracteres emp
; resultado é armazenado ems
;p
eq
são esvaziados.R
: lê da strings
, armazena o resultado na variávels
.E
: forma de avaliaçãos
, resultado da loja ems
.fonte
Pitão,
353433 bytesDemonstração.
1 byte graças a @Jakube.
Começamos analisando a entrada. O formato de entrada é próximo ao Python, mas não é bem assim. Precisamos de vírgulas após cada grupo entre parênteses ou entre colchetes. A vírgula no final de um grupo entre colchetes é desnecessária, mas inofensiva. Para fazer isso, usamos este código:
Isso deixará um extra
,
no final da string, que envolverá o objeto inteiro em uma tupla, mas isso é inofensivo, porque a tupla será somada e, portanto, terá um valor igual ao seu elemento.Agora que a string é analisada, devemos encontrar seu valor. Isso é feito usando uma função definida pelo usuário
y
, que é chamada no objeto analisado. a função é definida da seguinte maneira:fonte
Emacs lisp, 94
O formato parece muito lispy, então pensei que uma simples transformação poderia funcionar:
O formato intermediário é semelhante a (por exemplo, na pergunta):
Somos ajudados pelo fato de que adição e multiplicação já fazem o que queremos com uma lista de argumentos vazia.
Degolfado e interativo, para você se divertir:
fonte
interactive
(em vez de buffer-string, use read-from-string).Retina , 111 bytes
Dá saída em unário.
Cada linha deve ir para seu próprio arquivo, mas você pode executar o código como um arquivo com o
-s
sinalizador. Por exemplo:A explicação vem depois.
fonte
Java, 349 caracteres
Uma abordagem recursiva simples. Espera que a string seja o primeiro argumento usado para chamar o programa.
Expandido:
fonte
Perl 5, 108
Feito como intérprete, em vez de reescrever e avaliar. Não é uma ótima exibição, mas é divertido escrever de qualquer maneira.
Sem golfe:
fonte
Python, 99
Eu tentei uma variedade de métodos, mas o mais curto que consegui foi basicamente apenas uma substituição e avaliação. Fiquei agradavelmente surpreso ao descobrir que podia deixar todos os
,
s finais , pois o Python pode analisar[1,2,]
e a vírgula final final coloca a coisa toda em uma tupla. A única outra parte não simples seria aord(c)%31%7
de separar os diferentes personagens (que avalia a2
,3
,1
,0
para(
,)
,[
,]
respectivamente)fonte
Java, 301
uma abordagem um pouco diferente da resposta de TheNumberOne, embora a minha também seja de natureza recursiva. A entrada é retirada da linha de comando. O método nulo salva alguns bytes ao remover os caracteres que não são mais necessários.
expandido:
fonte
Python,
117110109 bytesUm aspecto com o qual estava lutando é que a função basicamente tem dois valores de retorno: o produto / soma e a nova posição na string. Mas preciso de uma função que retorne apenas o resultado, portanto, retornar uma tupla não funciona. Esta versão usa um argumento de "referência" (lista com um elemento), para retornar a posição da função.
Eu tenho uma versão mais curta (103 bytes) que usa uma variável global para a posição. Mas isso só funcionará na primeira chamada. E uma função que só funciona uma vez parece um pouco suspeita. Não tenho certeza se seria aceitável para o código de golfe.
O algoritmo é uma recursão direta. Eu tentei várias variações para a expressão que atualiza o produto / soma. Eu vim com algumas versões que tinham exatamente o mesmo comprimento, mas nenhuma delas mais curta.
Eu meio que esperava que a abordagem que transforma isso em uma expressão avaliada provavelmente vencesse. Mas, como eles dizem: "Repetir é humano, recompensar divino".
fonte
Clojure - 66 bytes
Observe que
([] (()) ([] []) [()] [([[] []] [] []) ([] [])])
é um formulário válido do Clojure. Tão:g
.g
função local aplica-se+
ou*
ao resultado da invocação deg
subelementos de seus argumentos.x
em uma sequência vazia;(map g x)
retornanil
eapply
retorna o valor neutro para a operação.fonte
JavaScript (ES6), 116 bytes
fonte