Befunge é uma linguagem de programação esotérica bidimensional. A idéia básica é que os comandos (de um caracter) sejam colocados em uma grade bidimensional. O fluxo de controle percorre a grade, executando comandos pelos quais passa e mudando de direção quando bate em uma seta ( >^<v
). Os comandos são baseados em pilha; veja esta lista . Veja também http://esolangs.org/wiki/Befunge .
A especificação para Befunge-98 está disponível.
Problema
Escreva um programa que transforma um programa Befunge em uma representação mais compacta. Por exemplo, o seguinte programa é impresso 0
:
> 0 v
> @ .
^ <
Nesse caso, ele pode ser compactado sem alterar o comportamento do programa, removendo linhas de espaços, para fornecer
>0v
>@.
^ <
Transformações mais sofisticadas poderiam girar ou espelhar seqüências de comandos e eliminar comandos desnecessários de fluxo de controle para compactar o programa. Por exemplo, com este programa:
>12345v
6
v....7<
.
.
.
@
você pode colocar o final do programa no buraco:
>12345v
>...@ 6
^....7<
Para o primeiro exemplo, o programa mais compacto possível é
>0.@
Você pode usar qualquer transformação, desde que o programa de saída dê o mesmo resultado.
Programas de entrada
Programas de entrada são programas válidos do Befunge-98.
Você pode assumir que o programa de entrada é determinístico. Ou seja, ele não usa comandos que leem o estado externo: os comandos de entrada do usuário &
e ~
, o randomizador ?
e o código de modificação automática p
e g
.
Você pode assumir que o programa de entrada termina.
Pontuação
Este não é um código de golfe, mas um problema para escrever um programa que execute código de golfe.
A entrada é um conjunto de casos de teste (programas Befunge que atendem às restrições de entrada acima). A pontuação total é a soma das pontuações para os casos de teste.
Pontuação para cada caso de teste
A pontuação é a área do casco convexo das células não vazias no programa de saída, onde cada célula é tratada como um quadrado cujos quatro cantos são pontos de treliça no plano cartesiano. Por exemplo, um programa de
> v
@ <
obtém uma pontuação de 9,5.
Se o seu programa não terminar em uma quantidade razoável de tempo e memória em uma entrada específica, a pontuação será a do programa de entrada. (Isso ocorre porque você pode adicionar trivialmente um invólucro com limite de tempo que gera o programa de entrada inalterado se o programa não terminar a tempo).
Se o programa de caso de teste tiver um resultado diferente (ou falhar ao finalizar) após o processamento com o programa, a pontuação será a pontuação do programa de entrada mais uma penalidade de 100 pontos.
.
significa número inteiro de saída, mas se você começar do canto superior esquerdo, não haverá um número inteiro na pilha para saída.
.
gera um número inteiro. Mas também, quando não há parâmetros suficientes na pilha, o befunge finge que há uma quantidade suficiente de zeros lá. Portanto, o segundo exemplo seria exibido 000
.
g
e p
não são permitidos (desculpe, esqueci-os; editados).