Invierta el método de formato.
El Format
método de la clase String (o equivalente, comosprintf
) está disponible en la mayoría de los idiomas. Básicamente toma una cadena de "Formato" que puede contener marcadores de posición con algún formato adicional y cero o más valores para insertar en lugar de esos marcadores de posición.
Su tarea es implementar la función inversa en el idioma que elija.
API
El nombre del método debe ser format1
o deformat
.
Entrada : el primer parámetro será la cadena de "Formato", al igual que en el método de formato original. El segundo parámetro será la cadena analizada (ver ejemplos a continuación). No se necesitan ni se permiten otros parámetros.
Salida : una matriz (o el equivalente de su idioma de elección) de valores que se extrajeron correspondientemente con los marcadores de posición en el formato.
Los marcadores de posición son {0}
, {1}
, {2}
, etc.
En caso de mal formato, puede arrojar un error o devolver lo que quiera.
En caso de una entrada no válida, puede lanzar un error o devolver lo que desee. Entrada no válida es tal que no puede ser generada por el uso de String.Format misma cadena de formato, por ejemplo: '{0}{0}', 'AAB'
.
Ejemplos
deformat('{0} {1}', 'hello world') => ['hello', 'world']
deformat('http{0}://', 'https://') => ['s']
deformat('http{0}://', 'http://') => [''] // array of one item which is an empty string
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
Ambigüedad
En caso de ambigüedad, puede devolver cualquier respuesta adecuada. Por ejemplo:
deformat('{0} {1}', 'Edsger W. Dijkstra')
// both ['Edsger', 'W. Dijkstra'] and ['Edsger W.', 'Dijkstra'] are applicable.
Algunas reglas más
- Para hacerlo más fácil, no es necesario admitir el formateo. Puede olvidarse de los ceros a la izquierda, el punto decimal o los problemas de redondeo. Simplemente genere los valores como cadenas.
- Para que no sea trivial, no se permiten expresiones regulares .
- No necesita ocuparse de las llaves en la entrada (es decir, el segundo parámetro de entrada no contendrá ninguna
{
s o}
s).
Victorioso
Este es el código de golf ! (debe leerse como "¡Esto es Esparta!") gana la función correcta que tenga la menor longitud. Las lagunas estándar están prohibidas.
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
, ¿qué pasaría si nos dieran en cambiodeformat('{0}{1}{0}', 'AAAA')
?['', 'AAAA']
,['A', 'AA']
,['AA', '']
deformat('{0}{1}{0}', 'ABBA') => ['', 'ABBA']
? Si es así, hay una solución barata a menos que cada cadena aparezca al menos dos veces.deformat('{0}_{1}_{0}', 'A_BB_A')
?Respuestas:
Haskell, 220 caracteres
Se rompe si usa múltiples representaciones para el mismo patrón (
{1}
vs{01}
): no impone su igualdad, descartando coincidencias para todas menos una representación.Se pueden guardar 19 caracteres omitiendo
mapKeys((0+).read)$
si no importa el orden adecuado de las coincidencias por encima de 10 patrones, o si se puede requerir un relleno de la misma longitud, o si el orden de las cadenas de patrones es aceptable. En cualquier caso, si se omite un patrón del primer argumento, también se omite del resultado.Eliminar
!!0
del final hace que seformat1
devuelva la lista de todas las soluciones, en lugar de solo la primera.antes de jugar al golf:
fuente
read
te deja con un tipo ambiguo. Haskell no sabe de qué tipo ordenable leer las claves.+0
fuerza un número, del cual Haskell ya puede hacer una elección arbitraria y elige números enteros.Ruby, 312 caracteres
Se podrían guardar 5 caracteres prefiriendo coincidencias de longitud cero, haciendo la
ABBA
solución['', 'ABBA']
, en lugar de la solución preferida de la pregunta. Elegí interpretar los ejemplos como una parte implícita de la especificación.fuente
Python, 208 caracteres, aunque incompleto.
La función barre ambas cadenas simultáneamente, hasta que encuentra una llave de apertura en la cadena de entrada, lo que significa un marcador de posición.
Luego, asume que el marcador de posición ya se ha expandido e intenta avanzar el índice de la cadena de salida más allá al mirar en la lista de valores encontrados hasta ahora.
Si no se ha expandido, agrega una nueva entrada a la lista de valores y comienza a agregar caracteres de la cadena de salida hasta que alcanza el carácter después del marcador de posición en la cadena de entrada.
Cuando llega al final de la cadena de entrada, devuelve los valores encontrados hasta ahora.
Funciona bien para entradas simples, pero tiene varios problemas:
Requiere un delimitador conocido después de cada marcador de posición en la entrada, por lo que no funciona con marcadores de posición uno al lado del otro, es decir, "{0} {1}". Es por eso que necesitaba agregar un carácter espacial a ambas cadenas.
Se supone que las primeras instancias de cada marcador de posición están en orden, por ejemplo, "{ 0 } { 1 } {1} {0} { 2 }".
Solo funciona para los primeros 10 marcadores de posición, ya que supone que tienen 3 caracteres de longitud.
No maneja casos ambiguos en absoluto :(
fuente
Código C ++ 11, 386 caracteres.
La función format1 tiene 2 cadenas como entrada (const char *) y devuelve un hashmap con claves enteras (el patrón) y el valor es la cadena identificada. Si no se encuentra nada o algún error, se devuelve un hashmap vacío.
Uso:
Salida:
Ejemplo 2
Salida:
Los patrones están en representación decimal, las entradas más grandes que
MAXINT
se desbordarán pero aún funciona.Aunque hay soluciones más pequeñas en otros lenguajes de programación, este es el C ++ más pequeño, ¡todavía! :)
Este es el código antes de jugar al golf:
fuente