Figuras de Lichtenberg

Neste arquivo iremos colocar os problemas já resolvidos (não são problemas "mortos" porque a discussão pode continuar a qualquer altura!)

Mensagempor Ivo_Timóteo em Sexta Jan 18, 2008 2:53 pm

vbmaster Escreveu:
Ivo_Timóteo Escreveu:Vá lá, não se faz muito com scheme...



Nós por cá resolvemos sudokus em scheme... ainda é alguma coisa... :P (o infamente projecto que trama a maior parte dos alunos.... )

Epah, já tenho é visto códigos de pessal da FEUP e acho sempre engraçado vocês nunca definirem procedimentos com "açucar sintático", fazem sempre (define <nome> (lambda (<args>) <corpo>))... acho estranho... podem fazer directamente (define (<nome> <args>) <corpo>).

Mas adorei aí o programa. Nós por acaso não exlorámos a vertante gráfica do scheme, já que no nosso projecto já nos davam a inteface gráfica.


E quando têm um número indefenido de argumentos?
E quando querem procedimentos a devolver procedimentos?
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Mensagempor Ivo_Timóteo em Sexta Jan 18, 2008 3:15 pm

Bem, aqui vai o código, se tiverem dúvidas, perguntem!

Código: Seleccionar Todos
(require (lib "graphics.ss" "graphics"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define graf-altura 0)
(define graf-vp 0)

(define janela               
  (lambda (larg alt titulo)
    (open-graphics)
    (set! graf-altura alt)
    (let ((vport (open-viewport titulo larg alt)))
      (set! graf-vp vport)
      (list larg alt titulo))))

(define ponto   
  (lambda (p) 
    ((draw-pixel graf-vp) (make-posn (car p)(- graf-altura (cadr p))) (make-rgb 0 0 0))))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

(define cria-grelha
  (lambda (colunas linhas)
    (if(zero? colunas)
       '()
       (append (list(make-vector linhas 0))(cria-grelha (sub1 colunas)linhas)))))

(define coord-grelha
  (lambda (lista x y)
    (vector-ref (list-ref lista x) y)))

(define ocupa!
  (lambda (lista x y)
    (vector-set! (list-ref lista x) y 1)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define pinta-coluna
  (lambda (lista col counter max)
    (if(< counter max)
       (if(equal? (coord-grelha lista col counter) 1)
          (begin
            (ponto (list col counter))
            (pinta-coluna lista col (add1 counter) max))
          (pinta-coluna lista col (add1 counter) max)))))

(define pinta-aux
  (lambda (lista counter max)
    (if(< counter max)
       (begin
         (pinta-coluna lista counter 0 (vector-length (car lista)))
         (pinta-aux lista (add1 counter) max)))))

(define pinta-janela
  (lambda (lista)
    (pinta-aux lista 0 (length lista))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define lichtenberg
  (lambda (x y iter)
    (janela x y "Lichtenberg")
    (let((lista(cria-grelha x y)))
      (ocupa! lista (truncate(/ x 2)) (truncate(/ y 2)))
      (pinta-janela lista)
      (letrec((aux
               (λ(lista iter x y limx limy)
                 (if(< 0 iter)
                    (if(= 1 (coord-grelha lista x y))
                       (aux lista iter (random limx)(random limy) limx limy)
                       (if(and(< 0 x)(> (sub1 limx) x)
                              (< 0 y)(> (sub1 limy) y))
                          (if(or(= 1 (coord-grelha lista (add1 x) y))
                                (= 1 (coord-grelha lista (sub1 x) y))
                                (= 1 (coord-grelha lista x (add1 y)))
                                (= 1 (coord-grelha lista x (sub1 y))))
                             (if(> (random 100)74)
                                (begin
                                  (ocupa! lista x y)
                                  (pinta-janela lista)
                                  (aux lista (sub1 iter)(random limx)(random limy) limx limy))
                                (aux lista (sub1 iter)(random limx)(random limy) limx limy))
                             (let((move(random 4)))
                               (cond((= move 0)(aux lista iter (add1 x) y limx limy))
                                    ((= move 1)(aux lista iter (sub1 x) y limx limy))
                                    ((= move 2)(aux lista iter x (add1 y) limx limy))
                                    ((= move 3)(aux lista iter x (sub1 y) limx limy)))))
                          (aux lista (sub1 iter)(random limx)(random limy) limx limy)))))))
        (aux lista iter (random x)(random y) x y)))))


Espero que gostem (())

Qualquer melhoria que possa ser feita, avisem!

(Não sou fã de deixar comentários por isso tento fazer o código o mais legível possível pelo que acho que não deve haver problemas)

P.S. Odeio usar letrec porque dificulta a leitura do procedimento 99% das vezes. Esta é a típica situação em que eu penso que ajuda porque após o letrec chamo apenas o procedimento que acabei de definir...
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Mensagempor vbmaster em Sexta Jan 18, 2008 3:28 pm

Ivo_Timóteo Escreveu:
vbmaster Escreveu:
Ivo_Timóteo Escreveu:Vá lá, não se faz muito com scheme...



Nós por cá resolvemos sudokus em scheme... ainda é alguma coisa... :P (o infamente projecto que trama a maior parte dos alunos.... )

Epah, já tenho é visto códigos de pessal da FEUP e acho sempre engraçado vocês nunca definirem procedimentos com "açucar sintático", fazem sempre (define <nome> (lambda (<args>) <corpo>))... acho estranho... podem fazer directamente (define (<nome> <args>) <corpo>).

Mas adorei aí o programa. Nós por acaso não exlorámos a vertante gráfica do scheme, já que no nosso projecto já nos davam a inteface gráfica.


E quando têm um número indefenido de argumentos?
E quando querem procedimentos a devolver procedimentos?



- Usas o .
- (define (procedimento predicado)
(lambda (arg) (procedimento arg)))


enfim, é só mesmo para aumentar a legibilidade... é como usares let* em vez de labdas encadeados...
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor Ivo_Timóteo em Sexta Jan 18, 2008 3:34 pm

[quote=vbmaster]- Usas o . [/quote]

Usas o ponto? Dá um exemplo...
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Mensagempor vbmaster em Sexta Jan 18, 2008 6:53 pm

Ivo_Timóteo Escreveu:[quote=vbmaster]- Usas o .


Usas o ponto? Dá um exemplo...[/quote]

(define (soma arg1 arg2 . args))

tens obrigatóriamente de dar dois argumentos. Se deres mais, o scheme mete-os na lista args.
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor Ivo_Timóteo em Sexta Jan 18, 2008 9:41 pm

Não é mais simples:

Código: Seleccionar Todos
(define procedimento
   (lambda args
       (corpo)))
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Mensagempor Ivo_Timóteo em Sexta Jan 18, 2008 10:31 pm

Professor, já tem o código e está a pouco de me convencer a aprender Python! É só mais um esforço! :twisted:
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Mensagempor jap em Sexta Jan 18, 2008 10:37 pm

Ivo_Timóteo Escreveu:Professor, já tem o código e está a pouco de me convencer a aprender Python! É só mais um esforço! :twisted:


Farei uma transcrição em Python, o mais funcional possível com montes de lambdas e 12 níveis de parêntesis...logo que tiver tempo. :wink: Sem estruturas de controlo e só com funções puras, eh, eh!
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor vbmaster em Sexta Jan 18, 2008 11:17 pm

Ivo_Timóteo Escreveu:Não é mais simples:

Código: Seleccionar Todos
(define procedimento
   (lambda args
       (corpo)))


Não sei se é mais simples, mas tudo isso de se usar lambda's em vez de as alternativas criadas só torna o código menos legivel. Porque o objectivo do lambda é criar-se um procedimento anónimo, em que o nome não interessa, e se o objectivo é esse porque é que se define um nome e se lho dá a algo que era suposto não ter?

Para mim um dos exemplos mais claro da falta de legibilidade é ao fazer procedimentos que devolvem procedimentos:

(define (comperação predicado)
(lambda (arg) (precidado arg))

é muito mais legível que:

(define comparação
(lambda (precidado) (lambda (arg) (predicado arg))))

(independentemente de ser estúpido ou não o exemplo de código dado) :P :P :P

Mas enfim, o pessoal aqui para o IST deve ser muito picuinhas...
Mas no fundo achei uma disciplina muito bem dada a de FP, já que com uma linguagem simples se abordou aquilo que realmente interessa: algoritmia, e não síntaxe, tendo-se pelo meio trabalhado com alguns estilos de programação, não só a programação funcional, como também a imperativa e até orientada a objectos.

Enfim, espero que isso para aí esteja a correr bem ;)
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor manuelmarque em Sexta Jan 18, 2008 11:21 pm

vbmaster Escreveu:(...)
Mas enfim, o pessoal aqui para o IST deve ser muito picuinhas...
Mas no fundo achei uma disciplina muito bem dada a de FP, já que com uma linguagem simples se abordou aquilo que realmente interessa: algoritmia, e não síntaxe, tendo-se pelo meio trabalhado com alguns estilos de programação, não só a programação funcional, como também a imperativa e até orientada a objectos.

Enfim, espero que isso para aí esteja a correr bem ;)


Mas, Miguel, Scheme? Com Python não tens que te preocupar praticamente com síntaxe (aquilo é praticamente Inglês e alguma Lógica...), e a minha cadeira de Int. à Programação centrou-se mesmo na algoritmia... havia por vezes um ou outro aspecto curioso do Python... mas era isso mesmo, curioso.

O Python foi apenas o vector para nos ensinar a pensar como um programador. (well, sort of :P) Desculpem a intromissão...
Avatar do utilizador
manuelmarque
strange-Quark!
strange-Quark!
 
Mensagens: 979
Registado: Quinta Nov 16, 2006 7:57 pm
Localização: Maia/Porto, Portugal

Mensagempor vbmaster em Sexta Jan 18, 2008 11:28 pm

manuelmarque Escreveu:
Mas, Miguel, Scheme? Com Python não tens que te preocupar praticamente com síntaxe (aquilo é praticamente Inglês e alguma Lógica...), e a minha cadeira de Int. à Programação centrou-se mesmo na algoritmia... havia por vezes um ou outro aspecto curioso do Python... mas era isso mesmo, curioso.

O Python foi apenas o vector para nos ensinar a pensar como um programador. (well, sort of :P) Desculpem a intromissão...


Pois, também não quero dizer que não se possa fazer o mesmo com outras linguagens. Mas o normal, tal como aconteceu com a outra linguagem que aprendemos neste semestre - Mathematica, mas noutra disciplina (Teoria da Computação), é estar-se ainda um pouco de tempo até perceber a lógica da síntaxe, e era isso que era díficil porque no fundo os problemas que nos eram dados eram do mais básico que havia (mostrar que era computável a função que pegava numa lista e retornava o número de elementos desta que fossem primos, por exemplo). Com Scheme para aí na aula 10, já se estava a mostrar como resolver a torre de hanoi com uma recursão em árvore, por exemplo, enquanto se começassemos por C provavelmente ainda estavámos a mostrar que o for tinha três instruções dentro dele, uma para bla bla bla.

Com scheme, a coisa, parece-me a mim, está muito mais simplificada, e penso que vou gostar de aprender LISP later on.
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor jap em Sexta Jan 18, 2008 11:30 pm

vbmaster Escreveu:

(...)

Com scheme, a coisa, parece-me a mim, está muito mais simplificada, e penso que vou gostar de aprender LISP later on.


As diferenças entre Scheme e LISP não são mínimas? Sempre pensei que fossem linguagens muito próximas. :wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor vbmaster em Sexta Jan 18, 2008 11:37 pm

jap Escreveu:
vbmaster Escreveu:

(...)

Com scheme, a coisa, parece-me a mim, está muito mais simplificada, e penso que vou gostar de aprender LISP later on.


As diferenças entre Scheme e LISP não são mínimas? Sempre pensei que fossem linguagens muito próximas. :wink:


Sim, são, por isso mesmo...
Avatar do utilizador
vbmaster
up-Quark!
up-Quark!
 
Mensagens: 464
Registado: Quarta Nov 15, 2006 11:49 pm
Localização: Peniche

Mensagempor jap em Sexta Jan 18, 2008 11:51 pm

E Caml Light, já alguém experimentou? :roll:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Mensagempor miranda_henrique em Terça Jan 22, 2008 12:11 am

Ora viva a todos!

Prof. será que me podia arranjar o código do programa Python que usou para fazer o output do Henrique que não sou eu? :D
É que fazer uma imagem em Scilab para além de demorar muito (já que não consigo instalar o SIP no meu computador novo) tenho que fazer acrescentar algumas coisas no output. E preciso de testar varios outputs para ver de onde vem o problema das figuras crescerem sempre para o mesmo lado.

Antes de mais Obrigado! :D

PS: Obrigado também pela boleia na ultima sessão, afinal sempre conseguimos apanhar o comboio, por uma unha negra, mas conseguimos. Hehehe. Foi um timing perfeito!
Visitem:
Blog da SAC: sac-aac.blogspot.com
Blog do Carro da Queima das Fitas 2011 de Física/Engenharia Física: feitosaobif.blogspot.com
Blog de humor avulso: maybetheperfectblog.blogspot.com
Avatar do utilizador
miranda_henrique
bottom-Quark!
bottom-Quark!
 
Mensagens: 34
Registado: Sábado Dez 22, 2007 2:51 am
Localização: Barcelos

AnteriorPróximo

Voltar para Problemas resolvidos

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 3 visitantes

cron