大文字や句読点を変更せずに単語を逆順にする


13

文字列内の各単語を逆順に並べ、句読点と大文字を最初の場所に保持しながら、文字数が最小のプログラムを作成します。

「単語の順序」とは、各単語が空のスペース( "")で分割されていることを意味するため、短縮などは1つの単語として扱われます。収縮のアポストロフィは同じ場所にとどまる必要があります。(「しない」=>「いいえ」)。

(句読点は、a〜z、A〜Z、または空白*以外の文字を意味します)。

  • 大文字の番号を使用できないため、このリストから番号が削除されました。数字は句読点として扱われるようになりました。

たとえば、入力の場合:

Hello, I am a fish.

出力されるはずです:

Olleh, I ma a hsif.

Hは以前は同じ場所で大文字だったため、最初の単語の最初の文字であるOが大文字になっていることに注意してください。

コンマとピリオドも同じ場所にあります。

その他の例:

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!
ジョンドヴォルザーク

1
各単語を逆にするのは簡単です。各単語を反転して大文字を使用することはできません。
ジョンドボラック

1
うん、それは挑戦です;)単にそれらを逆にするだけでは簡単すぎて、使用される言語に帰着するでしょう。これはあなたに考えさせるためのものです。
nasonfish

回答:


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エディターは便利そうです。ブックマーク、ありがとう
ジョンドヴォルザーク

ファイナルを" "内側に引い%て保存できます。私は10のために、まだ他の11文字のため-ZA-Zをテストする方法が、どれを見つけた
ピーター・テイラー

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に変換する必要があります。上記の⎕av⍳tは、ベクトルtの文字に対して0〜255の文字セットのインデックスを返します。
グラハム

4

コーヒースクリプト、 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文字(-pスイッチの1文字を含む)

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

編集:ああ私は今見る
-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少し詳細:で[A-z]はありません[A-Za-z]。最初の1つはよくある(?)間違いです。「アルファベット以外の文字が含まれているためです。
エリックアウトゴルファー16

1
また、これは、ゴルフをするべきではありませんか?
チョイス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.