没有A,只有大写锁定


197

如果CapsLock键盘上的键没有缺口,会发生什么?

“这很高兴。”

该程序的目标是一致地模拟每次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
Rod

88
如果只有回车键也有一个槽口,那么不会'
12

75
t发生.......
21

22
从字面上加入该网站来投票赞成“没有缺口,没有人能听到你的尖叫声”
lucasvw

Answers:


115

AutoHotKey,7个字节

a::vk14

//这有效吗?这确实是OP想要的-替换aCapsLock (vk14)

运行此程序,然后输入键盘输入。


4
“这有效吗?” OP没有指定输入或输出约束,因此我认为这是有效的。
Nefrin

5
看不到太多的ahk答案!
HaveSpacesuit

57
贪婪,但我该如何解决呢?
RobbG

69
@RobbG只需键入“ killLL utohotkey” ...哦,等等
Nefrin

5
@tsh我认为您错过了这里的笑话...
RobbG

32

V,9字节

ò/ãa
xg~$

在线尝试!

十六进制转储:

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

@Gnudiff \c在正则表达式搜索中的任何位置都可使不区分大小写
Herman L

您需要设置一个特定的标志g~$才能工作吗?因为对我来说,它只转换大小写直到行尾,而不是整个文件,所以对我来说,这对于多行文件来说实际上并不起作用。
立方

1
@Cubic正如我在答案中所写的,它“假设输入在一行上”
Herman L

@Cubic如果您希望它移至文件末尾并支持多行输入,则可以执行g~vGvG~
DJMcMayhem

15

C,72个字节

感谢@Ton Hospel帮助节省了16个字节!

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而不是偶数/奇数(每个xor t含32 a),然后直接与xor字母t
Ton Hospel

2
检测问题a的好方法
Ton Hospel

1
@TonHospel 函数必须是可重用的,如果您需要外部代码以使其在每次调用后再次可用,则我不认为它可重用。
Steadybox

1
6305%c如果c是13
0。– Rosie F '18

11

外壳,11个字节

Γ·§?m\:€"Aa

在线尝试!

说明

我使用的有些模糊超载Γ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。我们能得到一个解释吗?我找不到有关Γ确切功能的任何信息,这似乎是学习的好机会。
Sophia Lechner

1
@SophiaLechner完成。这个版本Γ有点难以解释,希望您能理解。
Zgarb

哇,这太慢了。只是TIO吗?
FrownyFrog

1
@FrownyFrog这是果壳。Γ通常,包含的程序的类型推断似乎很慢。如果您不熟悉Husk,则通过遍历程序的所有可能结构(基本上是括号的可能位置)和每个内置函数的所有重载,并选择结果良好的第一个来解释程序。输入。解释器足够聪明,可以尽早拒绝某些可能性,但似乎递归版本的Γ可以弄乱这一步骤,并迫使其循环很多选择。
Zgarb

@SophiaLechner我写了一个技巧,Γ详细解释了该技巧
Zgarb

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个字节
Leo

如果您有时间补充说明,我对这如何工作很感兴趣。谢谢!
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'
John

5
您可以使用相同的逻辑以69个字节的大小执行此操作!在线尝试!(使用输入/输出而不是控制台,删除ToList,对三进制求逆,并使用@John注释)这是一个不错的第一答案。继续!
aloisdg '18

3
启用CapsLock时,这两个版本都不交换大小写(仅转换为大写)。这是一个要求。(请参阅最后一个测试用例)
Broadwell

@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。谢谢!
瑞克·希区柯克

使用^1u是奇偶可以让你初始化它更短: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 '18

@ 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](.Net中的字符没有大写/小写)
  • |% *per执行与之前相同的方法调用快捷方式,但对于.ToUpper(),与.ToLower()
  • ($a,$b)[boolean test] 被滥用为伪三元运算符
  • !!$cforce-casts从[bool]这里开始是不确定的,$null因此它被强制为“大写锁定:$ false”。

1
|% t*y是我需要记住的巧妙技巧。比短[char[]],我经常使用。我几乎要说,应该进入“提示”线程。
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个字节

-1字节感谢@nwellnhof

-1字节感谢@ikegami

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

在线尝试!


为什么不简单地s/a(.*?)(a|$)/uc$1/egi(22个字节)?
nwellnhof

@nwellnhof因为激活时的大写锁定可切换大小写,所以它不只是大写
Ton Hospel

1
知道了 然后s/a(.*?)(a|$)/$1^uc$1^lc$1/egi短一个字节。
nwellnhof

@nwellnhof谢谢,这很整洁
Ton Hospel

a([^a]*)a?短于a(.*?)(a|$)
ikegami

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

@Pryftan谢谢:)这只是保持练习的一种好方法,我正在开发一些游戏,最近还为这台不错的旧机器演示了代码:)
Felix Palmen

好高兴看到!保持; 我记得曾经喜欢过asm,但如今我并不喜欢它(除非我可能像你一样拥有一台旧机器,即使那时也可能不行)-C一直是我最喜欢的东西,而我主要是采用。无论如何,请不要让它演变成聊天记录-只是想说我感谢您的回答!
Pryftan

5

爪哇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);}

-11个字节,感谢@OlivierGrégoire
-10个字节,感谢@Nevay

说明:

在线尝试。

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égoire18年

@OlivierGrégoire好答案!禁止我发表帖子意味着什么?您的工作网络严格吗?
凯文·克鲁伊森

我的答案已经准备了一段时间:我只是在发布之前完善测试用例,但是突然间无休止的会议发生了。
奥利维尔·格雷戈尔(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);}
Nevay

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;应该解决它。
Martin Ender '18

我不确定在这种情况下可重用性或保持状态是否更重要。如果可重用性更重要,我将在函数内部移动变量声明,以便开始阅读void f(){int c,d=0;[...]。在任何情况下,流都会死亡,因此必须进行编辑!
ErikF

您是否需要在while循环中使用s?除非您用f(NULL)调用,否则它不能为NULL
RiaD

d =!d翻转
-RiaD

!! 将会 !如果您翻转t的顺序,并以1开始d
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"}

虽然数学没有添加两个字符串的任何特定的方式,它是足够聪明,简化a+b-ab了任何价值ab,包括字符串值,所以这简化为{"i","N","p","U","t"}


4

红宝石42 41字节

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

在线尝试!

一个lambda接受一个字符串,对该字符串进行适当的更改,然后将其返回。这里的技巧是,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个字节。如果我包含所有测试用例,则链接太长。
Asone Tuhid

@AsoneTuhid谢谢...这些日子之一,我会记得立即使用三元运算符,因此您不必提醒我。
benj2240 '18

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 function关键字),或有一个完整的脚本(例如,使用$argn$argv$_GET)。所以目前这不是正确的提交。Return必须是echoed或returned(仅对c函数起作用)。
克里斯多夫(Christoph)

1
感谢@Christoph,我是打高尔夫球的新手:)。我现在已经更新了答案,如果有其他问题,请告诉我。
达维

@Christoph哇!75!非常好!你有我的+1 :)
Davіd

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

在线尝试!

假设输入一行。

@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

Stax,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:哦,我想我看到了问题。我没有提到stax程序有两种表示形式。ASCII和包装。两者之间存在无损转换。Ascii易于键入,但对于高尔夫球来说很浪费,因为只有95个符号。打高尔夫球的程序是打包的,因此它看起来有所不同,但是是相同的程序。
递归

3

Javascript(ES6),80 79字节

(部分基于断此答案由瑞克·希区柯克,张贴作为一个单独的答案,因为我没有足够的信誉发表评论。)

(由于@ l4m2 在这里的帖子,节省了1个字节。)

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

欢迎来到PPCG!
Laikoni

2

55字节

⇙U◌␛⮕⇨'aA'⇗⭱∈⊭⋱2wẂ[⭱y⋱1wx⮕⭧]
    \   ␛◌Ẃ!w1/      \1wX/

在线尝试!

可能短约三分之一。
当我在台式机上时,我会写一个解释并打高尔夫。


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)
Bubbler '18

为什么将此标记为低质量...?
妮莎

我不知道...
pppery

1
如果新帖子简短且不包含任何文本,则会自动对其进行标记。添加描述通常可以防止这种情况。
mbomb007 '18

现在,我想知道在“ ppperry”中应该有多少个“ A”。
李斯特先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.