Skip to content

Instantly share code, notes, and snippets.

@antedeguemon
Last active November 21, 2017 13:07
Show Gist options
  • Save antedeguemon/e8bdc5f3cf72c82b1c73ca91a9ab14e9 to your computer and use it in GitHub Desktop.
Save antedeguemon/e8bdc5f3cf72c82b1c73ca91a9ab14e9 to your computer and use it in GitHub Desktop.
#lang racket
(require test-engine/racket-tests)
; Armazena uma tupla (caracter, contagem) que representa
; uma sequência.
;
; ch : elemento, normalmente string de tamanho 1
; count : inteiro
(struct chtuple (ch count))
; Dado uma lista de iteráveis e comparáveis, define qual
; o elemento que mais aparece consecutivamente na lista.
;
; Entrada:
; maior : chtuple com informações do maior elemento
; atual : chtuple do elemento da sequência atual
;
; Saída: chtuple com a maior sequência
(define (maior-sequencia lst maior atual)
(if (empty? lst)
(if (> (chtuple-count atual) (chtuple-count maior))
atual
maior)
(if (eq? (car lst) (chtuple-ch atual))
(maior-sequencia (cdr lst)
maior
(chtuple (chtuple-ch atual)
(+
(chtuple-count atual)
1)))
(maior-sequencia (cdr lst)
(if (> (chtuple-count atual)
(chtuple-count maior))
atual
maior)
(chtuple (car lst) 1)))))
; Wrapper para a função maior-sequencia que elimina a
; chamada com estruturas maior e atual vazias.
;
; Entrada:
; str : lista de elementos comparáveis e iteráveis
;
; Saída: retorno da função maior-sequencia
(define (sequencia str)
(maior-sequencia
(string->list (string-append str "\0"))
(chtuple 0 0)
(chtuple 0 0)))
; Alguns testes de funcionamento
(check-expect (chtuple-count (sequencia "Pressaaao")) 3)
(check-expect (chtuple-ch (sequencia "Pressaaao")) #\a)
(check-expect (chtuple-count (sequencia "Pressaaaao")) 4)
(check-expect (chtuple-ch (sequencia "Pressaaa")) #\a)
(check-expect (chtuple-ch (sequencia "oooooooo")) #\o)
(check-expect (chtuple-count (sequencia "oooooooo")) 8)
(test)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment