Dada uma sequência de entrada contendo apenas caracteres ASCII alfanuméricos e iniciando com uma letra, troque cada letra executada pela digitação seguinte.
Uma corrida é uma sequência de letras ou dígitos consecutivos. Observe que, no caso em que a sequência de entrada termina com uma sequência de letras, essa execução é deixada intocada.
Exemplo passo a passo
Por exemplo, dada a sequência de entrada uV5Pt3I0
:
- Execuções separadas de letras e de dígitos:
uV 5 Pt 3 I 0
- Identifique pares de execuções:
(uV 5) (Pt 3) (I 0)
- Troque pares de execuções:
(5 uV) (3 Pt) (0 I)
- Concatenar:
5uV3Pt0I
Exemplos
uV5Pt3I0 -> 5uV3Pt0I
J0i0m8 -> 0J0i8m
abc256 -> 256abc
Hennebont56Fr -> 56HennebontFr
Em5sA55Ve777Rien -> 5Em55sA777VeRien
nOoP -> nOoP
Isso é código-golfe, então a resposta mais curta em bytes vence. As explicações são incentivadas.
(a,(b,y))<-span(<':')<$>span(>'9')s
.(a,(b,y):_)<-lex<$>span(>'9')s
: Experimente on-line!lex
funciona, então vou me abster de incluir isso por enquanto. De qualquer forma, é bom saber que há algo parecido no PreludeJavaScript (ES6), 34 bytes
Tente
fonte
Pitão , 15 bytes
Explicação
Conjunto de teste .
fonte
Python 2 , 49 bytes
Todas as soluções não regex que tentei foram mais longas. : P
Experimente online!
fonte
Japt (v2.0a0), 16 bytes
Teste online!
Nota: este é um alfa instável; portanto, se esse link for quebrado, você poderá usar uma versão um pouco mais longa na v1.4.4: Teste on-line!
Explicação
fonte
ò
.CJam ,
323028 bytesCJam não tem regex e não "divide em dígitos e letras" ou outros enfeites, então isso foi meio doloroso.
Experimente online!
Explicação
fonte
Gema , 11 caracteres
Exemplo de execução:
fonte
Java 8, 38 bytes
Não há muito a explicar. Usa o mesmo método da resposta Retina da @Okx , que não pode ser mais curta em Java.
Experimente aqui.
fonte
Japonês, 18 bytes
Teste-o
fonte
Sed, 29 bytes
Execute com -r.
Usa grupos de captura e os substitui na ordem oposta.
fonte
[A-Za-z]
para[^0-9]
. No entanto, você deve contar a sinalização como parte do seu código.sed <command>
esed -r <command>
, portanto, três bytes.sed -f filename
esed -rf filename
(ou entresed -e 'command'
esed -re 'command'
): um único byte.s/([a-z]+)([0-9]+)|([0-9]+)([a-z]+)/\2\1\4\3/gi
em 48 bytes. Caso contrário, da mesma forma.Gelatina , 12 bytes
Experimente online!
Explicação:
fonte
PHP, sem regex, 73 bytes
Execute como tubo
-nR
ou teste-o online .demolir
fonte
~
vez dea&
PHP , 45 bytes
Experimente online!
fonte
C #, 71 bytes
É uma pena que expressões regulares sejam tão longas em C #.
Experimente online!
Versão completa / formatada:
fonte
Clojure,
10488 bytesOh regex é realmente útil ... enfim ( TIO ):
partition-by
se divide em execuções consecutivas com base no valor de retorno dessa função, separtition-all
divide em partições de 2 (os pares que trocaremos),map reverse
reverte-os,flatten
se da estrutura de lista aninhada e, finalmente, produzimos uma string. Separtition
fosse usado em vez departition-all
e tivéssemos um número ímpar de pedaços, o último seria descartado.Original usado detalhado, mas divertido
(juxt second first)
e, em(set"0123456789")
vez dereverse
e intervalos inteiros ASCII.fonte
QuadR , 15 bytes
Experimente online!
Explicação roubada descaradamente de Okx :
Isso substitui o regex
(\D+)(\d+)
por\2\1
. Vamos detalhar se você não sabe o que isso significa.O
\D
meio 'corresponde a qualquer coisa que não seja um número'.\d
significa 'combinar tudo o que é um número'. O+
sinal significa 'igualar isso pelo menos uma vez, mas tente igualá-lo quantas vezes possível'. Os colchetes definem um grupo. O primeiro grupo é(\D+)
e o segundo é(\d+)
Na segunda linha, dizemos que queremos colocar o que foi correspondido pelo segundo grupo, seguido pelo que foi correspondido pelo primeiro grupo. Isso efetivamente troca as letras e dígitos.
fonte
PowerShell , 40 bytes
Experimente online!
O PowerShell é ideal para isso, pois suporta a pesquisa e substituição de expressões regulares fora da caixa. Os adereços vão para @Okx para a solução regex.
fonte
Pip , 17 bytes
Recebe entrada como um argumento de linha de comando. Experimente online!
Explicação
Isso usa a estratégia de substituição de regex padrão, um tanto quanto jogada.
O regex é
-C+XL.C+XD
, que avalia como`(?i)([a-z]+)(\d+)`
:A substituição é
{c.b}
uma função de retorno de chamada que concatena o segundo grupo (c
) e o primeiro grupo (b
). (O primeiro argumento para a funçãoa
,, contém toda a correspondência.)Isso é três bytes mais curto que o ingênuo
aR`(\D+)(\d+)``\2\1`
.fonte
brainfuck , 98 bytes
Experimente online!
Explicação
Este programa mantém uma fila de letras que ainda não foram exibidas e as produz quando apropriado.
A chave para este programa é
>>----[---->+<<<-[>]>]
. As três células à direita da célula de entrada começam em zero. Se a entrada for um ponto de código entre 1 e 63 inclusive, isso move o ponteiro um espaço para a direita e coloca a entrada dois espaços à direita dessa nova posição. Caso contrário, o ponteiro move dois espaços para a direita, a célula, um espaço à direita da nova posição, torna-se 63 e o mesmo 63 é subtraído da célula de entrada. Isso divide a entrada em letras (65-122) e dígitos (48-57).fonte
Ruby , 31 bytes
Experimente online!
fonte
Mathematica, 129 bytes
fonte