Lo contrataron para escribir un código para una aplicación de toma de dictado, que toma la entrada de voz de una fuente hablada, la analiza como palabras y la escribe en una pantalla.
La administración realmente no confía en ti con tanta potencia en el proyecto, desafortunadamente, te sientas y juegas al código de golf todo el día en lugar de hacer tu trabajo, por lo que simplemente te dan una tarea realmente simple: realizar un Oración con puntuación intercalada en una oración formateada correctamente, donde 'formateado correctamente' se define a continuación.
La oración es la cadena de entrada. Una palabra es un grupo de caracteres no espaciales distinguidos. Una puntuación es una palabra cuyo primer carácter es
^
.Una palabra está en mayúscula si la primera letra de la palabra no es una letra minúscula (las palabras en mayúscula coinciden con la expresión regular
/[^a-z].*/
).La primera palabra de la oración debe estar en mayúscula.
A
^COMMA
es el carácter de coma,
y tiene un espacio que sigue pero no precede.aaa ^COMMA bbb
se convierteaaa, bbb
.A
^COLON
es una coma que se parece:
.A
^SEMICOLON
es una coma que se parece;
.A
^PERIOD
es una coma que se parece.
. La palabra que sigue a^PERIOD
debe estar en mayúscula.A
^BANG
es un período que se parece!
.A
^DASH
es el carácter de guión-
y tiene un espacio que precede y sigue.A
^HYPHEN
también es el carácter de guión,-
pero no tiene espacio siguiente o anterior.Un
^EMDASH
es un guión (¡no un guión!) Que se deletrea--
.Un
^OPENQUOTE
es un carácter de comillas"
que tiene un espacio que precede pero no sigue. La palabra que sigue a^OPENQUOTE
debe estar en mayúscula. Si un^OPENQUOTE
está precedido por una palabra que no es puntuación, agregue un^COMMA
entre esa palabra y el^OPENQUOTE
. Si un^OPENQUOTE
está precedido por una puntuación que hace que la siguiente palabra esté en mayúscula, se salta^OPENQUOTE
a la siguiente palabra.A
^CLOSEQUOTE
es el dígrafo,"
que tiene un espacio que sigue pero no precede. Si una^CLOSEQUOTE
está precedida por una^COMMA
,^PERIOD
o^BANG
que desaparece y la Puntuacion^CLOSEQUOTE
se escribe,"
,."
o!"
respectivamente. Si la puntuación que desaparece especifica una mayúscula, esa capitalización aún debe ocurrir en la siguiente palabra disponible.Los espacios iniciales o finales en el resultado final completo deben eliminarse, y cualquier cadena de dos o más espacios en una fila debe contraerse en un solo carácter de espacio.
Cualquier caso no cubierto anteriormente (por ejemplo,
^COMMA ^COMMA
or^SEMICOLON ^CLOSEQUOTE
o^UNDEFINEDPUNCTUATION
) no ocurrirá en una entrada bien formada y, por lo tanto, es un comportamiento indefinido.
El equipo de desarrollo le informa lo siguiente:
El proyecto se está escribiendo en el idioma [su idioma aquí] , y debe ser lo más breve posible para que ocupe el menor espacio posible cuando se trata de una aplicación para Android / iPhone. Intentas explicar que no es así como funciona el desarrollo de aplicaciones, pero no escuchan. Pero oye, ¡qué coincidencia! ¡Eres un golfista increíble en [tu idioma aquí] !
La aplicación no tendrá ningún permiso de acceso web y no habrá ninguna biblioteca instalada que realice este formateo por usted. Sin embargo, probablemente pueda convencer al líder del equipo para que le permita una biblioteca de expresiones regulares si existe una para su idioma, si cree que necesita una.
El soporte para citas anidadas que usan comillas dobles / simples correctamente está planeado para una versión posterior de la aplicación, pero no para la versión en la que está trabajando ahora, así que no se preocupe.
La administración es un gran admirador del desarrollo basado en pruebas, por lo que el equipo de desarrollo ya ha hecho que un mono de teclado desafortunado escriba algunas pruebas para su parte del programa: (se agregaron nuevas líneas para facilitar la lectura, trátelas como espacios)
Entrada:
hello ^COMMA world ^BANG
Salida:
Hello, world!
Entrada:
once upon a time ^COMMA there was a horse ^PERIOD that horse cost me $50 ^PERIOD ^OPENQUOTE eat your stupid oats ^COMMA already ^BANG ^CLOSEQUOTE I told the horse ^PERIOD the horse neighed back ^OPENQUOTE no ^CLOSEQUOTE and died ^PERIOD THE END
Salida:
Once upon a time, there was a horse. That horse cost me $50. "Eat your stupid oats, already!" I told the horse. The horse neighed back, "No," and died. THE END
Entrada:
begin a ^PERIOD b ^COMMA c ^COLON d ^SEMICOLON e ^BANG f ^HYPHEN g ^DASH h ^EMDASH i ^OPENQUOTE j ^PERIOD ^OPENQUOTE k ^SEMICOLON ^OPENQUOTE l ^CLOSEQUOTE m ^BANG ^CLOSEQUOTE n ^PERIOD 0x6C6F6C end
Salida:
Begin a. B, c: d; e! F-g - h--i, "j. "K; "l," m!" N. 0x6C6F6C end
Este es un código de golf: gana el puntaje más bajo. Puede escribir una función de un argumento de cadena o un programa que lea desde STDIN y escriba en STDOUT.
fuente
prompt()
?Respuestas:
JavaScript:
653 611 547 514487 bytesOh Dios mío. Brendan Eich Lo siento mucho por esto.
PD: He agregado un espacio en blanco para facilitar la lectura, pero al eliminar todos los espacios en blanco permitidos se obtiene el recuento de bytes enumerado.
Teóricamente, podría acortar algunas partes como el
-e-
a algo como-e
o-e
, pero eso podría causar un problema si la palabra anterior termina con, o la siguiente palabra comienza con la letra 'e' (o cualquier palabra que decida usar). Supongo que podría usar un carácter ASCII. Lo investigaré.487 FF22 + solamente
514 FF22 + solamente
547 FF22 + solamente
611 FF 22+ solamente
653 cross-browser
Cómo funciona:
JSFiddle (para la solución de navegador cruzado de 653 bytes)
JSFiddle (para la única solución 595 FF 22+ )
JSFiddle (para la única solución 547 FF 22+ )
JSFiddle (para la única solución 514 FF 22+ )
JSFiddle (para la única solución 487 FF 22+ )
Esta es la primera vez que tengo que escribir JS que usa más de una expresión regular, y generalmente mi expresión regular está predefinida.
Continuaré recortando bytes tanto como pueda.
fuente
c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))
... y así sucesivamente. Arrow sintax es corto, pero incluso la 'función' debería guardar los mismos caracteres=>
s para que funcione, ¡pero usar las flechas me ahorró 40 bytes!PHP, 412 bytes
(Ungolfed aquí para mayor claridad; ver ideone para la versión de golf ).
La función preg_replace () de PHP aceptará argumentos de matriz, lo cual es bastante útil aquí. Creo que el siguiente código hace todo lo necesario. Pasa todos los casos de prueba al menos.
fuente