Capitalizar cadena

18

Dada una cadena, capitalícela. Por capitalización quiero decir conTeNT-lENgthcambios a Content-Length. En el ejemplo, mostré la cadena con 2 palabras con -el límite de la palabra. Sin embargo, espero que escriba el código de la cadena que contiene cualquier número de palabras separadas por un solo carácter como límite. Este límite puede cambiar a través de la cadena.

Condiciones

  1. el uso noregular expressions está permitido .
  2. puede haber cualquier cantidad de palabras en una oración (cadena).
  3. cada palabra consistirá en Englishletras [a-zA-Z]de cualquier caso.
  4. diferentes palabras en la oración estarán separadas por un solo carácter. Este personaje será solamente ser cualquiera de -, ., <space-character>, /, &, #. Puede asumir con seguridad que la oración no contendrá ningún otro carácter, excepto los mencionados.
  5. los límites de palabras deben conservarse en la salida.
  6. el código más corto gana.

Por ejemplo, su programa debería generar Begin/With.Type&Contentpara BeGin/wITH.tyPE&conTeNt.

Some test cases:
 "aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe" 
 "type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe" 
 "cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc" 
 "lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT" 
 "contENT/ACcEpT" 
 "BeGin/wITH.tyPE&conTeNt"
 "Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with" 
 "RaNgE&COnTeNT WITh CoNTENT-TypE tyPe"
 "BEgin COdE#uSeR#aGeNt.USeR"
 "TypE LENGth"
hombre murciélago
fuente
2
Lo que llamas capitalización es en realidad una transformación a camello.
Pierre Arlaud
66
@ArlaudPierre No, lo que ha dado como "casos de prueba" son más como un caso de camello. Lo que se llama capitalización está más cerca del Título del Caso.
Iszi
¿Puede proporcionar el resultado esperado para los casos de prueba? Parece que algunas funciones integradas pueden suponer que las palabras mayúsculas (como /CC/en la línea 2 o -AND&en la línea 7) deberían dejarse solas. ¿Está bien para este desafío?
Iszi
¿La entrada siempre comienza con una palabra o puede comenzar con un separador?
lebatsnok

Respuestas:

7

GolfScript, 36 27 19 caracteres

0\{95&+.47>32*\}%\;

Un enfoque bastante básico de GolfScript que funciona para todas las entradas de acuerdo con la especificación. Los ejemplos se pueden probar en línea .

Howard
fuente
Frio. Tenía curiosidad por saber si mi solución es al menos dos veces como profesional. :) Pero estoy seguro de que acortarán esto varias veces antes de que termine el día.
manatwork
@manatwork Ahora tenemos un factor de dos ;-) Todavía descontento con todos los intercambios.
Howard
Sabía que no me decepcionarías.
manatwork
22

Python 3,22

print(input().title())

Este código tomará una cadena como entrada de stdin y le dará una salida en mayúscula a stdout.

por ejemplo:

entrada:

BEGIN/wITH.tyPe&cOnTENt

salida:

Begin/With.Type&Content

El siguiente código es para entradas de varias líneas (si es necesario)

Pitón 3, 46

import sys
for i in sys.stdin:print(i.title())
Wasi
fuente
while 1:print(input.title())es un equivalente más corto para el último fragmento de código.
Ramchandra Apte
1
@RamchandraApte No estoy seguro de si está permitido o no. Su código morirá con un EOFError tan pronto como llegue al EOF
Wasi
1
Creo que el consenso general para los campos de golf es que mientras la salida sea correcta, los errores no importan
Volatilidad
Dang Tan pronto como vi esta pregunta, pensé en esto, pero me ganaste. +1
Justin
+1 Me gusta más que el golfscript porque no parece una obscenidad.
Tim Seguine
6

Mathematica 62

Datos

tests={"aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe","type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe","cc/rEspoNCe.lEngtH#tYpEwitH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc","lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT","contENT/ACcEpT","BeGin/wITH.tyPE&conTeNt","Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with","RaNgE&COnTeNT WITh CoNTENT-TypE tyPe","BEgin COdE#uSeR#aGeNt.USeR","TypE LENGth"}

Código

StringReplace[ToLowerCase@#,WordBoundary~~x_:>ToUpperCase@x]&

Uso

f["aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe"]

"Agente aceptado / Tipo de longitud Rango de usuario. Tipo"

f /@ tests

{"Aceptar agente / Longitud-Tipo de usuario Rango. Tipo",
"Tipo y agente / Cc / Contenido Longitud # Aceptar / Agente.Rango-Cc / Contenido / Código", "Cc / Respuesta. Longitud # Tipo-con y usuario / Comenzar y usuario. Agente y comenzar / Aceptar / Cc "," Longitud # Usuario. Tipo / Principio y Tipo de longitud / Aceptar # Rango / Código y Y-Aceptar / Contenido "," Contenido / Aceptar ",
" Comenzar / Con.Tipo y Contenido ",
" Código.Cc # Usuario. Longitud-Usuario -Y Tipo de tipo y longitud. Tipo de usuario. Usuario y con ",
" Rango y contenido con tipo de contenido tipo ",
" Código de inicio # Usuario # Agente.Usuario ",
" Longitud de tipo "}

DavidC
fuente
-1 Eso es básicamente regex
CalculatorFeline
Mathematica puede ejecutar regex directamente pero usé algo más. Es similar a la expresión regular, pero no es expresión regular.
DavidC
%% %%% % %%
CalculatorFeline
6

JavaScript (94)

prompt().split(l='').map(function(a){return l='A'>l?a.toUpperCase():a.toLowerCase()}).join('')
quietmint
fuente
5

PHP: 78 73 65 64 caracteres

$b=ucfirst;foreach(str_split($s)as$c)echo$b($c),!$b[0]=$c<A?u:l;

La entrada se pasa $s. Funciona en la cadena como una matriz de caracteres.

Es una máquina simple de 2 estados. Se basa en el ordenamiento léxico de cadenas, y que el analizador asume automáticamente que en algunos casos tenía la intención de escribir una cadena.

El estado se almacena $by se representa como el nombre de la función que debe llamarse en el siguiente carácter. ucfirsty lcfirstson más cortos de escribir y tienen un comportamiento idéntico a strtolower/ strtoupperen cadenas de caracteres individuales. Además, dado que solo difieren en una letra, podemos usarlos de manera eficiente para almacenar el estado. La versión original necesitaba almacenar el estado explícitamente en un booleano.

Como echo no imprime nada para boolean false, utilicé una coma y el !operador para "ocultar" la asignación (que en este caso es verdadera) en la declaración de echo. Esto me permitió guardar un personaje eliminando el {}.

Tim Seguine
fuente
Utilice el marcado de bloque de código en lugar del código en línea, de modo que los scripts como Code Golf UserScript Enhancement Pack puedan insertar el tamaño debajo del código. Por cierto, en su código se pueden eliminar los 3 caracteres de espacio.
manatwork
En lugar de $b=ord($c)>64;intentarlo $b=$c>"@";. O incluso $b=$c>=A;: AFAIR que arroja una advertencia, pero las buenas prácticas de codificación no son una virtud aquí.
manatwork
@manatwork gracias, no pensé en eso. Ya estoy lanzando una advertencia por usar una variable no establecida de todos modos.
Tim Seguine
Hmm ... ¿Qué tal no usar $ b solo como una bandera, sino almacenar el nombre de la función real en él? $b=ucfirst;foreach(str_split($s)as$c){echo$b($c);$b[0]=$c>=A?l:u;}.
manatwork
@manatwork genial! Estaba tratando de pensar en una forma de hacerlo con la función. Mis intentos fueron más grandes.
Tim Seguine
4

C, 83

n;main(c){c=getchar();putchar(c>96?n?c:(n=c-32):c&64?n?c+32:(n=c):(n=0,c));main();}

Toma líneas stdin, las traduce a stdout. (Prefiere SIGINTa EOF.)

Piedra de Darren
fuente
4

Powershell: 37-43

Dependiendo de cómo desea tomar la entrada ...

Solicitar al usuario su aporte: 43

(Culture).TextInfo.ToTitleCase((read-host))

Tomar entrada de la tubería: 38

(Culture).TextInfo.ToTitleCase($input)

Proporcione información como argumento al ejecutar el script: 37

(Culture).TextInfo.ToTitleCase($args)

NOTA: Las secuencias de comandos anteriores ignorarán las palabras mayúsculas, dejándolas como están. Si esto debe tenerse en cuenta, la entrada debe forzarse a minúsculas antes de la conversión de mayúsculas y minúsculas. Esto agrega 10 caracteres al primer método y 12 a los otros dos.

(Culture).TextInfo.ToTitleCase((read-host).ToLower())
(Culture).TextInfo.ToTitleCase("$input".ToLower())
(Culture).TextInfo.ToTitleCase("$args".ToLower())
Iszi
fuente
No funciona de acuerdo con las especificaciones. Tratar foo:bar.
Mormegil
@ Mororgil ¿Cuál? La versión de host de lectura, al menos, funciona bien para mí. Lo probé en todos los casos de prueba en la pregunta y todos regresaron como se esperaba, excepto los casos especiales que publiqué en el comentario a la pregunta.
Iszi
:(dos puntos) no aparece en la lista como separador de palabras en la regla n. ° 4, por lo tanto, AFAICS foo:bardebería dar como resultado Foo:bar, no Foo:Bar . Pero esa es solo mi lectura (bastante estricta) de la especificación.
Mormegil
2
@ Mormegil Bueno, esto está bien. Parece que la especificación se modificó para resolver esa ambigüedad, al mismo tiempo que no invalida esta respuesta.
Iszi
1
Puedes reemplazar get-culturecon culture; ver codegolf.stackexchange.com/a/778/1308
Danko Durbić
4

Java - 209 caracteres

class C{
public static void main(String[]a){
for(String b:a){
char[]k=b.toLowerCase().toCharArray();
for(int i=-1;i<k.length;i++){if(i<0||"-. /&#".indexOf(k[i])>=0)k[++i]=(char)(k[i]-32);}
System.out.println(k);}}}

Agregué nuevas líneas solo para facilitar la lectura.

Cierto suave
fuente
3

R, 143 116

Tal vez una solución un poco larga, pero aquí vamos:

f=function(x){a=sapply(1:nchar(x),function(y)substr(tolower(x),y,y));d=c(1,which(!a%in%letters)+1);a[d]=toupper(a[d]);cat(a,sep="")}

Ligeramente desanimado y explicado:

f <- function(x){
    #Split the string in characters and "lower-case" everything
    a <- sapply(1:nchar(x),function(y)substr(tolower(x),y,y))
    #Select the first character and each character following a 
    #character that doesn't belong to lower case alphabet
    d <- c(1,which(!a%in%letters)+1)
    #Make those ones uppercase.
    a[d] <- toupper(a[d])
    #Output (stdout) while pasting them back together.
    cat(a,sep="")
    }

Editar : 116 caracteres

El principal desafío aquí es vectorizar substr. Aquí hay otra forma menos detallada.

f=function(x){n=1:nchar(x);a=mapply(substr,tolower(x),n,n);d=c(T,!a%in%letters);a[d]=toupper(a[d]);cat(a[n],sep="")}

Sangrado:

f <- function(x){
    n <- 1:nchar(x)
    a <- mapply(substr,tolower(x),n,n)
    d <- c(T,!a%in%letters) #This has been simplified as well
    a[d] <- toupper(a[d])
    cat(a[n],sep="") #Because a is now 1 char longer than x, need to subset a
    }

Uso:

> f("aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe")
Agent Accept/Length-Type User Range.Type
plannapus
fuente
Puedes guardar algunos personajes. Dado que solo aconsta de caracteres en minúscula, no hay necesidad de buscar coincidencias con mayúsculas LETTERS.
Sven Hohenstein
@SvenHohenstein de hecho, ¡gracias!
plannapus
Otro: puede reemplazar TRUEcon T.
Sven Hohenstein
Originalmente tuve el tolowerposterior.
plannapus
OK, aquí hay otro ;-) Puede reemplazar mapply(substr,tolower(x),n,n) con strsplit(tolower(x),"")[[1]]para guardar un personaje.
Sven Hohenstein
3

Befunge 98 - 24 45

~\j:'``!3*j' -;:'``b*j:'/`!3*j' +#;:,'/`!jc#@

Escribir esto hirió mi cerebro.

Esto lleva la entrada ~y si el carácter anterior era uno de los separadores (o si no había ningún carácter anterior), se ejecuta

:'``!3*j' -;

Este fragmento toma el carácter, y si su valor ascii es mayor o igual que a, resta 32 de él, cambiando así a mayúscula. Si es menor que a, 3*jomite el ajuste. Luego, se salta la siguiente parte. Esta parte maneja el cambio de mayúsculas a minúsculas (estoy seguro de que se puede combinar con la siguiente parte; simplemente no estoy seguro de cómo):

:'``b*j:'/`!3*j' +#;

El carácter se imprime ( ,), luego esto verifica si el carácter es uno de los límites:

'/`!

Básicamente compara el carácter con el valor ascii de /. Si el personaje no es un límite, el código lo empuja 12para que se salteará el ajuste de capitalización la próxima vez. #salta sobre el programa final: @y, si se alcanza el final de la entrada, ~envía la ejecución del código nuevamente al @final del programa.

Justin
fuente
3

Ruby: 60 51 50 47 caracteres

$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}

Ejecución de muestra:

bash-4.1$ for line in "${test[@]}"; do printf '%-75s | %s\n' "$line" "$( ruby -ne '$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}' <<< "$line" )"; done
aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe                                    | Agent Accept/Length-Type User Range.Type
type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe             | Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc          | Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT     | Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
contENT/ACcEpT                                                              | Content/Accept
BeGin/wITH.tyPE&conTeNt                                                     | Begin/With.Type&Content
Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with           | Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
RaNgE&COnTeNT WITh CoNTENT-TypE tyPe                                        | Range&Content With Content-Type Type
BEgin COdE#uSeR#aGeNt.USeR                                                  | Begin Code#User#Agent.User
TypE LENGth                                                                 | Type Length
hombre trabajando
fuente
1
¿No es lo l==l.swapcasemismo que l<?0(no probado)? Al menos para la entrada permitida para esta tarea.
Howard
Si. Ahora ese batman enfatizó que no se deben esperar otros separadores, de hecho, eso es más corto. Gracias, @Howard.
manatwork
2

C # - 110

Un procesamiento simple basado en máquina de estado finito:

x.Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r

(donde xestá el stringcapitalizar)

y, por supuesto, si quieres ser aburrido (después de actualizar la especificación), puedes usar

new CultureInfo(9).TextInfo.ToTitleCase(x)

o, con todo el aburrido repetitivo:

class C{static void Main(string[]a){System.Console.WriteLine(new System.Globalization.CultureInfo(9).TextInfo.ToTitleCase(a[0]));}}
Mormegil
fuente
No, no se compilará ya que C # no es un lenguaje de script y necesita encapsular esto en una clase.
Pierre Arlaud
2
¿Dice quién? Microsoft (R) Roslyn C# Compiler version 1.2.20906.1 Loading context from 'CSharpInteractive.rsp'. Type "#help" for more information. > "foobar".Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r "Foobar"Pero si realmente te importa el aburrido repetitivo, agrega 112 caracteres.
Mormegil
1
Puede cortar el publicy string[]adesde la
placa de cocción
Oh sí, tienes razón public, pero necesito los argumentos, ya que eso es lo que proceso ...
Mormegil
2

Javascript 102

prompt().split(o=q='').map(function(c){o+=(q)?c.toLowerCase():c.toUpperCase(),q=('A'>c)?0:1})
alert(o)
martillo de lobo
fuente
No necesitas (... )alrededor de la condición ternaria. Aún más, no es necesario que el segundo ternario: function(c){o+=q?c.toLowerCase():c.toUpperCase(),q='@'<c}.
manatwork
2

Adelante, 135

: s swap ;
: c 1 begin key dup 96 > if s if 32 - then 0 s 
else dup 64 > if s 0= if 32 + then 0 s then else 1 s then then emit again ; c

La salida traducida se escribe a stdoutmedida que se lee stdin.

Piedra de Darren
fuente
1
"entonces luego emitir de nuevo" rima con adelante!
gato
2

Befunge-98 (29), C (65)

Dado que el método / algoritmo es más o menos el mismo, incluyo ambas versiones en la misma publicación. Ambos confían en realizar un seguimiento de si el último carácter fue un símbolo o una letra, para saber si se debe minúscula o no.

Befunge-98 (29)
#@~:'0` #v_,0>
',++@'% '<   ^
C (65)
c,d;main(){for(;~(c=getchar());d=c>48)putchar(c<48?c:c&95|32*d);}
Luciérnaga
fuente
2

05AB1E , 1 byte

Código:

Explicación:

™   # Implicit input which is converted to title case.

Pruébalo en línea!

Adnan
fuente
Eso es genial :-)
Batman
1

Excel VBA-11 caracteres

En la ventana Inmediato

?[Proper()]

VBscript

Set xlapp = CreateObject("excel.application")
wscript.echo xlapp.Evaluate("Proper(""BeGin/wITH.tyPE&conTeNt"")"
brettdj
fuente
¿Podría proporcionar alguna ayuda sobre el uso? Aparece el mensaje "Error de compilación: nombre externo no definido". (En Word 2013 en la ficha Programador Visual Basic hice clic, a continuación, en Visual Basic para Aplicación copio-pegar el código en la ventana Inmediato y presiona Enter.)
manatwork
@manatwork Debería haber aclarado que estaba en Excel. Puede hacerlo desde Word, pero el camino es más largo ya que necesita automatizar Excel.
brettdj
1
Frio. Funciona perfectamente cuando VBA se inicia desde Excel 2013.
manatwork
=PROPER(A1)También funciona directamente en Excel: también 11 bytes
Wernisch
1

AWK 113 103 bytes

{for(;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Esto funciona bien para el contenido de una sola línea, pero para la entrada multilínea se necesita agregar un par de inits

{O=""
for(L=0;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Sería bueno si pudiéramos aprovechar la división automática de un registro en campos y modificar dichos campos, pero luego perderíamos nuestros separadores de campo. :(

Sé que esta no es la mejor respuesta y esta es una pregunta bastante antigua, pero creo que AWK está subrepresentada en el espacio de respuesta de CG :)

(Gracias @manatwork por probar el código, debería funcionar ahora :) También cambió el flujo pero mantuvo el recuento de bytes igual, al reemplazar algunos ;con nuevas líneas.

Robert Benson
fuente
1
¿Estás seguro? Ninguno de los códigos parece producir la salida requerida ni con gawk, mawkni original-awk. (Probado en Ubuntu.)
manatwork
Fue escrito usando gawkun cuadro RHEL6, pero luego se transcribió a un cuadro de Windows. Bien podría haber un problema de transcripción. Intentaré probar después del trabajo cuando pueda hacer pruebas y publicar en la misma máquina ... Creo que veo el problema, de todos modos. l=0debería serL=0
Robert Benson
Ojalá funcione ahora, @manatwork. Gracias por la prueba :)
Robert Benson
1
Ahora parece funcionar correctamente. Sin marcar todos los casos de prueba, pero parece ser posible reducir un poco: {for(l=split($0,a,$0="");i<=l;s=a[++i]){$0=$0(L?toupper(s):tolower(s));L=index("-. /&#",s)}}1.
manatwork
Me gusta su uso del cambio $0y la 1etiqueta para evitar el printcomando son cosas que no he pensado hacer. Tendré que tenerlo en cuenta para el golf futuro :)
Robert Benson
1

PHP (> v5.4.32) - 25 caracteres

<?=ucwords($a,'-. /&#')?>

Explicación:

  • ucwords () es una función PHP integrada

  • El primer parámetro $aes la entrada.

  • El segundo parámetro son los delimitadores (caracteres no alfabéticos encontrados en casos de prueba)

  • Se supone retorno / eco / impresión debido al uso de <?= ?>

Enlaces:

jpl42
fuente
1
Hola y bienvenidos al sitio! Creo que en este momento es un fragmento que no está permitido por defecto, pero puede obtener 41 bytes como un programa completo usando -R: ¡ Pruébelo en línea! o 42 usando argumentos: ¡ Pruébelo en línea!
Dom Hastings
0

T-SQL, 179

DECLARE @T VARCHAR(MAX)='foo',@X VARCHAR(2),@ INT=0WHILE @<LEN(@T)SELECT @X=SUBSTRING(@T,@,2),@+=1,@T=STUFF(@T,@,1,IIF(@X LIKE'[a-Z]_',LOWER(RIGHT(@X,1)),UPPER(RIGHT(@X,1))))PRINT @T

Pruebe la versión SELECT en SQL Server 2012 aquí .

Reemplace "foo" con la cadena de entrada. El recuento de caracteres es para una cadena de longitud cero. Este código atraviesa la cadena usando un índice, en mayúsculas o minúsculas en esa posición en función del carácter anterior.

Muqo
fuente
0

JavaScript (Node.js) , 70 bytes

c=>a=>c.split``.map(b=>a="A">a?b.toUpperCase():b.toLowerCase()).join``

Pruébalo en línea!

Estoy seguro de que esto se puede jugar más golf.

Nota :

Toma entrada vía f(string)(), los últimos son obligatorios pero no realizan nada.

Muhammad Salman
fuente
0

Powershell, 77 75 bytes

Esta solución cumple totalmente con las reglas de la tarea (incluso un ejemplo ambiguo foo:bar).

-join($args|% t*y|%{"$_"|%('ToU*r','ToL*r')[+$l];$l=!('# -./&'|% Co*s $_)})

Vea también la solución Powershell con función integrada ToTitleCase de @Iszi.

Script de prueba explicado:

$f = {

-join(
$args|% t*y|%{                   # for each char from input string
    "$_"|%('ToU*r','ToL*r')[+$l] # evaluate ToUpper or ToLower method depend on $l (lower) value
                                 # Note the variable $l is not defined for a first char
                                 # so it evaluates toUpper for the first char 
    $l=!('# -./&'|% Co*s $_)     # golfed form for $l=!'# -./&'.Contains($_) expression
                                 # =0 if the current char is specified separator (toUpper for next char)
}                                # =1 otherwise (toLower for next char)
)                                # finally, join all chars to a result string

}

@(
    ,('foo:bar'                                                                 ,'Foo:bar')
    ,('aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe'                                ,'Agent Accept/Length-Type User Range.Type')
    ,('type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe'         ,'Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code')
    ,('cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc'      ,'Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc')
    ,('lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT' ,'Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content')
    ,('contENT/ACcEpT'                                                          ,'Content/Accept')
    ,('BeGin/wITH.tyPE&conTeNt'                                                 ,'Begin/With.Type&Content')
    ,('Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with'       ,'Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With')
    ,('RaNgE&COnTeNT WITh CoNTENT-TypE tyPe'                                    ,'Range&Content With Content-Type Type')
    ,('BEgin COdE#uSeR#aGeNt.USeR'                                              ,'Begin Code#User#Agent.User')
    ,('TypE LENGth'                                                             ,'Type Length')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-ceq$e): $r"
}

Salida:

True: Foo:bar
True: Agent Accept/Length-Type User Range.Type
True: Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
True: Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
True: Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
True: Content/Accept
True: Begin/With.Type&Content
True: Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
True: Range&Content With Content-Type Type
True: Begin Code#User#Agent.User
True: Type Length
mazzy
fuente
0

QBasic, 74 bytes

1c$=LCASE$(INPUT$(1))
IF f=0THEN c$=UCASE$(c$)
f=c$>"@
?c$;
IF""<c$GOTO 1

Los bytes se cuentan en CP-437 ; es un solo byte (código de carácter 20).

El método de entrada aquí es un poco extraño: los caracteres se escriben uno a la vez, y su uso de mayúsculas se convierte antes de mostrarse. Entonces, cuando escribe aGeNT, aparece en la pantalla como Agent. Golpear Entertermina el programa.

DLosc
fuente
0

Python 3 , 122 bytes

lambda s:''.join(chr(ord(c)+[[0,0],[0,32],[-32,0]][('@'<c<'[')-('`'<c<'{')]['@'<p<'['or'`'<p<'{'])for c,p in zip(s,'-'+s))

Pruébalo en línea!

No es un gran puntaje, pero quería probarlo sin operaciones de cadena incorporadas para cambiar los casos.

Matthew Jensen
fuente
-2

PHP - 23 caracteres

mb_convert_case ($ w, 2);

Necesita php_mbstring para funcionar

mattecapu
fuente
1
En mi 5.3.26 mb_convert_case("BeGin/wITH.tyPE&conTeNt", 2);devuelve "Begin / with.type & content", no "Begin / With.Type & Content".
manatwork