Nie, tylko CAPS LOCK


197

Co się stanie, gdy CapsLockklawisz na klawiaturze nie będzie miał wycięcia?

„Ten hPPENS”.

Celem tego programu jest konsekwentna emulacja chybotania klawiatury, gdzie każde Anaciśnięcie jest zastępowane CapsLock. Wielkie litery „A” ze źródła powinny dawać ten sam efekt. Po CapsLockwłączeniu wielkie litery są odwracane.

Przypadki testowe

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

Kryterium wygranej jest, jak zwykle, rozmiar kodu źródłowego przesłanego programu.


110
Witamy na stronie! To miłe pierwsze wyzwanie i niestety bardzo powiązane dla mnie i moich FT FINGERS.
DJMcMayhem

5
sugerowany przypadek testowy:teSTateSTateSTateST
Rod

88
Jeśli tylko klawisz Enter miał również wycięcie w niej więc to byłoby miło”
12Me21

75
t się stało .......
maja

22
Dosłownie dołączył do tej strony, aby głosować „Bez wycięcia nikt nie usłyszy twojego krzyku”
lucasvw

Odpowiedzi:


115

AutoHotKey , 7 bajtów

a::vk14

// Czy to jest ważne? To naprawdę robi to, czego chce OP - zastąp aprzez CapsLock (vk14).

Uruchom ten program i wpisz dane wejściowe z klawiatury.


4
„Czy to jest ważne?” OP nie określił ograniczeń wejściowych ani wyjściowych, więc uważam to za prawidłowe.
Nefrin

5
Nie widzę zbyt wielu odpowiedzi Ahk!
HaveSpacesuit

57
TO GREt, ale jak mogę to WYŁĄCZYĆ?
RobbG

69
@RobbG po prostu wpisz „killLL utohotkey” ... och, WIT
Nefrin

5
@tsh Myślę, że przegapiłeś tutaj żart ...
RobbG

32

V , 9 bajtów

ò/ãa
xg~$

Wypróbuj online!

Hexdump:

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

Wyjaśnienie:

ò       " 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 bajtów

qq/\ca
xg~$@qq@q

Zakłada, że ​​dane wejściowe są w jednej linii

Wyjaśnienie

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 

Czy w tym przypadku nie ma znaczenia rozróżnienie „a”?
Gnudiff

@Gnudiff w \cdowolnym miejscu wyszukiwania wyrażenia regularnego umożliwia rozróżnianie wielkości liter
Herman L

Czy potrzebujesz ustawić konkretną flagę g~$do działania? Ponieważ dla mnie odwraca tylko wielkość liter do końca wiersza, a nie cały plik, więc to tak naprawdę nie działa dla plików wielowierszowych.
Cubic

1
@Cubic Jak napisałem w odpowiedzi, „zakłada, że ​​dane wejściowe dotyczą jednego wiersza”
Herman L

@Cubic Jeśli chcesz, aby plik przechodził na koniec pliku i obsługiwał dane wejściowe w wielu wierszach, możesz zrobić g~vGlub vG~.
DJMcMayhem

15

C, 72 bajty

Dzięki @Ton Hospel za pomoc w oszczędzaniu 16 bajtów!

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

Wypróbuj online!


2
Możesz zamienić wielkość liter za pomocą xor z 32
Ton Hospel

Prawdopodobnie można zaoszczędzić jeszcze więcej mając tbyć 0/32zamiast parzyste / nieparzyste (xor T z 32 dla każdego a), a następnie xor litery bezpośrednio zt
Ton Hospel

2
Dobry sposób, aby wykryć a„s
Ton Hospel

1
@TonHospel Funkcje muszą być wielokrotnego użytku i nie sądzę, że liczy się jako wielokrotnego użytku, jeśli potrzebujesz zewnętrznego kodu, aby można go było ponownie używać po każdym wywołaniu.
Steadybox

1
6305%cwynosi 0, jeśli cwynosi 13.
Rosie F

11

Łuska , 11 bajtów

Γ·§?m\:€"Aa

Wypróbuj online!

Wyjaśnienie

Używam nieco niejasnego przeciążenia Γwywołania listNF, które konstruuje funkcje rekurencyjne działające na listach. Odpowiada następującemu wzorowi Haskella:

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

Chodzi o to, że listNFprzyjmuje funkcję pomocnika fi zwraca nową funkcję g, która pobiera listę. Funkcja fprzyjmuje funkcję, która zawsze będzie g, a także głowę xi ogon xslisty i coś z nimi robi. W naszej aplikacji fpołączenia grekurencyjnie są włączone xs. Program jest interpretowany w następujący sposób:

Γ (· (§ (?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
Wow, dobrze, że odświeżony przed Zamieściłem moje rozwiązanie 12 bajtów: Ḟ·+m\ṁx'Ax'a. Czy możemy uzyskać wyjaśnienie? Nie mogę znaleźć żadnych informacji na temat tego, co Γdokładnie robi, a to wydaje się być dobrą szansą na naukę.
Sophia Lechner

1
@SophiaLechner Gotowe. Ta wersja Γjest nieco trudna do wyjaśnienia, mam nadzieję, że możesz to zrozumieć.
Zgarb,

Wow, to jest powolne. Czy to tylko TIO?
FrownyFrog,

1
@FrownyFrog It's Husk. Wnioskowanie typów programów zawierających Γwydaje się być ogólnie powolne. Jeśli nie znasz Huska, program interpretuje się, przechodząc przez wszystkie możliwe struktury programu (w zasadzie możliwe położenia nawiasów) i wszystkie przeciążenia każdego wbudowanego, i wybierając ten pierwszy, w którym wynik jest dobrze- wpisane. Tłumacz jest wystarczająco inteligentny, aby odrzucić niektóre możliwości wcześniej, ale wydaje się, że rekurencyjna wersja Γmoże zepsuć ten krok i zmusić go do zapętlenia wielu wyborów.
Zgarb


11

Retina , 33 21 17 bajtów

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

Wypróbuj online

Wyjaśnienie:

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 bajtów dzięki Martinowi
-4 bajtów dzięki Leo


O dziwo jest to prawie tak krótkie, jak obecne rozwiązania Pyth
Ton Hospel

1
Myślę, że iT`aAlL`__Ll`a[^a]*a?działa również na 21 bajtów.
Neil

4 bajty krótsze przy użyciu nakładających się meczów
Leo

Interesuje mnie, jak to działa, jeśli masz czas na dodanie wyjaśnienia. Dzięki!
seshoumara

9

C # , 121 bajtów

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

** Aktualizacja (dzięki @John i @aloisdg) **

C # , 69 bajtów

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

2
Witamy w PPCG! Ładna pierwsza odpowiedź!
RedClover,

2
możesz zapisać 7 bajtów zmieniając new[] { 'a', 'A' }na'a', 'A'
John

5
Możesz to zrobić w 69 bajtach z tą samą logiką! Wypróbuj online! (użyj input / ouput zamiast konsoli, usuń ToList, odwróć trójskładnik i użyj komentarza @John) To ładna pierwsza odpowiedź. Tak trzymaj!
aloisdg

3
Obie te wersje nie zamieniają wielkości liter (przekształcają się tylko w wielkie litery), gdy włączona jest funkcja CapsLock. To jest wymóg. (Zobacz ostatni przypadek testowy)
Broadwell

@Broadwell Skąd wiesz, czy CapsLock jest włączony? Czy jesteś pewien, że ostatni przypadek testowy jest poprawny? O ile mi wiadomo, przechodzi wszystkie inne przypadki testowe. Dzięki!
Aalawlx

7

JavaScript (ES6), 93 88 84 82 bajtów

(zapisane 5 bajtów dzięki @Shaggy, 4 bajty dzięki @ user81655 i 2 bajty dzięki @ l4m2.)

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

Przypadki testowe:


1
['to${c<'a'?'Low':'Upp'}erCase']powinien zaoszczędzić kilka bajtów, zastępując pojedyncze cudzysłowy odwrotnymi znakami.
Shaggy

Jasne, @Shaggy. Dzięki!
Rick Hitchcock

Korzystanie ^1mają ubyć parytet mogę pozwolić ci zainicjalizować ją skrócić:s=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Oto kolejny trudny sposób na sprawdzenie akrótszego listu :a=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655,

Genialny, @ user81655, szczególnie używając takiego inoperatora. Zawsze więcej do nauki!
Rick Hitchcock

6

R , 92 bajty

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

Dziękujemy @Giuseppe za naprawienie odpowiedzi.

Wyjaśnienie

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

Wypróbuj online!


Być może nie wyjaśniłem tego jasno, ale ta odpowiedź nie odwraca wielkich liter, gdy CapsLock jest włączony (działa tylko toupper), co jest wymogiem.
Broadwell

2
ooohhhhhh jest to bardzo sprytne c(F,T), chociaż @Broadwell ma rację; wygląda na to, że będzie chartr("a-zA-Z","A-Za-z",v)[w]raczej niżtoupper
Giuseppe

@Giuseppe Thanks
Vlo

6

PowerShell Core , 105 bajtów

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

Wypróbuj online!

Co nie ma prawdziwego operatora trójskładnikowego i nie ma domyślnego aliasu do drukowania na ekranie, to nie jest takie krótkie.

  • % t*yrozwija się do | ForEach-Object -Method ToCharArrayekwiwalentu. z"$args".ToCharArray()
  • Write-Host -n jest dla parametru -NoNewLine
  • "$_"zmienia [char]typ z powrotem na [string](znaki nie mają wielkich / małych liter w .Net)
  • |% *perrobi ten sam skrót wywołania metody jak wcześniej, ale dla tego .ToUpper()samego z.ToLower()
  • ($a,$b)[boolean test] nadużywane jako fałszywy operator trójskładnikowy
  • !!$cforce-casts [bool]tutaj zaczyna się niezdefiniowany, $nullwięc zostaje zmuszony do istnienia jako „caps lock: $ false”.

1
To |% t*yfajna sztuczka, którą muszę zapamiętać. Krótszy niż [char[]], z którego często korzystam. Prawie powiedziałbym, że powinien przejść do wątku Porady.
AdmBorkBork

94 bajtów: -join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}}). dzięki za |% *ethodoperatora!
mazzy

6

Perl 5 -p , 31 30 29 bajtów

-1 bajt dzięki @nwellnhof

-1 bajt dzięki @ikegami

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

Wypróbuj online!


Dlaczego nie po prostu s/a(.*?)(a|$)/uc$1/egi(22 bajty)?
nwellnhof

@nwellnhof Ponieważ Capslock, gdy jest aktywny, przełącza obudowę, nie tylko wielkie litery
Ton Hospel

1
O, rozumiem. Wtedy s/a(.*?)(a|$)/$1^uc$1^lc$1/egijest o jeden bajt krótszy.
nwellnhof

@nwellnhof Dzięki, to jest bardzo miłe
Ton Hospel

a([^a]*)a?jest krótszy niża(.*?)(a|$)
ikegami,

5

Python, 63 bajty

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

Kolejne rozwiązanie Python, działa w Python 2 i 3. Zajmuje bardzo dużo czasu dla wszystkich danych oprócz małych.


5

Procedura kodu maszynowego 6502 (C64), 51 bajtów

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

Oczekuje wskaźnika do łańcucha wejściowego zakończonego na 0 w $fc/$fd , który jest wyświetlany na ekranie.

Skomentowano demontaż

 .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

Przykładowy program asemblera wykorzystujący procedurę:

Demo online

screenshot

Kod w składni 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        

Muszę tylko powiedzieć, że podziwiam, że podjęłaś wysiłek pisania w zgromadzeniu. Nie sądzę, żeby miało to wiele wspólnego z faktem, że naprawdę lubiłem asm, ale może dzięki temu doświadczeniu jestem bardziej świadomy tego, co się z tym wiąże. Doświadczenie lub łatwość są poza tym dla mnie ważne. Jaśniej rozjaśnia mój dzień, widząc również taki entuzjazm.
Pryftan

@Pryftan dzięki :) To po prostu fajny sposób na praktykę, pracuję nad jakąś grą, a ostatnio także kodem demonstracyjnym tej ładnej starej maszyny :)
Felix Palmen

Dobrze jest widzieć! Tak trzymaj; Pamiętam, że cieszę się asmem, ale nie sądzę, żebym się tak bardzo podobał (chyba, że ​​może miałbym starą maszynę taką jak ty, to znaczy, ale być może nawet nie wtedy) - C jest moim ulubionym przez cały czas i to jest to, co przede wszystkim posługiwać się. W każdym razie, nie pozwolę, aby przekształciło się to w czat - chciałem tylko powiedzieć, że doceniam odpowiedź!
Pryftan,

5

Java 8, 119 108 98 bajtów

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 bajtów dzięki @ OlivierGrégoire .
-10 bajtów dzięki @Nevay .

Wyjaśnienie:

Wypróbuj online.

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
Cholerne imperatywy ... zabroniły mi zamieszczania mojej odpowiedzi przed twoją ... W każdym razie, oto moja odpowiedź, 11 bajtów krótsza: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 Ładna odpowiedź! A co masz na myśli mówiąc, że zabroniłeś mi pisać? Czy twoja sieć pracy jest tak surowa?
Kevin Cruijssen

Moja odpowiedź była na chwilę gotowa: po prostu dopracowywałem przypadki testowe przed opublikowaniem, ale nagle zdarzyły się niekończące się spotkania.
Olivier Grégoire,

1
Nie, w porządku, muszę winić się tylko za to, że nie byłem wystarczająco szybki przed spotkaniami ;-) Ale dziękuję za sugestię!
Olivier Grégoire,

2
98 bajtów: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

DO, 167 168 158 131 bajtów

Dzięki za @Martin Ender za przegląd kodu: zmieniłem przetwarzanie strumienia na przetwarzanie ciągów, aby pomóc w ponownym użyciu. Dziękujemy również @RiaD i @ceilingcat za sugestie.

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

Wypróbuj online!

Jak to działa?

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

Uwagi

  • s[][]tam, gdzie dzieje się magia: [][0]jest funkcja porównania i[][1] jest powiązaną funkcją transformacji dla każdego stanu.
  • ! jest stosowany do funkcji porównania w celu wymuszenia jej w zakresie [0,1].

Witamy w PPCG! Niestety, nie możesz polegać na takiej inicjalizacji, dponieważ oznacza to, że twojej funkcji nie można ponownie użyć . Prosty d=0;powinien to naprawić.
Martin Ender

Nie byłem pewien, czy w tym przypadku ważniejsze jest ponowne użycie lub utrzymanie stanu. Jeśli ponowne użycie jest ważniejsze, przesunąłbym deklaracje zmiennych wewnątrz funkcji, aby początek był czytany void f(){int c,d=0;[...]. W każdym razie strumień umiera, więc edycja jest w porządku!
ErikF,

czy potrzebujesz s w swojej pętli while? Nie może stać się NULL, chyba że zadzwonisz z f (NULL)
RiaD

d =! d za przerzucenie
RiaD

!! będzie ! jeśli zmienisz kolejność ti zaczniesz d od 1
RiaD

4

Haskell , 92 bajty

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

Wypróbuj online!

Wyjaśnienie

Najpierw deklarujemy, gże jest funkcją, która odwzorowuje małe litery na wielkie i wielkie litery na małe. Jest to właściwie większość naszego bajtu. Następnie definiujemy funkcję f. Jeśli dane wejściowe mają fpostać, a:bktórą wykonujemy

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

ai Adopasuj pierwszy wzorzec, a zatem zastosujemy fdo danych wejściowych z odwróconą wielkością liter. W przeciwnym razie ruszamy az przodu i ubiegamy się fo b.


4

Wolfram Language (Mathematica) , 70 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe i wyjściowe jako listę znaków. Dla wygody dodałem kod w stopce, aby przekonwertować to zi na ciąg znaków.

Jak to działa

Część #//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&jest standardowa: znajdujemy pierwszą A(wielką lub małą), odwrotna wielkość jest następująca po Ai powtarzamy, aż nie będzie już więcejA .

Interesującą częścią jest to, jak odwracamy wielkość liter: funkcja ToUpperCase@# + ToLowerCase@# - #&. Dodajemy razem wielkoformatową wersję danych wejściowych i małą literę wersji danych wejściowych, a następnie odejmujemy rzeczywiste dane wejściowe. Na przykład, biorąc pod uwagę listę {"I","n","P","u","T"}to oblicza

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

które wątki nad listami jako

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

Mathematica i chociaż nie ma żadnego szczególnego sposobu dodawania dwóch ciągów, jest wystarczająco inteligentny, aby uprościć a+b-ado bwszelkich wartości ai b, w tym ciągów znaków, więc ten upraszcza się {"i","N","p","U","t"}.


4

Rubin , 42 41 bajtów

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

Wypróbuj online!

Lambda przyjmuje łańcuch, mutuje go w miejscu i zwraca. Sztuczka polega na tym, że subzwraca łańcuch (wartość zgodna z prawdą), jeśli dokonano podstawienia, i zwraca nilinaczej. Istnienieswapcase jest również bardzo przydatne.

-1 bajt: Zastąp logikę logiczną operatorem trójskładnikowym, dzięki 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
}

zapisz 1 bajt . Link był zbyt długi, gdybym uwzględnił wszystkie przypadki testowe.
Asone Tuhid

@AsoneTuhid Dzięki ... Pewnego dnia będę pamiętać, aby od razu użyć operatora trójskładnikowego, więc nie będziesz musiał mi przypominać.
benj2240

4

PHP 101 99 bajtów

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

Uruchom tak:

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

Nie golfowany:

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

To po prostu zapętla łańcuch za pomocą pętli for, a na każdej iteracji sprawdza, czy bieżąca litera jest a, jeśli tak, to odwróć wielkość liter całego łańcucha (metoda stąd ), a jeśli nie, to wydrukuj bieżącą literę.


1
Konwencja dotycząca kodu golfowego polega na tym, że należy podać cały kod. Oznacza to, że trzeba wziąć wejścia jako parametr funkcji i faktycznie zadeklarować funkcji (za pomocą słów kluczowych funkcji w php) lub mieć pełny skrypt (na przykład za pomocą $argn, $argv, $_GET). W tej chwili nie jest to prawidłowe zgłoszenie. Return musi być echoedytowany lub returnedytowany (dozwolony tylko dla funkcji ofc).
Christoph

1
Dzięki za @Christoph, jestem trochę nowy w golfa :). Zaktualizowałem teraz swoją odpowiedź, daj mi znać, jeśli coś jeszcze jest nie tak.
Davіd

@Christoph Wow! 75! Bardzo dobrze! Masz moje +1 :)
Davіd

4

Galaretka , 14 bajtów

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

Wypróbuj online!

Pełny program

Wyjaśnienie:

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

Wyjaśnienie kodu?
SK19

1
@ SK19 Dodano wyjaśnienie.
Erik the Outgolfer

4

MATL , 23 20 bajtów

'a A'Yb&Ybt2L)Yo2L(g

Wypróbuj online!

Wyjaśnienie:

'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

Starsza odpowiedź (23 bajty):

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

Inne metody, które wypróbowałem:

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

3

Łuska , 15 bajtów

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

Wypróbuj online!

Wyjaśnienie

ω(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 bajtów

õ?„AaS¡Dvć?š

Wypróbuj online!

Wyjaśnienie

õ?             # 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 bajtów

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

Spróbuj


Wyjaśnienie

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 bajtów

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

Wypróbuj online!

Zakłada pojedynczy wiersz danych wejściowych.

49 bajtów zapisanych przez @ninjalj !

Linia Swykonuje całą pracę, wyjaśniono poniżej:

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 


To daje złą odpowiedź (jak napisałeś w komentarzu, sprawa jest zamieniana, gdy CapsLock jest włączony)
mbomb007 14.03.18

Edytowałem post, aby wymagać zamiany liter (a nie tylko wielkich liter), gdy włączona jest funkcja CapsLock, ponieważ nigdy nie zdawałem sobie sprawy, że moja maszyna to robi.
Broadwell

@ mbomb007 ah, nie zdawałem sobie sprawy, że OP to zmieniło; Teraz edytuję wyjaśnienie, więc dołączę to do wyjaśnienia.
Giuseppe

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

@ninjalj, czy jesteś także golfistą SNOBOL, czy jestem po prostu okropny w grze w golfa?
Giuseppe,

3

Fortran (GFortran) , 307 bajtów

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

Wypróbuj online!

Ponieważ Fortran nie ma „zaawansowanych” narzędzi do radzenia sobie ze strunami, wymyśliłem tego małego potwora.

Wcięte i skomentowane:

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 bajtów

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

Uruchom i debuguj online

Dzieli się na regex, a następnie na przemian przełącza wielkość liter. Oto ten sam program, rozpakowany, nieposortowany i skomentowany.

"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

Uruchom ten


Jakoś nie mogę odnieść twojego wyjaśnienia do twojego kodu.
SK19

Spróbuj przejść przez komentowany i obserwować wewnętrzny stan tłumacza. To pomaga?
rekurencyjny

1
@ SK19: Och, chyba widzę problem. Nie wspomniałem, że programy stax mają dwie reprezentacje. Ascii i zapakowane. Pomiędzy nimi jest bezstratna konwersja. Ascii jest łatwy do pisania, ale marnuje się na golfa, ponieważ jest tylko 95 symboli. Program w golfa jest zapakowany, więc wygląda inaczej, ale jest to ten sam program.
rekurencyjny

3

JavaScript (ES6), 80 79 bajtów

(Częściowo na podstawie tej odpowiedzi Ricka Hitchcocka. Publikowanie jako osobna odpowiedź, ponieważ nie mam wystarczającej reputacji, aby komentować.)

(Zapisano 1 bajt dzięki postowi @ l4m2 tutaj .)

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

Witamy w PPCG!
Laikoni

2

Brudny , 55 bajtów

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

Wypróbuj online!

Prawdopodobnie może być o jedną trzecią krótszy.
Napiszę wyjaśnienie i pograć w golfa, gdy będę na komputerze.


2

Python 3, 78 72 bajtów

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

Możesz używać m[1]zamiast m.group(1)Python 3.6+.
Bubbler,

Dlaczego oznaczono to jako niskiej jakości…?
Nissa

Nie mam pojęcia ...
pppery

1
Nowe posty są automatycznie oznaczane, jeśli są krótkie i nie zawierają tekstu. Dodanie opisu zwykle temu zapobiega.
mbomb007

A teraz zastanawiam się, ile „A” powinno być w „ppperry”.
Pan Lister,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.