Ні, просто CAPS LOCK


197

Що відбувається, коли CapsLockклавіша на вашій клавіатурі не має в ній виїмки?

"Цей hPPENS."

Мета цієї програми - послідовно імітувати пропуски клавіатури, де Aзамінюється кожне натискання CapsLock. Верхня літера "А" від джерела повинна мати такий же ефект. Коли CapsLockце ввімкнено, використання великих літер змінюється на зворотному рівні.

Випробування

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

Критерієм виграшу є, як зазвичай, розмір вихідного коду поданої програми.


110
Ласкаво просимо на сайт! Це хороший перший виклик, і, на жаль, дуже відносний для мене та моїх FT FINGERS.
DJMcMayhem

5
запропонований тестовий випадок:teSTateSTateSTateST
Род

88
Якби тільки клавіша введення також мала на ній виїмку, щоб це не було
12Me21,

75
t відбудеться .......
12Me21

22
Буквально приєднався до цього сайту, щоб проголосувати "Без виїмки ніхто не почує, як ти
кричиш

Відповіді:


115

AutoHotKey , 7 байт

a::vk14

// Чи дійсно це? Це дійсно те, що хочуть ОП - замінити aна CapsLock (vk14).

Запустіть цю програму та введіть введення з клавіатури ..


4
"Це дійсно?" OP не вказував обмежень на вхід чи вихід, тому я вважаю це дійсним.
Нефрін

5
Не бачите занадто багато відповідей ах!
HaveSpacesuit

57
Це велике, але як його розібрати?
RobbG

69
@RobbG просто введіть "killLL utohotkey" ... о wIT
Нефрін

5
@tsh Я думаю, ви тут пропустили жарт ...
RobbG

32

V , 9 байт

ò/ãa
xg~$

Спробуйте в Інтернеті!

Hexdump:

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

Пояснення:

ò       " 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 байт

qq/\ca
xg~$@qq@q

Припускає, що введення знаходиться в одному рядку

Пояснення

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 

Чи є ця справа нечутливою знахідкою "a"?
Gnudiff

@Gnudiff в \cбудь-якому місці регулярного пошуку шукає можливості нечутливості до випадків
Герман L

Чи потрібно встановити певний прапор для g~$роботи? Тому що для мене це лише інвертує регістр до кінця рядка, а не весь файл, тому це для мене не працює для багаторядкових файлів.
Кубік

1
@Cubic Як я писав у відповіді, це "припускає, що введення знаходиться в одному рядку"
Герман L

@Cubic Якщо ви хочете, щоб він закінчував файл і підтримував введення в декількох рядках, ви можете зробити це g~vGабо vG~.
DJMcMayhem

15

C, 72 байти

Дякуємо @Ton Hospel за допомогу зберегти 16 байт!

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

Спробуйте в Інтернеті!


2
Ви можете поміняти регістр букв з допомогою XOR з 32
Ton Hospel

Ви , ймовірно , можна заощадити ще більше, маючи tбути 0/32замість парного / непарного (XOR т з 32 по кожному a) , а потім XOR букві безпосередньоt
Ton Hospel

2
Хороший спосіб виявити a's
Тон Євангелія

1
@TonHospel Функції повинні бути повторно використані , і я не думаю, що вона вважається багаторазовою, якщо вам потрібен зовнішній код, щоб зробити його знову корисним після кожного дзвінка.
Steadybox

1
6305%cдорівнює 0, якщо cє 13.
Rosie F

11

Лушпиння , 11 байт

Γ·§?m\:€"Aa

Спробуйте в Інтернеті!

Пояснення

Я використовую дещо незрозумілу перевантаження Γвиклику listNF, яка будує рекурсивні функції, які працюють у списках. Він відповідає наступному шаблону Haskell:

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

Ідея полягає в тому, що listNFбере функцію помічника fі повертає нову функцію g, яка бере список. Функція fприймає функцію, яка завжди буде g, і голова xі хвіст xsсписку, і щось робить з ними. У нашому додатку fдзвінки gрекурсивно вмикаються xs. Програма трактується так:

Γ (· (§ (?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
Нічого собі, добре , що я оновилася , перш ніж я розмістив мої 12 байт рішення: Ḟ·+m\ṁx'Ax'a. Чи могли б ми отримати пояснення? Я не можу знайти будь-якої інформації про те, Γщо саме робить, і це здається гарним шансом навчитися.
Софія Лехнер

1
@SophiaLechner Готово. Цю версію Γтрохи важко пояснити, я сподіваюся, що ви зможете зрозуміти це.
Згарб

Нічого це повільно. Це просто ТІО?
FrownyFrog

1
@FrownyFrog Це лушпиння. Вигляд програм, що містять, Γздається, загалом повільний. Якщо ви не знайомі з Husk, програма інтерпретується прокручуванням всіх можливих структур програми (по суті можливих місць розташування дужок) та всіх перевантажень кожної вбудованої програми та вибору першого, де результат добре- набрав. Інтерпретатор досить розумний, щоб рано відхилити деякі можливості, але здається, що рекурсивна версія Γможе зіпсуватися з цим кроком і змусити його пройти через багато варіантів.
Згарб


11

Сітківка , 33 21 17 байт

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

Спробуйте в Інтернеті

Пояснення:

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 байт завдяки Мартіну
-4 байти завдяки Леву


Дивовижно, що це майже так само коротко, як і нинішні рішення Pyth
Тон Євангелія

1
Я думаю, що iT`aAlL`__Ll`a[^a]*a?також працює на 21 байт.
Ніл

4 байти коротше за допомогою матчів, що перекриваються
Лев,

Мене цікавить, як це працює, якщо у вас є час додати пояснення. Дякую!
seshoumara

9

C # , 121 байт

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

** Оновлення (завдяки @John & @aloisdg) **

C # , 69 байт

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

2
Ласкаво просимо до PPCG! Приємна перша відповідь!
RedClover

2
Ви можете заощадити 7 байт зміни new[] { 'a', 'A' }в'a', 'A'
Джон

5
Ви можете зробити це в 69 байт з тією ж логікою! Спробуйте в Інтернеті! (використовуйте input / ouput замість консолі, видаліть ToList, переверніть термінал і використовуйте коментар @John) Це хороша перша відповідь. Продовжуй!
aloisdg

3
Обидві ці версії не замінюють регістр (вони перетворюються лише на великі регістри), коли функцію CapsLock увімкнено. Це вимога. (Див. Останній тестовий випадок)
Бродвелл

@Broadwell Як ви знаєте, якщо функцію CapsLock увімкнено? Ви впевнені, що останній тестовий випадок правильний? Він проходить всі інші тестові випадки, наскільки я бачу. Дякую!
Aalawlx

7

JavaScript (ES6), 93 88 84 82 байт

(збережено 5 байт завдяки @Shaggy, 4 байти завдяки @ user81655, і 2 байти завдяки @ l4m2.)

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

Тестові приклади:


1
['to${c<'a'?'Low':'Upp'}erCase']має заощадити кілька байт, замінивши окремі лапки на задній план.
Кудлатий

Звичайно, @Shaggy. Дякую!
Рік Хічкок

Використання ^1для uпарності може дозволити вам ініціалізувати його коротше:s=>s.replace(u=/./g,c=>/a/i.test(c)?(u^=1,''):+u?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Також ось ще один хитрий спосіб перевірити на aкоротший лист :a=>a.replace(A=/./g,c=>c in{a,A}?(A^=1,''):+A?c[`to${c<'a'?'Low':'Upp'}erCase`]():c)
user81655

Блискучий, @ user81655, особливо використовуючи такий inоператор. Завжди більше вчитися!
Рік Хічкок

6

R , 92 байти

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

Дякую @Giuseppe за виправлення відповіді.

Пояснення

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

Спробуйте в Інтернеті!


Можливо, я не дав зрозуміти, але ця відповідь не повертає великої літери, коли функцію CapsLock увімкнено (вона працює лише toupper), що є обов'язковою умовою.
Бродвелл

2
ooohhhhhhh це дуже розумно з c(F,T), хоча @Broadwell має рацію; схоже, це буде chartr("a-zA-Z","A-Za-z",v)[w]скоріше, ніжtoupper
Джузеппе

@Giuseppe Дякую
Vlo

6

PowerShell Core , 105 байт

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

Спробуйте в Інтернеті!

Що не має справжнього потрійного оператора і немає псевдоніму за замовчуванням для друку на екран, це не так вже й коротко.

  • % t*yрозширюється до | ForEach-Object -Method ToCharArrayеквівалента. з"$args".ToCharArray()
  • Write-Host -n є для параметра -NoNewLine
  • "$_"повертає [char]тип назад [string](символи не мають верхнього / нижнього регістру в .Net)
  • |% *perробить той самий метод виклику ярлика, що і раніше, але для того .ToUpper()ж з.ToLower()
  • ($a,$b)[boolean test] зловживають як фальшивий тренажер
  • !!$cforce-caststs [bool]тут він починається невизначеним, $nullтому він змушує його існувати як "cap lock: $ false".

1
Це |% t*yакуратний трюк, який я повинен пам'ятати. Коротше, чим [char[]]я багато користуюся. Я майже сказав, що слід перейти до теми "Поради".
AdmBorkBork

94 байт: -join($args|% t*y|%{if($_-eq'a'){$c=!$c}else{(("$_"|%("*per","*wer")[$_-in65..90]),$_)[!$c]}}). дякую |% *ethodоператору!
маззи

6

Perl 5 -p , 31 30 29 байт

-1 байт завдяки @nwellnhof

-1 байт завдяки @ikegami

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

Спробуйте в Інтернеті!


Чому б не просто s/a(.*?)(a|$)/uc$1/egi(22 байти)?
nwellnhof

@nwellnhof Оскільки шапка, коли активована, перемикає корпус, це не просто велика літера
Тон Євангелія

1
А, бачу. Потім s/a(.*?)(a|$)/$1^uc$1^lc$1/egiна один байт коротше.
nwellnhof

@nwellnhof Спасибі, що дуже акуратно
Тон Евангелія

a([^a]*)a?коротше, ніжa(.*?)(a|$)
ikegami

5

Пітон, 63 байти

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

Ще одне рішення Python, працює в Python 2 та 3. Займає дуже багато часу для всіх, крім малих входів.


5

Рутинна машина-код 6502 (C64), 51 байт

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

Очікує вказівник на 0-завершений рядок введення в $fc/$fd , виводиться на екран.

Прокоментували розбирання

 .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

Приклад програми асемблера з використанням рутини:

Демонстрація в Інтернеті

screenshot

Код у синтаксисі 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        

Треба лише сказати, що я захоплююсь тим, що ви доклали зусиль до написання в зборах. Я не думаю, що це має багато спільного з тим, що я справді насолоджувався зором, але, можливо, маючи досвід, я більше розумію, що це означає. Досвід чи легкість - це крім мене важливе значення. Це трохи полегшує мені день, щоб побачити і такий ентузіазм.
Прифтан

@Pryftan спасибі :) Це просто приємний спосіб продовжувати практику, я працюю над деякою грою, а останнім часом також демо-кодом для цієї старої гарної машини :)
Фелікс Палмен

Ну це чудово бачити! Тримай це; Я пам’ятаю, що насолоджувався asm, але я не думаю, що мені би сподобалось це сьогодні (якщо, можливо, у мене була така стара машина, як ти, але, можливо, навіть тоді). використання. У будь-якому випадку, не дозволяйте цьому перерости в чат - просто хотів сказати, що оцінив відповідь!
Прифтан

5

Java 8, 119 108 98 байт

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 байт завдяки @ OlivierGrégoire .
-10 байт завдяки @Nevay .

Пояснення:

Спробуйте в Інтернеті.

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
Чортові імперативи ... вони забороняли мені публікувати свою відповідь перед вашою ... У будь-якому випадку, ось моя відповідь, на 11 байт коротше: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);}
Олів'є Грегоар

@ OlivierGrégoire Приємна відповідь! А що ви маєте на увазі під забороною мені публікувати? Ваша мережа роботи така сувора?
Кевін Кройсейсен

Моя відповідь була готова на деякий час: я просто шліфував тестові справи перед публікацією, але потім раптом відбулися нескінченні зустрічі.
Олів'є Грегоар

1
Ні, це нормально, я лише повинен звинувачувати себе у тому, що я недостатньо швидкий до зустрічей ;-) Але дякую, що ви запропонували це!
Олів’є Грегоар

2
98 байт: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);}
Невай

5

С, 167 168 158 131 байт

Дякуємо @Martin Ender за перегляд коду: я переключив обробку потоків на обробку рядків, щоб допомогти у використанні повторно. Також дякую @RiaD та @ceilingcat за їх пропозиції.

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

Спробуйте в Інтернеті!

Як це працює?

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

Примітки

  • s[][]де відбувається магія: [][0]є функція порівняння і[][1] є пов'язаною функцією перетворення для кожного стану.
  • ! застосовується до функції порівняння, щоб примусити її до діапазону [0,1].

Ласкаво просимо до PPCG! На жаль, ви не можете покластися на ініціалізацію dподібного, оскільки це означає, що ваша функція не може бути використана повторно . Простий d=0;повинен це виправити.
Мартін Ендер

Я не був впевнений, чи важливіше використання в цьому випадку повторного використання або збереження стану. Якщо використання може бути важливішим, я переміщу декларації змінних всередині функції, щоб початок читався void f(){int c,d=0;[...]. У будь-якому випадку, потік гине, тож редагування в порядку!
ErikF

вам потрібні s у циклі while? Він не може стати NULL, якщо ви не зателефонували з f (NULL)
RiaD

d =! d для гортання
RiaD

!! буде ! якщо ви перевернете порядок t, і почніть d з 1
RiaD

4

Хаскелл , 92 байти

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

Спробуйте в Інтернеті!

Пояснення

Спочатку ми оголосимо gфункцію, яка відображає малі та малі регістри, а великі регістри - малі. Це фактично більшість нашого рахунку. Потім визначаємо функцію f. Якщо вхід до fтакої форми, яку a:bми робимо

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

aі Aзбігаємося з першим шаблоном, і таким чином ми застосовуємо fдо вводу з його інвертованим випадком. В іншому випадку ми переходимо aспереду і звертаємось fдо b.


4

Мова Вольфрама (Mathematica) , 70 байт

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

Спробуйте в Інтернеті!

Вводить і виводить як список символів. Для зручності я додав код у нижньому колонтитулі, щоб перетворити це з і назад у рядок.

Як це працює

Частина #//.{x___,"a"|"A",y___}:>Join[{x},... {y}]&є стандартною: ми знаходимо першу A(велику або малу букву), зворотний випадок цього - після A, і повторюємо, поки більше Aне знайдеться.

Цікава частина полягає в тому, як ми обертаємо випадок: функція ToUpperCase@# + ToLowerCase@# - #&. Додаємо версію верхнього регістру вводу та нижню версію вводу, а потім віднімаємо фактичний вхід. Наприклад, з урахуванням списку {"I","n","P","u","T"}цей обчислюється

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

які нитки над списками як

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

і хоча Mathematica не має якогось - якого конкретного способу додавання двох рядків, він досить розумний , щоб спростити , a+b-aщоб bза будь-яких значеннях aі b, в тому числі строкових значень, так що це спрощує для {"i","N","p","U","t"}.


4

Рубі , 42 41 байт

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

Спробуйте в Інтернеті!

Лямбда, яка приймає рядок, мутує рядок на місці та повертає її. Хитрість тут полягає в тому, що subповертає рядок (truthy значення), якщо була зроблена заміна, і повертається в nilіншому випадку. Існування swapcaseтакож досить зручно.

-1 байт: Замініть булеву логіку на потрійний оператор, завдяки Асоне Тухід

->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 байт . Посилання було занадто довгим, якщо я включив усі тестові випадки.
Асона Тухід

@AsoneTuhid Дякую ... Одного дня я згадаю використовувати термінальний оператор відразу, тому вам не доведеться нагадувати мені.
benj2240

4

PHP 101 99 байт

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

Бігайте так:

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

Безголовки:

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

Це просто проходить цикл через рядок з циклом for, і на кожній ітерації він перевіряє, чи є поточна літера a, якщо так, то переверніть корпус цілого рядка (метод звідси ), а якщо ні, то надрукуйте поточний лист.


1
Угода про код гольфу полягає в тому, що весь код повинен бути включений. Це означає , що ви повинні прийняти вхід в якості параметра функції і фактично оголосити функцію ( з допомогою функції ключового слова в PHP) або мати повний сценарій (наприклад , використовуючи $argn, $argv, $_GET). Тож наразі це не правильне подання. Повернення має бути echoредактором або returnредагуванням (дозволено лише для функцій ofc).
Крістоф

1
Дякую за це @Christoph, я трохи новачок у гольфі :). Зараз я оновив свою відповідь, просто дайте мені знати, чи є ще щось, що не так.
Давід

@Christoph Wow! 75! Дуже хороша! У вас є мій +1 :)
Давид

4

Желе , 14 байт

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

Спробуйте в Інтернеті!

Повна програма.

Пояснення:

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

Пояснення коду?
SK19

1
@ SK19 Додано пояснення.
Ерік Аутгольфер

4

MATL , 23 20 байт

'a A'Yb&Ybt2L)Yo2L(g

Спробуйте в Інтернеті!

Пояснення:

'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

Старіша відповідь (23 байти):

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

Інші методи, які я спробував:

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

3

Лушпиння , 15 байт

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

Спробуйте в Інтернеті!

Пояснення

ω(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 байт

õ?„AaS¡Dvć?š

Спробуйте в Інтернеті!

Пояснення

õ?             # 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 байт

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

Спробуй це


Пояснення

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 байт

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

Спробуйте в Інтернеті!

Передбачає єдиний рядок введення.

Цілих 49 байтів, збережених @ninjalj !

Рядок Sвиконує всю роботу, пояснювану нижче:

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 


Це дає неправильну відповідь (як ви сказали у своєму коментарі, випадок змінюється, коли CapsLock увімкнено)
mbomb007

Я відредагував публікацію, щоб вимагати заміни регістру (а не просто великі регістри), коли функцію CapsLock увімкнено, оскільки я ніколи не розумів, що моя машина робить це.
Бродвелл

@ mbomb007 ах, я не розумів, що ОП змінив це; Я редагую пояснення зараз, тому включу це до пояснення.
Джузеппе

I =INPUT;S I ANY("Aa") REM . R =REPLACE(R,&LCASE &UCASE,&UCASE &LCASE) :S(S); OUTPUT =I;END
ніндзя

@ninjalj Ви також гольфіст SNOBOL чи я просто жахливий у гольфінгу ??
Джузеппе

3

Фортран (GFortran) , 307 байт

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

Спробуйте в Інтернеті!

Оскільки Фортран не «вдосконалив» інструменти для боротьби з струнами, я придумав це маленьке чудовисько.

Відступ та коментар:

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

Стакс , 12 байт

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

Запустити та налагодити його в Інтернеті

Він розділяється на регулярний вираз, а потім по черзі перемикає корпус. Ось та сама програма, розпакована, нерозважена і коментована.

"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

Виконати цей


Я якось не можу пов'язати ваше пояснення з вашим кодом.
SK19

Спробуйте переглядати коментований і спостерігати за внутрішнім станом перекладача. Чи допомагає це?
рекурсивна

1
@ SK19: О, я думаю, я бачу проблему. Я не згадував, що програми stax мають два представлення. Ассі і спакував. Між ними є конверсія без втрат. Ascii легко набрати, але марнотратний на гольф, оскільки на ньому всього 95 символів. Програма для гольфу упакована, тому вона виглядає інакше, але це та сама програма.
рекурсивна

3

Javascript (ES6), 80 79 байт

(Частково грунтується на цій відповіді Ріком Хічкоком. Опублікування як окрема відповідь, оскільки я не маю достатньої репутації для коментарів.)

(Збережено 1 байт завдяки публікації @ l4m2 тут .)

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

Ласкаво просимо до PPCG!
Лайконі


2

Python 3, 78 72 байти

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

Ви можете використовувати m[1]замість m.group(1)на Python 3.6+.
Бубон

Чому це було позначено як низьку якість…?
Нісса

Я поняття не маю ...
pppery

1
Нові публікації позначаються автоматично, якщо вони короткі та не містять тексту. Додавання опису зазвичай перешкоджає цьому.
mbomb007

І тепер мені цікаво, скільки «А» повинно бути в «ppperry».
Містер Лістер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.