fundo
Alice e Bob estão criando uma linguagem de golfe para vencer todos os desafios do PPCG. Alice quer criar uma linguagem bidimensional, como> <>, mas Bob prefere uma sintaxe de prefixo-infixo como em J. Como compromisso, eles decidem criar uma linguagem bidimensional de prefixo-infixo. O analisador é difícil de escrever e eles precisam da sua ajuda!
Especificação de sintaxe
No idioma de Alice e Bob, existem variáveis representadas por letras ASCII minúsculas a-z
e funções representadas por letras ASCII maiúsculas A-Z
. Uma função pode ser chamada com um ou dois argumentos. Um programa é uma grade retangular de letras a-zA-Z
e espaços, e o canto superior esquerdo não deve conter um espaço. Este é um exemplo de um programa válido:
F Gy
H
R x
Quando o programa é analisado, é transformado em uma expressão de uma linguagem de estilo C (C, Java, Python ...) contendo variáveis de uma letra e chamadas de função no formato <func>(<arg>)
ou <func>(<arg1>,<arg2>)
. Por exemplo, o programa acima resulta nesta expressão:
F(H(R(x)),G(x,y))
Os detalhes do processo de análise são os seguintes:
- Os espaços são apenas de preenchimento e, portanto, não são analisados.
- Toda variável
a-z
é sempre analisada como ela mesma. - Toda função
A-Z
é analisada como uma chamada de função. Seus argumentos são as expressões mais próximas abaixo e à direita na grade, nesta ordem. Se apenas um deles estiver presente, é dado como o único argumento. Você pode assumir que todas as funções têm pelo menos um argumento na grade.
No exemplo acima, as variáveis x
e y
são analisadas como elas próprias. A função R
não tem nada abaixo e x
à direita; portanto, é analisada como a invocação de um argumento R(x)
. Da mesma forma, H
é analisado como H(R(x))
, pois possui R
abaixo dele. A função G
tem x
abaixo e y
à direita, portanto é analisada como G(x,y)
e da mesma forma para F
. A expressão analisada no canto superior esquerdo é o resultado do processo de análise.
Entrada e saída
Sua entrada é uma matriz retangular não vazia de caracteres. Sempre será um programa válido na linguagem de Alice e Bob, mas pode conter expressões que não são usadas na saída. Sua saída deve ser a expressão analisada resultante do processo acima.
Regras e pontuação
Você pode escrever um programa completo de uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
Estes são dados no formato grid <newline> expression
, com hífens ---
entre os casos. O formato SE deixa algumas linhas em branco, mas elas devem ser preenchidas com espaços.
x
x
---
x y
z
x
---
Fx
F(x)
---
Fx
y
F(y,x)
---
ABu
A(B(u))
---
G
H
k
G(H(k))
---
ABCA
x xs
DFk
A(x,B(D(F(k)),C(x,A(s))))
---
A B
C D x
A(C(D(x)),B(D(x)))
---
RT Hq
I xR k
R(I(x),T(H(R(k),q)))
---
A A A a
S A b
B C Dx
d X u f
A(B(d,C(D(f,x))),A(X(u),A(u,a)))
(A (B (D x)) (C (D x)))
seria adequada ou o formato é fixo?Respostas:
CJam,
676260585754 bytesAgradecimentos a Dennis por salvar 4 bytes.
Isso define um bloco nomeado (função)
J
e o deixa na pilha. A própria função espera uma matriz de seqüências de caracteres na pilha, que representa a grade de entrada e deixa a sequência desejada em seu lugar.Teste aqui.
Eu pretendo resolver esse problema desde que foi publicado, mas aparentemente eu precisava de uma recompensa e de uma solução Pyth muito longa para me motivar o suficiente.
Explicação
A solução é, obviamente, recursiva e constrói gradualmente a string.
fonte
Python 2,
227223192182179177 bytes(Os quatro espaços são de fato guias)
Leva uma lista 2D de caracteres como o primeiro argumento para r.
fonte
Pitão, 97 bytes
Meu deus que demorou muito tempo para fazer (cerca de 5/6 horas?). Pyth realmente não foi projetado para isso ...
Experimente aqui .
Tentativa de explicação, bem como equivalente em python
Onde as funções
Pprint
eassign
retornam o que são dadas.fonte
Haskell,
124122120119 bytesExemplo de uso:
(#id) ["RT Hq ","I xR k"]
->"R(I(x),T(H(R(k),q)))"
.Como funciona: além da grade de entrada
r
, a função#
assume outra funçãog
como argumento aplicador
sempre que o caractere superior esquerdo for um espaço. Se for um caractere minúsculo, retorne-o. Caso contrário, ele deve ser um caractere maiúsculo e#
é chamado recursivamente, uma veztail
para descer e outramap tail
para ir para a direita.!
une os resultados das chamadas recursivas com a,
, se necessário. Tudo começa com a grade de entrada e a função de identidade.fonte
Python 3, 187 bytes
Ainda estou procurando maneiras de jogar golfe, mas estou satisfeito por conseguir transformá-lo em uma linha.
fonte