De acuerdo con este sitio, una regla general recomendada por el Manual de Estilo de la Oficina de Imprenta del Gobierno de EE. UU. Es
Ponga en mayúscula todas las palabras en títulos de publicaciones y documentos, excepto a, an, the, at, by, for, in, of, on, up, and, as, but, or, and nor.
Esto podría no ser cierto ya que no puedo encontrar una recomendación de este tipo en el Manual de estilo , pero usemos esta regla de todos modos.
El reto
Dada una cadena de entrada que consiste en palabras minúsculas delimitadas por espacios, genera la mayúscula de la cadena de acuerdo con las siguientes reglas
- La primera y última palabra está en mayúscula.
- Todas las demás palabras se capitalizan, excepto una , una , el , en , por , para , de , de , de , a , a , y , tal como , pero , o , y tampoco .
La cadena de entrada contendrá al menos una palabra y cada palabra contiene al menos una letra y solo caracteres de aa z.
Este es un desafío de código de golf, así que trate de usar la menor cantidad de bytes posible en el idioma que elija. Puede escribir un programa completo o una función para realizar la tarea.
Casos de prueba
"the rule of thumb for title capitalization" -> "The Rule of Thumb for Title Capitalization"
"programming puzzles and code golf" -> "Programming Puzzles and Code Golf"
"the many uses of the letter a" -> "The Many Uses of the Letter A"
"title" -> "Title"
"and and and" -> "And and And"
"a an and as at but by for in nor of on or the to up" -> "A an and as at but by for in nor of on or the to Up"
"on computable numbers with an application to the entscheidungsproblem" -> "On Computable Numbers With an Application to the Entscheidungsproblem"

Respuestas:
Python 2, 118 bytes
Mira ma, no regex!
La entrada debe estar entre comillas. La salida tiene un espacio final y no hay nueva línea final (supongo que está bien). Verifique todos los casos de prueba en Ideone .
Explicación
Tomemos la entrada
a or ancomo nuestro ejemplo.Usando el
`x`acceso directo de Python 2 pararepr, ajustamos la entrada entre comillas simples:'a or an'. Luego nos dividimos en espacios en blanco e iteramos sobre las palabras.Dentro del bucle, tomamos el de
reprnuevo . Para la primera y última palabra, esto da"'a"y"an'". Para otras palabras, da'or'. Queremos evitar poner en mayúsculas las palabras si se ajustan al último patrón y están en la lista de palabras cortas. Por lo tanto, podemos representar la lista de palabras como la cadena"'a'an'...'up'"y saber quereprcualquier palabra corta será una subcadena.`w` in "..."da un valor booleano, que podemos tratar como0o1para fines de indexación en la lista[w.title(), w]. En resumen, titulamos la palabra en mayúscula si está al principio, al final o no en la lista de palabras cortas. De lo contrario, lo dejamos solo. Afortunadamente,title()todavía funciona como se esperaba con aportes como'a.Finalmente, eliminamos las comillas simples de la palabra y las imprimimos con un espacio final.
fuente
05AB1E ,
6861 bytesGuardado 7 bytes gracias a Adnan
Pruébalo en línea!
Explicación
“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“es una cadena de diccionario traducida comoa an the at by for in of on to up and as but or nor.fuente
alugar de€…guardar un byte adicional también si lideraba con eso :) Gracias!GNU sed
81 7473 BytesIncluye +1 para -r
La primera línea escribe en mayúscula la primera letra de cada palabra. El segundo cambia todas las palabras requeridas a minúsculas.
Pruébalo en línea!
fuente
Retina,
6966 bytesEscriba con mayúscula la primera letra de cada palabra, luego cambie las palabras seleccionadas a minúsculas si no son la primera o la última palabra. Hay un espacio al final de la última línea.
Pruébalo en línea
Esto también funciona con un
.lugar en lugar del primer espacio.Hay muchas expresiones regulares con la misma longitud, pero ya no puedo encontrar una forma de recortarlas ...
fuente
+truco para acortarlo).JavaScript (ES6),
141138135133 bytesGuardado 3 bytes gracias a mbomb007
Casos de prueba
Mostrar fragmento de código
fuente
Jalea , 58 bytes
TryItOnline! o ejecutar todas las pruebas
¿Cómo?
Una cadena comprimida con espacios que separan las palabras serían
47bytes, dividiéndolo en1bytes de costo , por48bytes.Dos cadenas comprimidas no separadas de las palabras de longitud
2y3(con una 'a' al final de una) serían40bytes más2para dividir cada una y1unirlas, por45bytes.Un número de base 250 como se describe a continuación es
32bytes, luego3para convertir a base 26,3para indexar en el alfabeto en minúsculas y3dividirlo en el carácter no utilizado'z', para41bytes.Entonces, la búsqueda de las palabras para no capitalizar:
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’se formó así:
Toma esas palabras y únelas con un separador:
s="a an the at by for in of on to up and as but or nor"Siguiente etiqueta
'a'como1,'b'como2con el separador como0:Convierta esto en un
26número base (la última letra utilizada es'y'más un dígito para el separador, el código de Python para esto es:n=sum(v*26**i for i,v in enumerate(x[::-1]))Convierta eso en un
250número base (usando una lista para los dígitos):Busque los caracteres en esos índices en la página de códigos de jelly:
(nota: dado que la implementación real es biyectiva, si
btuviera alguna0dígito, primero tendría que llevarlo hacia abajo)El resto:
fuente
PHP, 158 bytes
10 bytes guardados por @Titus
Versión anterior PHP, 174 Bytes
fuente
foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);TI-Basic, 295 + 59 + 148 = 502 bytes
Ahora puede capitalizar su calculadora. Genial para la escuela :)
Programa principal, 295 bytes
Básicamente, el truco para hacer coincidir palabras para
Aque no se conviertanaes encerrar espacios, como reemplazar" A "con" a ". Esto también hace que las primeras y últimas palabras permanezcan en mayúscula, ya que no tienen espacio en ambos lados y, por lo tanto, no coincidirán con ninguna de las palabras. (Genio, ¿verdad? Y súper largo porque las letras minúsculas son de dos bytes cada una ...)Subprograma (
prgmQ), 59 bytes:Subprograma (
prgmR), 148 bytes:PS
~representa token0x81y@representa token0x7F, obtenga más información aquí .fuente
Java 7,
271259258 bytesUngolfed y código de prueba:
Pruébalo aquí.
Salida:
fuente
Groovy,
131129Dos bytes guardados gracias a la computación caruso
fuente
i->y úseloitpara guardar 2 bytes.{it.split()*.with{a->a in "a an the at by for in of on to up and as but or nor".split()?a:a.capitalize()}.join(" ").capitalize()}.capitalize()ocupan muchos bytes. ¿Hay alguna forma de hacer un alias.capitalize()?C #, 305 bytes
Mucho margen de mejora aún, pero aquí tienes:
fuente
Ruby,
123117111102 bytesPerdón por todas las ediciones, esta debería ser la última.
fuente
Python, 177 bytes
Entregado en formato de función para guardar bytes. Esta no es una respuesta especialmente competitiva, pero es una que no requiere
repr()niregextruco. También es agnóstico a la versión; Funciona con Python 2 o 3.Aunque es quizás una solución muy por las reglas.
fuente
PHP,
109142 bytesUna fusión de la respuesta del usuario 59178 y mbomb007 .
escribe en mayúscula la primera letra de cada palabra, luego en minúscula todas las palabras de la lista rodeadas de espacios.
Desafortunadamente, la devolución de llamada tiene que operar en el conjunto completo; Esto cuesta 29 bytes.
fuente
a an and as at but by for in nor of on or the to upRaqueta 353 bytes
Sin golf:
Pruebas:
Salida:
fuente
Java 7
431 317311 bytesGracias a @KevinCruijssen por 114 bytes.
Gracias a @RosLup por guardar 6 bytes.
sin golf
primera respuesta por encima de 250 bytes
fuente
String f(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=z>0?i<1|i++==l.length-1?x:c:x)+" ";}return v;}( 314 bytes ) Sugiero echar un vistazo a lo que cambié como consejos para la próxima vez. :) PD: He publicado una respuesta con un enfoque diferente ( 259 bytes ).c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "que hiciste dos veces deberían hacerte pensar en reutilizarlo de alguna manera. Y las inicializaciones combinadas como lo hiciste correctamente con elint, pero por alguna razón no con elString. Además, no necesita el extrabooleancuando puede almacenar comoint0 o 1 y luego verificarlo>0. Y trataría de evitar los corchetes ybreaktodo lo posible; Por lo general, hay un truco para deshacerse de ellos, como elfor(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);que he mostrado. :)String c(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=(z>0?i<1|i++>l.length-2?x:c:x)+" ";}return v;}y no hay problema. :) También aprendí mucho cuando era nuevo en el golf de código. Solo hago una lista con cada consejo general de codegolf que aprendo y lo veo / actualizo a veces. Pero mi código todavía es muy usado por otros.PHP,
117118112 bytesUtiliza el comportamiento
ucwords()y escapa de las palabras relevantes que están rodeadas por espacios y luego elimina los caracteres de escape.Copié el
(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])de la respuesta de Jörg Hülsermann pero a medida que el enfoque es completamente diferente que lo pongo como una respuesta por separado.editar: error notado por Titus, arreglarlo cuesta 1 byte. también: 6 bytes guardados gracias a su útil comentario sobre strtr
fuente
strtrlugar destr_replace. O anteponga las palabras con<>y sueltethe str_replacey use la salida HTML.preg_filterlugar depreg_replace. No lo henice try for a start. Reemplazar uno de los espacios con una aserción resuelve eso (+4 bytes).preg_filterfallaría en eltitlecaso de prueba, sin devolver nada.Puro
bash- 253(no se llaman programas externos) - necesita bash v4
vista normal con comentarios
salida
fuente
Japt , 71 bytes
Pruébalo en línea!
Explicación:
Una de mis características favoritas de Japt es su compresión de cadenas, que utiliza la biblioteca shoco .
Puede comprimir una cadena envolviéndola en
Oc"{string}"→Oc"a an the at by for in of on to up and as but or nor"Luego descomprimirlo con backticks o
Od"{compressed string}"→Od"a e by f up d ¿t n"fuente
-Sbandera se agregó después de publicar este desafío, por lo que su solución actual no es competitiva. Sin embargo, creo que puede hacerlo£...+XÅ}S, lo que estaría compitiendo por el mismo conteo de bytes (¡ Pruébelo en línea! )Puro
bash-205192181 bytesAl igual que la respuesta de jm66
tcacepta entrada estándar.fuente
En realidad , 79 bytes
Pruébalo en línea!
Explicación:
fuente
Lote, 323 bytes.
Con comentarios:
fuente