Không A, chỉ CAPS LOCK


197

Điều gì xảy ra khi CapsLockphím trên bàn phím của bạn không có một notch trong đó?

"Điều này hPPENS."

Mục tiêu của chương trình này là liên tục mô phỏng các lỗi bàn phím nơi mỗi lần Anhấn được thay thế CapsLock. Chữ hoa 'A' từ nguồn sẽ mang lại hiệu quả tương tự. Khi CapsLockđược bật, viết hoa được đảo ngược.

Các trường hợp thử nghiệm

"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?"

Tiêu chí chiến thắng là, như thường lệ, kích thước của mã nguồn của chương trình được gửi.


110
Chào mừng đến với trang web! Đây là một thử thách đầu tiên tốt đẹp, và thật không may cho tôi và FTERS của tôi.
DJMcMayhem

5
trường hợp thử nghiệm được đề xuất:teSTateSTateSTateST
Rod

88
Nếu chỉ có phím enter cũng có một notch trong đó thì điều này sẽ không xảy ra '
12Me21

75
t xảy ra .......
12Me21

22
Nghĩa đen đã tham gia trang web này để nâng cấp "Không có notch, không ai có thể nghe thấy bạn hét lên"
lucasvw 15/03/18

Câu trả lời:


115

AutoHotKey , 7 byte

a::vk14

// Điều này có hợp lệ không? Điều này thực sự làm những gì OP muốn - thay thế abằng CapsLock (vk14).

Chạy chương trình này và nhập dữ liệu từ bàn phím ..


4
"Điều này có hợp lệ không?" OP đã không chỉ định các ràng buộc đầu vào hoặc đầu ra vì vậy tôi đã xem xét điều này hợp lệ.
Nefrin

5
Đừng thấy quá nhiều câu trả lời ahk!
HaveSpacesuit

57
Đó là TUYỆT VỜI nhưng làm thế nào để tôi vô hiệu hóa nó?
RobbG

69
@RobbG chỉ cần gõ "killLL utohotkey" ... oh wIT
Nefrin 16/03/18

5
@tsh Tôi nghĩ bạn đã bỏ lỡ trò đùa ở đây ...
RobbG

32

V , 9 byte

ò/ãa
xg~$

Hãy thử trực tuyến!

Hexdump:

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

Giải trình:

ò       " 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 byte

qq/\ca
xg~$@qq@q

Giả sử đầu vào là trên một dòng

Giải trình

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 

Là trường hợp này không tìm thấy 'a'?
Gnudiff

@Gnudiff \cbất cứ nơi nào trong tìm kiếm regex cho phép phân biệt chữ hoa chữ thường
Herman L

Bạn có cần đặt một cờ cụ thể g~$để làm việc không? Bởi vì đối với tôi, nó chỉ đảo ngược trường hợp cho đến cuối dòng chứ không phải toàn bộ tệp, vì vậy điều này không thực sự hiệu quả đối với các tệp đa dòng đối với tôi.
Khối

1
@Cubic Như tôi đã viết trong câu trả lời, nó "giả sử đầu vào nằm trên một dòng"
Herman L

@Cubic Nếu bạn muốn nó đi đến cuối tệp và hỗ trợ đầu vào trên nhiều dòng, bạn có thể làm g~vGhoặc vG~.
DJMcMayhem

15

C, 72 byte

Cảm ơn @TonMedel đã giúp tiết kiệm 16 byte!

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

Hãy thử trực tuyến!


2
Bạn có thể hoán đổi trường hợp các chữ cái bằng cách sử dụng xor với 32
TonMedel

Bạn có lẽ có thể tiết kiệm hơn nữa bằng việc có tthể 0/32thay vì cùng chẵn / lẻ (xor t với 32 cho mỗi a) và sau đó thư xor trực tiếp vớit
Tôn Hospel

2
Đẹp cách để phát hiện a's
Tôn Hospel

1
Các chức năng @TonHosp phải được sử dụng lại và tôi không nghĩ nó được tính là có thể sử dụng lại nếu bạn cần mã bên ngoài để làm cho nó có thể sử dụng lại được sau mỗi cuộc gọi.
Steadybox

1
6305%clà 0 nếu clà 13.
Rosie F

11

Husk , 11 byte

Γ·§?m\:€"Aa

Hãy thử trực tuyến!

Giải trình

Tôi đang sử dụng quá tải hơi mơ hồ của lệnh Γgọi listNF, cấu trúc các hàm đệ quy hoạt động trên danh sách. Nó tương ứng với mẫu Haskell sau:

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

Ý tưởng là listNFcó một hàm trợ giúp fvà trả về một hàm mới g, trong đó có một danh sách. Hàm fnày có một hàm, sẽ luôn luôn là gđầu xvà đuôi xscủa danh sách và thực hiện một cái gì đó với chúng. Trong ứng dụng của chúng tôi, fcác cuộc gọi gđệ quy trên xs. Chương trình được diễn giải như thế này:

Γ (· (§ (?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
Ồ, điều tốt là tôi đã làm mới trước khi tôi đăng giải pháp 12 byte của mình : Ḟ·+m\ṁx'Ax'a. Chúng ta có thể có được một lời giải thích? Tôi không thể tìm thấy bất kỳ thông tin nào về Γchính xác những gì và đây có vẻ là một cơ hội tốt để tìm hiểu.
Sophia Lechner

1
@SophiaLechner Xong. Phiên bản Γnày hơi khó giải thích, tôi hy vọng bạn có thể hiểu ý nghĩa của nó.
Zgarb

Wow điều này là chậm. Có phải chỉ là TIO?
FrownyFrog

1
@FrownyFrog Đó là Husk. Kiểu suy luận của các chương trình có Γvẻ là chậm nói chung. Nếu bạn không quen thuộc với Husk, một chương trình được diễn giải bằng cách lặp qua tất cả các cấu trúc có thể có của chương trình (về cơ bản là các vị trí có thể có của dấu ngoặc đơn) và tất cả các tình trạng quá tải của mỗi phần tử tích hợp và chọn cái đầu tiên trong đó kết quả tốt đánh máy Trình thông dịch đủ thông minh để từ chối một số khả năng sớm, nhưng có vẻ như phiên bản đệ quy Γcó thể gây rối với bước này và buộc nó phải lặp qua rất nhiều lựa chọn.
Zgarb

@SophiaLechner Tôi đã viết một mẹo giải thích Γchi tiết .
Zgarb

11

Võng mạc , 33 21 17 byte

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

Dùng thử trực tuyến

Giải trình:

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 byte nhờ Martin
-4 byte nhờ Leo


Thật đáng ngạc nhiên, điều này gần như ngắn như các giải pháp Pyth hiện tại
TonMedel 14/03/18

1
Tôi nghĩ iT`aAlL`__Ll`a[^a]*a?cũng hoạt động cho 21 byte.
Neil

Ngắn hơn 4 byte bằng cách sử dụng các kết quả trùng lặp
Leo

Tôi quan tâm đến cách thức hoạt động nếu bạn có thời gian để thêm lời giải thích. Cảm ơn!
seshoumara

9

C # , 121 byte

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

** Cập nhật (cảm ơn @John & @aloitorg) **

C # , 69 byte

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

2
Chào mừng đến với PPCG! Câu trả lời đầu tiên tốt đẹp!
RedClover

2
bạn có thể lưu 7 byte thay đổi new[] { 'a', 'A' }thành'a', 'A'
John

5
Bạn có thể làm điều đó trong 69 byte với cùng logic! Hãy thử trực tuyến! (sử dụng input / ouput thay vì console, xóa ToList, đảo ngược ternary và sử dụng @John bình luận) Đây là một câu trả lời đầu tiên hay. Tiếp tục đi!
aloisdg

3
Cả hai phiên bản này đều không hoán đổi trường hợp (chúng chỉ chuyển thành chữ hoa) khi bật CapsLock. Đây là một yêu cầu. (Xem trường hợp thử nghiệm cuối cùng)
Broadwell

@Broadwell Làm thế nào để bạn biết nếu CapsLock được bật? Bạn có chắc trường hợp kiểm tra cuối cùng là chính xác? Nó vượt qua tất cả các trường hợp thử nghiệm khác, theo như tôi có thể thấy. Cảm ơn!
Aalawlx

7

JavaScript (ES6), 93 88 84 82 byte

(đã lưu 5 byte nhờ @Shaggy, 4 byte nhờ @ user81655 và 2 byte nhờ @ l4m2.)

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

Các trường hợp thử nghiệm:


1
['to${c<'a'?'Low':'Upp'}erCase']sẽ tiết kiệm cho bạn một vài byte, thay thế các trích dẫn đơn bằng backticks.
Shaggy

Chắc chắn là có, @Shaggy. Cảm ơn!
Rick Hitchcock

Sử dụng ^1để có utính chẵn lẻ có thể cho phép bạn khởi tạo nó ngắn hơn:s=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655 18/03/18

Ngoài ra đây là một cách khó khăn khác để kiểm tra thư angắn hơn:a=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655 18/03/18

Rực rỡ, @ user81655, đặc biệt là sử dụng intoán tử như thế. Luôn luôn để học hỏi!
Rick Hitchcock

6

R , 92 byte

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

Cảm ơn @Giuseppe đã sửa câu trả lời.

Giải trình

# 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="")

Hãy thử trực tuyến!


Có lẽ tôi đã không làm rõ, nhưng câu trả lời này không đảo ngược chữ viết hoa khi CapsLock được bật (nó chỉ thực hiện toupper), đây là một yêu cầu.
Broadwell

2
ooohhhhhhh rất thông minh với c(F,T), mặc dù @Broadwell đã đúng; có vẻ như nó sẽ là một chartr("a-zA-Z","A-Za-z",v)[w]thay vìtoupper
Giuseppe

@Giuseppe Cảm ơn
Vlo

6

Lõi PowerShell , 105 byte

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

Hãy thử trực tuyến!

Điều mà không có toán tử ternary thực sự và không có bí danh mặc định để in ra màn hình, nó không phải là ngắn.

  • % t*ymở rộng đến | ForEach-Object -Method ToCharArrayđẳng của"$args".ToCharArray()
  • Write-Host -n dành cho tham số -NoNewLine
  • "$_"biến [char]kiểu trở lại [string](ký tự không có chữ hoa / thường trong .Net)
  • |% *perthực hiện cùng một phương thức gọi tắt như trước đó, nhưng cho .ToUpper(), giống với.ToLower()
  • ($a,$b)[boolean test] bị lạm dụng như người điều hành giả
  • !!$cép buộc đến [bool]đây nó bắt đầu không xác định $nullđể nó buộc nó tồn tại dưới dạng "mũ khóa: $ false".

1
Đó |% t*ylà một mẹo gọn gàng tôi cần phải nhớ. Ngắn hơn [char[]], mà tôi sử dụng rất nhiều. Tôi gần như muốn nói rằng nên đi vào chủ đề Mẹo.
admBorkBork 19/03/18

94 byte : -join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}}). cảm ơn cho một |% *ethodnhà điều hành!
mê mẩn

6

Perl 5 -p , 31 30 29 byte

-1 byte nhờ @nwellnhof

-1 byte nhờ @ikegami

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

Hãy thử trực tuyến!


Tại sao không đơn giản s/a(.*?)(a|$)/uc$1/egi(22 byte)?
nwellnhof

@nwellnhof Vì capslock khi hoạt động bật tắt trường hợp, nó không chỉ viết hoa
TonMedel 16/03/18

1
Ah tôi thấy. Sau đó s/a(.*?)(a|$)/$1^uc$1^lc$1/egilà một byte ngắn hơn.
nwellnhof

@nwellnhof Cảm ơn, điều đó rất gọn gàng
TonMedel 16/03/18

a([^a]*)a?ngắn hơna(.*?)(a|$)
ikegami 18/03/18

5

Python, 63 byte

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

Một giải pháp Python khác, hoạt động trong Python 2 và 3. Mất một thời gian rất dài cho tất cả các đầu vào nhỏ.


5

Thường trình mã máy 6502 (C64), 51 byte

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

Yêu cầu một con trỏ tới chuỗi đầu vào 0 kết thúc $fc/$fd, xuất ra màn hình.

Bình luận tháo gỡ

 .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

Ví dụ chương trình biên dịch chương trình bằng cách sử dụng thường trình:

Bản demo trực tuyến

ảnh chụp màn hình

Mã theo cú pháp 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        

Tôi chỉ cần nói rằng tôi ngưỡng mộ bạn đã nỗ lực để viết trong lắp ráp. Tôi không nghĩ rằng điều này có liên quan nhiều đến thực tế tôi đã từng thực sự thích asm nhưng có lẽ trải nghiệm này khiến tôi nhận thức rõ hơn về những gì nó đòi hỏi. Kinh nghiệm hoặc dễ dàng là bên cạnh quan điểm với tôi. Nó làm sáng ngày của tôi chỉ một chút để thấy sự nhiệt tình như vậy quá.
Pryftan 18/03/18

@Pryftan cảm ơn :) Đó chỉ là một cách hay để luyện tập, tôi đang làm việc với một số trò chơi và gần đây cũng đã giới thiệu mã cho máy cũ tuyệt vời này :)
Felix Palmen

Thật tuyệt khi thấy điều đó! Giữ nó lên; Tôi nhớ thưởng thức asm nhưng tôi không nghĩ rằng tôi thích nó ngày nay (trừ khi tôi có thể có một chiếc máy cũ như bạn, đó là nhưng thậm chí có thể không) - C là sở thích của tôi mọi lúc và đó là điều tôi chủ yếu sử dụng. Dù sao, sẽ không để điều này phát triển thành trò chuyện - chỉ muốn nói rằng tôi đánh giá cao câu trả lời!
Pryftan

5

Java 8, 119 108 98 byte

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 byte nhờ @ OlivierGrégoire .
-10 byte nhờ @Nevay .

Giải trình:

Hãy thử trực tuyến.

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
Các mệnh lệnh chết tiệt ... họ cấm tôi đăng câu trả lời của mình trước câu trả lời của bạn ... Dù sao, đây là câu trả lời của tôi, ngắn hơn 11 byte: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);}
Olivier Grégoire

@ OlivierGrégoire Câu trả lời hay! Và bạn có ý gì khi cấm tôi đăng bài? Mạng lưới công việc của bạn có nghiêm ngặt không?
Kevin Cruijssen

Câu trả lời của tôi đã sẵn sàng trong một thời gian: Tôi chỉ đánh bóng các trường hợp thử nghiệm trước khi đăng nhưng rồi đột nhiên các cuộc họp bất tận xảy ra.
Olivier Grégoire

1
Không, không sao, tôi chỉ phải tự trách mình vì đã không đủ nhanh trước các cuộc họp ;-) Nhưng cảm ơn bạn đã gợi ý điều này!
Olivier Grégoire

2
98 byte: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 17/03/18

5

C, 167 168 158 131 byte

Cảm ơn @Martin Ender đã xem xét mã: Tôi đã chuyển đổi xử lý luồng để xử lý chuỗi để giúp sử dụng lại. Cũng xin cảm ơn @RiaD và @ceilingcat vì những gợi ý của họ.

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động?

/* 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));
  }
}

Ghi chú

  • s[][]là nơi phép màu xảy ra: [][0]là hàm so sánh và [][1]là hàm biến đổi liên quan cho mỗi trạng thái.
  • ! được áp dụng cho hàm so sánh để buộc nó vào phạm vi [0,1].

Chào mừng đến với PPCG! Thật không may, bạn không thể dựa vào việc khởi tạo dnhư thế này vì điều đó có nghĩa là chức năng của bạn không thể tái sử dụng . Một đơn giản d=0;nên sửa nó.
Martin Ender

Tôi không chắc liệu tái sử dụng hay duy trì trạng thái là quan trọng hơn trong trường hợp này. Nếu khả năng sử dụng lại là quan trọng hơn, tôi sẽ di chuyển các khai báo biến trong hàm để bắt đầu đọc void f(){int c,d=0;[...]. Trong mọi trường hợp, luồng chết, vì vậy một chỉnh sửa là theo thứ tự!
ErikF

bạn có cần s trong vòng lặp while không? Nó không thể trở thành NULL trừ khi bạn gọi bằng f (NULL)
Rịa 16/03/18

d =! d để lật
Rịa 16/03/18

!! sẽ là ! nếu bạn lật thứ tự của t và bắt đầu d với 1
Rịa 16/03/18

4

Haskell , 92 byte

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

Hãy thử trực tuyến!

Giải trình

Đầu tiên chúng ta khai báo glà hàm ánh xạ chữ thường thành chữ hoa và chữ hoa thành chữ thường. Đây thực sự là phần lớn của bytecount của chúng tôi. Sau đó, chúng tôi xác định chức năng f. Nếu đầu vào flà của mẫu a:bchúng tôi làm

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

aAkhớp mẫu đầu tiên và do đó chúng tôi áp dụng fcho đầu vào với trường hợp được đảo ngược. Nếu không, chúng tôi di chuyển ara phía trước và áp dụng fcho b.


4

Ngôn ngữ Wolfram (Mathicala) , 70 byte

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

Hãy thử trực tuyến!

Lấy đầu vào và đầu ra dưới dạng một danh sách các ký tự. Để thuận tiện, tôi đã thêm mã ở chân trang để chuyển đổi mã này từ và trở lại thành chuỗi.

Làm thế nào nó hoạt động

Phần #//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&là tiêu chuẩn: chúng tôi tìm thấy Achữ cái đầu tiên (chữ hoa hoặc chữ thường), trường hợp ngược lại xuất hiện sau Avà lặp lại cho đến khi không còn Atìm thấy nữa.

Phần thú vị là cách chúng ta đảo ngược trường hợp: hàm ToUpperCase@# + ToLowerCase@# - #&. Chúng tôi thêm phiên bản đầu vào của đầu vào và phiên bản đầu vào của đầu vào, sau đó trừ đi đầu vào thực tế. Ví dụ, đưa ra danh sách {"I","n","P","u","T"}này tính toán

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

chủ đề nào trong danh sách như

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

và mặc dù Mathematica không có bất kỳ cách đặc biệt thêm hai dây, nó đủ thông minh để đơn giản hóa a+b-ađể bcho bất kỳ giá trị của ab, bao gồm các giá trị chuỗi, vì vậy đây đơn giản hoá để {"i","N","p","U","t"}.


4

Ruby , 42 41 byte

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

Hãy thử trực tuyến!

Một lambda chấp nhận một chuỗi, thay đổi chuỗi tại chỗ và trả lại nó. Thủ thuật ở đây là subtrả về chuỗi (giá trị trung thực) nếu thay thế được thực hiện và trả về nilkhác. Sự tồn tại của swapcaselà khá tiện dụng, quá.

-1 byte: Thay thế logic boolean bằng toán tử ternary, nhờ 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
}

tiết kiệm 1 byte . Liên kết quá dài nếu tôi bao gồm tất cả các trường hợp thử nghiệm.
Asone Tuhid 16/03/18

@AsoneTuhid Cảm ơn ... Một trong những ngày này tôi sẽ nhớ sử dụng toán tử tạm thời ngay lập tức, vì vậy bạn sẽ không phải nhắc tôi.
benj2240

4

PHP 101 99 byte

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

Chạy như thế này:

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

Ung dung:

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.
    }
}

Điều này chỉ lặp qua chuỗi với một vòng lặp for và trên mỗi lần lặp, nó sẽ kiểm tra xem chữ cái hiện tại là gì a, nếu vậy, hãy lật trường hợp của toàn bộ chuỗi (phương thức từ đây ), và nếu không, thì in chữ cái hiện tại.


1
Quy ước cho mã golf là tất cả các mã phải được bao gồm. Điều đó có nghĩa bạn phải mất đầu vào như tham số chức năng và thực sự khai báo một chức năng (thông qua các từ khóa hàm trong php) hoặc có một kịch bản đầy đủ (ví dụ sử dụng $argn, $argv, $_GET). Vì vậy, tại thời điểm này đây không phải là một đệ trình chính xác. Trả về phải là echoed hoặc returned (chỉ được phép cho các chức năng ofc).
Christoph

1
Cảm ơn vì điều đó @Christoph, tôi là người mới chơi golf :). Tôi đã cập nhật câu trả lời của mình bây giờ, chỉ cần cho tôi biết nếu có bất cứ điều gì khác không đúng.
Davіd 15/03/18

@Christoph Wow! 75! Rất đẹp! Bạn có +1 của tôi :)
Davіd 16/03/18

4

Thạch , 14 byte

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

Hãy thử trực tuyến!

Chương trình đầy đủ.

Giải trình:

Œ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.

Giải thích về mã?
SK19

1
@ SK19 Đã thêm một lời giải thích.
Erik the Outgolfer 19/03/18

4

MATL , 23 20 byte

'a A'Yb&Ybt2L)Yo2L(g

Hãy thử trực tuyến!

Giải trình:

'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

Câu trả lời cũ hơn (23 byte):

"H @ 'aA'm? ~ XHx} @ w ~? Yo] & h

Các phương pháp khác tôi đã thử:

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

3

Husk , 15 byte

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

Hãy thử trực tuyến!

Giải trình

ω(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 byte

õ?„AaS¡Dvć?š

Hãy thử trực tuyến!

Giải trình

õ?             # 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 byte

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

Thử nó


Giải trình

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 byte

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

Hãy thử trực tuyến!

Giả sử một dòng đầu vào.

Một con số khổng lồ 49 byte được lưu bởi @ninjalj !

Line Sthực hiện tất cả các công việc, giải thích dưới đây:

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 


Điều này đưa ra câu trả lời sai (như bạn đã nêu trong nhận xét của mình, trường hợp được hoán đổi khi bật CapsLock)
mbomb007

Tôi đã chỉnh sửa bài đăng để yêu cầu hoán đổi trường hợp (thay vì chỉ đơn giản là chữ hoa) khi CapsLock được bật vì tôi không bao giờ nhận ra rằng máy của mình thực hiện việc này.
Broadwell

@ mbomb007 ah, tôi đã không nhận ra OP đã thay đổi nó; Tôi đang chỉnh sửa để giải thích ngay bây giờ vì vậy tôi sẽ đưa nó vào phần giải thích.
Giuseppe

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

@ninjalj bạn cũng là một tay golf SNOBOL hay tôi chỉ kinh khủng khi chơi golf chứ ??
Giuseppe

3

Fortran (GFortran) , 307 byte

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

Hãy thử trực tuyến!

Vì Fortran không có các công cụ "tiên tiến" để xử lý chuỗi, tôi đã nghĩ ra con quái vật nhỏ này.

Thụt lề và bình luận:

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 byte

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

Chạy và gỡ lỗi trực tuyến

Nó phân tách trên một biểu thức chính quy, và sau đó xen kẽ các trường hợp. Đây là cùng một chương trình, giải nén, không ghi chú và nhận xét.

"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

Chạy cái này


Tôi bằng cách nào đó không thể liên quan giải thích của bạn với mã của bạn.
SK19

Hãy thử bước qua nhận xét và xem trạng thái nội bộ của trình thông dịch. cái đó có giúp ích không?
đệ quy

1
@ SK19: Ồ, tôi nghĩ rằng tôi thấy vấn đề. Tôi đã không đề cập rằng các chương trình stax có hai đại diện. Ascii và đóng gói. Có một sự chuyển đổi không mất mát giữa hai người. Ascii rất dễ gõ, nhưng lãng phí cho golf, vì chỉ có 95 biểu tượng. Chương trình chơi gôn được đóng gói, vì vậy nó trông khác nhau, nhưng đó là cùng một chương trình.
đệ quy

3

Javascript (ES6), 80 79 byte

(Một phần dựa trên câu trả lời này của Rick Hitchcock. Đăng bài dưới dạng một câu trả lời riêng vì tôi không đủ uy tín để bình luận.)

(Đã lưu 1 byte nhờ vào bài đăng của @ l4m2 tại đây .)

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

Chào mừng đến với PPCG!
Laikoni

2

Bẩn , 55 byte

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

Hãy thử trực tuyến!

Có lẽ có thể ngắn hơn khoảng một phần ba.
Tôi sẽ viết một lời giải thích và chơi gôn thêm khi tôi ở trên máy tính để bàn.


2

Python 3, 78 72 byte

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

Bạn có thể sử dụng m[1]thay m.group(1)cho Python 3.6+.
Bong bóng

Tại sao điều này được gắn cờ là chất lượng thấp?
Nissa

Tôi không có ý tưởng ...
pppery

1
Bài viết mới được gắn cờ tự động nếu chúng ngắn và không chứa văn bản. Thêm một mô tả thường ngăn chặn điều đó.
mbomb007

Và bây giờ tôi tự hỏi có bao nhiêu chữ "A" được cho là có trong "ppperry".
Ông Lister
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.