No A, solo BLOC MAIUSC


197

Cosa succede quando il CapsLocktasto sulla tastiera non ha una tacca al suo interno?

"Questo hPPENS."

L'obiettivo di questo programma è quello di emulare in modo coerente le mancanze della tastiera in cui Aviene sostituita ogni pressione CapsLock. Le A maiuscole dalla fonte dovrebbero produrre lo stesso effetto. Quando CapsLockè abilitato, le maiuscole vengono invertite.

Casi test

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

Il criterio vincente è, come al solito, la dimensione del codice sorgente del programma inviato.


110
Benvenuti nel sito! Questa è una bella prima sfida e sfortunatamente molto simile per me e le mie dita FT.
DJMcMayhem

5
caso di prova suggerito:teSTateSTateSTateST
Rod

88
Se solo la chiave di
invio

75
t succede .......
12Me21

22
Si è unito letteralmente a questo sito per votare "Senza il notch, nessuno può sentirti urlare"
lucasvw

Risposte:


115

AutoHotKey , 7 byte

a::vk14

// È valido? Questo fa davvero ciò che vuole OP - sostituisci acon CapsLock (vk14).

Esegui questo programma e digita l'input dalla tastiera.


4
"È valido?" OP non ha specificato vincoli di input o output, quindi lo considero valido.
Nefrin,

5
Non vedere troppe risposte ahk!
HaveSpacesuit

57
È GRANDE ma come posso DISATTIVARLO?
RobbG

69
@RobbG basta digitare "killLL utohotkey" ... oh wIT
Nefrin

5
@tsh Penso che ti sia perso lo scherzo qui ...
RobbG

32

V , 9 byte

ò/ãa
xg~$

Provalo online!

hexdump:

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

Spiegazione:

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

Presuppone che l'input sia su una singola riga

Spiegazione

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 

Questa constatazione insensibile al caso di 'a'?
Gnudiff,

@Gnudiff \covunque in una ricerca regex consente l'insensibilità ai casi
Herman L

Devi impostare un flag specifico per g~$funzionare? Perché per me inverte solo il caso fino alla fine della riga, non l'intero file, quindi questo non funziona davvero per i file multilinea per me.
Cubico

1
@Cubic Come ho scritto nella risposta, "presume che l'input sia su una sola riga"
Herman L

@Cubic Se vuoi che finisca il file e supporti gli input su più righe, puoi farlo g~vGo vG~.
DJMcMayhem

15

C, 72 byte

Grazie a @Ton Hospel per aver contribuito a salvare 16 byte!

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

Provalo online!


2
Puoi scambiare il caso delle lettere usando un xor con 32
Ton Hospel

Probabilmente si può risparmiare ancora di più avendo tessere 0/32invece pari / dispari (t XOR con 32 per ciascuna a) e poi le lettere XOR direttamente cont
Ton Hospel

2
Bel modo di rilevare a's
Ton Hospel

1
Le funzioni di @TonHospel devono essere riutilizzabili e non credo che contino come riutilizzabili se hai bisogno di un codice esterno per renderlo nuovamente utilizzabile dopo ogni chiamata.
Steadybox

1
6305%cè 0 se cè 13.
Rosie F

11

Buccia , 11 byte

Γ·§?m\:€"Aa

Provalo online!

Spiegazione

Sto usando il sovraccarico alquanto oscuro di Γchiamato listNF, che costruisce funzioni ricorsive che operano su liste. Corrisponde al seguente modello di Haskell:

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

L'idea è che listNFaccetta una funzione di supporto fe restituisce una nuova funzione g, che accetta un elenco. La funzione fprende una funzione, che sarà sempre g, e la testa xe la coda xsdella lista, e fa qualcosa con loro. Nella nostra applicazione, fchiama gricorsivamente xs. Il programma è interpretato in questo modo:

Γ (· (§ (?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, buona cosa ho rinfrescato prima che ho postato la mia soluzione 12 byte: Ḟ·+m\ṁx'Ax'a. Potremmo avere una spiegazione? Non riesco a trovare alcuna informazione su ciò che Γfa esattamente e questa sembra una buona opportunità per imparare.
Sophia Lechner,

1
@SophiaLechner Done. Questa versione di Γè un po 'difficile da spiegare, spero che tu possa dargli un senso.
Zgarb,

Wow, questo è lento. È solo TIO?
FrownyFrog,

1
@FrownyFrog It's Husk. L'inferenza del tipo di programmi contenenti Γsembra essere lenta in generale. Se non hai familiarità con Husk, un programma viene interpretato eseguendo il ciclo attraverso tutte le possibili strutture del programma (essenzialmente i possibili posizionamenti delle parentesi) e tutti i sovraccarichi di ciascun built-in, e scegliendo il primo in cui il risultato è ben- digitato. L'interprete è abbastanza intelligente da rifiutare alcune possibilità in anticipo, ma sembra che la versione ricorsiva di Γquesto pasticcio possa rovinare molte scelte.
Zgarb,

@SophiaLechner Ho scritto un suggerimento che spiega Γin dettaglio .
Zgarb,

11

Retina , 33 21 17 byte

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

Provalo online

Spiegazione:

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 grazie a Martin
-4 byte grazie a Leo


Sorprendentemente, questo è quasi breve quanto le attuali soluzioni
Pyth

1
Penso che funzioni iT`aAlL`__Ll`a[^a]*a?anche per 21 byte.
Neil

4 byte più brevi usando partite sovrapposte
Leone

Sono interessato a come funziona se hai tempo di aggiungere la spiegazione. Grazie!
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()));

** Aggiornamento (grazie a @John & @aloisdg) **

C # , 69 byte

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

2
Benvenuti in PPCG! Bella prima risposta!
RedClover

2
puoi salvare 7 byte cambiando new[] { 'a', 'A' }in'a', 'A'
John

5
Puoi farlo in 69 byte con la stessa logica! Provalo online! (usa input / ouput invece di console, rimuovi ToList, inverti il ​​ternario e usa il commento di @John) Questa è una bella prima risposta. Continua così!
aloisdg,

3
Entrambe queste versioni non scambiano maiuscole (si trasformano solo in maiuscolo) quando CapsLock è abilitato. Questo è un requisito (Vedi l'ultimo caso di prova)
Broadwell,

@Broadwell Come sapresti se CapsLock è abilitato? Sei sicuro che l'ultimo test case sia corretto? Passa tutti gli altri casi di test, per quanto posso vedere. Grazie!
Aalawlx,

7

JavaScript (ES6), 93 88 84 82 byte

(5 byte salvati grazie a @Shaggy, 4 byte grazie a @ user81655 e 2 byte grazie a @ l4m2.)

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

Casi test:


1
['to${c<'a'?'Low':'Upp'}erCase']dovrebbe salvarti qualche byte, sostituendo le virgolette singole con i backtick.
Shaggy

Certo, @Shaggy. Grazie!
Rick Hitchcock,

Utilizzando ^1ad avere ula parità può farvi inizializzare più breve:s=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Anche qui c'è un altro modo complicato per testare la lettera ache è più corta:a=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Fantastico, @ user81655, specialmente usando l' inoperatore in quel modo. Sempre di più da imparare!
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="")

Grazie a Giuseppe per aver risolto la risposta.

Spiegazione

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

Provalo online!


Forse non l'ho chiarito, ma questa risposta non inverte le maiuscole quando CapsLock è abilitato (funziona solo toupper), il che è un requisito.
Broadwell,

2
ooohhhhhhh è molto intelligente con il c(F,T), anche se @Broadwell ha ragione; sembra che sarà un chartr("a-zA-Z","A-Za-z",v)[w]piuttosto chetoupper
Giuseppe

@Giuseppe Grazie
Vlo

6

PowerShell Core , 105 byte

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

Provalo online!

Che cosa senza un vero operatore ternario e nessun alias predefinito per la stampa su schermo, non è così breve.

  • % t*ysi espande in | ForEach-Object -Method ToCharArrayequiv. di"$args".ToCharArray()
  • Write-Host -n è per il parametro -NoNewLine
  • "$_"[char]riporta il tipo a [string](i caratteri non hanno maiuscole / minuscole in .Net)
  • |% *perfa lo stesso metodo chiama scorciatoia come prima, ma per .ToUpper(), lo stesso con.ToLower()
  • ($a,$b)[boolean test] abusato come operatore falso-ternario
  • !!$cforza-cast a [bool]qui inizia indefinito, $nullquindi viene costretto a esistere come "caps lock: $ false".

1
Questo |% t*yè un trucco accurato che dovrò ricordare. Più corto di quello [char[]]che uso molto. Direi quasi che dovrebbe andare sul thread Suggerimenti.
AdmBorkBork

94 byte: -join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}}). grazie per un |% *ethodoperatore!
mazzy

6

Perl 5 -p , 31 30 29 byte

-1 byte grazie a @nwellnhof

-1 byte grazie a @ikegami

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

Provalo online!


Perché non semplicemente s/a(.*?)(a|$)/uc$1/egi(22 byte)?
nwellnhof,

@nwellnhof Poiché il blocco maiuscole quando attivo attiva / disattiva il caso, non è maiuscolo
Ton Hospel

1
Ah, capisco. Quindi s/a(.*?)(a|$)/$1^uc$1^lc$1/egiè più corto di un byte.
nwellnhof

@nwellnhof Grazie, è molto pulito
Ton Hospel

a([^a]*)a?è più corto dia(.*?)(a|$)
ikegami il

5

Python, 63 byte

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

Un'altra soluzione Python, funziona in Python 2 e 3. Richiede molto tempo per tutti gli input tranne quelli piccoli.


5

6502 routine codice macchina (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

Si aspetta un puntatore a una stringa di input con terminazione 0 $fc/$fd, output sullo schermo.

Smontaggio commentato

 .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

Esempio di programma assembler che utilizza la routine:

Demo online

immagine dello schermo

Codice nella sintassi 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        

Devo solo dire che ammiro che tu sia andato allo sforzo di scrivere in assemblea. Non penso che questo abbia molto a che fare con il fatto che mi divertivo davvero tanto, ma forse avere l'esperienza mi rende più consapevole di ciò che comporta. L'esperienza o la facilità sono oltre il punto per me. Rallegra un po 'la mia giornata anche vedere un tale entusiasmo.
Pryftan,

@Pryftan grazie :) È solo un bel modo per continuare a esercitarmi, sto lavorando ad alcuni giochi e recentemente anche un codice demo per questa bella vecchia macchina :)
Felix Palmen

Bene è bello da vedere! Continuate così; Ricordo di essermi divertito ma non credo che mi piacerebbe così tanto al giorno d'oggi (a meno che forse non avessi una vecchia macchina come te, cioè ma forse nemmeno allora) - C è la mia preferita in ogni momento ed è ciò che principalmente uso. Ad ogni modo, non permettere che questo si evolva in chat - volevo solo dire che ho apprezzato la risposta!
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 grazie a @ OlivierGrégoire .
-10 byte grazie a @Nevay .

Spiegazione:

Provalo 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
Dannati imperativi ... mi hanno proibito di pubblicare la mia risposta prima della tua ... Comunque, ecco la mia risposta, 11 byte in meno: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 Bella risposta! E cosa intendi per proibirmi di pubblicare? La tua rete di lavoro è così rigorosa?
Kevin Cruijssen,

La mia risposta è stata pronta per un po ': stavo solo lucidando i casi di test prima di pubblicare, ma poi improvvisamente sono avvenute riunioni infinite.
Olivier Grégoire,

1
No, va bene, devo solo incolpare me stesso per non essere stato abbastanza veloce prima degli incontri ;-) Ma grazie per avermelo suggerito!
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,

5

C, 167 168 158 131 byte

Grazie per @Martin Ender per la revisione del codice: ho cambiato l'elaborazione del flusso per l'elaborazione della stringa per aiutare con la riusabilità. Mille grazie anche a @RiaD e @ceilingcat per i loro suggerimenti.

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

Provalo online!

Come funziona?

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

Appunti

  • s[][]è dove avviene la magia: [][0]è la funzione di confronto ed [][1]è la funzione di trasformazione correlata per ogni stato.
  • ! viene applicato alla funzione di confronto per forzarlo nell'intervallo [0,1].

Benvenuti in PPCG! Sfortunatamente, non puoi fare affidamento sull'inizializzazione di dquesto perché significa che la tua funzione non è riutilizzabile . Un semplice d=0;dovrebbe risolverlo.
Martin Ender,

Non ero sicuro che la riusabilità o il mantenimento dello stato fossero più importanti in questo caso. Se la riusabilità è più importante, sposterei le dichiarazioni delle variabili all'interno della funzione in modo da leggere l'inizio void f(){int c,d=0;[...]. In ogni caso, lo stream muore, quindi una modifica è in ordine!
ErikF

hai bisogno di s nel tuo ciclo while? Non può diventare NULL se non si chiama con f (NULL)
RiaD

d =! d per il lancio
RiaD

!! sarà ! se capovolgi l'ordine di t e inizi con d con 1
RiaD

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

Provalo online!

Spiegazione

Per prima cosa dichiariamo gdi essere la funzione che mappa minuscole in maiuscole e maiuscole in minuscole. Questa è in realtà la maggior parte del nostro personale. Quindi definiamo la funzione f. Se l'input a fè della forma a:bche facciamo

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

ae Acorrispondiamo al primo modello e quindi applichiamo fl'input con il caso invertito. In caso contrario, ci muoviamo afuori davanti e applichiamo fa b.


4

Wolfram Language (Mathematica) , 70 byte

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

Provalo online!

Accetta input e output come un elenco di caratteri. Per comodità ho aggiunto il codice nel piè di pagina per convertirlo da e verso una stringa.

Come funziona

La parte #//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&è standard: troviamo la prima A(maiuscola o minuscola), viceversa che viene dopo A, e ripetiamo fino a quando non ce ne sono più A.

La parte interessante è come invertire il caso: la funzione ToUpperCase@# + ToLowerCase@# - #&. Aggiungiamo insieme la versione maiuscola dell'input e la versione maiuscola dell'input, quindi sottraggiamo l'input effettivo. Ad esempio, dato l'elenco, {"I","n","P","u","T"}questo calcola

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

quali thread su elenchi come

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

e anche se Mathematica non ha alcuna modalità di aggiunta di due stringhe, è abbastanza intelligente per semplificare a+b-aa bper tutti i valori di ae b, tra valori di stringa, quindi questo semplifica al {"i","N","p","U","t"}.


4

Rubino , 42 41 byte

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

Provalo online!

Un lambda che accetta una stringa, la muta in posizione e la restituisce. Il trucco qui è che subrestituisce la stringa (un valore veritiero) se è stata effettuata una sostituzione, e restituisce nilaltrimenti. L'esistenza di swapcaseè anche abbastanza utile.

-1 byte: sostituisce la logica booleana con l'operatore ternario, grazie a 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
}

salva 1 byte . Il collegamento era troppo lungo se includevo tutti i casi di test.
Solo Tuhid,

@AsoneTuhid Grazie ... Uno di questi giorni mi ricorderò di usare subito l'operatore ternario, quindi non dovrai ricordarmelo.
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];

Esegui in questo modo:

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

Questo fa semplicemente un giro nella stringa con un ciclo for, e ad ogni iterazione controlla se la lettera corrente è a, in tal caso, quindi capovolge il caso dell'intera stringa (metodo da qui ) e, in caso contrario, stampa la lettera corrente.


1
La convenzione per il codice golf è che tutto il codice deve essere incluso. Ciò significa che si deve prendere in ingresso come parametro di funzione e in realtà dichiarare una funzione (tramite la parola chiave function in php) o di avere uno script completo (ad esempio utilizzando $argn, $argv, $_GET). Quindi al momento questa non è una presentazione corretta. Il ritorno deve essere modificato echoo modificato return(consentito solo per le funzioni ofc).
Christoph

1
Grazie per questo @Christoph, sono un po 'nuovo del golf :). Ho aggiornato la mia risposta ora, fammi sapere se c'è qualcos'altro che non va.
Davіd

@Christoph Wow! 75! Molto bella! Hai il mio +1 :)
Davіd

4

Gelatina , 14 byte

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

Provalo online!

Programma completo.

Spiegazione:

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

Spiegazione del codice?
SK19

1
@ SK19 Aggiunta una spiegazione.
Erik the Outgolfer

4

MATL , 23 20 byte

'a A'Yb&Ybt2L)Yo2L(g

Provalo online!

Spiegazione:

'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

Risposta precedente (23 byte):

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

Altri metodi che ho provato:

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

3

Buccia , 15 byte

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

Provalo online!

Spiegazione

ω(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ć?š

Provalo online!

Spiegazione

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

Provalo


Spiegazione

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

Provalo online!

Presuppone una singola riga di input.

Un enorme 49 byte salvati da @ninjalj !

Line Sfa tutto il lavoro, spiegato di seguito:

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 


Questo dà la risposta sbagliata (come hai affermato nel tuo commento, il caso viene scambiato quando CapsLock è
attivo

Ho modificato il post per richiedere lo scambio di maiuscole / minuscole (anziché semplicemente maiuscole) quando CapsLock è abilitato perché non mi sono mai reso conto che la mia macchina lo fa.
Broadwell,

@ mbomb007 ah, non mi ero reso conto che OP lo avesse cambiato; Sto modificando una spiegazione ora, quindi la includerò nella spiegazione.
Giuseppe

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

@ninjalj sei anche un golfista SNOBOL o sono semplicemente terribile a giocare a golf ??
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

Provalo online!

Dato che Fortran non ha strumenti "avanzati" per gestire le stringhe, ho pensato a questo piccolo mostro.

Rientrato e commentato:

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

Esegui ed esegui il debug online

Si divide su una regex e quindi alterna alternativamente il case. Ecco lo stesso programma, decompresso, non modificato e commentato.

"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

Esegui questo


In qualche modo non riesco a mettere in relazione la tua spiegazione con il tuo codice.
SK19

Prova a passare da quello commentato e a guardare lo stato interno dell'interprete. Questo aiuta?
ricorsivo

1
@ SK19: Oh, penso di vedere il problema. Non ho detto che i programmi stax hanno due rappresentazioni. Ascii e confezionato. C'è una conversione senza perdite tra i due. Ascii è facile da scrivere, ma dispendioso per il golf, poiché ci sono solo 95 simboli. Il programma di golf è pieno, quindi sembra diverso, ma è lo stesso programma.
ricorsivo

3

Javascript (ES6), 80 79 byte

(In parte basato su questa risposta di Rick Hitchcock. Pubblicazione come risposta separata perché non ho la reputazione sufficiente per commentare.)

(Salvato 1 byte grazie al post di @l4m2 qui .)

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

Benvenuti in PPCG!
Laikoni

2

Sporco , 55 byte

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

Provalo online!

Probabilmente può essere circa un terzo più corto.
Scriverò una spiegazione e giocherò ancora di più quando sono su un desktop.


2

Python 3, 78 72 byte

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

Puoi usare m[1]al posto di m.group(1)su Python 3.6+.
Gorgogliatore

Perché questo è stato contrassegnato come di bassa qualità ...?
Nissa,

Non ne ho idea ...
pepery

1
I nuovi post vengono contrassegnati automaticamente se sono brevi e non contengono testo. L'aggiunta di una descrizione di solito impedisce questo.
mbomb007,

E ora mi chiedo quante "A" dovrebbero esserci in "Ppperry".
Sig. Lister,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.