Inverter palavras sem alterar maiúsculas ou pontuação

13

Crie um programa com a menor quantidade de caracteres para inverter cada palavra em uma sequência, mantendo a ordem das palavras, bem como pontuação e letras maiúsculas, em seu lugar inicial.

Por "ordem das palavras", quero dizer que cada palavra é dividida por um espaço vazio (""), de modo que as contrações serão tratadas como uma palavra. O apóstrofo nas contrações deve permanecer no mesmo local. ("Não" => "Não registrado").

(Pontuação significa qualquer caractere que não seja az, AZ ou espaço em branco *).

  • Os números foram removidos desta lista devido ao fato de que você não pode ter números maiúsculos. Os números agora são tratados como pontuação.

Por exemplo, para a entrada:

Hello, I am a fish.

deve produzir:

Olleh, I ma a hsif.

Observe que O, que é a primeira letra da primeira palavra, agora é maiúsculo, pois H era maiúsculo antes no mesmo local.

A vírgula e o período também estão no mesmo lugar.

Mais exemplos:

This; Is Some Text!

produziria

Siht; Si Emos Txet!

Qualquer idioma pode ser usado. O programa com a menor quantidade de caracteres vence.

nasonfish
fonte
3
Como as contrações devem ser tratadas? Ou seja, Don't touch that!mapeia para t'noD hcuot taht!ou para noD't hcuot taht!?
dmckee --- ex-moderador gatinho
2
@dmckee "(pontuação significa quaisquer caracteres que não são az, AZ, 1-9 ou espaços em branco)"
John Dvorak
1
@dmckee por isso deve mapear paraNod't hcuot tath!
John Dvorak
1
Inverter cada palavra é fácil. Inverter cada palavra e manter a capitalização não é.
precisa
1
Sim, esse é o desafio;) simplesmente revertê-los seria muito simples e provavelmente se resumiria ao idioma usado. Isso é feito para fazer você pensar.
precisa saber é o seguinte

Respostas:

7

GolfScript, 58 54 48 caracteres

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

Esta é uma solução GolfScript que se tornou bastante longa. Muito do código está realmente descobrindo se um caractere está em a-zA-Z. Talvez alguém possa encontrar uma maneira ainda mais curta de testá-lo.

Você pode tentar o código online . Exemplos:

> 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
fonte
Esse editor de golfe online parece útil. Bookmarking, thanks
John Dvorak
Você pode puxar a final para " "dentro %para salvar uma. Eu encontrei outros meios de testar a-zA-Z para 11 caracteres, mas nenhum ainda para 10.
Peter Taylor
4

APL 69

Obtém a entrada da tela via: t ← ⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]
Graham
fonte
O APL não deve ser contado em UTF-8 bytes? :-)
John Dvorak
@JanDvorak O conjunto de caracteres APL + Win V5 é de byte único. Eu tenho que converter para UTF-8 para postar aqui para que os caracteres sejam renderizados corretamente. Aboveav⍳t acima retorna um índice no conjunto de caracteres de 0 a 255 para os caracteres do vetor 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 é (para os propósitos do código golf) uma versão um pouco mais densa do javascript. Não possui o operador ternário, mas tem uma fuga para o javascript.

Aqui está a versão 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"]()})}))

Recuado:

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
fonte
2

Ruby: 89 caracteres (incluindo 1 para o -pswitch)

Não copiado Jan Dvorak 's solução CoffeeScript , mas depois de muitas tentativas meu código acabou parecendo uma cópia exata. Uma voz subconsciente provavelmente continuava sussurrando "siga o coelho branco Jan Dvorak". Portanto, os votos positivos para o algoritmo devem ser respondidos.

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

Exemplo de execução:

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
homem a trabalhar
fonte
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
fonte
Boa tentativa, mas também deve manter a pontuação no lugar: pastebin.com/X8QLf6fW
manatwork
Edição: oh eu vejo agora
mniip 08/04
-1

EcmaScript 6 (112 caracteres)

A entrada é fornecida em s.

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

Com base na resposta de @Jan Dorvak.

Escova de dente
fonte
-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;
    }

Minificado

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
fonte
Não deveria ser A-Za-z?
Cyoce 27/02
@ Cyoce Um pequeno detalhe: [A-z]não é [A-Za-z]. O primeiro é um erro comum (?), Porque contém caracteres não alfabéticos.
Erik o Outgolfer
1
Também não deveria ser, erm, jogado golfe?
Cyoce