^(A)?(B)?C?(D|())(E|())(F)?(G)?
$.($.5*$.8*$(6*$7$2$2)$#6*$.3*$($.2*$(___$7)5*$7)$#4*$(6*$1_3*$8
Experimente online! Pode não ser o melhor caminho, mas é uma maneira interessante de programar no Retina. Explicação:
^(A)?(B)?C?(D|())(E|())(F)?(G)?
Tenta capturar os casos interessantes. As capturas positivas simplesmente capturam a letra, se estiver presente. O comprimento da captura é, portanto, 1 se estiver presente e 0 se estiver ausente. Os casos especiais são capturas 4 e 6, que existem apenas se D ou E estão ausentes, respectivamente. Eles só podem ser expressos em decimal como $#4
e $#6
mas é tudo o que precisamos aqui. As capturas são então construídas em uma sequência cujo comprimento é o número desejado. Por exemplo, se escrevermos 6*$1
, essa sequência terá comprimento 6 se A estiver presente e 0 se estiver ausente. Para escolher entre diferentes expressões, usamos $.
(para as capturas positivas) ou $#
(para as capturas negativas) que são avaliadas como 0 ou 1 e isso pode ser multiplicado pela cadeia até agora.
$.5*$.8*$(6*$7$2$2)
F
é repetido 6 vezes e B
duas vezes (por concatenação, pois é mais golfista). No entanto, o resultado é ignorado, a menos que ambos E
e G
estejam presentes. Isso lida com os casos de 2
, 6
e 8
.
$#6*$.3*$($.2*$(___$7)5*$7)
F
é repetido 5 vezes e, se B
estiver presente, é adicionado uma sexta vez mais um 3 extra (representado por uma sequência constante de comprimento 3). No entanto, o resultado é ignorado, a menos que D
esteja presente e E
ausente. Isso lida com os casos de 3
, 5
e 9
.
$#4*$(6*$1_3*$8
A
é repetido 6 vezes, e G
repetido 3 vezes, e um acréscimo 1
adicional (representado por um caractere constante entre os dois porque é mais golfista). No entanto, o resultado é ignorado, a menos que D
esteja ausente. Isso lida com os casos de 1
, 4
e 7
.
$.(
As strings acima são então concatenadas e o comprimento obtido. se nenhuma das opções acima se aplicar, nenhuma sequência será gerada e seu comprimento será, portanto 0
.
As seqüências resultantes (antes que o comprimento seja obtido) são as seguintes:
1 _
2 BB
3 ___
4 _GGG
5 FFFFF
6 FFFFFF
7 AAAAAA_
8 FFFFFFBB
9 ___FFFFFF