대문자 나 구두점을 바꾸지 않고 단어 반전


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 --- ex-moderator 고양이

2
@dmckee "(문구는 az, AZ, 1-9 또는 공백이 아닌 문자를 의미합니다)"
John Dvorak

1
@dmckee 그래서 매핑한다Nod't hcuot tath!
존 드보락

1
각 단어를 바꾸는 것은 쉽습니다. 각 단어를 바꾸고 대문자를 유지하는 것은 아닙니다.
John Dvorak

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.

온라인 골프 스크립트 편집기가 유용하게 보입니다. 북마크, 감사
John Dvorak

당신은 " "내부를 최종을 당겨 %하나를 저장할 수 있습니다 . 나는 11 문자에 대해 a-zA-Z를 테스트하는 다른 방법을 찾았지만 아직 10에 대해서는 테스트하지 않았습니다.
Peter Taylor

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 바이트로 계산해서는 안됩니까? :-)
John Dvorak

@JanDvorak APL + Win V5 문자 세트는 1 바이트입니다. 문자를 올바르게 렌더링하려면 여기에 게시하려면 UTF-8로 변환해야합니다. 위의 ⎕av⍳t는 벡터 t의 문자에 대해 0에서 255까지의 문자 집합으로 색인을 반환합니다.
Graham

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는 (코드 골프 목적으로) 약간 더 밀집된 자바 스크립트 버전입니다. 삼항 연산자는 없지만 자바 스크립트로 이스케이프됩니다.

다음은 자바 스크립트 버전입니다.

자바 스크립트, 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

루비 : 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 10

편집 : 오, 지금 본다
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

@Cyoce 약간의 세부 사항 : [A-z]아닙니다 [A-Za-z]. 첫 번째는 알파벳이 아닌 문자를 포함하기 때문에 일반적인 (?) 실수입니다.
Outgolfer Erik

1
이게 골프 야?
Cyoce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.