大/小文字を区別する文字列をもっと楽しく


28

この課題に触発された(または、より具体的には誤読する)ことで、次の課題を思いつきました。

入力文字列Sを指定すると、すべて大文字とすべて小文字の順序が逆になります。文字以外の文字はすべてそのままにしておきます。例えば:

こんにちは世界!

大文字W(最初の大文字)がH(最後の)に置き換えられたことに注意してください。小文字についても同様です。「d」(最初)はe(最後)と交換され、l(2番目)はl(ペン最後)に置き換えられます...文字以外の文字はすべてそのまま残ります。

入力

  • 入力は、32〜126の範囲のASCII文字のみの文字列です。
  • 入力は少なくとも1文字以上であることが保証されており、言語の制限を超えることはありません。

出力

  • 説明どおりに文字を交換した同じ文字列。

追加のルール

  • 標準的な抜け穴は禁止されています
  • 回答は、スニペットまたはREPLエントリではなく、完全なプログラムまたは関数でなければなりません。
  • 、バイト単位の最短回答が勝ちます。

テストケース

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

2文字のテストケースを含めることもできますが、最初のソリューションは最初は失敗しました。(変更することにより無償で固定.+する.*
ETHproductions

「lazy doge」はこのことを思い出させてくれました:youtube.com/watch
v

回答:


5

MATL、14バイト

2:"t@Y2myy)Pw(

MATL Onlineでお試しください

説明

        % Impicitly grab input as a string
2:      % Push the array [1, 2] to the stack
"       % For each value in this array
  t     % Duplicate the top element of the stack (S)
  @     % Get the current loop index
  Y2    % Load the predefined literal 1Y2 ('ABC...Z') on the first loop
        % and the predefined literal 2Y2 ('abc...z') on the second loop (M)
  m     % Create a logical array the length of S that is TRUE when a character is in the
        % array M and FALSE otherwise (B)
  yy    % Make a copy of both S and B
  )     % Grab just the letters of S that were in M using B as an index
  P     % Reverse this array
  w     % Flip the top two stack elements
  (     % Assign them back into the string
        % Implicit end of for loop and implicit display

1
よくやった!私が持っていた2:"tttXk>f)5MP(Yo17バイトのために
ルイスMendo

11

網膜、19バイト

Retinaには文字列を逆順にする直接的な方法はありませんが、ソートステージを利用してそれを行うことができます。

O^#`[a-z]
O^#`[A-Z]

指定された正規表現に一致するすべての文字列(最初の行は小文字、2番目は大文字O)の並べ替え()、数字としての読み取り(#)、および順序(^)の逆順。

これは、数字として数字を含まない文字列を数値として読み取ろうとすると0、それらがとして扱われるため、すべての文字の並べ替えの値が同じになるためです。ソートは安定しているため、同じ順序のままになり、逆にすると元の文字列が逆になります。

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


10

Perl、45バイト

44バイトのコード+ -pフラグ。

for$c(u,l){@T=/\p{L$c}/g;s/\p{L$c}/pop@T/ge}

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

Unicode文字は\p{Lu}\p{Ll}大文字と小文字をそれぞれクラスと一致させます。
したがって/\p{L$c}/、すべての大文字(または小文字)のリストを返します(そしてそれをに格納します@T)。
そして、正規表現は、s/\p{$c}/pop@T/ge最後の文字がそれぞれ(アッパー、そして小文字)の文字に置き換えられます@Tから、それを除去しながら@T


7

JavaScript(ES6)、74 73 71 70バイト

f=
s=>(g=r=>s=s.replace(r,_=>a.pop(),a=s.match(r)))(/[A-Z]/g,g(/[a-z]/g))
<input oninput=o.textContent=f(this.value)><pre id=o>

編集:@Arnauldのおかげで1バイト保存されました。


4
私が知っていた ...より良い方法があった
ETHproductions

5

JavaScript(ES6)、92バイト

s=>(F=(r,s)=>s.replace(r,([x],a,y)=>y+F(r,a)+x))(/[a-z](.*)([a-z])/,F(/[A-Z](.*)([A-Z])/,s))

そこていました正規表現との間の類似性を利用する方法であることが...

テストスニペット


これは、関数がという変数に割り当てられていると仮定していますfか?バイトカウントに含める必要がありますか?
steenbergh

@steenbergh関数は匿名で、好きなように呼び出すことができます
Kritixi Lithos

1
@steenberghいいえ、別の関数を作成しFてから再帰的に2回呼び出す匿名関数です。外部関数は、実際にはそれ自体をどの時点でも呼び出しません。
ETHproductions

なぜ.*正規表現で括弧を使用するのですか?
ルーク

@Lukeがこれらのキャラクターをキャプチャ(ain ([x],a,y)=>
ETHproductions

4

Perl 6の75の 69バイト

{my @a=.comb;@(grep $_,@a).&{@$_=[R,] $_} for /<:Lu>/,/<:Ll>/;[~] @a}

使い方

  1. my @a=.comb;
    文字列を文字に分割し、配列に格納します。

  2. for /<:Lu>/,/<:Ll>/
    それぞれ大文字と小文字に一致する2つの正規表現の場合...

    • @(grep $_,@a)
      正規表現に一致するすべての配列エントリのスライスを取得します。

    • .&{@$_=[R,] $_}
      スライスの逆をそれ自体に割り当てます。

  3. [~] @a
    変更された配列を連結して再度文字列を形成し、それを返します。


@Dadaのソリューションから、文字範囲の代わりにUnicodeクラスを使用するというアイデアを盗んで-6バイト。


3

ゼリー、14バイト

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.
    ,Ṛ$         Pair with its reverse. 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.

ちょっとしたことではありませんが.. 14文字!= 23バイト:) mothereff.in/byte-counter
ギズモ

@Gizmo Jellyはコードページを使用します。詳細については、このメタ投稿を参照してください。
Suever

@スーバーそれはきちんとした、今日何かを学んだ^。^
ギズモ

3

Bash + Unixユーティリティ、122 121バイト

f()(p=[^$1*
v="\)\([$1\)\("
for((n=99;n;n--)){
q="$q;s/^\($p$v.*$v$p\)$/\1\4\3\2\5/"
p=[^$1*[$1$p
}
sed $q)
f a-z]|f A-Z]

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

それほど短くありません。多分誰かがそれをさらにゴルフすることができます。

stdinの入力、stdoutの出力。

これは、200文字未満の入力で正しく機能します。

(実際には、200文字未満の小文字と200文字未満の大文字の文字列を正しく処理します。)

コード内の99を102に増やすと(1バイトの追加コスト)、最大205文字の文字列を処理します。

ただし、sedの最大引数長を超えるため、コードの99を102を超えて増やすことはできません。

特定の入力サイズの制限がないバージョンを次に示しますが、カウントはもう少し長く、137バイトです。(この長いバージョンは、tという名前の補助ファイルに書き込みます。)

f()(p=[^$1*
v="\)\([$1\)\("
for((n=`wc -c<t`;n;n--)){
sed -i "s/^\($p$v.*$v$p\)$/\1\4\3\2\5/" t
p=[^$1*[$1$p
})
cat>t
f a-z]
f A-Z]
cat t

テスト実行:

for x in A Ok OK 'Hello, World!' 0123456789 'The quick brown Fox jumps over the lazy doge' odd racecar 'EtOn Em OsN R AaToNsIsIhT!!1!'
  do
    echo "$x"
    ./swapping3 <<<"$x"
    echo
  done

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

TIOで失敗するのは興味深いことです。system sedシステムにインストールされている実装に依存sedする-r場合がありますが、GNU にオプションを追加し\、すべての括弧のエスケープを削除できます。
マナトワーク


2

Java(OpenJDK 8)、271バイト

s->new String(new Error(){char[]o=s.toCharArray();char c;int b;{while(b++<2)for(int l=0,r=o.length;l<r;l++){for(--r;r>l&&f(r);r--);for(;l<r&&f(l);l++);if(l<r){o[l]=o[r];o[r]=c;}}}boolean f(int i){c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);}}.o)

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


これをラムダにすることで、いくつかのバイトを節約できます。s->new String...
NonlinearFruit

1
@NonlinearFruitありがとうございます!294-> 272、初期化なしでrとlを再利用したときの誤りも修正しました。
DmitrySamoylenko

PPCGへようこそ!あなたはゴルフまだできたいくつかの点:char[]o=s.toCharArray();char c;int b;char o[]=s.toCharArray(),c,b;。両方&&&'; そしてc=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);までc=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);合計259バイト)。そして、私はおそらくそれをもっとゴルフするいくつかのことを逃しました。また、まだ見たことがない場合は、Javaでのゴルフのヒントを読むのも面白いかもしれません。
ケビンCruijssen

1

R、107バイト

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));u[l]=u[rev(l)]};cat(intToUtf8(u,T),sep="")

リンクされたチャレンジへの私の応答から適応。これはペアを交換するよりもかなり簡単です。いくつかのゴルフでサブ100を手に入れることができるのかな?

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.