Antecedentes
En C, hay una función de ayuda de análisis sintáctico argumentos de línea de comandos: getopt
.
Getopt toma el recuento de argumentos ( argc
), la lista de argumentos ( argv
) y una cadena que representa las opciones que el programa debe tomar ( optstring
).
La cadena de opción ( optstring
) es una serie de caracteres de opción seguidos de dos puntos (para una opción que requiere un argumento), dos puntos (para una opción con un argumento opcional) o cero puntos (para una opción sin argumento).
Por ejemplo: uno podría usar la siguiente cadena de opciones para el nuevo widget de su compañía.
"v::x:hy:S:G::dns:f::"
¡Pero eso se ve horrible! ¡Las opciones se mezclan todas juntas! Esta cadena de opciones se vería mucho mejor si se ordenara:
"f::G::v::S:s:x:y:dhn"
Especificaciones
La entrada será una cadena que coincida con la expresión regular
([A-Za-z]:{0,2})+
Debe tomar la entrada como una cadena o lista de caracteres.
Debe generar la cadena ordenada por el método detallado a continuación.
No necesita manejar entradas vacías.
No necesita manejar la entrada con opciones repetidas del mismo tipo (
"aa"
no es válido, pero"aa:a::"
es válido).
Método de clasificación
En la cadena de opción ordenada:
Los caracteres seguidos por dos puntos son los primeros, ordenados alfabéticamente, con letras mayúsculas antes de sus respectivas letras minúsculas (es decir, "aBb", no "Bab").
Luego están los caracteres con dos puntos, ordenados alfabéticamente, con letras mayúsculas antes de sus respectivas letras minúsculas.
Los últimos son los caracteres sin dos puntos, ordenados alfabéticamente, con letras mayúsculas antes de sus respectivas letras minúsculas.
Reglas
- Las lagunas estándar están prohibidas.
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en bytes en cada idioma.
Ejemplos
# "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 prueba largo (312 caracteres)
Entradas no válidas (no tiene que manejar):
"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::
rompió la mía je ... Irónico.Respuestas:
Casco , 11 bytes
Pruébalo en línea!
Explicación
fuente
Retina , 47 bytes
Pruébalo en línea!
La parte más complicada fue en realidad ordenar las letras, porque la función "ordenar por" de Retina no tiene una clasificación que no distinga entre mayúsculas y minúsculas (por lo que ordena las letras mayúsculas por delante de todas las letras minúsculas). Para evitar esto, tuve que insertar una copia en minúscula de cada personaje para ordenar y luego deshacerme de él nuevamente.
fuente
tEsTiNg
con el método de clasificación anterior, ordena los pares de letras eneEggiinNsstTtt → EgiNsTt
lugar deeEggiinNsstttT → EgiNstT
(las letras mayúsculas siempre se colocan antes de las letras minúsculas).Python 2 ,
10090 bytesPruébalo en línea!
fuente
Jalea , 14 bytes
Pruébalo en línea!
Programa completo
fuente
Japt ,
1716 bytes¡Pruébelo en línea!
Cómo funciona
Digamos que la cadena de entrada es
v:vg::G:G::o:
. La primera parte del código,f".:*"
encuentra todas las coincidencias de la expresión regular/.:*/g
, que coincide con un carácter seguido de cualquier número de dos puntos. Esto divide la entrada en[v:, v, g::, G:, G::, o:].
El
ñ
método en una matriz ordena cada matriz como si se aplicaran ciertos cambios, sin aplicarlos realmente (comosorted(array, key=<whatever>)
en Python). Entonces necesitamos ordenar:Z{ZiZéJ v}
es la forma más corta que pude encontrar para hacer esto:Esto es más fácil de entender con algunos ejemplos:
Los valores originales se ordenan lexicográficamente por estas claves. El resultado es que
::gG::
se ordena al frente, luego::gg::
, y así sucesivamente, dándonos[G::, g::, G:, o:, v:, v]
, que luego se uneq
y se genera.fuente
JavaScript (ES6), 93 bytes
fuente
Perl 5 , 69 + 1 (
-n
) = 70 bytesPruébalo en línea!
fuente
=~/A-Z/
a==/A-Z/
debería solucionar el problema.Haskell , 124 bytes
Pruébalo en línea!
fuente
Golpetazo,
232213 bytespruébalo en línea
fuente
C # (.NET Core) , 152 bytes
Pruébalo en línea!
Sin golf:
La idea básica es iterar sobre las 156 opciones posibles y verificar su existencia. Si se encuentra, agregue a la salida y elimine de la entrada.
fuente