いいえ、ただCaps Lock


197

CapsLockキーボードのキーにノッチがない場合はどうなりますか?

「このhPPENS。」

このプログラムの目標は、各Aプレスがに置き換えられるキーボードミスを一貫してエミュレートすることCapsLockです。ソースの大文字の「A」でも同じ効果が得られます。ときにCapsLock有効になり、総額が逆転しています。

テストケース

"The quick brown fox jumps over the lazy dog."
-> "The quick brown fox jumps over the lZY DOG."

"Compilation finished successfully."
-> "CompilTION FINISHED SUCCESSFULLY."

"What happens when the CapsLock key on your keyboard doesn't have a notch in it?"
-> "WhT Hppens when the CPSlOCK KEY ON YOUR KEYBOrd doesn't hVE  notch in it?"

"The end of the institution, maintenance, and administration of government, is to secure the existence of the body politic, to protect it, and to furnish the individuals who compose it with the power of enjoying in safety and tranquillity their natural rights, and the blessings of life: and whenever these great objects are not obtained, the people have a right to alter the government, and to take measures necessary for their safety, prosperity and happiness."
-> "The end of the institution, mINTENnce, ND dministrTION OF GOVERNMENT, IS TO SECURE THE EXISTENCE OF THE BODY POLITIC, TO PROTECT IT, nd to furnish the individuLS WHO COMPOSE IT WITH THE POWER OF ENJOYING IN Sfety ND TRnquillity their nTURl rights, ND THE BLESSINGS OF LIFE: nd whenever these greT OBJECTS re not obtINED, THE PEOPLE Hve  RIGHT TO lter the government, ND TO Tke meSURES NECESSry for their sFETY, PROSPERITY nd hPPINESS."

"aAaaaaAaaaAAaAa"
-> "" (Without the notch, no one can hear you scream)

"CapsLock locks cAPSlOCK"
-> "CPSlOCK LOCKS CPSlOCK"

"wHAT IF cAPSlOCK IS ALREADY ON?"
-> "wHt if CPSlOCK IS lreDY ON?"

通常、勝つ基準は、提出されたプログラムのソースコードのサイズです。


110
サイトへようこそ!これは素晴らしい最初の挑戦であり、残念ながら私と私のfT FINGERSにとって非常に関係があります。
DJMcMayhem

5
推奨テストケース:teSTateSTateSTateST
ロッド

88
Enterキーだけにノッチがあった場合、これはそうではありません」
-12Me21

75
tが起こる.......
12Me21

22
文字通りこのサイトに参加して「ノッチなしでは誰もあなたの悲鳴を聞くことはできません」
-lucasvw

回答:


115

AutoHotKey、7バイト

a::vk14

//これは有効ですか?これは本当にOPが望むことをaCapsLock (vk14)ます-で置き換えます。

このプログラムを実行し、キーボードから入力を入力します。


4
「これは有効ですか?」OPは入力または出力の制約を指定していなかったため、これは有効だと思います。
ネフリン

5
ahkの回答が多すぎないようにしてください!
HaveSpacesuit

57
ThT'S GREtですが、どうすればそれを無効にできますか?
RobbG

69
@RobbGは単に「killLL utohotkey」と入力します...ああwIT
ネフリン

5
@tsh私は...あなたがここに冗談を逃したと思う
RobbG

32

V、9バイト

ò/ãa
xg~$

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

Hexdump:

00000000: f22f e361 0a78 677e 24                   ./.a.xg~$

説明:

ò       " Recursively:
 /ãa    "   Move forward to the next 'a' (upper or lowercase)
        "   This will break the loop when there are no more 'a's
x       "   Delete the 'a'
 g~$    "   Toggle the case of every character after the cursor's position.

21

Vim、16バイト

qq/\ca
xg~$@qq@q

入力が単一行にあると仮定します

説明

qq            Start a loop
 /\ca␊         Find the first occurence of an a, end the loop if there are none left
 xg~$          Remove it and invert the case of the rest of the file
@qq@q         End the loop 

この大文字小文字を区別しない「a」の検出ですか?
Gnudiff

\c正規表現検索の任意の場所で@Gnudiffを使用すると、大文字と小文字が区別されません
ハーマンL

動作するには特定のフラグを設定する必要がありg~$ますか?私にとっては、ファイル全体ではなく、行の終わりまで大文字と小文字を反転するだけなので、これは複数行のファイルに対して実際には機能しません。
キュービック

1
@Cubic回答で書いたように、「入力は単一の行にあると仮定する」
ハーマンL

@Cubicファイルの最後に移動して複数行の入力をサポートする場合は、g~vGまたはを実行できますvG~
DJMcMayhem

15

C、72バイト

16バイトの節約を支援してくれた@Ton Hospelに感謝します!

t,c;f(char*s){for(t=0;c=*s++;6305%c?putchar(isalpha(c)?c^t:c):(t^=32));}

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


2
xorと32を使用して文字の大文字と小文字を入れ替えることができます
Ton Hospel

あなたはおそらく持っていることによって、さらに節約することができますtこと0/32偶数/奇数の代わりに、(それぞれ32とのXORトンaと直接)、その後、XORの手紙t
トンHospel

2
検出する良い方法a年代
トンHospel

1
@TonHospel 関数は再利用可能である必要があり、各呼び出し後に再び使用可能にするために外部コードが必要な場合、再利用可能とは見なされません。
Steadybox

1
6305%c場合は0であるc13である
ロージーF

11

、11バイト

Γ·§?m\:€"Aa

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

説明

Γcalledのやや不明瞭なオーバーロードを使用listNFしています。これは、リストを操作する再帰関数を作成します。次のHaskellパターンに対応します。

listNF f = g
  where g (x : xs) = f g x xs
        g [] = []

これlistNFは、ヘルパー関数を受け取り、リストを受け取るf新しい関数を返すという考え方ですg。この関数fは、常にである関数、およびリストのg先頭xと末尾xsを取り、それらに対して何かを行います。このアプリケーションでfは、をg再帰的に呼び出しますxs。プログラムは次のように解釈されます。

Γ (· (§ (?m\) : (€"Aa")))
Γ (                     )  Create a function g that takes a list (x:xs) and applies a function on x and xs.
   · (                 )   Compose g with second argument of function in parentheses.
                           Instead of x and xs, the function is called on x and the result of a recursive call of g on xs.
                (€"Aa")    Check if x is 'A' or 'a'.
        (?m\)              If it is, then swap the case of every char in g(xs).
      §       :            Otherwise, prepend x to g(xs).

3
私は12バイトのソリューションを投稿する前うわー、良いことは、私がリフレッシュさ:Ḟ·+m\ṁx'Ax'a。説明をいただけますか?Γ正確に何ができるかについての情報を見つけることができず、これは学ぶ良い機会のようです。
ソフィア・レヒナー

1
@SophiaLechnerできました。このバージョンはΓ説明するのが少し難しいです、あなたがそれを理解できることを願っています。
ズガルブ

うわー、これは遅いです。TIOだけですか?
FrownyFrog

1
@FrownyFrogそれは殻です。含むプログラムの型推論はΓ一般に遅いようです。Huskに精通していない場合、プログラムは、プログラムのすべての可能な構造(基本的に括弧の可能な配置)と各組み込みのすべてのオーバーロードをループし、結果が適切な最初のものを選択することによって解釈されます。入力しました。インタプリタは、いくつかの可能性を早期に拒否するのに十分賢いですが、再帰バージョンはΓこのステップを混乱させ、多くの選択肢を強制的にループさせることができるようです。
ズガルブ

@SophiaLechner 詳細を説明Γするヒントを書きました。
ズガルブ

11

網膜33 21 17バイト

i(Tv`lL`Ll`a.*
a

オンラインで試す

説明:

i(              i is for case-insensitive, the paren makes it modify both stages
  Tv`           Transliteration, with simple overlaps (v) - 1 match at every start pos
     lL`Ll`     Replace lowercase with uppercase, and vice versa
           a.*  Every 'a' will match, overlapping to the end of the string
                This swaps the case on all letters after each 'a'
a               Replace all 'a's with nothing

マーティンのおかげで-12バイトレオのおかげで
-4バイト


驚いたことに、これは現在のPythソリューションとほぼ同じくらい短いです。
Ton Hospel

1
iT`aAlL`__Ll`a[^a]*a?21バイトでも動作すると思います。
ニール

重複する一致を使用して4バイト短縮
レオ

説明を追加する時間があれば、この仕組みに興味があります。ありがとう!
seshoumara

9

C#、121バイト

Console.WriteLine(string.Join("",Console.ReadLine().Split(new[]{'a','A'}).Select((a,i)=>i%2==0?a:a.ToUpper()).ToList()));

**更新(@John&@aloisdgに感謝)**

C#、69バイト

x=>string.Concat(x.Split('a','A').Select((a,i)=>i%2>0?a.ToUpper():a))

2
PPCGへようこそ!素敵な最初の答え!
RedClover

2
あなたは変化する7つのバイトを保存することができますnew[] { 'a', 'A' }'a', 'A'
ジョン・

5
同じロジックで69バイトで実行できます!オンラインでお試しください!(コンソールの代わりにinput / ouputを使用し、ToListを削除し、3項を逆にして@Johnコメントを使用します)これは良い最初の回答です。立ち止まるな!
-aloisdg

3
CapsLockが有効になっている場合、これらのバージョンはどちらも大文字と小文字を交換しません(大文字のみに変換します)。これは要件です。(最後のテストケースを参照)
ブロードウェル

@Broadwell CapsLockが有効になっているかどうかをどのように知りますか?最後のテストケースは正しいですか?私が見る限り、他のすべてのテストケースに合格します。ありがとう!
Aalawlx

7

JavaScript(ES6)、93 88 84 82バイト

(@Shaggyのおかげで5バイト、@ user81655のおかげで4バイト、@ l4m2のおかげで2バイト保存されました。)

a=>a.replace(A=/./g,c=>c in{a,A}?(A=!A,''):A?c:c[`to${c<{}?'Low':'Upp'}erCase`]())

テストケース:


1
['to${c<'a'?'Low':'Upp'}erCase']単一引用符をバッククォートに置き換えて、数バイト節約できます。
シャギー

確かに、@ Shaggy。ありがとう!
リックヒッチコック

使用して^1持っているuパリティことは、あなたが短く、それを初期化させることができます:s=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

また、ここで手紙をテストするための別のトリッキーな方法ですa:短いa=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

ブリリアント、@ user81655、特にそのinような演算子を使用しています。もっと学ぶために!
リックヒッチコック

6

R、92バイト

cat(`[<-`(v<-el(strsplit(scan(,""),"a|A")),w<-c(F,T),chartr("a-zA-Z","A-Za-z",v)[w]),sep="")

答えを修正してくれた@Giuseppeに感謝します。

説明

# Write
cat(
  # Replace and return, this is the function that powers
  # the R store at index operations, a[i]<-b
  `[<-`(
    # First arg - what to replace = extract first list element
    # of a string input after splitting at a or A
    v<-el(strsplit(scan(,""),"a|A")),
    # Second arg - index to replace = abuse vector recycling
    # to create infinite F, T, F, T, F, etc series
    w<-c(F,T),
    # Third arg - replacement values = replace with case toggled letters
    chartr("a-zA-Z","A-Za-z",v)[w]),
  # Write without separation
  sep="")

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


おそらく明確にしなかったかもしれませんが、CapsLockが有効になっている(実行するだけのtoupper)場合、この答えは大文字の使用を元に戻しません。これは要件です。
ブロードウェル

2
ooohhhhhhhそれはc(F,T)、@ Broadwellが正しいですが、非常に賢いです。それはなるだろうように見えるchartr("a-zA-Z","A-Za-z",v)[w]のではなくtoupper
ジュゼッペ・

@Giuseppeのおかげで
VLO

6

PowerShellコア、105バイト

"$args"|% t*y|%{if($_-in97,65){$c=!$c}else{Write-Host -n($_,("$_"|%("*per","*wer")[$_-in65..90]))[!!$c]}}

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

実際の三項演算子とスクリーンへの印刷用のデフォルトのエイリアスがないのは、それほど短くはありません。

  • % t*y同等に展開し| ForEach-Object -Method ToCharArrayます。の"$args".ToCharArray()
  • Write-Host -n パラメータ用です -NoNewLine
  • "$_"オン[char]戻るタイプ[string](文字がネットには大文字/小文字を有していません)
  • |% *per以前と同じメソッド呼び出しのショートカットを行いますが、ため.ToUpper()、同じ.ToLower()
  • ($a,$b)[boolean test] 偽の三項演算子として虐待された
  • !!$c[bool]ここへの強制キャストは未定義で開始される$nullため、「caps lock:$ false」として強制的に存在させます。

1
これ|% t*yは覚えておく必要のあるすてきなトリックです。よりも短い[char[]]、私はよく使う。私はそれがTipsスレッドに行くべきだとほぼ言っているでしょう。
AdmBorkBork

94バイト:-join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}})|% *ethodオペレーターに感謝します!
mazzy

6

Perl 5の -p31の 30 29バイト

@nwellnhofのおかげで-1バイト

@ikegamiのおかげで-1バイト

#!/usr/bin/perl -p
s/a([^a]*)a?/$1^uc$1^lc$1/egi

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


単純にs/a(.*?)(a|$)/uc$1/egi(22バイト)しませんか?
nwellnhof

@nwellnhofアクティブ時のcapslockはケースを切り替えるため、大文字ではありません
Ton Hospel

1
ああ、分かった。次にs/a(.*?)(a|$)/$1^uc$1^lc$1/egi、1バイト短くなります。
nwellnhof

@nwellnhofありがとう、それは非常にきちんとしています
トンホスペル

a([^a]*)a?より短いa(.*?)(a|$)
池上

5

Python、63バイト

f=lambda s:s and[s[0]+f(s[1:]),f(s[1:]).swapcase()][s[0]in"aA"]

別のPythonソリューションは、Python 2および3で動作します。小さな入力を除くすべての入力に非常に長い時間がかかります。


5

6502マシンコードルーチン(C64)、51バイト

A0 00 84 FE B1 FC F0 2A C9 41 F0 06 90 1A C9 C1 D0 08 A9 80 45 FE 85 FE B0 11
B0 06 C9 5B B0 08 90 04 C9 DB B0 02 45 FE 20 16 E7 C8 D0 D6 E6 FD D0 D2 60

の0で終わる入力文字列へのポインターを期待$fc/$fdし、画面に出力します。

コメント付きの分解

 .caps:
A0 00       LDY #$00
84 FE       STY $FE             ; init capslock state
 .loop:
B1 FC       LDA ($FC),Y         ; next char from string
F0 2A       BEQ .done           ; NUL -> we're done
C9 41       CMP #$41            ; compare to 'a'
F0 06       BEQ .isa            ; if equal, toggle capslock
90 1A       BCC .out            ; if smaller, direct output
C9 C1       CMP #$C1            ; compare to 'A'
D0 08       BNE .ctog           ; if not equal, check for letter
 .isa:
A9 80       LDA #$80            ; toggle bit 7 in caps lock state
45 FE       EOR $FE
85 FE       STA $FE
B0 11       BCS .next           ; and go on
 .ctog:
B0 06       BCS .cZ             ; if char larger 'A', check for 'Z'
C9 5B       CMP #$5B            ; compare with 'z'+1
B0 08       BCS .out            ; larger or equal -> direct output
90 04       BCC .tog            ; smaller -> apply capslock
 .cZ:
C9 DB       CMP #$DB            ; compare with 'Z'+1
B0 02       BCS .out            ; larger or equal -> direct output
 .tog:
45 FE       EOR $FE             ; toggle bit from capslock state
 .out:
20 16 E7    JSR $E716           ; output char
 .next:
C8          INY                 ; and loop to next char
D0 D6       BNE .loop
E6 FD       INC $FD
D0 D2       BNE .loop
.done:
60          RTS

ルーチンを使用したアセンブラープログラムの例:

オンラインデモ

スクリーンショット

ca65構文のコード:

.import caps ; link with routine above

.segment "BHDR" ; BASIC header
                .word   $0801           ; load address
                .word   $080b           ; pointer next BASIC line
                .word   2018            ; line number
                .byte   $9e             ; BASIC token "SYS"
                .byte   "2061",$0,$0,$0 ; 2061 ($080d) and terminating 0 bytes

.bss
string:         .res    $800

.data
prompt:         .byte   $d, "input> ", $0

.code
                lda     #$17            ; set upper/lower mode
                sta     $d018

                lda     #<prompt        ; display prompt
                ldy     #>prompt
                jsr     $ab1e

                lda     #<string        ; read string into buffer
                sta     $fc
                lda     #>string
                sta     $fd
                jsr     readline

                lda     #>string        ; call our caps routine on buffer
                sta     $fd
                jmp     caps

; read a line of input from keyboard, terminate it with 0
; expects pointer to input buffer in $fc/$fd
; NO protection agains buffer overflows !!!
.proc readline
                ldy     #$0
                sty     $cc             ; enable cursor blinking
                sty     $fe             ; temporary for loop variable
                lda     $fd
                sta     $2              ; initial page of string buffer
getkey:         jsr     $f142           ; get character from keyboard
                beq     getkey
                sta     $fb             ; save to temporary
                and     #$7f
                cmp     #$20            ; check for control character
                bcs     prepout         ; no -> to normal flow
                cmp     #$d             ; was it enter/return?
                beq     prepout         ; -> normal flow
                cmp     #$14            ; was it backspace/delete?
                bne     getkey          ; if not, get next char
                lda     $fe             ; check current index
                bne     prepout         ; not zero -> ok
                lda     $2              ; otherwise check if we're in the
                cmp     $fd             ;    first page of the buffer
                beq     getkey          ; if yes, can't use backspace
prepout:        ldx     $cf             ; check cursor phase
                beq     output          ; invisible -> to output
                sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and clear 
                and     #$7f            ;   cursor in
                sta     ($d1),y         ;   current row
                cli                     ; enable interrupts
output:         lda     $fb             ; load character
                jsr     $e716           ;   and output
                ldx     $cf             ; check cursor phase
                beq     store           ; invisible -> to store
                sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and show
                ora     #$80            ;   cursor in
                sta     ($d1),y         ;   current row
                cli                     ; enable interrupts
                lda     $fb             ; load character
store:          cmp     #$14            ; was it backspace/delete?
                beq     backspace       ; to backspace handling code
                ldy     $fe             ; load buffer index
                sta     ($fc),y         ; store character in buffer
                cmp     #$d             ; was it enter/return?
                beq     done            ; then we're done.
                iny                     ; advance buffer index
                sty     $fe
                bne     getkey          ; not zero -> ok
                inc     $fd             ; otherwise advance buffer page
                bne     getkey
done:           lda     #$0             ; terminate string in buffer with zero
                ldy     $fe             ; get buffer index
                iny
                bne     termidxok       ; and advance ...
                inc     $fd
termidxok:      sta     ($fc),y         ; store terminator in buffer
                inc     $cc             ; disable cursor blinking
                rts                     ; return
backspace:      ldy     $fe             ; load buffer index
                bne     bsidxok         ; if zero
                dec     $fd             ;   decrement current page
bsidxok:        dey                     ; decrement buffer index
                sty     $fe
                bcs     getkey          ; and get next key
.endproc        

私はあなたがアセンブリで書く努力に行ったことを賞賛しなければなりません。これは、私が本当にasmを楽しんでいたという事実とはあまり関係がないと思いますが、多分、経験を積むことで、それが何を伴うのかをより意識するようになるでしょう。経験や使いやすさは私にとって重要な点です。そのような熱意を見ると、私の一日も少し明るくなります。
プリフタン

@Pryftanありがとう:)それは練習を続ける良い方法です、私はいくつかのゲームに取り組んでおり、最近この素敵な古いマシンのデモコードも:)
Felix Palmen

まあそれは素晴らしいことです!がんばり続ける; 私はasmを楽しんだことを覚えていますが、最近はあまり好きではないと思います(あなたのような古いマシンを持っている場合を除きますが、そうではないかもしれませんが)-Cは常に私のお気に入りであり、主につかいます。とにかく、これをチャットに進化させません-ただ、私は答えに感謝したいだけです!
プリフタン

5

Java 8、119 108 98バイト

s->{int f=0,t;for(int c:s)if((t=c&95)==65)f^=1;else System.out.printf("%c",f<1|t<66|t>90?c:c^32);}

@OlivierGrégoireのおかげで-11バイト。@Nevayの
おかげで-10バイト。

説明:

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

s->{                           // Method with char-array parameter and no return-type
  int f=0,t;                   //  Flag-integer, starting at 0
  for(int c:s)                 //  Loop over the characters of the input as integers
    if((t=c&95)==65)           //   If the current character is an 'A' or 'a':
      f^=1;                    //    Toggle the flag (0→1 or 1→0)
    else                       //   Else:
      System.out.printf("%c",  //    Print integer as character
        f<1|                   //     If the flag-integer is 0,
        t<66|t>90?             //     or the current character isn't a letter:
         c                     //      Simply output the character as is
        :                      //     Else (the flag it 1 and it's a letter)
         c^32);}               //      Print it with its case reversed

1
くそ命令...彼らはあなたの前に私の答えを投稿することを禁じた...とにかく、ここに私の答えは、11バイト短くなります:s->{int z=0,d;for(int c:s)if((d=c&95)==65)z^=1;else System.out.printf("%c",z<1|d<66|d>90?c:c<91?c|32:c&95);}
オリビエグレゴワール

@OlivierGrégoireいい答えだ!そして、投稿を禁止されたということはどういう意味ですか?あなたの職場のネットワークは厳しいですか?
ケビンクルーッセン

私の答えはしばらく準備ができていました。投稿する前にテストケースを精査していましたが、突然無限の会議が起こりました。
オリビエグレゴワール

1
いいえ、大丈夫です。会議の前に十分な速さではなかったと自分自身を責めるだけです;-)しかし、これを提案してくれてありがとう!
オリビエグレゴワール

2
98バイト:s->{int f=0,t;for(int c:s)if((t=c&95)==65)f^=1;else System.out.printf("%c",f<1|t<66|t>90?c:c^32);}
18年

5

C、167 168 158 131バイト

コードレビューをしてくれた@Martin Enderに感謝します。再利用性を高めるために、ストリーム処理を文字列処理に切り替えました。また、@ RiaDと@ceilingcatの提案に感謝します。

c,d;(*t[][2])()={{isupper,tolower},{islower,toupper}};f(char*s){for(d=1;c=*s++;)t[0][1](c)==97?d=!d:putchar(t[!t[d][0](c)][1](c));}

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

どのように機能しますか?

/* int c is the input character,
   int d is the Caps Lock flag (1=off, 0=on)  starting as "Off". */
int c, d;
/* array of comparison functions and transformation functions for each state */
(*t[][2])() = {{isupper, tolower}, {islower, toupper}};

f(char *s) {
  /* Loop if we haven't hit the terminator */
  for(d = 1; c = *s++;)
    t[0][1](c) == 97 ?
      /* If tolower(c)=='a' then flip the Caps Lock state */
      d=!d:
      /* Otherwise, convert character according to the following table:

                       Character case
         Caps Lock  UPPER       LOWER
                ON  tolower()   toupper()
               OFF  toupper()   tolower()
      */
      putchar(t[!t[d][0](c)][1](c));
  }
}

ノート

  • s[][]魔法が発生する場所[][0]です。比較関数で[][1]あり、各状態に関連する変換関数です。
  • ! 比較関数に適用され、範囲[0,1]に強制されます。

PPCGへようこそ!残念ながら、dこのような初期化に頼ることはできません。これは、関数が再利用できないことを意味します。単純なものd=0;で修正する必要があります。
マーティンエンダー

この場合、再利用性や状態の維持がより重要かどうかはわかりませんでした。再利用性がより重要な場合、変数宣言を関数内に移動して、先頭がになるようにしますvoid f(){int c,d=0;[...]。いずれにせよ、ストリームは死ぬので、編集は正常です!
ErikF

whileループにsが必要ですか?あなたは、F(NULL)で呼び出さない限り、それはNULLになったことはできません
リヤド

d =!dフリッピング
RiaD

!! なります!tの順序を反転し、dを1から開始する場合
RiaD

4

Haskell、92バイト

import Data.Char
g x|x<'['=toLower x|1>0=toUpper x
f(a:b)|elem a"aA"=f$g<$>b|1>0=a:f b
f x=x

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

説明

最初にg、小文字を大文字に、大文字を小文字にマップする関数であることを宣言します。これは、実際にはバイトカウントの大部分です。次に、関数を定義しますf。入力は、場合f形式であるa:b私たちがやります

f(a:b)
 |elem a"aA"=f$g<$>b
 |1>0=a:f b

aA最初のパターンと一致するfため、大文字と小文字を逆にして入力に適用します。それ以外の場合は、a前に出てに適用fbます。


4

Wolfram言語(Mathematica)、70バイト

#//.{x___,"a"|"A",y___}:>Join[{x},ToUpperCase@#+ToLowerCase@#-#&@{y}]&

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

入力と出力を文字のリストとして受け取ります。便宜上、フッターにコードを追加して、これを文字列に変換したり、文字列に戻したりします。

使い方

#//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&の部分が標準です:私たちは、最初の発見Aの後に来るの場合を逆に、(大文字または小文字)をA、そしてもう存在しなくなるまで繰り返してA発見されるのは。

興味深い部分は、大文字小文字を逆にする方法です:関数ToUpperCase@# + ToLowerCase@# - #&。入力の大文字バージョンと入力の小文字バージョンを加算し、実際の入力を減算します。たとえば、{"I","n","P","u","T"}これが計算するリストが与えられた場合

{"I","N","P","U","T"}+{"i","n","p","u","t"}-{"I","n","P","u","T"}

リストのスレッド

{"I"+"i"-"I","N"+"n"-"n","P"+"p"-"P","U"+"u"-"u","T"+"t"-"T"}

Mathematicaは2つの文字列を追加することの任意の特定の方法がありませんが、それは単純化するために十分にスマートだa+b-abいずれかの値のためにab、文字列値を含む、ので、これはのように簡単になります{"i","N","p","U","t"}


4

ルビー42 41バイト

->s{s.sub!(/a(.*)/i){$1.swapcase}?redo:s}

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

文字列を受け取り、その文字列をその場で変更して返すラムダ。ここでのコツはsub、置換が行われた場合は文字列(真偽値)を返し、nilそれ以外の場合は返すことです。の存在swapcaseも非常に便利です。

-1バイト:Asone Tuhidのおかげで、ブール論理を三項演算子に置き換えます

->s{
  s.sub!(/a(.*)/i){     # Replace "a" followed by anything with
    $1.swapcase         #   the case-swapped capture group
  } ? redo              # If a match was found, restart the block
    : s                 # Otherwise, return the modified string
}

1バイトを節約します。すべてのテストケースを含めると、リンクが長すぎました。
アソーヌトゥヒド

@AsoneTuhidありがとう...最近の1つは、3項演算子をすぐに使用することを忘れないでください。
benj2240

4

PHP 101 99バイト

for($s=$argn;$i<strlen($s);$i++)lcfirst($s[$i])==a?$s=strtolower($s)^strtoupper($s)^$s:print$s[$i];

次のように実行します:

echo '[the input]' | php -nR '[the code]'

ゴルフをしていない:

for ($s = $argn; $i < strlen($s); $i++) {
    if (lcfirst($s[$i]) == 'a') {
        $s = strtolower($s) ^ strtoupper($s) ^ $s; // Flip the whole string's case.
    } else {
        print $s[$i]; // Print the current letter.
    }
}

これは単にforループで文字列をループし、各反復で現在の文字がaであるかどうかをチェックし、そうである場合は文字列全体の大文字と小文字を切り替え(ここからの方法)、そうでない場合は現在の文字を印刷します。


1
コードゴルフの規則では、すべてのコードを含める必要があります。それはあなたが(例えば使用して関数のパラメータとして入力を取り、実際に関数を宣言(PHPの関数キーワードを経由して)、または完全なスクリプトを持ってしなければならないことを意味します$argn$argv$_GET)。したがって、現時点ではこれは正しい提出ではありません。リターンはechoedまたはreturnedである必要があります(cの関数でのみ許可されます)。
クリストフ

1
@Christophに感謝します。私はゴルフが初めてです:)。回答を更新しました。他に何か問題がある場合はお知らせください。
ダビッド

@Christophうわー!75!非常に素晴らしい!あなたは私の+1を持っています:)
16:07にDavіd18年

4

ゼリー、14バイト

Œu=”Aœp⁸ŒsJḤ$¦

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

完全なプログラム。

説明:

Œu=”Aœp⁸ŒsJḤ$¦ Arguments: x
Œu             Uppercase x
  =”A          ^ Equals 'A' (vectorizes)
     œp⁸       ^ Partition ⁸ [⁸=x]
             ¦ Apply link A, keep results at specific indices B
        Œs     A: Swap case
            $  B: Form a >=2-link monadic chain
          JḤ      Arguments: y
          J       Get list indices ([1, length(list)]) of y
           Ḥ      Double (vectorizes) ^
                  This way, we only "apply" link A to even indices, so every second
                  element, starting from the secondd one.

コードの説明?
SK19

1
@ SK19説明を追加しました。
エリックアウトゴルファー

4

MATL23 20バイト

'a A'Yb&Ybt2L)Yo2L(g

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

説明:

'a A'Yb   % form a cell array containing {'a', 'A'}
&Yb       % split input into substrings, with either of those ('a' or 'A') as delimiters
t2L)      % extract out the even positioned cells from that result
Yo        % switch the case of those substrings
2L(       % place the result back in even positioned cells of the original cell array
g         % convert cell array to matrix, concatenating all substrings in the process
          % implicit output

古い回答(23バイト):

「H @ 'aA'm?〜XHx} @ w〜?Yo]&h

私が試した他の方法:

0w"@t'aA'm?x~}y?Yo]w]]xv!
t'aA'mXHYsot&y*XzcYowf([]H(
t'aA'mXHYsoy3Y2m*32*Z~c[]H(

3

、15バイト

ω(F·+otm\↕·≠_'a

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

説明

ω(F·+(tm\)↕·≠_'a) -- example input: "Bar, baz and Foo."
ω(              ) -- apply the following, until fixpoint is reached:
          ↕       -- | split string with predicate
           · _    -- | | the lower-cased character
            ≠ 'a  -- | | is not 'a'
                  -- | : ("B","ar, baz and Foo.")
  F               -- | apply the following to the tuple
    +             -- | | join the elements with..
   · (   )        -- | | ..the second element: "ar, baz and Foo."
       m\         -- | | | swap case: "AR, BAZ AND fOO."
      t           -- | | | tail: "R, BAZ AND fOO."
                  -- | : "BR, BAZ AND fOO."
                  -- : "BR, Bz ND fOO."

3

05AB1E、12バイト

õ?„AaS¡Dvć?š

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

説明

õ?             # print an empty string (to account for the special case of only A's)
  „AaS¡        # split on occurrences of "A" or "a"
       D       # duplicate
        v      # for each element in the top copy
         ć?    # extract and print the head of the other copy
           š   # switch the case of the rest of the other copy

3

Japt v2.0a0、16バイト

e/a.*/i_År\l_c^H

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


説明

e                   :Recursively replace
 /a.*/i             :RegEx /a.*/gi
       _            :Pass each match through a function
        Å           :  Slice off the first character
         r          :  Replace
          \l        :  RegEx /[A-Za-z]/g
            _       :  Pass each match though a function
             c^     :    Bitwise XOR the character code
               H    :    With 32

3

SNOBOL4(CSNOBOL4)141 92バイト

	I =INPUT
S	I ANY("Aa") REM . R =REPLACE(R,&LCASE &UCASE,&UCASE &LCASE) :S(S)
	OUTPUT =I
END

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

1行の入力を想定しています。

@ninjaljによって保存されたなんと49バイト!

Line Sは、以下で説明するすべての作業を実行します。

I                    # in the subject string I match the following PATTERN:
 ANY("Aa")           # match A or a and
 REM . R             # match the remainder of I, assigning this to R
 =REPLACE(           # replace the PATTERN above with
          R, ...)    # R with swapped cases.
   :S(S)             # and if there was a match, goto S, else goto next line 


これは間違った答えを与えます(コメントで述べたように、CapsLockがオンのときに大文字と小文字が入れ替わります)
-mbomb007

CapsLockが有効になっているときに大文字と小文字を入れ替える必要があるように投稿を編集しましたが、これは自分のマシンがこれを行うことに気付いたことがないためです。
ブロードウェル

@ mbomb007ああ、OPがそれを変えたことに気付いていませんでした。私は今説明のために編集していますので、それを説明に含めます。
ジュゼッペ

I =INPUT;S I ANY("Aa") REM . R =REPLACE(R,&LCASE &UCASE,&UCASE &LCASE) :S(S); OUTPUT =I;END
ninjalj

@ninjaljはあなた SNOBOLゴルファーですか、それとも私はそれをゴルフするのがひどいですか??
ジュゼッペ

3

Fortran(GFortran)、307バイト

CHARACTER(999)F,G
G=' '
READ(*,'(A)')F
N=1
M=1
DO I=1,999
IF(F(I:I)=='a'.OR.F(I:I)=='A')THEN
M=-M
ELSEIF(M==1)THEN
G(N:N)=F(I:I)
N=N+1
ELSE
J=IACHAR(F(I:I))
SELECTCASE(J)
CASE(65:90)
G(N:N)=ACHAR(J+32)
CASE(97:122)
G(N:N)=ACHAR(J-32)
CASE DEFAULT
G(N:N)=F(I:I)
ENDSELECT
N=N+1
ENDIF
ENDDO
PRINT*,TRIM(G)
END

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

Fortranには文字列を処理するための「高度な」ツールがないため、この小さな怪物を思いつきました。

インデントとコメント:

CHARACTER(999)F,G	!Define input and output strings (up to 999 characters)
G=' '			!Fill output with spaces
READ(*,'(A)')F		!Take input
N=1			!Represent the position to be written in output string
M=1			!M=-1: Change case; M=1: Do not change case
DO I=1,999
	IF(F(I:I)=='a'.OR.F(I:I)=='A')THEN	!If the character is A...
		M=-M				!Ah-ha - you pressed cPS-LOCK!
	ELSEIF(M==1)THEN			!Case the character is not A, and do not need to change case...
		G(N:N)=F(I:I)			!...only copy the character
		N=N+1
	ELSE !Otherwise...
		J=IACHAR(F(I:I))			!...get ascii of current character
		SELECTCASE(J)
			CASE(65:90)			!If is upper case,
				G(N:N)=ACHAR(J+32)	!now is lower case
			CASE(97:122)			!If is lower case,
				G(N:N)=ACHAR(J-32)	!now is upper case
			CASE DEFAULT			!If do not belong to alphabet,
				G(N:N)=F(I:I)		!simply copy the character
		ENDSELECT
		N=N+1
	ENDIF
ENDDO
PRINT*,TRIM(G) !Trim out trailing spaces
END !That's all folks!

3

スタックス、12 バイト

ìo'½`║â↨╪U?5

オンラインで実行してデバッグする

正規表現で分割し、大文字と小文字を交互に切り替えます。これは同じプログラムで、アンパック、アンゴルフ、コメント付きです。

"a|A"|s split on regex /a|A/
rE  reverse and explode array to stack
W   repeat forever...
p   print top of stack with no newline
:~p print top of stack, case inverted, with no newline

これを実行する


私はどういうわけかあなたの説明をあなたのコードに関連付けることができません。
SK19

コメントされたものをステップスルーして、インタープリターの内部状態を見てみてください。それは役立ちますか?
再帰的

1
@ SK19:ああ、私は問題を見ると思う。スタックスプログラムには2つの表現があることは言及しませんでした。アスキーとパック。2つの間にロスレス変換があります。Asciiは簡単に入力できますが、95個の記号しかないため、ゴルフには無駄です。ゴルフプログラムは満載なので、見た目は異なりますが、同じプログラムです。
再帰的

3

Javascript(ES6)、80 79バイト

(Rick Hitchcockによるこの回答に一部基づいています。コメントするのに十分な評判がないため、別の回答として投稿しています。)

(@ l4m2の投稿のおかげで1バイト保存されました。)

a=>a.replace(j=/a()|./gi,(c,o=c[`to${j^c>{}?'Low':'Upp'}erCase`]())=>(j^=!o,o))

PPCGへようこそ!
ライコニ


2

Python 3、78 72バイト

import re
lambda x:re.sub("[Aa](.*?)(a|A|$)",lambda m:m[1].swapcase(),x)

Python 3.6+のm[1]代わりに使用できますm.group(1)
バブラー

なぜこれが低品質として報告されたのですか…?
ニッサ


1
新しい投稿は短く、テキストが含まれていない場合、自動的にフラグが立てられます。通常、説明を追加するとそれができなくなります。
mbomb007

そして今、私は「ppperry」にあるはずの「A」がいくつあるのだろうかと思います。
ミスターリスター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.