fundo
Em C, há uma função de argumentos de linha de comando ajuda de análise: getopt
.
Getopt pega o argumento count ( argc
), a lista de argumentos ( argv
) e uma string que representa as opções que o programa deve usar ( optstring
).
A opção string ( optstring
) é uma série de caracteres de opção, cada um seguido por dois pontos (para uma opção que exige um argumento), dois pontos (para uma opção com argumento opcional) ou zero dois pontos (para uma opção sem argumento).
Por exemplo: pode-se usar a seguinte opção para o novo widget da empresa.
"v::x:hy:S:G::dns:f::"
Mas isso parece horrível! As opções são todas misturadas! Essa sequência de opções ficaria muito melhor se fosse classificada:
"f::G::v::S:s:x:y:dhn"
Especificações
A entrada será uma string que corresponde à expressão regular
([A-Za-z]:{0,2})+
Você deve receber a entrada como uma sequência ou lista de caracteres.
Você deve gerar a sequência classificada pelo método detalhado abaixo.
Você não precisa manipular entrada vazia.
Você não precisa manipular entrada com opções repetidas do mesmo tipo (
"aa"
não é válido, mas"aa:a::"
é válido).
Método de classificação
Na sequência de opções classificada:
Os caracteres seguidos por dois pontos-vírgulas são os primeiros, classificados em ordem alfabética, com letras maiúsculas antes de suas respectivas letras minúsculas (ou seja, "aBb", não "Bab").
Em seguida, são os caracteres com um dois pontos, classificados em ordem alfabética, com letras maiúsculas antes de suas respectivas letras minúsculas.
Por último, os caracteres sem dois pontos, classificados em ordem alfabética, com letras maiúsculas antes de suas respectivas letras minúsculas.
Regras
- As brechas padrão são proibidas.
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes em cada idioma vence.
Exemplos
# "input" => "output"
"v::x:hy:S:G::dns:f::" => "f::G::v::S:s:x:y:dhn"
"aa:a::" => "a::a:a"
"B:" => "B:"
"Confusio:n::" => "n::o:Cfinosu"
"Confusio:n:" => "n:o:Cfinosu"
"m:qW:X:xc:vViI" => "c:m:W:X:IiqVvx"
"V:omo:V" => "o:V:moV"
"agg:ra:va::ting::" => "a::g::a:g:aginrtv"
"input" => "inptu"
Caso de teste longo (312 caracteres)
Entradas do Invaid (você não precisa lidar com):
"gg" (duplicated option)
"" (empty string)
":w:" (first colon isn't after a character)
"x:y:0:fhn" ('0' is not alphabetic)
"A:::" (3 colons is invalid)
agg:ra:va::ting::
quebrou o meu heh ... Irônico.Respostas:
Casca , 11 bytes
Experimente online!
Explicação
fonte
Retina , 47 bytes
Experimente online!
A parte mais complicada foi classificar as letras, porque o recurso "classificar por" de Retina não possui uma classificação que não diferencia maiúsculas de minúsculas (por padrão, ele classifica as letras maiúsculas na frente de todas as letras minúsculas). Para contornar isso, tive que inserir uma cópia em minúscula de cada caractere para fazer a classificação e depois me livrar dela novamente.
fonte
tEsTiNg
com o seu método de classificação acima, os pares de letras são classificados emeEggiinNsstTtt → EgiNsTt
vez deeEggiinNsstttT → EgiNstT
(as letras maiúsculas são sempre colocadas antes das letras minúsculas).Python 2 ,
10090 bytesExperimente online!
fonte
Gelatina , 14 bytes
Experimente online!
Programa completo.
fonte
Japonês ,
1716 bytesTeste online!
Como funciona
Digamos que a sequência de entrada seja
v:vg::G:G::o:
. A primeira parte do código,f".:*"
localiza todas as correspondências do regex/.:*/g
, que corresponde a um caractere seguido por qualquer número de dois pontos. Isso divide a entrada em[v:, v, g::, G:, G::, o:].
O
ñ
método em uma matriz classifica cada matriz como se determinadas alterações fossem aplicadas, sem realmente aplicá-las (comosorted(array, key=<whatever>)
no Python). Então, precisamos classificar:Z{ZiZéJ v}
é a maneira mais curta que eu poderia encontrar para fazer isso:Isso é mais fácil de entender com alguns exemplos:
Os valores originais são então classificados lexicograficamente por essas chaves. O resultado é que
::gG::
é ordenado para a frente,::gg::
e assim por diante, fornecendo-nos o[G::, g::, G:, o:, v:, v]
que é então unidoq
e produzido.fonte
JavaScript (ES6), 93 bytes
fonte
Perl 5 , 69 + 1 (
-n
) = 70 bytesExperimente online!
fonte
=~/A-Z/
para==/A-Z/
deve resolver o problema.Haskell , 124 bytes
Experimente online!
fonte
Bash,
232213 bytesexperimente online
fonte
C # (.NET Core) , 152 bytes
Experimente online!
Ungolfed:
A idéia básica é iterar todas as 156 opções possíveis e verificar sua existência. Se encontrado, anexe à saída e remova-o da entrada.
fonte