ケースの変更


42

今日の課題では、文字列の大文字と小文字を交互に切り替えるプログラムまたは関数を作成する必要があります。ただし、アルファベット以外の文字は無視する必要があります。これは、すべてのアルファベット文字の大文字と小文字が前後のアルファベット文字異なる必要があることを意味します。これは、たとえば他のすべての文字を大文字にするよりも少し複雑です。次のような文字列を取る場合

hello world

そして、他のすべての文字を大文字に変換すると、次のようになります:

hElLo wOrLd

ご覧のとおり、小文字のo後に小文字が続きwます。これは無効です。代わりに、スペースを無視して、次の結果を得る必要があります。

hElLo WoRlD

アルファベット以外の文字はすべて同じにしておく必要があります。一貫して交互に出力される限り、出力は大文字でも小文字でも開始できます。これは、以下も許容可能な出力であることを意味します。

HeLlO wOrLd

プログラムは、入力の大文字と小文字に関係なく動作するはずです。

入力文字列には印刷可能なASCIIのみが含まれるため、印刷できない文字、改行、またはUnicodeを心配する必要はありません。あなたの提出物は、完全なプログラムまたは機能のいずれかであることができます、そして、あなたはどんな合理的な形式ででも入力と出力をするかもしれません。たとえば、関数の引数/戻り値、STDIN / STDOUT、ファイルの読み取り/書き込みなど。

例:

ASCII                                   ->  AsCiI
42                                      ->  42
#include <iostream>                     ->  #InClUdE <iOsTrEaM>
LEAVE_my_symbols#!#&^%_ALONE!!!         ->  lEaVe_My_SyMbOlS#!#&^%_aLoNe!!!
PPCG Rocks!!! For realz.                ->  PpCg RoCkS!!! fOr ReAlZ.
This example will start with lowercase  ->  tHiS eXaMpLe WiLl StArT wItH lOwErCaSe
This example will start with uppercase  ->  ThIs ExAmPlE wIlL sTaRt WiTh UpPeRcAsE
A1B2                                    ->  A1b2

これは、標準の抜け穴が適用され、バイト単位の最短回答が勝ちます!


33
うわ、私はちょうどこれが気づいたてきたというミームはXD
ベータ崩壊を

@BetaDecayハハハ、それは私の意図ではありませんでした。もっと不幸なタイミング。私はそれをchat-mini-challengeと考えていますが、見た目よりも微妙に難しいので、その背後にあるアイデアが好きです。
DJMcMayhem

4
次の課題は、ASCIIスポンジàラ・印刷することであるcowsay
Frambot

1
くそ!私はちょうど(昨日のように)このためCJamスクリプトを書いて、それを削除しました。
エソランジングフルーツ

2
タイトルまたは少なくとも運命のペンギンまたはスポークのいずれかを使用した例について、いくつかの見逃された可能性があります。
イアン

回答:


19

JavaScript(ES6)、66 63バイト

大文字で始まります。

s=>s.replace(/[a-z]/gi,c=>c[`to${(s=!s)?'Low':'Upp'}erCase`]())

テストケース


まさに私がそれをやろうとしていた。私はあなたが数バイトを保存できる場所を見ることができると思いますが、私は携帯電話にいるので適切にテストすることはできません。
シャギー

うん、三元を使用することは私が提案しようとしていたものです。
シャギー

1
s=!sトリックはどのように機能しますか?
KritixiのLithos

7
@KritixiLithos sは入力文字列であるため、!s最初に評価されますfalse(入力文字列が空の場合を除き、その場合評価されtrueますが、空の文字列は一致を生成しません)。その後は、とを交互に切り替えて、標準のブール演算にfalseなりtrueます。また、sフィードに既に使用されていたため、この時点でコンテンツを失うことはありません.replace()
アーナウド

3
@MayorMonty残念ながら、これはいくつかのシンボルに一致します。などの入力"A[I"は失敗します。
アーナルド

12

05AB1E11 8バイト

コード:

lvyJ¤aiš

05AB1Eエンコードを使用します。オンラインでお試しください!

説明:

l           # Lowercase the input
 vy         # For each element..
   J        #   Join the entire stack into a single string
    ¤a      #   Check if the last character is alphabetic
      iš    #   If true, swapcase the entire string

私は11バイトを破らなければならないことを知っているので、私は盲目になるのが大好きです。その後、ゆっくりと17バイトから11バイトに移動し、lvy¾Fš}Da½Jすでに持っていたものとまったく同じであることに気付きます。
魔法のタコUr

1
@carusocomputingはるかに簡単な8バイトソリューションがあります。p–
アドナン

4
ああ、そう、簡単。
魔法のタコUr

2
@Octopusこれについてはいくつかの議論がありますが、「osable」と「osabie」の両方を使用しています。
アドナン

1
@octopus文字通りOh-Five-Ay-Bee-One-Eee、私は創造的な人間ではありません。
魔法のタコUr


8

ゼリー、13バイト

nŒsTm2
ŒlŒuǦ

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

使い方

ŒlŒsǦ  Main link. Argument: s (string)

Œl      Cast to lowercase.
    Ǧ  At indices returned by the helper link...
  Œu        apply uppercase.


nŒsTm2      Helper link. Argument: s (string)

 Œs         Apply swapcase to s.
n           Perform vectorizing not-equal comparison.
   T        Compute the truthy indices.
    m2      Select every other one, starting with the first.

7

Japt16 14バイト

r"%l"_m"uv"gT°

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

説明

r              // RegEx replace input
 "%l"          // [A-Za-z] as first arg to replace
     _         // created function Z=>Z as second arg to replace
       "uv"gT° // alternates "u" & "v"
      m        // map Z to either "u" upper or "v" lower

非常に素晴らしい!を削除でき,ます。数字(つまり[12])でない限り、Japtはそれらが異なるアイテムであることを知っています。&1同様に削除できると思います。
オリバー

ありがとう@obarakon。Japtのドキュメントは少しまばらです。
18時13分にパウエル

Japtをご利用いただきありがとうございます。Japtチャットルームで質問、提案などをお気軽にお尋ねください。Japt threadのヒントもあります。:)
オリバー

_m"uv"gT°いいね 私はちょうどそれを提案しようとしていました。
オリバー

@obarakonええ、チャットでETHがあなたの質問に答えた場所を見て、それを試してみました。
パウエル


5

アリス、18バイト

/olZlYuN
@iy.u..//

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

説明

このプログラムは、完全に順序モードで実行される奇数長のプログラムのあまり知られていないテンプレートに従います。このコードの線形化バージョンは次のとおりです。

il.l.uN.YuZyo@

コードの説明:

i - push input onto stack            ["Hello world!"]
l - convert to lowercase             ["hello world!"]
. - duplicate                        ["hello world!", "hello world!"]
l - convert to lowercase (should be no-op, but avoids what seems to be a bug in the TIO implementation)
. - duplicate again                  ["hello world!", "hello world!", "hello world!"]
u - convert to uppercase             ["hello world!", "hello world!", "HELLO WORLD!"]
N - difference between sets          ["hello world!", "helloworld"]
. - duplicate reduced string         ["hello world!", "helloworld", "helloworld"]
Y - unzip (extract even positions)   ["hello world!", "helloworld", "hlool", "elwrd"]
u - convert to uppercase             ["hello world!", "helloworld", "hlool", "ELWRD"]
Z - zip evens back into string       ["hello world!", "helloworld", "hElLoWoRlD"]
y - perform substitution             ["hElLo WoRlD!"]
o - output                           []
@ - terminate

l複製で使用しない場合、後のスタックはにNなります["helloworld", "helloworld"]。これはバグだと強く思う。


5

C(tcc)60 57 56バイト

ASCII大文字/小文字の違いはビット5のみであることに注意してくれたDigitalTraumaのおかげです。

さらに3バイトのゴルフをしてくれたzchに感謝します。

RJHunterのアイデアからもう1バイトを節約する

l;f(char*s){for(;*s=isalpha(*s)?*s&95|++l%2<<5:*s;s++);}

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


私はそれをもう少しゴルフし、 gcc、tcc、clangのすべてで動作するように修正しました。FWIW、gccは文字列リテラルを読み取り専用メモリにstrdup()格納するため、テストドライバーコードで読み取り/書き込みメモリへのポインターを取得していました。
デジタル外傷

1
@DigitalTrauma、ありがとう。ビット5が上位と下位の違いであることを認識すべきでした。いいね!
cleblanc

私もこのバージョンを再帰的にしようとしましたが、これ以上短くすることはできませんでした。
デジタル外傷

内側の条件付き*s&~32|++l%2<<5を3バイト節約するために置換できます。
-zch

入力は印刷可能なASCIIであることが約束さ&~33&95ているため、で置き換えてさらにバイトを保存できます。
RJHunter

4

Java 8、99バイト

a->{String r="";int i=0;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?i++%2<1?c|32:c&~32:c);return r;}

説明:

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

a->{                          // Lambda with char-array parameter and String return-type
  String r="";                //  Result-String
  int i=0;                    //  Flag for alteration
  for(int c:a)                //  Loop over the characters of the input
    r+=(char)                 //   And append the result-String with the following (converted to char):
      (c>64&c<91|c>96&c<123?  //    If it's a letter:
       i++%2<1?               //     And the flag states it should be lowercase:
        (c|32)                //      Convert it to lowercase
       :                      //     Else (should be uppercase):
        (c&~32)               //      Convert it to uppercase
      :                       //    Else:
       c);                    //     Simply append the non-letter character as is
                              //  End of loop (implicit / single-line body)
  return r;                   //  Return result-String
}                             // End of method

短くすることはできませんでしたが、バイトを使用し(c+"").matches("[A-Za-z]")たりCharacter.isLetter(c)、バイトを節約したりできるかもしれません。
TheLethalCoder

@TheLethalCoderどちらも長いc>64&c<91|c>96&c<123です。intとにかくゴルフCharacter.toUpperCase(...)Character.toLowerCase(...)ゴルフのパーツ(これら:(char)(c&~32)(char)(c|32))に使用しているので、これらのどちらかで短くすることはできません。
ケビンCruijssen

1
とにかくそれらを利用できるかどうかを確認するために投稿する価値はないだろうと思った
-TheLethalCoder

@TheLethalCoderああ、わかった。:)場合によっては、最初の方法が他の課題に対してわずかに異なるアプローチに役立つ場合がありますが、この課題の場合はそのままです。とにかくありがとう。
ケビンCruijssen

a->{String r="";int i=0,f=32;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?(f=~f):c);return r;}
ローマングラフ

4

ルビー、57 55 47 41バイト

バイトカウントには、コマンドラインオプション用の2バイトが含まれます。
たとえば次のように実行します。$ ruby -p0 alternate_case.rb <<< "some input"

gsub(/\p{L}/){($&.ord&95|32*$.^=1).chr}

このp0オプションを使用すると、入力全体が一度に消費され、魔法のグローバル$.が1に増分されます。これは後で0と1の間で切り替えられ、状態を維持するために使用されます。

複数行入力で動作します。 オンラインでお試しください!

素晴らしい入力をしてくれたVenteroに感謝します-詳細についてはコメントを確認してください。


1
それは事実がなければ男、$.それぞれに自動インクリメントgetsコールは、との完全なプログラム-pフラグが短くなってきたでしょう...
バリューインク

1
1&$.+=1括弧を削除できます。また、完全を期すために、別のグローバル整数があります$$。残念ながら、読み取り専用です。
ヴェンテロ

1
コマンドラインフラグに関するもう1つのこと:-p0インタプリタが利用可能なすべての入力を一度に読み取るようにします。したがって、コードは1回だけ呼び出され、を自由に使用できます$.。それを、指定時にgsub暗黙的に動作するという事実と組み合わせると、プログラム全体が大幅に短くなります。フラグは48文字、フラグは2 文字です。$_.gsub!-pgsub(/[a-z]/i){[$&.upcase,$&.downcase][1&$.+=1]}p0
ヴェンテロ

1
最後に、私は約束します:)一度使用したら-p0、実際にいくつかの文字$.を前後に保存することができます:1コードが呼び出されたときに保証されるので、単に使用できます$.^=1
ヴェンテロ

2
私は嘘をついた、別のコメントがあります:D入力には印刷可能なASCIIのみが含まれることが保証されているため、Rubyの正規表現でのUnicodeカテゴリのサポートを使用できます:/\p{L}/(UnicodeカテゴリLetter)は1文字より短い文字です/[a-z|/i
ヴェンテロ

3

Brachylog、25バイト

{ḷ|ụ}ᵐ.{ḷ∈Ạ&}ˢ¬{s₂{∈Ạ}ᵐ}∧

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

これは長くて遅いです。

説明

{   }ᵐ.                       The Output is the result of mapping on each char of the Input:
 ḷ                              Lowecase the char
  |                             Or
   ụ                            Uppercase the char
       {    }ˢ                In the Ouput, select the chars that:
        ḷ∈Ạ&                    when lowercased are in "abc...xyz" (ie are letters)
              ¬{       }∧     In that new string, it is impossible to find:
                s₂              a substring of 2 consecutive chars
                  {∈Ạ}ᵐ         where both of them are in the lowercase alphabet

3

MATL16 15バイト

Xktkyy-f2L))5M(

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

説明

「hello world」の入力を検討する

Xk    % To upper case
      % STACK: 'HELLO WORLD'
t     % Duplicate top element
      % STACK: 'HELLO WORLD', 'HELLO WORLD'
k     % To lower case
      % STACK: 'HELLO WORLD', 'hello word'
yy    % Duplicate top two elements
      % STACK: 'HELLO WORLD', 'hello word', 'HELLO WORLD', 'hello word'
-     % Difference (of code points; element-wise)
      % STACK: 'HELLO WORLD', 'hello word', [-32 -32 -32 -32 -32 0 -32 -32 -32 -32 -32]
f     % Indices of nonzeros
      % STACK: 'HELLO WORLD', 'hello word', [1 2 3 4 5 7 8 9 10 11]
2L)   % Keep only even-indexed values (*)
      % STACK: 'HELLO WORLD', 'hello word', [2 4 7 9 11]
)     % Reference indexing (get values at indices)
      % STACK: 'HELLO WORLD', 'elwrd'
5M    % Push (*) again
      % STACK: 'HELLO WORLD', 'elwrd', [2 4 7 9 11]
(     % Assignment indexing (write values at indices). Implicit display
      % STACK: 'HeLlO wOrLd

'


3

Perl 6の 32の  30バイト

{S:g/<:L><-:L>*<:L>?/$/.tclc()/}

それを試してみてください

{S:g{<:L><-:L>*<:L>?}=$/.tclc}

それを試してみてください

拡張:

{  # bare block lambda with implicit parameter 「$_」

  S            # string replace (not in-place) implicitly against 「$_」

  :global

  {

    <+ :L >    # a letter
    <- :L >*   # any number of non-letters
    <+ :L >?   # an optional letter

  }

  =

  $/.tclc()    # uppercase the first letter, lowercase everything else
}

3

q / kdb +、51 42 38バイト

解決:

{@[x;;upper]1#'2 cut(&)x in .Q.a}lower

例:

q){@[x;;upper]1#'2 cut(&)x in .Q.a}lower"hello world"
"HeLlO wOrLd"

ノート:

.Q.a        // abcde...xyz lowercase alphabet
(&) x in    // where, returns indices for where x (hello world) is an alpha
2 cut       // splits list into 2-item lists
1#'         // takes first item of each 2-item list; ie the indices to uppercase
@[x;;upper] // apply (@) upper to x at these indices

2

V17、13のバイト

VUÍშáü$©/ì&

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

または、すべてのテストケースを検証してください!

HeXdUmP:

00000000: 5655 cde1 83a8 e1fc 24a9 2fec 26         VU......$./.&

説明:

これは圧縮された正規表現 ™️を使用するため、説明する前に正規表現を展開してみましょう。

:%s/\v\a.{-}(\a|$)/\l&

VUすべてを大文字に変換します。次に、これを実行します。

:%                      " On every line:
  s/\v                  "   Substitute:
      \a                "     A letter
        .{-}            "     Followed by as few characters as possible
            (\a|$)      "     Followed by either another letter or an EOL
                  /     "   With:
                   \l   "     The next character is lowercased
                     &  "     The whole text we matched

古い/より興味深い答え:

:se nows
Vuò~h2/á


2

CJam26 24バイト

qeu{_'[,65>&,T^:T{el}&}%

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

説明

q         e# Read all input.
eu        e# Uppercase it.
{         e# For each character:
 _        e#  Duplicate it.
 '[,65>&  e#  Set intersection with the uppercase alphabet.
 ,        e#  Length (either 0 or 1 in this case).
 T^:T     e#  XOR with T (T is initially 0), then store the result back in T.
 {el}&    e#  If The result of the XOR is true, lowercase the character.
}%        e# (end for)

2

Pyth、11バイト

srR~xZ}dGrZ

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

説明

              # Z = 0; Q = eval(input())
srR~xZ}dGrZQ  # Auto-fill variables
         rZQ  # lowercase the input
 rR           # Apply the r function to each letter of the input with
   ~xZ}dG     # ... this as the other argument
   ~          # use the old value of the variable Z, then update it with the value of ...
    xZ        # Z xor ...
      }dG     # the variable d is a lowercase letter
              # because of how mapping works in pyth, d will contain the current letter
              # This causes Z to flip between 0 and 1, alternately upper and lower casing
              # the current character if it is a letter

2

PowerShell、86バイト

-join($args[0]|%{if($_-match"[a-z]"-and($i=!$i)){"$_".toupper()}else{"$_".tolower()}})

入力は[char[]]配列です。

説明のためのコード内のコメント

# Join the array of string and char back together.
-join
    # Take the first argument and pass each element ([char]) down the pipe. 
    ($args[0]|%{
        # Check if this is a letter. Second condition is a boolean that changes at every pass 
        # but only if the current element is a letter. If not the condition never fires
        if($_-match"[a-z]"-and($i=!$i)){
            # Change the character to uppercase
            "$_".toupper()
        }else{
            # Output the character to lowercase. 
            # Special characters are not affected by this method
            "$_".tolower()
        }
    })

2

Haskell、105 83 + 2 4 +セパレーターの1バイト= 108 86 88バイト

import Data.Char
f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
_#l=l

関数は(1#)、小文字で始まります。オンラインでお試しください!

悲しいことに、これはJavaとC#の回答よりも長いということです。3行を1行にマージして22バイトを節約してくれたØrjanJohansenに感謝します。


2
長いインポート関数が必要だったので、試してさえいませんでした...しかし、それは少しです。いくつかの行をマージできます。f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
ØrjanJohansen

ニックピッキングで申し訳ありませんが1#、匿名関数としてはカウントされないと思います。私の理解では、匿名関数を識別子にバインドできるはずですが、たとえば機能しf=1#ません。代わりに(1#)、+ 2バイトのセクションが必要です。これはHaskellでのゴルフに関するコミュニティガイドラインにも暗黙的に記載されていますが、このケースを明示的に言及するように適合させる必要があります。
ライコニ

@Laikoni OK、回答が更新されました
一般的な表示名

2

Googleスプレッドシート、264バイト

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),CHAR(CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))+MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32),MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1))))

これは大きな混乱ですが、展開すると少し簡単になります。

=ArrayFormula(
  JOIN(
    "",
    IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),
      CHAR(
        CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))
        +
        MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32
      ),
      MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)
    )
  )
) 

擬似ロジックは次のように実行されます。

For each character {                                    // ArrayFormula()
  If (character is a letter) {                          // REGEXMATCH(MID())
    Return CHAR(                                        // CHAR()
      CODE(UPPER(letter))                               // CODE(UPPER(MID()))
      +
      If (nth letter found and n is odd) {32} else {0}  // MOD(LEN(REGEXREPLACE(LEFT())))
    )
  } else {
    Return character                                    // MID()
  }
}

2

Perl 5、24バイト

23バイト+ 1バイト-p

-2バイトの@Dadaに感謝します。

s/\pl/--$|?uc$&:lc$&/eg

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


きちんとした。\pl代わり[a-z]に2バイトtho :)
ダダ

@ダダ、私は本当にそれを知りませんでした!どうして私はそれを知らなかった!! ありがとうございました!
ドンヘイスティングス

私はそれをトン・ホスペルから学んだと思うし、時々それを使う(実際、私はそれをあまりにも頻繁に忘れて[a-z]代わりに使う傾向がある!)疑問に思うなら、perlrecharclassから来ています;)
ダダ


1

C 64バイト

B;R(char *s){for(;*s=isalpha(*s)?(B=!B)?*s|=32:*s&=~32:*s;s++);}

大文字と小文字が0x20でオフセットされるASCIIエンコーディングを利用します。


あなたは間「」のスペースを必要としないchar*s
cleblanc

これは@cleblancの回答非常によく似ています
デジタル外傷

@cleblancの投稿がtoUpper()とtoLower()を使用したときに投稿しました。
-user230118

1
このアプローチ示唆する私のコメントは18:29:34Zでした。 これを組み込むcleblancの編集は18:37:36Zでした。あなたの答えは18:38:21Zに投稿されました。だから、cleblancの答えはあなたの投稿の1分未満だったと思います。あなたの答えは私の提案に非常に似ていますが、それはコードゴルフの性質だと思います-多くの場合、同じ言語のソリューションは同じものに収束します-だからスライドさせます:)
Digital Trauma

1

網膜、32バイト

T`l`L
01T`L`l`[A-Z][^A-Z]*[A-Z]?

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

最初に入力を大文字に変換してから、入力を最大2つの大文字を含む一致にグループ化します。唯一の文字が含まれるのは、最後の文字にペアがない場合だけです。次に、これらの各一致の最初の文字を小文字にします。

01第二段階では、おおよその翻訳:試合数に基づいて、このステージの動作を変更するが、唯一の各試合の最初の文字に変更を適用しません。


1

PHP 5、54バイト

<?=preg_filter('/\pL/e','($0|" ")^a^aA[$i^=1]',$argn);

1

C#、100バイト

s=>{var r="";int m=0;foreach(var c in s)r+=char.IsLetter(c)?(char)(++m%2>0?c|32:c&~32):c;return r;};



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