Executar um sistema Lindenmayer
Um sistema Lindenmayer (ou sistema L) está relacionado aos sistemas Thue e Post e é usado na modelagem botânica e geração de fractal .
Um sistema L é descrito por reescrita de seqüência de caracteres, onde um símbolo do alfabeto é mapeado para uma sequência de substituição de símbolos. Uma coleção desses mapeamentos constitui o sistema L propriamente dito.
O método de saída gráfica desenvolvido por Prusinkiewicz interpreta a sequência resultante após os mapeamentos terem sido aplicados a uma sequência inicial para um número especificado de iterações , como comandos de Desenho de Tartarugas: frente, trás, esquerda, direita, esse tipo de coisa. Isso pode exigir código extra para controlar a escala do desenho, pois contagens de iterações diferentes podem produzir imagens de tamanhos drasticamente diferentes.
Sua tarefa é executar um sistema L com o menor número de caracteres. Seu programa deve ser capaz de renderizar tanto a Curva do Dragão quanto as Hastes de Ramificação da página da Wikipedia, fornecendo a entrada apropriada (arquivo, linha de comando, mas externo à fonte, por favor).
Isso é código de golfe.
Edit: Aqui estão alguns exemplos que eu publiquei na cidade. responda a SO / gire para o norte { Onde descobri o sistema L pela primeira vez } , responda a SO / como programar um fractal , responda a SO / recursão em postscript , discussão comp.lang.postscript / considerando , coleção postscript do sistema l , codegolf.SE/draw-a-sierpinski-triangle {origem da competição entre mim e thomasW} .
fonte
Respostas:
Mathematica
200198188171168Espaços adicionados para maior clareza:
Onde:
Gramática das regras de produção:
A sequência {2,4,6,8} está lá porque eu estou usando
I^n
(I
= unidade imaginária) para fazer curvas.Exemplos:
fonte
Graphics@k
porGraphics@Flatten@k
se você planeja usar muitas iterações. Caso contrário, um limite de recursão o morderá e sua sessão de Mma será cancelada.Python,
369294Não sou um vencedor, mas vou postar o que tentei de qualquer maneira.
Não é bom no golfe de Python ...... Talvez alguém possa fazer isso.
Entrada
A entrada é de um arquivo externo chamado "l" (sem extensão), com o seguinte formato:
Linha 1 : Estado inicial (Axioma)
Linha 2 : Regras separadas por vírgula
Símbolos
f
eF
: Desenhe para a frente+
: Vire à direita 5 graus-
: Vire à esquerda 5 graus[
: Salve a posição e o cabeçalho]
: Posição pop e o cabeçoteOutros símbolos são ignorados pela função de desenho.
Regras
Uma regra está no formato
"predecessor":"successor(s)"
Observe que as aspas são necessárias, sejam simples ou duplas.
predecessor
deve ser um único caractere.Além disso, não há constantes implícitas: você deve especificar explicitamente uma regra de não alteração para elas.
Exemplos
Hastes de ramificação
Saída
Observe que a fonte é modificada para liberar isso APENAS PARA ESCALAR O GRÁFICO NA ÁREA VISÍVEL. O console também é usado para esconder a "tartaruga".
Curva do dragão
Saída
Novamente, o console é usado para ocultar a "tartaruga".
Triângulo de Sierpinski
Gerações de saída reduzidas para 5 aqui.
fonte
f
,r
,l
; adicionando um parâmetro fictício ao
ec
; e, em seguida, mudar o interruptor pseudo para{'f':fd,'F':fd,'+':rt,'-':lt,'[':o,']':c}[k](5)
g
, e eu achoo
ec
valem a pena eliminando com embutidosif
declarações (mais barata do que aglobal
declaração)o
ec
diretamente no pseudo-interruptor) deram erros de sintaxe, mas outras não ' t.s,R,*p=input().split()
. 3. Gere o valor final des
porexec('s="".join(map(eval(R).get,s));'*8)
. 4. Deixe de foracontinue
. 5. Recue apenas 1 espaço. 6. Economize espaço após aif
troca das laterais do teste. 7. Coloquek:int
adict
(primeira entrada) e então você não precisaexcept: try:
. (Recebo 215 caracteres.)Javascript (179 bytes)
Não tenho certeza absoluta de que isso se qualifica, pois o objeto de regras faz todo o desenho real.
Demo (Dragon, animado):
- Expandido: http://jsfiddle.net/SVkMR/9/show/light
- Com código: http://jsfiddle.net/SVkMR/9/
Minificado:
Legível (ish):
Entrada:
Uso:
Bônus: Espiral Dourada http://jsfiddle.net/SVkMR/35/show/light/
fonte
Postscript
264298295255Aqui está minha tentativa de fazê-lo de maneira diferente. Em vez da macroexpansão que eu costumo usar, esta verifica o tamanho da pilha de execução para vincular a recursão. Se o limite for excedido, ele pára de examinar recursivamente o procedimento e tenta interpretar os comandos da tartaruga (e descarta o
pop pop
contrário). Uma vantagem desse método é que ele não requer enormes quantidades de memória. Uma desvantagem é que o controle de recursão é bastante desajeitado, pois o tamanho da pilha cresce mais do que apenas 1 de um nível de recursão para o próximo.Editar: +34 caracteres para ramificação.
Edit: -3 caracteres. Redesenhado para usar a pilha de operandos para controle de recursão. Isso torna o sistema básico muito mais simples. Como os colchetes precisam de uma pilha independente, coloquei a posição salva na pilha do dicionário e quase paguei todas as economias.
Além disso, redesenhado para usar seqüências de caracteres e números inteiros em vez de matrizes e nomes.
Editar: -40 caracteres. Foram adicionados dois procedimentos para chamar nomes de sistemas por número (não consigo fazer com que os tokens binários brutos funcionem. Mas esse idioma funciona para mim.)
Binário semi-comentado.
Un- "binário".
Ele exige que o sistema L seja definido em um dicionário na pilha de pistas, com a sequência inicial e a posição inicial da tartaruga na pilha de operandos (anexada à fonte, por exemplo
gs dragon.sys lsys.ps
).Curva do dragão.
Hastes de ramificação.
Ungolfed e comentou.
Para executá-lo, esses 3 blocos podem ser salvos como 3 arquivos: dragon.ps, stems.ps, lsys.ps (qualquer um dos blocos de programas acima funcionará de forma idêntica). Em seguida, execute com gs:
gs dragon.ps lsys.ps
ougs stems.ps lsys.ps
. Eles também podem ser concatenados primeiro, se desejado:cat dragon.ps lsys.ps | gs -
oucat stems.ps lsys.ps | gs -
.Nenhuma imagem de hastes. Não fica mais interessante em profundidades mais altas.
fonte
Mathematica 290
Essa implementação básica concentra-se na saída e não no processamento. Ele não usa regras de produção. Portanto, pode não ser uma resposta adequada ao desafio.
Hastes ramificadas adaptadas da demonstração de Theo Gray .
Código
Uso
O primeiro parâmetro determina se a Curva do Dragão ou Hastes de Ramificação serão exibidas. O segundo termo refere-se à geração.
Mais exemplos
fonte
A->F[+A][-A]
ondeF
é movimento,+
é rodar para a esquerda 30,-
é certo girar 30, e[
/]
são push / pop