Inverser les mots sans changer les majuscules ni la ponctuation

13

Créez un programme avec le plus petit nombre de caractères pour inverser chaque mot d'une chaîne tout en conservant l'ordre des mots, ainsi que la ponctuation et les majuscules, à leur place initiale.

Par "Ordre des mots", je veux dire que chaque mot est divisé par un espace vide (""), donc les contractions et autres seront traitées comme un seul mot. L'apostrophe dans les contractions doit rester au même endroit. ("Don't" => "Tno'd").

(La ponctuation signifie tous les caractères qui ne sont pas az, AZ ou espaces blancs *).

  • Les numéros ont été supprimés de cette liste car vous ne pouvez pas avoir de numéros de capital. Les nombres sont désormais traités comme de la ponctuation.

Par exemple, pour l'entrée:

Hello, I am a fish.

il devrait produire:

Olleh, I ma a hsif.

Notez que O, qui est la première lettre du premier mot, est maintenant majuscule, puisque H était auparavant majuscule au même endroit.

La virgule et la période sont également au même endroit.

Plus d'exemples:

This; Is Some Text!

sortirait

Siht; Si Emos Txet!

N'importe quelle langue peut être utilisée. Le programme avec le plus petit nombre de caractères gagne.

nasonfish
la source
3
Comment traiter les contractions? C'est-à-dire la Don't touch that!carte vers t'noD hcuot taht!ou vers noD't hcuot taht!?
dmckee --- chaton ex-modérateur
2
@dmckee "(la ponctuation signifie tous les caractères qui ne sont pas az, AZ, 1-9 ou espaces blancs)"
John Dvorak
1
@dmckee donc il devrait être mappé àNod't hcuot tath!
John Dvorak
1
Inverser chaque mot est facile. Inverser chaque mot et conserver la capitalisation ne l'est pas.
John Dvorak
1
Oui, c'est le défi;) simplement les inverser serait trop simple et se résumerait probablement au langage utilisé. Ceci est destiné à vous faire réfléchir.
nasonfish

Réponses:

7

GolfScript, 58 54 48 caractères

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

Il s'agit d'une solution GolfScript qui est devenue assez longue. Une grande partie du code consiste en fait à savoir si un caractère est en a-zA-Z. Peut-être que quelqu'un peut trouver un moyen encore plus court de le tester.

Vous pouvez essayer le code en ligne . Exemples:

> 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
la source
Cet éditeur de golfscript en ligne semble utile. Bookmarking, thanks
John Dvorak
Vous pouvez tirer la finale " "à l'intérieur %pour en enregistrer une. J'ai trouvé d'autres façons de tester a-zA-Z pour 11 caractères, mais aucune pour 10.
Peter Taylor
4

APL 69

Prend la saisie d'écran via: t ← ⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]
Graham
la source
L'APL ne doit-il pas être compté en octets UTF-8? :-)
John Dvorak
@JanDvorak Le jeu de caractères APL + Win V5 est composé d'un seul octet. Je dois convertir en UTF-8 pour publier ici afin que les personnages s'affichent correctement. ⎕av⍳t ci-dessus renvoie un index dans le jeu de caractères de 0 à 255 pour les caractères du vecteur t.
Graham
4

Coffeescript, 134 133 caractères

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 est (aux fins du code golf) une version légèrement plus dense de javascript. Il n'a pas l'opérateur ternaire, mais il a un échappement vers javascript.

Voici la version javascript:

Javascript, 152 151 caractères

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"]()})}))

Dentelé:

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
la source
2

Ruby: 89 caractères (dont 1 pour le -p switch)

Non copié Jan Dvorak de solution CoffeeScript , mais après de nombreuses tentatives mon code comme une recherche clos le copie exacte. Une voix subconsciente n'arrêtait pas de chuchoter "suivez le lapin blanc Jan Dvorak". Donc, les votes positifs pour l'algorithme devraient aller à sa réponse.

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

Exemple d'exécution:

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
homme au travail
la source
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
la source
Bien essayé, mais il devrait également maintenir la ponctuation en place: pastebin.com/X8QLf6fW
manatwork
EDIT: oh je vois maintenant
mniip
-1

EcmaScript 6 (112 caractères)

L'entrée est fournie dans s.

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

Basé sur la réponse de @Jan Dorvak.

Brosse à dents
la source
-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;
    }

Minifié

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;}
microbien
la source
N'est-ce pas A-Za-z?
Cyoce
@Cyoce Un petit détail: [A-z]non [A-Za-z]. La première est une erreur courante (?), Car elle contient des caractères non alphabétiques.
Erik the Outgolfer le
1
Cela ne devrait-il pas aussi être, euh, joué au golf?
Cyoce