Retina , 61 55 bytes
^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$
Como esse é apenas um único regex, o Retina será executado no modo de Correspondência e relatará o número de correspondências encontradas, que serão 1para seqüências válidas e 0outras. Isso não é competitivo em comparação com os idiomas do golfe, mas estou muito feliz com isso, pois comecei com um monstro de 260 bytes.
Explicação
^((.)(?<!\2.+))*
Este bit consome um prefixo de letras únicas de comprimento variável, ou seja, corresponde ao pedaço inicial potencialmente incompleto. O lookbehind garante que qualquer caractere correspondente a esse bit não tenha aparecido antes na string.
Agora, para o restante da entrada, queremos combinar partes de 7 sem repetir caracteres. Poderíamos igualar um pedaço assim:
(.)(?!.{0,5}\1)(.)(?!.{0,4}\2)(.)(?!.{0,3}\3)...(.)(?!.?\5).
Ou seja, combinamos um caractere que não aparece para outros 6 caracteres, depois um que não aparece para outros 5 caracteres e assim por diante. Mas isso requer uma repetição de código bastante horrível, e teríamos que combinar um pedaço (potencialmente incompleto) à parte separadamente.
Grupos de equilíbrio para o resgate! Uma maneira diferente de combinar
(.)(?!.{0,5}\1)
é colocar 5 correspondências vazias em uma pilha de captura e tentar esvaziá-la:
(){5}(.)(?!(?<-1>.)*\2)
Ele *permite um mínimo de zero repetições, assim como {0,5}, e como fizemos cinco capturas, também não será possível exibir mais de 5 vezes. Isso é mais longo para uma única instância desse padrão, mas é muito mais reutilizável. Como estamos fazendo o popping em um lookahead negativo , isso não afeta a pilha real depois que o lookahead é concluído. Então, depois do lookahead, ainda temos 5 elementos na pilha, não importa o que aconteceu lá dentro. Além disso, podemos simplesmente exibir um elemento da pilha antes de cada lookahead e executar o código em um loop, para diminuir automaticamente a largura do lookahead de 5 para 0. Portanto, esse pedaço muito longo pode ser reduzido para
(){7}((?<-1>)(.)(?!(?<-1>.)*\1\3))*
(Você pode notar duas diferenças: estamos pressionando 7 em vez de 5. Uma captura adicional é porque pop antes de cada iteração, não depois dela. A outra é realmente necessária para que possamos sair da pilha 7 vezes (já que queremos o loop é executado 7 vezes), podemos corrigir o erro de um por um dentro da cabeça de impressão, garantindo \1que ainda exista pelo menos um elemento na pilha.)
A vantagem disso é que ele também pode corresponder ao pedaço incompleto à direita, porque nunca precisamos repetir 7 vezes (isso é apenas o máximo necessário, porque não podemos sair da pilha com mais frequência do que isso). Então, tudo o que precisamos fazer é agrupar isso em outro loop e garantir que chegamos ao final da string para obter
^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$