大文字と小文字を区別する(非常に)敏感な文字列を解読する


53

ゴール

これは簡単な挑戦です。あなたの目標は、各文字を同じケースの次の文字と交換し、文字以外の文字を変更せずに文字列を解読することです。

例

ステップごとの説明

  1. 最初の文字はEです。大文字の次の文字を探します:a Cです。これらの文字を交換すると、につながりCdoE!ます。

  2. 次の文字に進みdます。これはです。次の文字を小文字で探します:それはoです。これらの文字を交換すると、につながりCodE!ます。

  3. 次のキャラクターに進みます。これはdここで移動したものです。既に処理されているため、無視します。

  4. 次のキャラクターに進みます。これは、Eステップ1でここに移動したものです。既に処理されているため、無視します。

  5. 次の文字に進み!ます。これはです。手紙ではないので無視します。

ルール

  • 入力文字列は、32〜126の範囲の印刷可能なASCII文字のみで構成されていると想定できます。

  • 完全なプログラムまたは関数を作成して、結果を出力または返すことができます。

  • 入力文字列に奇数個の文字が含まれている場合、最後の残りの文字を別の文字と交換することはできません。文字列に含まれる文字数が偶数で、大文字と小文字が奇数である場合、同じロジックが適用されます。

  • これはコードゴルフなので、バイト単位の最短回答が勝ちです。標準的な抜け穴は禁止されています。

テストケース

Input : lLEhW OroLd!
Output: hELlO WorLd!

Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf

Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg

Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!

それほどランダムではないテストケース:

Input : (^_^)
Output: (^_^)

Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP

Input : hwn oeesd acsp nawyya
Output: who needs caps anyway

Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken

Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.

入力に偶数個の文字が含まれているが、奇数個の大文字と奇数個の小文字が含まれている場合、同様のコメントが保持されると思います。
グレッグマーティン

14
これは本当に巧妙な挑戦です...小文字の文字列を入力し、一部の文字を大文字にランダムに変更し、問題を解決するのとまったく同じプログラムを実行することで、テストケースを作成できることも気に入っています!
グレッグマーティン

1
@GregMartinテストケースを試すときに、入力ではなく出力を誤って入力したため、問題はそれ自身の逆であることがわかりました:
ルイスメンドー

複数の非文字ASCII文字を含むテストケースを含める必要があると思います...実装が一部の実装では、予期しない場合に誤って相互に切り替えられる可能性があると思います。
グレッグマーティン

3
テストケースには、おそらく大文字を含まない文字列と、文字をまったく含まない文字列を含める必要があります。
デニス

回答:


4

ゼリー21 20 19 18バイト

s2UF,
nŒlTÇyJịŒsµ⁺

オンラインでお試しください!

使い方

nŒlTÇyJịŒsµ⁺  Main link. Argument: s (string)

 Œl           Convert to lowercase.
n             Test for inequality.
   T          Truth; yield all indices of 1's.
    Ç         Call the helper link. Yields [A, B] (pair of lists).
      J       Indices; yield I := [1, ..., len(s)].
     y        Translate; replace the integers of I that occur in A with the
              corresponding integers in B.
        Œs    Swapcase; yield s with swapped case.
       ị      Use the translated index list to index into s with swapped case.
          µ   Combine all links to the left into a chain.
           ⁺   Duplicate the chain, executing it twice.


s2UF,         Helper link. Argument: J (list of indices)

s2            Split J into pairs. If the length is odd, the last list will be
              a singleton list.
  U           Upend; reverse each pair. This is a no-op for singletons lists.
   F          Flatten, concatenating the pairs.
    ,          Pair the previous result with J.


9

MATL、22バイト

2:"tttk<f2etAZ))P5M(Yo

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

2:"       % Do the following twice
  ttt     %   Input string (implicit). Push three more copies
  k       %   Convert to lowercase
  <f      %   Indices of characters that had their code point increased by
          %   the lowercase conversion, i.e. that were uppercase letters
  2e      %   Convert to 2-row matrix. This pads a zero in the lower-right 
          %   corner if necessary
  tAZ)    %   Keep only columns that don't contain zeros. Thus if there
          %   was a character that can't be swapped it will be ignored             
  )       %   Get 2-row matrix of characters at those positions
  P       %   Flip vertically. This does the swapping
  5M      %   Push matrix of original indices again
  (       %   Write the swapped characters onto their original positions
  Yo      %   Change case. In the first iteration, this prepares the
          %   string so the second iteration will process the letters that
          %   were originally lowercase. In the second iteration, it
          %   undoes the change of case 
          % End (implicit)
          % Display (implicit)

6

Bash + Unixユーティリティ、77 62 57 56 54バイト

sed -r "s/([$1)([^$1*)([$1)/\3\2\1/g"||$0 a-z]|$0 A-Z]

標準入力。標準出力に出力します。

(この最後のバージョンでは、stderrも書き込まれますが、PPCGのコンセンサスは、それで問題ないようです-stderr は単に無視されます。

編集1:15バイトの@Dennisに感謝します!改善:(a)stdinを介した入力の取得。(b)2つのsedスクリプトを1つに結合します。(c)trをbashパラメーター展開を介して置換に置き換える。(b)と(c)は編集2で消えました。

編集2:さらに5バイト短くします。Edit 1で(b)と(c)の両方を置き換えるために関数呼び出しを使用しました。

編集3:もう1バイト-関数の引数の一部として渡されます]。

編集4:引数がない場合、2つの関数呼び出しをプログラム自体の呼び出しに置き換えました。

テストベッドとサンプル出力:

for x in 'lLEhW OroLd!' 'rpGOZmaimgn uplRzse naC DEoO LdGf' 'eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg' 'NraWgCi: Nsas-eNEiTIsev rNsiTG!!' '(^_^)' 'AWCTY HUOS RETP' 'hwn oeesd acsp nawyya' 'SpMycaeIesKyBorekn' "D's mroyr, Ivam. I'e faardi I act'n od htta."; do ./swapping <<<"$x" 2>/dev/null; done

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.

6

ES6、185の 95バイト

i=>(o=[...i]).map((c,j)=>/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?o[o[j]=o[b],b]=c:j:0)&&o.join``

@ Neil、@ Arnauld、@ edc65の助けを借りてソリューションが大幅に短縮されました

説明

f = i =>
  // Get array of characters from input string
  (o = [...i])
    .map((c, j) => 
      // Check if it's a text character, otherwise skip it
      /[a-z]/i.test(c) ? 
        // Get last character position for case
        // merged with setting a variable for if the character is lowercase
        // merged with storing the current case character position,  
        // under properties on the array (with keys "true" or "false")
        o[e = c>"Z"] =
          // Check if there exists a character position to switch with
          // merged with storing the current position for quick access
          1/(b=o[e]) ? 
            // This statement will end up returning the Array subset, 
            // which will be falsy in the above conditional since (1/[])==false
            o[
              // Switch left character to the right
              o[j]=o[b]
            // Switch right character to the left
            ,b]=c : 
            // No character exists for case, so return current character position
            j
         // It was not a text character, so do nothing
         :0
      )
  // Join array and return as result
  && o.join``;

`lLEhW OroLd!
NraWgCi: Nsas-eNEiTIsev rNsiTG!!
rpGOZmaimgn uplRzse naC DEoO LdGf
eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
(^_^)
AWCTY HUOS RETP
hwn oeesd acsp nawyya
SpMycaeIesKyBorekn
D's mroyr, Ivam. I'e faardi I act'n od htta`
  .split`\n`
  .map(testCase => console.log(f(testCase)));


6バイト、2番目のステートメントを削除すると、囲み括弧が冗長になります。
1

2
最後のコメントは無視してください。ここでは99です:/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
アルノー

2
[o[b],o[j]]=[c,o[b]]可能性がありますo[o[j]=o[b],b]=c
edc65

ここでの本当のmasterstrokeは、配列のインデックスとしてtrueとfalseを使用している
edc65

おかげさまで、95人になりました。理にかなった方法でソリューションを文書化することは本当に難しくなり始めています。XD @ edc65は、インデックスではなく、配列オブジェクトのプロパティとして保存されます。ええアーナウルドは、それらが文字配列に格納されていることを理解しましたが、オブジェクトの再利用は、別の提案から来たと思います。最初は別のオブジェクトに保存されていましたが、これはもちろんチャレンジの範囲にはまったく必要ありませんでした。
1


3

QBasic、229バイト

LINE INPUT s$
FOR i=1TO LEN(s$)
c$=MID$(s$,i,1)
IF"@"<c$AND"[">c$THEN
IF u THEN MID$(s$,u,1)=c$:MID$(s$,i,1)=u$
u=-i*(u=0)
u$=c$
ELSEIF"`"<c$AND"{">c$THEN
IF l THEN MID$(s$,l,1)=c$:MID$(s$,i,1)=l$
l=-i*(l=0)
l$=c$
END IF
NEXT
?s$

戦略

入力文字列をループします。大文字に遭遇すると、それとその位置を保存します。2回目に大文字に遭遇すると、それらの保存された値を使用して前の値と交換します。小文字でも同じです。

(QBasicの文字列は不変だと思っていたため、配列を使用したかなり長いバージョンを投稿しようとしていました。それから、MID$(strng$, index, length) = replacement$うまく動作するという事実に出会いました。

Ungolfed +コメント済み

LINE INPUT text$

FOR i = 1 TO LEN(text$)
  char$ = MID$(text$, i, 1)
  IF "A" <= char$ AND "Z" >= char$ THEN
    ' Uppercase
    IF upperIndex = 0 THEN
      ' This is the first of a pair of uppercase letters
      ' Store the letter and its index for later
      upperLetter$ = char$
      upperIndex = i
    ELSE
      ' This is the second of a pair of uppercase letters
      ' Put it at the position of the previous uppercase letter
      ' and put that letter at this letter's position
      MID$(text$, upperIndex, 1) = char$
      MID$(text$, i, 1) = upperLetter$
      upperIndex = 0
    END IF
  ELSEIF "a" <= char$ AND "z" >= char$ THEN
    ' Lowercase
    IF lowerIndex = 0 THEN
      ' This is the first of a pair of lowercase letters
      ' Store the letter and its index for later
      lowerLetter$ = char$
      lowerIndex = i
    ELSE
      ' This is the second of a pair of lowercase letters
      ' Put it at the position of the previous lowercase letter
      ' and put that letter at this letter's position
      MID$(text$, lowerIndex, 1) = char$
      MID$(text$, i, 1) = lowerLetter$
      lowerIndex = 0
    END IF
  END IF
NEXT i

PRINT text$

2

C ++ 11(GCC)、154 149バイト

#include<algorithm>
[](std::string s){int*p,u,l=u=-1;for(auto&c:s)(c|32)-97<26U?p=&(c&32?u:l),~*p?(std::swap(c,s[*p]),*p=-1):*p=&c-&s[0]:0;return s;}

1
#include<string>C ++ 14に切り替えるか、C ++ 14に切り替えて汎用ラムダ[](auto s)を宣言し、であると想定sする必要がありstd::stringます。また、宣言[](auto&s)することで、入力引数を変更して出力として機能するため、文字列を返す必要がなくなります。
カールナップ

2

Qbasic、436 408バイト

LINE INPUT a$:b=len(a$):FOR a=1TO b:t$=MID$(a$,a,1)
IF"@"<t$AND"[">t$THEN
b$=b$+"U":u$=u$+t$
ELSEIF"`"<t$AND"{">t$THEN
b$=b$+"L":l$=l$+t$
ELSE b$=b$+t$
END IF:NEXT
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT
FOR x=1TO b:t$=MID$(b$,x,1)
IF"U"=t$THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF"L"=t$THEN l=l+1:z$=z$+MID$(h$,l,1)
ELSE z$=z$+t$
END IF:NEXT:?z$

DLoscのおかげで1バイト節約されました。文字以外の文字の処理を変更することにより、さらにいくつかを節約しました。

これは基本的に3つの部分で構成されます。

  • 入力を3つの文字列(大文字、小文字、およびマップ(他の文字も保持))に分割する
  • 大文字と小文字の反転
  • マップを使用して出力を(再)構成します。

より詳細な説明(これは以前のバージョンのコードに関するものですが、原則はまだ適用されることに注意してください):

' --- Part I: Reading the input
LINE INPUT a$
'This FOR loop takes one character at a time
b=len(a$):FOR a=1TO b
' And checks in what category the character belongs
t$=MID$(a$,a,1):SELECT CASE t$
' For each group, char t$ is added to that group (u$ for uppercase, 
' l$ for lowercase. The map in b$ is updated with a U or L on this index,
' or with the non-letter char t$.
CASE"A"TO"Z":b$=b$+"U":u$=u$+t$
CASE"a"TO"z":b$=b$+"L":l$=l$+t$
CASE ELSE:b$=b$+t$
END SELECT:NEXT

' --- Part II: Swapping within case-groups
' Loop through u$ and l$ twp chars at a time, and add those chunks in reverse order
' to g$ and h$. Because mid$ doesn't fail past the end of a string (but returns ""), 
' this automatically compensates for odd-length groups.
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT

' --- Part III: Read the map to put it all back together
FOR x=1TO b:t$=MID$(b$,x,1)
' See what group was in this spot, then read the next char from the flipped string.
' This keeps an index on those strings for the next lookup.
IF t$="U"THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF t$="L"THEN l=l+1:z$=z$+MID$(h$,l,1)
' The map contains a non-letter char, just drop that in
ELSE z$=z$+t$
' And finally,display the end result.
END IF:NEXT:?z$

2

PHP、108 93 83バイト

<?=preg_replace([$a="/([a-z])([^a-z]*)([a-z])/",strtoupper($a)],"$3$2$1",$argv[1]);

以前のバージョン(93バイト)

<?=preg_replace(["/([a-z])([^a-z]*)([a-z])/","/([A-Z])([^A-Z]*)([A-Z])/"],"$3$2$1",$argv[1]);

preg_replace()引数として文字列の配列を使用できることを思い出させてくれた@ user59178に感謝します。


元の回答(108バイト)

$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

コードは、使用可能なスペースに合わせてここにラップされます。
コマンドラインから実行できます:

$ php -d error_reporting=0 -r '$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));' 'lLEhW OroLd!'

PHP 7では$f、最初の呼び出し内の割り当てを絞ることにより、1バイトの短いバージョンが可能です。

echo($f=preg_replace)("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

テストケースと未使用バージョンを含む両方のソリューションは、Githubにあります。


1
preg_replace1回の呼び出しだけで済むように、一連の置換を実行できます。さらに、使用する<?=よりも短いですecho。これらを使用すると、回答を93バイトまで簡単に取得できます。
user59178

あなたは正しいpreg_replace()。私はそれを忘れていました。私は好きではありません<?=(私の意見で<?は言語の一部ではなく、単なるマーカーです)php -r。しかし、コードゴルフの目的のためにあなたは再び正しいです。を使用して1バイトを保存できます<?=
axiac

1

Mathematica、96バイト

s[#,r="([a-z])(.*?)([a-z])"]~(s=StringReplace[#,RegularExpression@#2->"$3$2$1"]&)~ToUpperCase@r&

正規表現を使用するLeoのRetinaアンサーのポート。


数学にそのための組み込み機能がないことに正直驚いています。つまり、「イースターの日はいつですか」、「日没はいつですか」、「フランスの形は何ですか」が組み込まれていれば、これも必要です。
sagiksp


1

Bean、83バイト

Hexdump:

00000000 26 53 d0 80 d3 d0 80 a0 5d 20 80 0a a1 81 81 00  &SÐ.ÓÐ. ] ..¡...
00000010 23 81 01 20 80 0a a1 81 81 02 23 81 01 a8 db c1  #.. ..¡...#..¨ÛÁ
00000020 ad da dd a9 a8 db de c1 ad da dd aa bf a9 a8 db  .ÚÝ©¨ÛÞÁ.Úݪ¿©¨Û
00000030 c1 ad da dd 29 a4 b3 a4 b2 a4 31 a8 db e1 ad fa  Á.ÚÝ)¤³¤²¤1¨Ûá.ú
00000040 dd a9 a8 db de e1 ad fa dd aa bf a9 a8 db e1 ad  Ý©¨ÛÞá.úݪ¿©¨Ûá.
00000050 fa dd 29                                         úÝ)
00000053

同等のJavaScript:

a.replace(/([A-Z])([^A-Z]*?)([A-Z])/g,'$3$2$1').replace(/([a-z])([^a-z]*?)([a-z])/g,'$3$2$1')

説明:

a(改行はスクランブルされた文字列の一部にはなれないため)書式なしで入力の最初の行を暗黙的に取得し、大文字と小文字のペアを順番に置き換えることにより、スクランブルされていない文字列を暗黙的に出力します。

こちらからデモをお試しください。

ここでテストスイートを試してください。


1

Ruby、81バイト

puts f=->(i,s){i.gsub /([#{s})([^#{s}*)([#{s})/,'\3\2\1'}[f[$*[0],'a-z]'],'A-Z]']

1

JavaScript(ES6)、80バイト

レオの網膜の回答に基づいています

s=>eval("s"+(r=".replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')")+r.toLowerCase())

これが機能するのは、コード内の大文字のみ.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')AおよびZであり、文字範囲を記述するために使用されるためです。これはまさに、2番目のパスを処理するために小文字に変換する必要があるものです。

テストケース


実際、デニスによるこのPythonの回答と非常によく似ています。
アーナウド

1

ES6 155-195バイト

私はすでにより良い答えがあることを知っていますが、正規表現なしで試してみたかったです。これは句読点でも機能しますが、(^_^)テストに違反しているようです。その場合c()、以下に示す別の関数があります。

f=(s)=>{d={};s=[...s];for(i in s){b=s[i];for(j in s)if(i<j&!d[i]&c(s[j])==c(b)){d[j]=1;s[i]=s[j];s[j]=b;break}}return s.join('')}
c=c=>~(c.charCodeAt()/32)

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> )_^^(

c=c=>((c!=c.toUpperCase())<<1|c!=c.toLowerCase())||c.charCodeAt()

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> (^_^)

説明

f=(s)=>{
    d={};        //list of indexes already swapped
    s=[...s];        //string to array, stolen from above ES6 answer
    for(i in s){
        b=s[i];        //keep a note of what we are swapping
        for(j in s)        //iterate over the array again
            if( i<j & !d[i] & c(s[j])==c(b) ){
                        //only pay attention after we pass i'th
                        //only swap if this char hasn't been swapped
                        //only swap if both chars in same 'category'
                d[j]=1;        //note that the latter char has been swapped
                s[i]=s[j];
                s[j]=b;
                break        //avoid swapping on the same 'i' twice
            }
    }
    return s.join('')        //return as string
}

1

Perl 6、56バイト

{for "A".."Z","a".."z" ->@c {s:g/(@c)(.*?)(@c)/$2$1$0/}}

文字列変数を引数として受け取り、その変数をインプレースで変更して、ラムダを呼び出した後に変数に結果が含まれるようにします。

次の理由により、Perlの場合よりも長くなります。

  • 新しい正規表現構文はより冗長です。たとえば、文字クラスを書き出すと、の<[A..Z]>代わりになり[A-Z]ます。
  • 正規表現はコンパイル時に解析される一流のソースコードであり、自己完結型のサブ正規表現で構成されている場合、文字列は実行時にのみ補間されます(つまり、文字列を文字クラスに補間することはできません)。
  • Explict EVALには柔軟性がありますが、ゴルフにやさしいuse MONKEY-SEE-NO-EVAL;プラグマが必要です。

プラス側では、@変数内の配列は正規表現で直接参照でき、代替として扱われます。


Perl 6、65バイト

{reduce ->$_,@c {S:g/(@c)(.*?)(@c)/$2$1$0/},$_,"A".."Z","a".."z"}

機能バージョン(結果をラムダの戻り値として出力します)。


1

R、343バイト

ひどく不器用なRソリューション:

f <- function(x) {
        y=unlist(strsplit(x,""))
        z=data.frame(l=ifelse(y %in% letters,0,ifelse(y %in% LETTERS,1,2)),s=y)
        l <- list(which(z$l==0),which(z$l==1))
        v <- unlist(l)
        for(j in 1:2) for (i in seq(1,ifelse(length(l[[j]])%%2==1,length(l[[j]])-2,length(l[[j]])-1),2)) l[[j]][i:(i+1)] <- rev(l[[j]][i:(i+1)])
        z[v,] <- z[unlist(l),]
        return(z$s)
    }

f("D's mroyr, Ivam. I'e faardi I act'n od htta.")

# [1] I ' m   s o r r y ,   D a v e .   I ' m   a f r a i d   I   c a n ' t   d o   t h a t .

1

Python 2、181バイト

本来あるべきよりもはるかに長いが、とにかく:

def F(s):
 for l in[i for i,c in enumerate(s)if c.isupper()],[i for i,c in enumerate(s)if c.islower()]:
  for a,b in zip(l[0::2],l[1::2]):s=s[:a]+s[b]+s[a+1:b]+s[a]+s[b+1:]
 print s

これにより、最初に2つのリストが作成されます。1つは大文字のインデックス、もう1つは小文字のインデックスです。これらのリストはそれぞれ、インデックスのペアでループされ、これらのインデックスの文字が切り替えられます。

明日これでゴルフをしますが、今のところは寝る時間です。


1

ピップ、28バイト

Y[XLXU]aRy.`.*?`.y{Sa@0a@va}

入力をコマンドライン引数として受け取ります。オンラインでお試しください!

説明

これは、組み込みの正規表現変数XL(小文字、`[a-z]`)およびXU(大文字、)を使用した正規表現ソリューション`[A-Z]`です。

                              a is 1st cmdline arg; v is -1 (implicit)
Y[XLXU]                       Yank a list containing XL and XU into y
         y.`.*?`.y            Concatenate y, `.*?`, and y itemwise, giving this list:
                              [`[a-z].*?[a-z]`; `[A-Z].*?[A-Z]`]
       aR                     In a, replace matches of each regex in that list...
                  {        }  ... using this callback function:
                   Sa@0a@v     Swap the 0th and -1st characters of the match
                          a    and return the resulting string
                              Print (implicit)

の2番目の引数Rがリストの場合、置換は連続して実行されます。したがって、小文字の置換と大文字の置換は互いに干渉しません。



1

AWK121 129バイト

BEGIN{FS=OFS=""}{for(a=1;a<=NF;a++){if($a~/[A-Z]/?U>0?p=U+(U=0):0*(U=a):$a~/[a-z]/?L>0?p=L+(L=0):0*(L=a):0>0){t=$a;$a=$p;$p=t}}}1

オンラインでお試しください!注:リンクには、複数行の入力を許可するために8バイトが追加されています

使用法はかなり一般的ですがAWK、フィールドセパレーターとして空の文字列を受け入れるバージョンが必要です(ほとんどのバージョンですgawkが、オリジナルAWKは失敗するはずです:()

単純に各文字を反復処理し、前にそのケースの1つが見つかったかどうかを確認するため、非常に簡単です。その場合、文字を交換し、チェックされたインデックスをリセットします。物事の学習面では、AWK以前は割り当てステートメント内で割り当てステートメントを使用したことはありませんでした。何らかの理由で、それは決して現れなかった。:)

BEGINコマンドラインの割り当てなどを使用してOFSとFSをブロックの外側に割り当てるように言うことで、数バイト削ることができるかもしれませんが、この方法で「よりきれいに」なります。

TIOのリンクを追加すると、私は修正に8つのバイトを必要とする転写誤りがあったことを見せてくれた:((私は左0*(U=a):




1

R223 163バイト 148バイト

編集:forループを実装して-60バイト

編集:ジュゼッペから-15バイト

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));x=sum(l|1)%/%2;u[l[1:(x*2)]]=u[c(matrix(l,2)[2:1,1:x])]};cat(intToUtf8(u,T),sep="")

オンラインでお試しください!

文字が小文字か大文字かをテストし、それらをマトリックスに配置し、マトリックスを反転して、スワップ形式で値を抽出します。次に、で出力しcatます。scan(,'')コードが複数行であるため、コードの1行全体にセミコロンがある場合は、オンラインで試してみてください。


私はあなたのリンクで168を得ますが、このゴルフは163です
ジュゼッペ

そして、これは 162にそれをもたらします
ジュゼッペ

これはおそらく機能します。xあいは賢い少しですが、を取り除くm=matrixだけでなく4つのバイトでした。
ジュゼッペ

scan(,'')の問題?そして、「lLEhW OroLd!」の削減 TIO scan(,'')または他の方法で入力を取得しますか?
Sumner18

1
カップルを見逃した:tio.run
ジュゼッペ

0

Java 7、117バイト

String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

編集:私はそれについて独立して考えていたにもかかわらず、私は@LeoのRetinaの答えと同様の答えを持っていることに気付きました。

ゴルフをしていない:

String c(final String s) {
  String x = "([a-z])(.*?)([a-z])",
         y = "$3$2$1";
  return s.replaceAll(x, y).replaceAll(x.toUpperCase(), y);
}

テストコード:

ここで試してみてください。

class M{
  static String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

  public static void main(String[] a){
    System.out.println(c("lLEhW OroLd!"));
    System.out.println(c("rpGOZmaimgn uplRzse naC DEoO LdGf"));
    System.out.println(c("eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg"));
    System.out.println(c("NraWgCi: Nsas-eNEiTIsev rNsiTG!!"));
    System.out.println(c("(^_^)"));
    System.out.println(c("AWCTY HUOS RETP"));
    System.out.println(c("hwn oeesd acsp nawyya"));
    System.out.println(c("SpMycaeIesKyBorekn"));
    System.out.println(c("D's mroyr, Ivam. I'e faardi I act'n od htta."));
  }
}

出力:

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.