倒转单词,不改变大小写或标点符号


13

创建一个使用最少字符数的程序,以反转字符串中的每个单词,同时将单词的顺序以及标点和大写字母保持在其初始位置。

所谓“单词的顺序”,是指每个单词都被一个空格隔开(“”),因此,收缩等将被视为一个单词。收缩中的撇号应留在同一位置。(“ Do n't” =>“ Tno'd”)。

(标点符号表示不是az,AZ或空格*的任何字符)。

  • 由于您没有大写字母,因此已从此列表中删除数字。现在将数字视为标点符号。

例如,对于输入:

Hello, I am a fish.

它应该输出:

Olleh, I ma a hsif.

注意,O(第一个单词的第一个字母)现在是大写字母,因为H在同一位置之前是大写字母。

逗号和句点也位于同一位置。

更多示例:

This; Is Some Text!

将输出

Siht; Si Emos Txet!

可以使用任何语言。字符数最少的程序获胜。


3
应该如何治疗宫缩?那是Don't touch that!映射到t'noD hcuot taht!还是到noD't hcuot taht!
dmckee ---前主持人小猫,

2
@dmckee“(标点符号表示不是az,AZ,1-9或空格的任何字符)”
John Dvorak

1
@dmckee,所以它应该映射到Nod't hcuot tath!
John Dvorak

1
反转每个单词很容易。反转每个单词并保持大写不是。
John Dvorak

1
是的,这就是挑战;)仅简单地将它们反转就太简单了,很可能会归结为所使用的语言。这是为了让您思考。
nasonfish

Answers:


7

GolfScript,58 54 48个字符

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

这是一个GolfScript解决方案,它变得相当长。许多代码实际上是在查找字符是否在a-zA-Z中。也许有人可以找到一种更短的测试方法。

您可以在线尝试代码。例子:

> 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.

那个在线golfscript编辑器看起来很有用。收藏,谢谢
John Dvorak

您可以拉动最终" "%保存一个。我发现测试-ZA-Z的11个字符的其他方式,但没有却为10
彼得·泰勒

4

APL 69

通过以下方式进行屏幕输入:t←⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]

APL不应以UTF-8字节计数吗?:-)
约翰·德沃夏克

@JanDvorak APL + Win V5字符集是单字节。我必须转换为UTF-8才能在此处发布文字,以便正确呈现字符。上面的avavt返回向量t中字符从0-255的字符集索引。
格雷厄姆

4

Coffeescript, 134 133个字符

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是(出于代码高尔夫的目的)JavaScript的稍密集版本。它没有三元运算符,但是可以使用javascript进行转义。

这是javascript版本:

Javascript 152 151个字符

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

缩进:

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

2

Ruby:89个字符(其中1个用于-p切换)

没有复制Jan DvorakCoffeeScript解决方案,但是经过多次尝试,我的代码看起来像是完全相同的副本。一个潜意识的声音可能一直在低语“跟随白兔子扬·德沃夏克”。因此,对该算法的支持应归功于他的答案。

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

样品运行:

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

0

卢阿(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)))

不错的尝试,但也应将标点符号保持在适当的位置:pastebin.com/X8QLf6fW
manatwork 2013年

编辑:哦,我现在看到了
mniip

-1

EcmaScript 6(112个字符)

输入在中提供s

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

基于@Jan Dorvak的答案。


-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;
    }

缩小的

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;}

不是A-Za-z吗?
Cyoce '16

@Cyoce一个小细节:[A-z]不是[A-Za-z]。第一个是常见的(?)错误,因为它包含非字母字符。
暴民埃里克(Erik the Outgolfer)

1
而且,这不是应该打高尔夫吗?
Cyoce '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.