Hayır A, sadece CAPS LOCK


197

CapsLockKlavyenizdeki tuşun içinde çentik yoksa ne olur ?

"Bu HPPENS."

Bu programın amacı, her Abasının değiştirildiği yerde klavye özlemlerini tutarlı bir şekilde taklit etmektir CapsLock. Kaynaktaki büyük 'A aynı etkiyi vermelidir. Ne zaman CapsLocketkindir, büyük harf tersine çevrilir.

Test Kılıfları

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

Kazanan kriter, her zamanki gibi sunulan programın kaynak kodunun boyutudur.


110
Siteye Hoşgeldiniz! Bu güzel bir ilk meydan okuma ve ne yazık ki ben ve fT FINGERS'ım için çok sevindirici.
DJMcMayhem

5
önerilen test durumu:teSTateSTateSTateST
Rod

88
Sadece girmek anahtar da bu yüzden bir çentik olsaydı bu 'gitmeyeceklerini
12Me21

75

22
Kelimenin tam anlamıyla bu siteye katılmak için "Çentik olmadan, kimse çığlık duyamazsın"
lucasvw 15:18

Yanıtlar:


115

AutoHotKey , 7 bayt

a::vk14

// Bu geçerli mi? Bu gerçekte ne OP istiyorsun - yerine agöre CapsLock (vk14).

Bu programı çalıştırın ve girişi klavyeden yazın.


4
"Bu geçerli mi?" OP, giriş veya çıkış kısıtlamaları belirtmedi, bu yüzden bunun geçerli olduğunu düşünüyorum.
Nefrin

5
Çok fazla ahk cevabı görmüyorum!
Mart'ta

57
BU BÜYÜK ama bunu nasıl reddediyorum?
RobbG

69
@RobbG sadece "killLL utohotkey" yazın ... oh wIT
Nefrin

5
@tsh Burada şakayı kaçırdığınızı düşünüyorum ...
RobbG

32

V , 9 bayt

ò/ãa
xg~$

Çevrimiçi deneyin!

HexDump:

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

Açıklama:

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

qq/\ca
xg~$@qq@q

Girişin tek bir satırda olduğunu varsayar

açıklama

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 

Bu durumda 'a' duyarsız bulgusu var mı?
Gnudiff

\cBir regex araştırmasının herhangi bir yerinde @Gnudiff büyük / küçük harfe duyarsızlığı sağlar
Herman L

g~$Çalışmak için belirli bir bayrak belirlemeniz mi gerekiyor ? Çünkü benim için sadece dosyanın sonuna değil satırın sonuna kadar dava açar, bu yüzden benim için çok satırlı dosyalar için bu gerçekten işe yaramaz.
Kübik

1
@Cubic Cevapta yazdığım gibi, "girişin tek bir satırda olduğunu varsayar"
Herman L

@Cubic Dosyanın sonuna gitmek ve birden çok satırdaki girişleri desteklemek istiyorsanız, g~vGveya yapabilirsiniz vG~.
DJMcMayhem

15

C, 72 bayt

16 byte tasarruf etmenize yardımcı olan @Ton Hospel'e teşekkürler!

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

Çevrimiçi deneyin!


2
Harfleri bir xor kullanarak harfini 32 ile değiştirebilirsiniz
Ton Hospel 14.03.2014

Muhtemelen alarak daha fazla tasarruf edebilirsiniz tolmak 0/32yerine tek / çift (her biri için 32 ile xor t adoğrudan ile daha sonra ve xor harf)t
Ton Hospel

2
a'S algılamak için güzel bir yol
Ton Hospel

1
@TonHospel İşlevleri yeniden kullanılabilir olmalı ve her çağrıdan sonra tekrar kullanılabilir hale getirmek için harici koda ihtiyacınız varsa, yeniden kullanılabileceğini saymıyorum .
Steadybox

1
6305%c13 ise 0'dır c.
Rosie F

11

Kabuğu , 11 bayt

Γ·§?m\:€"Aa

Çevrimiçi deneyin!

açıklama

Ben biraz karanlık aşırı yüklenmesini kullanıyorum Γdenilen listNFlistelerinde faaliyet özyinelemeli fonksiyonlar oluşturur. Aşağıdaki Haskell düzenine karşılık gelir:

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

Buradaki fikir, listNFyardımcı işlevi alan fve gliste alan yeni bir işlev döndüren şeydir . fİşlev, her zaman olacak olan bir işlevi alır ve listenin gbaşı xve kuyruğu xsile onlarla bir şeyler yapar. Bizim uygulamada, yinelemeli olarak fçağırır . Program şöyle yorumlanır:gxs

Γ (· (§ (?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
Benim 12 bayt çözümü yayınlamadan önceki Vay, iyi bir şey ben yenilenir: Ḟ·+m\ṁx'Ax'a. Bir açıklama alabilir miyiz? ΓTam olarak ne olduğu hakkında hiçbir bilgi bulamıyorum ve bu öğrenmek için iyi bir şans gibi görünüyor.
Sophia Lechner,

1
@SophiaLechner Yapıldı. Bu versiyonunu Γaçıklamak biraz zor, umarım anlamış olabilirsiniz.
Zgarb

Vay bu yavaş. Sadece TIO mu?
FrownyFrog

1
@ FrownyFrog Bu Husk. ΓGenel olarak , programlar içeren tür çıkarımı yavaş görünüyor. Eğer Husk'a aşina değilseniz, bir program, programın olası tüm yapılarını (esasen parantezlerin olası yerleşimleri) ve her bir yerleşikin tüm aşırı yüklemelerini geçerek ve sonucun iyi olduğu ilki seçerek yorumlanır. yazdınız. Tercüman bazı olasılıkları erken reddetmek için yeterince zekidir, ancak özyinelemeli sürümünün Γbu adımı bozabileceği ve birçok seçenek arasında dolaşmaya zorlayabileceği anlaşılmaktadır .
Zgarb

@SophiaLechner Bir ayrıntıyı açıklayanΓ bir ipucu yazdım .
Zgarb

11

Retina , 33 21 17 bayt

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

Çevrimiçi deneyin

Açıklama:

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

Martin sayesinde -12 byte
Leo sayesinde -4 byte-byte


Şaşırtıcı bir şekilde bu, şu anki Pyth çözümleri kadar kısa
Ton Hospel 14.03.2018

1
Sanırım iT`aAlL`__Ll`a[^a]*a?21 bayt için de çalışıyor.
Neil

Örtüşen eşleşmeleri kullanarak daha kısa 4 byte
Leo

Açıklama eklemek için zamanınız varsa, bunun nasıl çalıştığıyla ilgileniyorum. Teşekkürler!
seshoumara

9

C # , 121 bayt

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

** Güncelleme (@John & @aloisdg sayesinde) **

C # , 69 bayt

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

2
PPCG'ye Hoşgeldiniz! Güzel ilk cevap!
RedClover

2
Eğer 7 bayt değişen kaydedebilirsiniz new[] { 'a', 'A' }için'a', 'A'
John

5
Aynı mantıkla 69 baytta yapabilirsiniz! Çevrimiçi deneyin! (konsol yerine input / ouput kullanın, ToList'i kaldırın, üçlüyü ters çevirin ve @John comment kullanın) Bu güzel bir ilk cevap. Devam et!
aloisdg

3
CapsLock etkinleştirildiğinde, bu sürümlerin ikisi de büyük / küçük harf değişimi yapmaz (yalnızca büyük harfe dönüşürler). Bu bir gerekliliktir. (Son test
Broadwell

@Broadwell CapsLock'un etkin olup olmadığını nasıl anlarsınız? Son test durumunun doğru olduğundan emin misin? Görebildiğim kadarıyla tüm diğer test durumlarını geçiyor. Teşekkürler!
Aalawlx

7

JavaScript (ES6), 93 88 84 82 bayt

(@Shaggy sayesinde 5 bayt, @ user81655 sayesinde 4 bayt ve @ l4m2 sayesinde 2 bayt kaydedildi.)

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

Test durumları:


1
['to${c<'a'?'Low':'Upp'}erCase']tek tırnak işaretlerini backtick'lerle değiştirerek birkaç bayt kurtarmanız gerekir.
Shaggy

Tabii ki, @Shaggy. Teşekkürler!
Rick Hitchcock

Kullanılması ^1için u: olmak paritesi bunu kısa initialize sağlayabilirsinizs=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Ayrıca burada akısa olan harf için test etmek için başka zor bir yol :a=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Brilliant, @ user81655, özellikle de inböyle bir operatörü kullanarak . Her zaman öğrenmek için daha fazla!
Rick Hitchcock

6

R , 92 bayt

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

Cevabı düzeltmek için @Giuseppe teşekkür ederiz.

açıklama

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

Çevrimiçi deneyin!


Belki de açıklığa kavuşturmadım, ancak bu cevap CapsLock etkinleştirildiğinde (yalnızca gerçekleştirir toupper) büyük harfleri tersine çevirmez , bu bir gerekliliktir.
Broadwell

2
ooohhhhhhh c(F,T), @Broadwell haklı olmasına rağmen; chartr("a-zA-Z","A-Za-z",v)[w]daha ziyade olacak gibi görünüyortoupper
Giuseppe

@Giuseppe Thanks
Vlo 14:18

6

PowerShell Çekirdek , 105 bayt

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

Çevrimiçi deneyin!

Ne gerçek üçlü operatör ve ekrana yazdırma için varsayılan takma ad yok, o kadar kısa değil.

  • % t*y| ForEach-Object -Method ToCharArrayeşdeğeri genişler nın-nin"$args".ToCharArray()
  • Write-Host -n parametre için -NoNewLine
  • "$_"[char]türü geri döndürür [string](karakterlerde .Net'te büyük / küçük harf olmaz)
  • |% *perdaha önceki fakat aynı yöntem çağrısı kısayol yapar .ToUpper()ile aynı.ToLower()
  • ($a,$b)[boolean test] sahte üçlü operatör olarak kötüye
  • !!$c[bool]Buraya zorla atılanlar tanımsız başlar, $nullböylece "büyük harf kilidi: $ false" olarak var olmaya zorlar .

1
Bu |% t*y, hatırlamam gereken düzenli bir numara. [char[]]Çok kullandığımdan daha kısa . Neredeyse bunun Ipuçları başlığına gitmesi gerektiğini söyleyebilirim.
AdmBorkBork

94 bayt: -join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}}). bir |% *ethodoperatör için teşekkürler !
mazzy 11

6

Perl 5 -p , 31 30 29 bayt

@Nwellnhof sayesinde -1 bayt

@İkegami sayesinde -1 bayt

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

Çevrimiçi deneyin!


Neden basitçe s/a(.*?)(a|$)/uc$1/egi(22 bayt) değil?
nwellnhof

@nwellnhof Aktif durumda davayı değiştirdiğinde capslock, sadece büyük değil
Ton Hospel

1
Ah, anlıyorum. O zaman s/a(.*?)(a|$)/$1^uc$1^lc$1/egibir bayt daha kısa.
nwellnhof

@nwellnhof Teşekkürler, bu çok temiz
Ton Hospel

a([^a]*)a?daha kısadıra(.*?)(a|$)
ikegami 18:18

5

Python, 63 bayt

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

Başka bir Python çözümü, Python 2 ve 3'te çalışır. Küçük girdiler dışındaki herkes için çok uzun zaman alır.


5

6502 makine kodu rutini (C64), 51 bayt

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

Bir işaretçiyi 0 ile sonlandırılmış bir giriş dizgisine girmesini bekler $fc/$fd, ekrana çıkar.

Yorum yapılan sökme

 .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

Rutini kullanarak örnek assembler programı:

Çevrimiçi demo

ekran görüntüsü

Ca65 sözdiziminde kod :

.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        

Sadece şunu söylemeliyim ki, meclis yazma çabasına girdin. Asmın gerçekten zevk aldığım gerçeğiyle bir ilgisi olduğunu sanmıyorum ama belki de deneyime sahip olmak beni neyin gerektirdiğinin daha fazla farkında hale getiriyor. Tecrübe ya da kolaylık benim açımdan başka bir şey değil. Bu coşkuyu görmek için günümü biraz aydınlatıyorum.
Pryftan

@Pryftan teşekkürler :) Pratikte kalmanın güzel bir yolu, bazı oyunlar üzerinde çalışıyorum ve son zamanlarda da bu güzel eski makine için demo kodunu yapıyorum :)
Felix Palmen

Peki görmek güzel! Aynen böyle devam; Asm'dan zevk aldığımı hatırlıyorum ama bugünlerde çok fazla zevk alacağımı sanmıyorum (belki senin gibi eski bir makinem olmasaydı, belki de o zaman bile değil) kullanın. Her neyse, bunun sohbete dönüşmesine izin vermeyeceğim - sadece cevabı takdir ettiğimi söylemek istedim!
Pryftan

5

Java 8, 119 108 98 bayt

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

@ OlivierGrégoire sayesinde -11 bayt . @Nevay
sayesinde -10 bayt .

Açıklama:

Çevrimiçi deneyin.

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
Lanet olası zorunluluklar ... sizden önce cevabımı göndermemi yasakladılar ... Her neyse, işte cevabım, 11 bayt daha kısa: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 Güzel cevap! Peki benim göndermemi yasaklamakla ne demek istiyorsun? İş ağınız o kadar sıkı mı?
Kevin Cruijssen

Cevabım bir süre hazırdı: Sadece göndermeden önce test davalarını parlatıyordum ama sonra aniden sonsuz toplantılar oldu.
Olivier Grégoire

1
Hayır, sorun değil, sadece toplantılardan önce yeterince hızlı olmadığım için kendimi suçlamalıyım ;-) Ama bunu önerdiğin için teşekkürler!
Olivier Grégoire

2
98 bayt: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 bayt

@Martin Ender için kod incelemesi için teşekkürler: Yeniden kullanılabilirliğe yardımcı olmak için akış işlemeyi string işleme için değiştirdim. Ayrıca @RiaD ve @ceilingcat'e önerileri için çok teşekkürler.

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

Çevrimiçi deneyin!

O nasıl çalışır?

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

notlar

  • s[][]sihrin olduğu yer: [][0]karşılaştırma işlevi ve [][1]her durum için ilgili dönüşüm işlevidir.
  • ! [0,1] aralığına zorlamak için karşılaştırma işlevine uygulanır.

PPCG'ye Hoşgeldiniz! Maalesef, dbunun gibi ilklendirmelere güvenemezsiniz, çünkü fonksiyonunuzun tekrar kullanılamaz olduğu anlamına gelir . Basit bir d=0;tamir etmeli.
Martin Ender

Yeniden kullanılabilirliğin ya da devletin korunmasının bu durumda daha önemli olup olmadığından emin değildim. Yeniden kullanılabilirlik daha önemliyse, değişken bildirimlerini işlevin içinde hareket ettiririm, böylece başlangıç ​​okuyabilir void f(){int c,d=0;[...]. Her durumda, akış ölür, bu yüzden bir düzenleme sırayla!
Erik

süre bitiminde s ihtiyacınız var mı? F (NULL) ile
aramadıysanız,

d =! d saygısızlık için
RiaD

!! olacak ! t sırasını çevirirseniz ve d ile 1
RiaD 16-18

4

Haskell , 92 bayt

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

Çevrimiçi deneyin!

açıklama

İlk önce gküçük harfe büyük harfe, büyük harfe küçük harfe eşleştiren işlev olarak ilan ediyoruz. Bu aslında bayt sayımızın çoğunluğu. Sonra işlevi tanımlarız f. Girdi fbiçiminde ise a:byaptığımız

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

ave Ailk kalıbı eşleştirdikten sonra f, büyük / küçük harf ters çevrilmiş olarak girdiye uygulanır . Aksi takdirde biz hareket aönüne ve uygulamak fiçin b.


4

Wolfram Dili (Mathematica) , 70 bayt

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

Çevrimiçi deneyin!

Girdi ve çıktıyı karakter listesi olarak alır. Kolaylık sağlamak için bunu bir dizgeye dönüştürmek için altbilgiye kod ekledim.

Nasıl çalışır

#//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&parçası standarttır: Biz ilk bulmak A(büyük veya küçük harf), bundan sonra gelen harf ters Aartık kalmayıncaya kadar ve tekrar A'ın bulunacak.

İlginç olanı, durumu nasıl tersine çevirdiğimizdir: fonksiyon ToUpperCase@# + ToLowerCase@# - #&. Girişin üst kasalı versiyonunu ve girişin alt kasalı versiyonunu bir araya getirip gerçek girişi çıkartırız. Örneğin, {"I","n","P","u","T"}bu hesaplananlar listesi

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

hangi listelerde

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

Mathematica iki dizeyi ekleyerek herhangi bir şekilde yok olmasına rağmen ve bu basitleştirmek kadar akıllı a+b-aiçin bherhangi değerleri için ave bdize değerleri de dahil, bu yüzden bu kadar kolaylaştırır {"i","N","p","U","t"}.


4

Ruby , 42 41 bayt

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

Çevrimiçi deneyin!

Bir dizgeyi kabul eden, dizgiyi yerinde mutasyona uğratan ve geri döndüren bir lambda. Buradaki hile, subbir değiştirme yapılmışsa dizeyi (bir truthy değeri) döndürür, nilaksi takdirde döndürür . Varlığı swapcaseda oldukça kullanışlıdır.

-1 bayt: Asone Tuhid sayesinde boolean mantığını üçlü operatörle değiştirin

->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 bayt kaydedin . Tüm test durumlarını dahil edersem bağlantı çok uzundu.
Asone Tuhid

@AsoneTuhid Teşekkürler ... Bugünlerde üçlü operatörü hemen kullanmayı hatırlayacağım, bu yüzden bana hatırlatmanıza gerek kalmayacak.
benj2240

4

PHP 101 99 bayt

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

Bu şekilde koş:

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

Ungolfed:

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

Bu sadece for for döngüsüyle dize dolaşır ve her yinelemede geçerli mektubun olup olmadığını kontrol eder a, eğer öyleyse, tüm dizenin büyüklüğünü çevirir ( buradan yöntem ) ve değilse, geçerli mektubu yazdırır.


1
Kod golf için yapılan kural, tüm kodların dahil edilmesi gerektiğidir. Yani (örn kullanarak fonksiyon parametre olarak girdi almak ve aslında (php function anahtar yoluyla) bir işlev bildirmek ya da tam bir senaryo olması gerektiği anlamına gelir $argn, $argv, $_GET). Yani şu anda bu doğru bir sunum değil. Dönüş echoed veya returned olmalıdır (sadece c fonksiyonlarında izin verilir).
Christoph

1
Bunun için teşekkürler @Christoph, golf oynamak için yeniyim :). Cevabımı şimdi güncelledim, sadece yanlış olan bir şey olursa bana bildirin.
Davіd,

@ Christoph Vay! 75! Çok hoş! Sen benim +1 :) var
Davіd

4

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Tam program

Açıklama:

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

Kodun açıklaması?
SK19

1
@ SK19 Bir açıklama eklendi.
Outgolfer,

4

MATL , 23 20 bayt

'a A'Yb&Ybt2L)Yo2L(g

Çevrimiçi deneyin!

Açıklama:

'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

Daha eski cevap (23 bayt):

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

Çalıştığım diğer yöntemler:

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

3

Kabuğu , 15 bayt

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

Çevrimiçi deneyin!

açıklama

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

õ?„AaS¡Dvć?š

Çevrimiçi deneyin!

açıklama

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

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

Dene


açıklama

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 bayt

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

Çevrimiçi deneyin!

Tek bir giriş satırı varsayar.

@Ninjalj tarafından kaydedilen bir kuyruklu 49 bayt !

Line Sbütün işi yapar, aşağıda açıklanmıştır:

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 


Bu yanlış cevap verir (yorumunuzda belirtildiği gibi, CapsLock açıkken durum değiştirilir)
mbomb007 14:18

Gönderimi, CapsLock etkinleştirildiğinde büyük / küçük harf yerine büyük / küçük harf değişimi gerektirecek şekilde değiştirdim, çünkü makinemin bunu yaptığını asla anlamadım.
Broadwell

@ mbomb007 ah, OP'nin değiştiğini anlamadım; Şimdi bir açıklama düzenliyorum, bu yüzden bunu açıklamaya ekleyeceğim.
Giuseppe

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

@ ninjalj aynı zamanda bir SNOBOL golfçü mü yoksa sadece golf oynamak için korkunç muyum?
Giuseppe

3

Fortran (GFortran) , 307 bayt

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

Çevrimiçi deneyin!

Fortran, dizelerle başa çıkacak araçları "geliştiremediğinden" bu küçük canavara rastladım.

Girintili ve yorum yaptı:

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 bayt

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

Çevrimiçi çalıştırın ve hata ayıklayın

Bir regex üzerinde böler ve sonra sırayla geçiş yapar. İşte aynı program, paketlenmemiş, bağlanmamış ve yorum yaptı.

"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

Bunu çalıştır


Her nasılsa, açıklamalarını kodunla ilişkilendiremiyorum.
SK19

Yorum yapılana adım atmayı ve tercümanın iç durumunu izlemeyi deneyin. Bu yardımcı olur mu?
özyinelemeli

1
@ SK19: Oh, sanırım sorunu görüyorum. Stax programlarının iki temsili olduğunu söylemedim. ASCI ve paketlenmiş. İkisi arasında kayıpsız bir dönüşüm var. Ascii'nin yazması kolaydır, ancak yalnızca 95 sembol olduğundan golf için israflıdır. Golf programı doludur, bu yüzden farklı görünüyor, ama aynı program.
özyinelemeli

3

Javascript (ES6), 80 79 bayt

(Kısmen Rick Hitchcock tarafından yazılan bu cevaba dayanıyor . Yorum yapacak kadar itibarım yok çünkü ayrı bir cevap olarak gönderiliyor.)

(@ L4m2 yayınının 1 bayt sayesinde Kaydedilen burada .)

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

PPCG'ye Hoşgeldiniz!
Laikoni

2

Kirli , 55 bayt

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

Çevrimiçi deneyin!

Muhtemelen üçüncü bir kısa olabilir.
Masaüstünde olduğumda bir açıklama yazıp biraz daha golf oynayacağım.


2

Python 3, 78 72 bayt

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

Python 3.6+ m[1]yerine kullanabilirsiniz m.group(1).
Bubbler

Bu neden düşük kalite olarak işaretlendi?
Nissa

Ben ... Hiçbir fikrim yok
pppery

1
Kısa mesajlar varsa ve metin içermiyorsa, yeni yazılar otomatik olarak işaretlenir. Bir açıklama eklemek genellikle bunu önler.
mbomb007 15:18,

Ve şimdi merak ediyorum "A" nın "ppperry" içinde olması gerekiyordu.
Bay Lister
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.