Wörter umkehren, ohne die Groß- oder Kleinschreibung zu ändern

13

Erstellen Sie ein Programm mit der geringsten Anzahl von Zeichen, um jedes Wort in einer Zeichenfolge umzukehren, wobei die Reihenfolge der Wörter sowie Satzzeichen und Großbuchstaben an der ursprünglichen Stelle beibehalten werden.

Mit "Reihenfolge der Wörter" meine ich, dass jedes Wort durch ein leeres Leerzeichen ("") getrennt ist, sodass Kontraktionen und dergleichen als ein Wort behandelt werden. Das Apostroph bei Kontraktionen sollte an derselben Stelle bleiben. ("Don't" => "Tno'd").

(Zeichensetzung bedeutet alle Zeichen, die nicht az, AZ oder Whitespace * sind.)

  • Nummern wurden aus dieser Liste entfernt, da Sie keine Großbuchstaben haben können. Zahlen werden jetzt als Interpunktion behandelt.

Zum Beispiel für die Eingabe:

Hello, I am a fish.

es sollte ausgeben:

Olleh, I ma a hsif.

Beachten Sie, dass O, das der erste Buchstabe im ersten Wort ist, jetzt Großbuchstaben ist, da H zuvor an derselben Stelle Großbuchstaben war.

Das Komma und der Punkt stehen ebenfalls an der gleichen Stelle.

Mehr Beispiele:

This; Is Some Text!

würde ausgeben

Siht; Si Emos Txet!

Es kann jede Sprache verwendet werden. Das Programm mit der geringsten Anzahl von Zeichen gewinnt.

Nasonfish
quelle
3
Wie sollen Kontraktionen behandelt werden? Das heißt Don't touch that!map to t'noD hcuot taht!oder to noD't hcuot taht!?
dmckee --- Ex-Moderator Kätzchen
2
@ dmckee "(Zeichensetzung bedeutet alle Zeichen, die nicht az, AZ, 1-9 oder Leerzeichen sind)"
John Dvorak
1
@ Dmckee so sollte es zuNod't hcuot tath!
John Dvorak
1
Jedes Wort umzukehren ist einfach. Jedes Wort umzukehren und die Großschreibung beizubehalten, ist nicht.
John Dvorak
1
Ja, das ist die Herausforderung;) Sie einfach umzukehren, wäre zu einfach und würde wahrscheinlich auf die verwendete Sprache hinauslaufen. Das soll Sie zum Nachdenken bringen.
Nasonfish

Antworten:

7

GolfScript, 58 54 48 Zeichen

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

Dies ist eine GolfScript-Lösung, die ziemlich lang geworden ist. Viel Code findet heraus, ob sich ein Zeichen in a-zA-Z befindet. Vielleicht kann jemand einen noch kürzeren Weg finden, es zu testen.

Sie können den Code online ausprobieren . Beispiele:

> 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
quelle
Dieser Online-Golfscript-Editor sieht nützlich aus. Lesezeichen, danke
John Dvorak
Sie können das Finale " "in das ziehen %, um eines zu speichern. Ich habe andere Möglichkeiten zum Testen von a-zA-Z für 11 Zeichen gefunden, aber noch keine für 10.
Peter Taylor
4

APL 69

Übernimmt die Bildschirmeingabe über: t ← ⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]
Graham
quelle
Sollte APL nicht in UTF-8-Bytes gezählt werden? :-)
John Dvorak
@JanDvorak Der APL + Win V5-Zeichensatz besteht aus einem einzelnen Byte. Ich muss in UTF-8 konvertieren, um hier zu posten, damit die Zeichen korrekt dargestellt werden. ⎕av⎕t oben gibt einen Index in den Zeichensatz von 0-255 für die Zeichen im Vektor t zurück.
Graham
4

Kaffeeskript, 134 133 Zeichen

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 ist (im Sinne von Code Golf) eine etwas dichtere Version von Javascript. Es hat nicht den ternären Operator, aber es hat ein Escape zu Javascript.

Hier ist die Javascript-Version:

Javascript, 152 151 Zeichen

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

Eingerückt:

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

Ruby: 89 Zeichen (einschließlich 1 für den -pSchalter)

Nicht kopiert Jan Dvorak ‚s Coffee Lösung , aber nach vielen Versuchen meinen Code ended sah aus wie eine exakte Kopie. Eine unbewusste Stimme flüsterte wahrscheinlich immer wieder „folge dem weißen Kaninchen Jan Dvorak“. Also sollten Aufstimmungen für den Algorithmus zu seiner Antwort gehen.

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

Probelauf:

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
Mann bei der Arbeit
quelle
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
quelle
Netter Versuch, aber es sollte auch Interpunktion an Ort und Stelle halten: pastebin.com/X8QLf6fW
Manatwork
BEARBEITEN: Oh, ich
verstehe
-1

EcmaScript 6 (112 Zeichen)

Die Eingabe erfolgt in s.

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

Basierend auf der Antwort von @Jan Dorvak.

Zahnbürste
quelle
-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;
    }

Minimiert

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;}
mikrobisch
quelle
Sollte es nicht sein A-Za-z?
Cyoce
@Cyoce Ein kleines Detail: [A-z]geht nicht [A-Za-z]. Der erste Fehler ist ein häufiger (?) Fehler, da er nicht alphabetische Zeichen enthält.
Erik der Outgolfer
1
Sollte das nicht auch Golf sein?
Cyoce