Tidak, hanya CAPS LOCK


197

Apa yang terjadi ketika CapsLocktombol di keyboard Anda tidak memiliki lekukan di dalamnya?

"HPPENS ini."

Tujuan dari program ini adalah untuk secara konsisten meniru kesalahan keyboard dimana setiap Apers diganti CapsLock. Huruf besar 'A' dari sumber harus menghasilkan efek yang sama. Saat CapsLockdiaktifkan, kapitalisasi dibalik.

Uji Kasus

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

Kriteria yang menang adalah, seperti biasa, ukuran kode sumber program yang dikirimkan.


110
Selamat datang di situs ini! Ini adalah tantangan pertama yang bagus, dan sayangnya sangat cocok untuk saya dan jari-jari saya.
DJMcMayhem

5
test case yang disarankan:teSTateSTateSTateST
Rod

88
Kalau saja kunci enter juga memiliki takik di dalamnya, maka ini tidak akan
12Me21

75
itu tidak terjadi .......
12Me21

22
Secara harfiah bergabung dengan situs ini untuk mengunggulkan "Tanpa kedudukan, tidak ada yang dapat mendengar Anda menjerit"
lucasvw

Jawaban:


115

AutoHotKey , 7 byte

a::vk14

// Apakah ini valid? Ini benar - benar melakukan apa yang OP inginkan - ganti adengan CapsLock (vk14).

Jalankan program ini, dan ketik input dari keyboard ..


4
"Apakah ini valid?" OP tidak menentukan batasan input atau output jadi saya menganggap ini valid.
Nefrin

5
Jangan melihat terlalu banyak jawaban ahk!
HaveSpacesuit

57
HAL, tetapi bagaimana saya bisa menolaknya?
RobbG

69
@RobbG cukup ketik "killLL utohotkey" ... oh wIT
Nefrin

5
@tsh, saya pikir Anda sudah melewatkan lelucon di sini ...
RobbG

32

V , 9 byte

ò/ãa
xg~$

Cobalah online!

Hexdump:

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

Penjelasan:

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

Mengasumsikan input berada pada satu baris

Penjelasan

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 

Apakah kasus ini penemuan 'a' yang tidak sensitif?
Gnudiff

@Gnudiff \cdi mana saja dalam pencarian regex memungkinkan case-insensitivity
Herman L

Apakah Anda perlu menetapkan bendera khusus g~$agar berfungsi? Karena bagi saya itu hanya membalik kasus sampai akhir baris, bukan seluruh file, jadi ini tidak benar-benar berfungsi untuk file multiline untuk saya.
Cubic

1
@Cubic Seperti yang saya tulis dalam jawaban, itu "mengasumsikan input berada pada satu baris"
Herman L

@Cubic Jika Anda menginginkannya pergi ke akhir file dan mendukung input pada banyak baris, Anda bisa melakukan g~vGatau vG~.
DJMcMayhem

15

C, 72 byte

Terima kasih kepada @Ton Hospel untuk membantu menghemat 16 byte!

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

Cobalah online!


2
Anda dapat menukar case huruf menggunakan xor dengan 32
Ton Hospel

Anda mungkin dapat lebih berhemat dengan tmenjadi 0/32genap / ganjil (xor t dengan 32 untuk masing-masing a) dan kemudian xor huruf langsung dengant
Ton Hospel

2
Cara yang baik untuk mendeteksi a's
Ton Hospel

1
@TonHospel Functions harus dapat digunakan kembali , dan saya pikir itu tidak dapat digunakan kembali jika Anda memerlukan kode eksternal untuk membuatnya dapat digunakan lagi setelah setiap panggilan.
Steadybox

1
6305%cadalah 0 jika cadalah 13.
Rosie F

11

Sekam , 11 byte

Γ·§?m\:€"Aa

Cobalah online!

Penjelasan

Saya menggunakan overloading yang agak kabur dari yang Γdisebut listNF, yang membangun fungsi rekursif yang beroperasi pada daftar. Ini sesuai dengan pola Haskell berikut:

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

Idenya adalah yang listNFmengambil fungsi pembantu fdan mengembalikan fungsi baru g, yang mengambil daftar. Fungsi tersebut fmengambil fungsi, yang akan selalu ada g, dan kepala xdan ekor xsdaftar, dan melakukan sesuatu dengan mereka. Dalam aplikasi kami, fpanggilan gsecara rekursif aktif xs. Program ditafsirkan seperti ini:

Γ (· (§ (?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, hal yang baik saya segar sebelum saya diposting saya solusi 12 byte: Ḟ·+m\ṁx'Ax'a. Bisakah kita mendapat penjelasan? Saya tidak dapat menemukan informasi tentang apa yang Γtepatnya dan ini sepertinya kesempatan yang baik untuk belajar.
Sophia Lechner

1
@SophiaLechner Selesai. Versi Γini agak sulit dijelaskan, saya harap Anda bisa memahaminya.
Zgarb

Wah ini lambat. Apakah hanya TIO?
FrownyFrog

1
@FrownyFrog Ini Sekam. Ketik inferensi program yang mengandung Γtampaknya lambat secara umum. Jika Anda tidak terbiasa dengan Husk, sebuah program ditafsirkan dengan perulangan melalui semua struktur yang mungkin dari program (pada dasarnya kemungkinan penempatan kurung) dan semua kelebihan beban dari masing-masing built-in, dan memilih yang pertama di mana hasilnya baik- diketik. Penerjemah cukup pintar untuk menolak beberapa kemungkinan sejak dini, tetapi tampaknya versi rekursif Γdapat mengacaukan langkah ini dan memaksanya untuk mengulang melalui banyak pilihan.
Zgarb

@SophiaLechner Saya menulis tip yang menjelaskan Γsecara rinci .
Zgarb

11

Retina , 33 21 17 byte

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

Cobalah online

Penjelasan:

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 terima kasih kepada Martin
-4 byte terima kasih kepada Leo


Hebatnya ini hampir sesingkat solusi Pyth saat ini
Ton Hospel

1
Saya pikir iT`aAlL`__Ll`a[^a]*a?juga berfungsi untuk 21 byte.
Neil

4 byte lebih pendek menggunakan pertandingan yang tumpang tindih
Leo

Saya tertarik pada cara kerjanya jika Anda punya waktu untuk menambahkan penjelasan. Terima kasih!
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()));

** Pembaruan (terima kasih kepada @John & @aloisdg) **

C # , 69 byte

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

2
Selamat datang di PPCG! Jawaban pertama yang bagus!
RedClover

2
Anda dapat menyimpan 7 byte yang diubah new[] { 'a', 'A' }menjadi'a', 'A'
John

5
Anda dapat melakukannya dalam 69 byte dengan logika yang sama! Cobalah online! (gunakan input / ouput alih-alih konsol, hapus ToList, inversi ternary dan gunakan @John komentar) Ini adalah jawaban pertama yang bagus. Teruskan!
aloisdg

3
Kedua versi ini tidak menukar huruf besar (hanya berubah menjadi huruf besar) ketika CapsLock diaktifkan. Ini adalah persyaratan. (Lihat test case terakhir)
Broadwell

@Broadwell Bagaimana Anda tahu jika CapsLock diaktifkan? Apakah Anda yakin test case terakhir benar? Itu melewati semua kasus uji lainnya, sejauh yang saya bisa lihat. Terima kasih!
Aalawlx

7

JavaScript (ES6), 93 88 84 82 byte

(disimpan 5 byte berkat @Shaggy, 4 byte terima kasih ke @ user81655, dan 2 byte berkat @ l4m2.)

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

Kasus uji:


1
['to${c<'a'?'Low':'Upp'}erCase']akan menghemat beberapa byte, menggantikan tanda kutip tunggal dengan backticks.
Shaggy

Tentu, @Shaggy. Terima kasih!
Rick Hitchcock

Menggunakan ^1telah uparitas dapat membiarkan Anda menginisialisasi lebih pendek:s=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Juga ada cara rumit lain untuk menguji surat ayang lebih pendek:a=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Cemerlang, @ user81655, terutama menggunakan inoperator seperti itu. Selalu lebih banyak belajar!
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="")

Terima kasih @Giuseppe karena telah memperbaiki jawabannya.

Penjelasan

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

Cobalah online!


Mungkin saya tidak memperjelasnya, tetapi jawaban ini tidak membalikkan huruf besar ketika CapsLock diaktifkan (hanya berfungsi toupper), yang merupakan persyaratan.
Broadwell

2
ooohhhhhhh itu sangat pintar dengan c(F,T), meskipun @Broadwell benar; sepertinya itu akan menjadi chartr("a-zA-Z","A-Za-z",v)[w]bukantoupper
Giuseppe

@Giuseppe Terima kasih
Vlo

6

PowerShell Core , 105 byte

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

Cobalah online!

Apa yang tanpa operator ternary nyata dan tidak ada alias standar untuk mencetak ke layar, itu tidak sesingkat itu.

  • % t*ymemperluas ke | ForEach-Object -Method ToCharArrayequiv. dari"$args".ToCharArray()
  • Write-Host -n adalah untuk parameter -NoNewLine
  • "$_"mengembalikan [char]tipe ke [string](karakter tidak memiliki huruf besar / kecil di .Net)
  • |% *permelakukan cara pintas panggilan metode yang sama seperti sebelumnya, tetapi untuk .ToUpper(), sama dengan.ToLower()
  • ($a,$b)[boolean test] disalahgunakan sebagai operator terner palsu
  • !!$cmemaksa-cast ke [bool]sini mulai tidak terdefinisi $nullsehingga dipaksa menjadi ada sebagai "caps lock: $ false".

1
Itu |% t*yadalah trik rapi yang perlu saya ingat. Lebih pendek dari [char[]]yang saya gunakan banyak. Saya hampir mengatakan bahwa harus masuk ke thread Tips.
AdmBorkBork

94 bytes: -join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}}). terima kasih untuk |% *ethodoperator!
mazzy

6

Perl 5 -p , 31 30 29 byte

-1 byte terima kasih kepada @nwellnhof

-1 byte terima kasih kepada @ikegami

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

Cobalah online!


Mengapa tidak sederhana s/a(.*?)(a|$)/uc$1/egi(22 byte)?
nwellnhof

@nwellnhof Karena capslock ketika aktif menghidupkan
kasing, kasing

1
Ah, begitu. Maka s/a(.*?)(a|$)/$1^uc$1^lc$1/egilebih pendek satu byte.
nwellnhof

@nwellnhof Terima kasih, itu sangat rapi
Ton Hospel

a([^a]*)a?lebih pendek daria(.*?)(a|$)
ikegami

5

Python, 63 byte

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

Solusi Python lain, bekerja di Python 2 dan 3. Membutuhkan waktu yang sangat lama untuk semua input kecil.


5

6502 rutin kode mesin (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

Mengharapkan pointer ke string input 0-terminasi di $fc/$fd, output ke layar.

Komentar pembongkaran

 .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

Contoh program assembler menggunakan rutin:

Demo online

tangkapan layar

Kode dalam sintaksis 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        

Saya hanya harus mengatakan bahwa saya mengagumi Anda pergi ke upaya untuk menulis dalam pertemuan. Saya tidak berpikir ini ada hubungannya dengan fakta saya dulu sangat menikmati asm tapi mungkin memiliki pengalaman membuat saya lebih sadar akan apa yang disyaratkan. Pengalaman atau kemudahan adalah hal penting bagi saya. Itu mencerahkan hari saya hanya sedikit untuk melihat antusiasme seperti itu juga.
Pryftan

@Pryftan terima kasih :) Ini hanya cara yang bagus untuk terus berlatih, saya sedang mengerjakan beberapa permainan dan baru-baru ini juga mendemonstrasikan kode untuk mesin tua yang bagus ini :)
Felix Palmen

Bagus untuk dilihat! Teruskan; Saya ingat menikmati asm tapi saya pikir saya tidak akan menikmatinya saat ini (kecuali mungkin saya punya mesin tua seperti Anda, itu tapi mungkin bahkan tidak saat itu) - C adalah favorit saya sepanjang masa dan itu yang terutama saya lakukan menggunakan. Bagaimanapun, jangan biarkan ini berkembang menjadi obrolan - hanya ingin mengatakan saya menghargai jawabannya!
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 terima kasih kepada @ OlivierGrégoire .
-10 byte berkat @Nevay .

Penjelasan:

Cobalah 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
Sangat penting ... mereka melarang saya untuk mengirim jawaban saya sebelum Anda ... Bagaimanapun, inilah jawaban saya, lebih pendek 11 byte:s->{int z=0,d;for(int c:s)if((d=c&95)==65)z^=1;else System.out.printf("%c",z<1|d<66|d>90?c:c<91?c|32:c&95);}
Olivier Grégoire

@ OlivierGrégoire Jawaban yang bagus! Dan apa yang Anda maksud dengan melarang saya memposting? Apakah jaringan kerja Anda seketat itu?
Kevin Cruijssen

Jawaban saya siap untuk sementara waktu: Saya hanya memoles kasus uji sebelum memposting tetapi kemudian pertemuan yang tak berkesudahan terjadi.
Olivier Grégoire

1
Tidak, tidak apa-apa, saya hanya harus menyalahkan diri saya sendiri karena tidak cukup cepat sebelum pertemuan ;-) Tapi terima kasih telah menyarankan ini!
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

Terima kasih untuk @Martin Ender untuk ulasan kode: Saya telah mengubah pemrosesan aliran untuk pemrosesan string untuk membantu penggunaan kembali. Juga banyak terima kasih kepada @RiaD dan @ceilingcat untuk saran mereka.

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

Cobalah online!

Bagaimana cara kerjanya?

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

Catatan

  • s[][]adalah tempat keajaiban terjadi: [][0]adalah fungsi perbandingan dan [][1]fungsi transformasi terkait untuk setiap negara.
  • ! diterapkan pada fungsi perbandingan untuk memaksanya ke dalam kisaran [0,1].

Selamat datang di PPCG! Sayangnya, Anda tidak dapat mengandalkan inisialisasi dseperti ini karena itu berarti bahwa fungsi Anda tidak dapat digunakan kembali . Sederhana d=0;harus memperbaikinya.
Martin Ender

Saya tidak yakin apakah dapat digunakan kembali atau mempertahankan keadaan lebih penting dalam kasus ini. Jika usabilitas lebih penting, saya akan memindahkan deklarasi variabel di dalam fungsi sehingga awal akan membaca void f(){int c,d=0;[...]. Bagaimanapun, aliran mati, jadi pengeditan dalam urutan!
ErikF

Apakah Anda perlu di loop sementara Anda? Itu tidak bisa menjadi NULL kecuali Anda memanggil dengan f (NULL)
RiaD

d =! d untuk membalik
RiaD

!! akan ! jika Anda membalik urutan t, dan mulai d dengan 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

Cobalah online!

Penjelasan

Pertama kita mendeklarasikan gsebagai fungsi yang memetakan huruf kecil ke huruf besar dan huruf besar ke huruf kecil. Ini sebenarnya sebagian dari bytecount kami. Kemudian kita mendefinisikan fungsinya f. Jika input ke fadalah dari formulir yang a:bkami lakukan

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

adan Acocok dengan pola pertama dan dengan demikian kami berlaku funtuk input dengan case itu terbalik. Jika tidak kami bergerak adepan dan berlaku funtuk b.


4

Bahasa Wolfram (Mathematica) , 70 byte

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

Cobalah online!

Mengambil input dan output sebagai daftar karakter. Untuk kenyamanan saya telah menambahkan kode di footer untuk mengonversikan dari dan kembali ke string.

Bagaimana itu bekerja

Bagian #//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&adalah standar: kami menemukan yang pertama A(huruf besar atau kecil), kasus terbalik yang datang setelah A, dan ulangi sampai tidak ada lagi yang Adapat ditemukan.

Bagian yang menarik adalah bagaimana kita membalikkan huruf besar: fungsi ToUpperCase@# + ToLowerCase@# - #&. Kami menambahkan versi input yang berhuruf besar dan input yang berhuruf rendah, kemudian mengurangi input yang sebenarnya. Sebagai contoh, mengingat daftar {"I","n","P","u","T"}ini menghitung

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

yang utas sebagai daftar

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

dan meskipun Mathematica tidak memiliki cara tertentu untuk menambahkan dua string, itu cukup pintar untuk menyederhanakan a+b-auntuk buntuk setiap nilai-nilai adan b, termasuk nilai-nilai string, jadi ini untuk menyederhanakan {"i","N","p","U","t"}.


4

Ruby , 42 41 byte

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

Cobalah online!

Seekor lambda menerima string, memutasikan string di tempatnya, dan mengembalikannya. Kuncinya di sini adalah submengembalikan string (nilai kebenaran) jika substitusi dilakukan, dan mengembalikan nilsebaliknya. Keberadaannya swapcasepun cukup praktis.

-1 byte: Ganti logika boolean dengan operator ternary, terima kasih kepada 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
}

simpan 1 byte . Tautannya terlalu panjang jika saya memasukkan semua kotak uji.
Asone Tuhid

@ AsoneTuhid Terima kasih ... Suatu hari saya akan ingat untuk segera menggunakan operator ternary, jadi Anda tidak perlu mengingatkan saya lagi.
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];

Jalankan seperti ini:

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

Tidak Terkumpul:

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

Ini hanya loop melalui string dengan for loop, dan pada setiap iterasi ia memeriksa apakah huruf saat ini adalah a, jika demikian, kemudian membalik kasing dari seluruh string (metode dari sini ), dan jika tidak, kemudian cetak huruf saat ini.


1
Konvensi untuk kode golf adalah bahwa semua kode harus disertakan. Itu berarti Anda harus mengambil masukan sebagai parameter fungsi dan benar-benar menyatakan fungsi (melalui kata kunci fungsi dalam php) atau memiliki script lengkap (misalnya menggunakan $argn, $argv, $_GET). Jadi saat ini ini bukan pengiriman yang benar. Kembali harus echodiedit atau returndiedit (hanya diizinkan untuk fungsi c).
Christoph

1
Terima kasih untuk @Christoph, saya agak baru dalam bermain golf :). Saya telah memperbarui jawaban saya sekarang, beri tahu saya jika ada hal lain yang salah.
David

@Christoph Wow! 75! Sangat bagus! Anda memiliki +1 saya :)
David

4

Jelly , 14 byte

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

Cobalah online!

Program lengkap.

Penjelasan:

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

Penjelasan kode?
SK19

1
@ SK19 Menambahkan penjelasan.
Erik the Outgolfer

4

MATL , 23 20 byte

'a A'Yb&Ybt2L)Yo2L(g

Cobalah online!

Penjelasan:

'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

Jawaban yang lebih lama (23 byte):

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

Metode lain yang saya coba:

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

3

Sekam , 15 byte

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

Cobalah online!

Penjelasan

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

Cobalah online!

Penjelasan

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

Cobalah


Penjelasan

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

Cobalah online!

Mengasumsikan satu baris input.

49 byte kekalahan disimpan oleh @ninjalj !

Line Smengerjakan semua pekerjaan, dijelaskan di bawah ini:

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 


Ini memberikan jawaban yang salah (seperti yang Anda nyatakan dalam komentar Anda, case diganti ketika CapsLock aktif)
mbomb007

Saya telah mengedit posting untuk meminta pertukaran kasus (bukan hanya huruf besar) ketika CapsLock diaktifkan karena saya tidak pernah menyadari bahwa mesin saya melakukan ini.
Broadwell

@ mbomb007 ah, saya tidak menyadari OP telah mengubahnya; Saya mengedit penjelasan sekarang jadi saya akan memasukkannya dalam penjelasan.
Giuseppe

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

@ninjalj apakah Anda juga seorang pegolf SNOBOL atau apakah saya hanya buruk dalam bermain 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

Cobalah online!

Karena Fortran belum "canggih" alat untuk berurusan dengan string, saya datang dengan monster kecil ini.

Diindentasi dan berkomentar:

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

Jalankan dan debug secara online

Itu terbelah pada regex, dan kemudian secara bergantian matikan case. Inilah program yang sama, dibongkar, tidak diseret, dan dikomentari.

"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

Jalankan yang ini


Saya entah bagaimana tidak bisa menghubungkan penjelasan Anda dengan kode Anda.
SK19

Coba melangkahi yang berkomentar, dan perhatikan keadaan internal penerjemah. Apakah itu membantu?
rekursif

1
@ SK19: Oh, saya rasa saya melihat masalahnya. Saya tidak menyebutkan bahwa program stax memiliki dua representasi. Ascii dan dikemas. Ada konversi tanpa kerugian di antara keduanya. Ascii mudah diketik, tetapi boros untuk golf, karena hanya ada 95 simbol. Program golf dikemas, sehingga terlihat berbeda, tetapi program yang sama.
rekursif

3

Javascript (ES6), 80 79 byte

(Sebagian didasarkan dari jawaban ini oleh Rick Hitchcock. Posting sebagai jawaban terpisah karena saya tidak memiliki reputasi yang cukup untuk berkomentar.)

(Disimpan 1 byte berkat posting @ l4m2 di sini .)

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

Selamat datang di PPCG!
Laikoni

2

Kotor , 55 byte

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

Cobalah online!

Mungkin sekitar sepertiga lebih pendek.
Saya akan menulis penjelasan dan golf lagi ketika saya di desktop.


2

Python 3, 78 72 byte

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

Anda dapat menggunakannya m[1]sebagai pengganti m.group(1)Python 3.6+.
Bubbler

Mengapa ini ditandai sebagai kualitas rendah ...?
Nissa

Saya tidak tahu ...
pppery

1
Posting baru ditandai secara otomatis jika pendek dan tidak mengandung teks. Menambahkan deskripsi biasanya mencegah hal itu.
mbomb007

Dan sekarang saya bertanya-tanya berapa banyak "A" yang seharusnya ada dalam "ppperry".
Tn. Lister
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.