Invierta palabras sin cambiar mayúsculas o puntuación

13

Cree un programa con la menor cantidad de caracteres para invertir cada palabra en una cadena mientras mantiene el orden de las palabras, así como los signos de puntuación y mayúsculas, en su lugar inicial.

Por "Orden de las palabras", quiero decir que cada palabra está dividida por un espacio vacío (""), por lo que las contracciones y demás se tratarán como una sola palabra. El apóstrofe en las contracciones debe permanecer en el mismo lugar. ("Don't" => "Tno'd").

(La puntuación significa cualquier carácter que no sea az, AZ o espacio en blanco *).

  • Los números se eliminaron de esta lista debido al hecho de que no puede tener números en mayúscula. Los números ahora se tratan como puntuación.

Por ejemplo, para la entrada:

Hello, I am a fish.

debería generar:

Olleh, I ma a hsif.

Observe que O, que es la primera letra de la primera palabra, ahora es mayúscula, ya que H antes era mayúscula en la misma ubicación.

La coma y el punto también están en el mismo lugar.

Más ejemplos:

This; Is Some Text!

saldría

Siht; Si Emos Txet!

Se puede usar cualquier idioma. El programa con la menor cantidad de personajes gana.

pescado de temporada
fuente
3
¿Cómo deben tratarse las contracciones? ¿Eso es Don't touch that!mapa a t'noD hcuot taht!o para noD't hcuot taht!?
dmckee --- ex-gatito moderador el
2
@dmckee "(Puntuación significa cualquier carácter que no sea az, AZ, 1-9 o espacio en blanco)"
John Dvorak
1
@dmckee por lo que debería mapear aNod't hcuot tath!
John Dvorak
1
Invertir cada palabra es fácil. Invertir cada palabra y mantener la capitalización no lo es.
John Dvorak
1
Sí, ese es el desafío;) simplemente revertirlos sería demasiado simple y probablemente se reduciría al lenguaje utilizado. Esto está destinado a hacerte pensar.
nasonfish

Respuestas:

7

GolfScript, 58 54 48 caracteres

" "/{.{65- 223&26<}:A,\{.A{96&\)31&@+}*}%+}%" "*

Esta es una solución de GolfScript que se hizo bastante larga. Gran parte del código realmente está descubriendo si un personaje está en a-zA-Z. Quizás alguien pueda encontrar una forma aún más corta de probarlo.

Puedes probar el código en línea . Ejemplos:

> Hello, I am fish.
Olleh, I ma hsif.

> This; Is Some Text!
Siht; Si Emos Txet!

> Don't try this at home.
Tno'd yrt siht ta emoh.
Howard
fuente
Ese editor de golfscript en línea parece útil. Marcadores, gracias
John Dvorak
Puedes tirar la final " "dentro de la %para guardar una. He encontrado otras formas de probar a-zA-Z para 11 caracteres, pero ninguno para 10.
Peter Taylor
4

APL 69

Toma entrada de pantalla a través de: t ← ⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]
Graham
fuente
¿No debería contarse APL en bytes UTF-8? :-)
John Dvorak
@ JanDvorak El conjunto de caracteres APL + Win V5 es de un solo byte. Tengo que convertir a UTF-8 para publicar aquí para que los caracteres se representen correctamente. ⍳av⍳t anterior devuelve un índice en el conjunto de caracteres de 0-255 para los caracteres del vector t.
Graham
4

Coffeescript, 134 133 caracteres

alert prompt().replace /\S+/g,(x)->c=x.match r=/[a-z]/gi;return x.replace r,(y)->return c.pop()[`(y<"a"?"toUpp":"toLow")`+"erCase"]()

Coffeescript es (a los efectos del código golf) una versión ligeramente más densa de javascript. No tiene el operador ternario, pero tiene un escape a JavaScript.

Aquí está la versión de JavaScript:

Javascript, 152 151 caracteres

alert(prompt().replace(/\S+/g,function(x){c=x.match(r=/[a-z]/gi);return x.replace(r,function(y){return c.pop()[(y<"a"?"toUpp":"toLow")+"erCase"]()})}))

Sangrado:

alert(prompt().replace(/\S+/g,function(x){
  c=x.match(r=/[a-z]/gi);
  return x.replace(r, function(y){
    return c.pop()[(y<"a"?"toUpp":"toLow")+"erCase"]()
  })
}))
John Dvorak
fuente
2

Ruby: 89 caracteres (incluido 1 para el -pinterruptor)

No se copió la solución CoffeeScript de Jan Dvorak , pero después de muchos intentos, mi código terminó pareciendo una copia exacta. Una voz subconsciente probablemente seguía susurrando "sigue al conejo blanco Jan Dvorak". Entonces, los votos a favor del algoritmo deberían ir a su respuesta.

$_.gsub!(/\S+/){|m|l=m.scan r=/[a-z]/i;m.gsub(r){|c|l.pop.send c<?a?:upcase: :downcase}}

Ejecución de muestra:

bash-4.2$ ruby -p reverse-word.rb <<< "Hello, I am a fish.
This; Is Some Text!
Don't touch that!
S'm00ch1e"
Olleh, I ma a hsif.
Siht; Si Emos Txet!
Tno'd hcuot taht!
E'h00cm1s
hombre trabajando
fuente
0

Lua, 143

print(((io.read"*l"):gsub("%w+",function(s)local r=""for i=1,#s do r=("")[s:byte(-i)>96 and"lower"or"upper"](s:sub(i,i))..r end return r end)))
mniip
fuente
Buen intento, pero también debe mantener la puntuación en su lugar: pastebin.com/X8QLf6fW
manatwork
EDITAR: oh, ahora veo
mniip
-1

EcmaScript 6 (112 caracteres)

La entrada se proporciona en s.

alert(s.replace(/\S+/g,x=>(_=x.match(X=/[a-z]/gi),x.replace(X,a=>_.pop()[(a<"a"?"toUpp":"toLow")+"erCase"]()))))

Basado en la respuesta de @Jan Dorvak.

Cepillo de dientes
fuente
-2

C # (375)

 public static string rev(string s)
    {
        var r = new Regex("[^A-za-z]");

        var result = "";
        var token = "";
        foreach (var c in s)
        {
            if (!r.IsMatch(c + ""))
            {
                token += c;
            }
            else
            {
                result += new string(token.Reverse().ToArray());
                result += c;
                token = "";
            }
        }

        var arr = result.ToArray();
        int i = 0;
        foreach (var c in s)
        {
            arr[i] = char.IsUpper(c) ? char.ToUpper(arr[i]) : char.ToLower(arr[i]);
            i++;
        }

        result = new string(arr);
        return result;
    }

Minified

public static string rev(string s){var r=new Regex("[^A-za-z]");var result="";var token="";foreach(var c in s){if(!r.IsMatch(c+"")){token+=c;}else{result+=new string(token.Reverse().ToArray());result+=c;token="";}}var arr=result.ToArray();int i=0;foreach(var c in s){arr[i]=char.IsUpper(c)?char.ToUpper(arr[i]):char.ToLower(arr[i]);i++;}result=new string(arr);return result;}
microbiano
fuente
¿No debería ser A-Za-z?
Cyoce
@Cyoce Un pequeño detalle: [A-z]no lo es [A-Za-z]. El primero es un error común (?), Porque contiene caracteres no alfabéticos.
Erik the Outgolfer
1
¿No debería ser esto, erm, golf?
Cyoce