Prigrama em racket/scheme para troca de cartas

329 palavras 2 páginas
#lang racket
; Problema C: Troca de cartas
; Adriano Alberto Borges Ramos TIA: 4080254-1
; Descobrindo qual é o menor número entre a quantidade de trocas.
(define (minimo x y)
(cond ((< x y) x)
(else y)))

; Definindo sintaxe para usar while como loop
(define-syntax (while stx) (syntax-case stx () ((_ condition expression ...) #`(do () ((not condition)) expression ...))))

; Definindo quantidade de trocas de cada uma das jogadoras
(define trocasB 0)
(define trocasA 0)
; Contador
(define i 0)
; Maximo de cartas
(define n 100000)
; Vectors de cartas de n posições zerados; Serão usados para contar as cartas que podem ser trocadas
(define vetA(make-vector n))
(define vetB(make-vector n))

; Definindo função "trocar"
; a = quantidade máxima de cartas da jogadora A
; b = quantidade máxima de cartas da jogadora B
; cartasA = vector com as IDs das cartas da jogadora A
; cartasB = vector com as IDs das cartas da jogadora B
; Exemplo:
; (trocar 4 6 #(8 9 15 56) #(15 2 9 16 2 7))
(define (trocar a b cartasA cartasB) (begin (while(< i a) ; Número de ID da carta = (posição no vetA-1)++ para indicar quantas cartas de tal ID existem (vector-set! vetA (- (vector-ref cartasA i) 1) (+ (vector-ref vetA i) 1)) (set! i (+ i 1)) ) (set! i 0) (while(< i b) ; Número de ID da carta = (posição no vetB-1)++ para indicar quantas cartas de tal ID existem (vector-set! vetB (- (vector-ref cartasB i) 1) (+ (vector-ref vetB i) 1)) (set! i (+ i 1)) ) (set! i 0) (while(< i n) ; Se no vetA existir uma carta e no vetB não existir nenhuma, então é possível trocar (cond ((and (> (vector-ref vetA i) 0) (= (vector-ref vetB i) 0)) (set! trocasA (+ trocasA 1)))) ; Se no vetB existir uma carta e no vetA não existir nenhuma, então é possível trocar (cond ((and (> (vector-ref vetB

Relacionados