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 a
a 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 an
como 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
repr
nuevo . 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 querepr
cualquier palabra corta será una subcadena.`w` in "..."
da un valor booleano, que podemos tratar como0
o1
para 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
a
lugar 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
47
bytes, dividiéndolo en1
bytes de costo , por48
bytes.Dos cadenas comprimidas no separadas de las palabras de longitud
2
y3
(con una 'a' al final de una) serían40
bytes más2
para dividir cada una y1
unirlas, por45
bytes.Un número de base 250 como se describe a continuación es
32
bytes, luego3
para convertir a base 26,3
para indexar en el alfabeto en minúsculas y3
dividirlo en el carácter no utilizado'z'
, para41
bytes.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'
como2
con el separador como0
:Convierta esto en un
26
nú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
250
nú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
b
tuviera alguna0
dí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
A
que no se conviertana
es 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 token0x81
y@
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 úseloit
para 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()
niregex
truco. 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 up
Raqueta 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 extraboolean
cuando puede almacenar comoint
0 o 1 y luego verificarlo>0
. Y trataría de evitar los corchetes ybreak
todo 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
strtr
lugar destr_replace
. O anteponga las palabras con<>
y sueltethe str_replace
y use la salida HTML.preg_filter
lugar depreg_replace
. No lo henice try for a start
. Reemplazar uno de los espacios con una aserción resuelve eso (+4 bytes).preg_filter
fallaría en eltitle
caso 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
-S
bandera 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
tc
acepta entrada estándar.fuente
En realidad , 79 bytes
Pruébalo en línea!
Explicación:
fuente
Lote, 323 bytes.
Con comentarios:
fuente