Нет, просто БЛОКИРОВКА


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
Добро пожаловать на сайт! Это хороший первый вызов, и, к сожалению, очень подходящий для меня и моих пальцев.
DJMcMayhem

5
Предлагаемый тестовый пример:teSTateSTateSTateST
Род

88
Если только ключ входят также имел прорезь в нем так этого Wouldn»
12Me21

75
не бывает .......
12Me21

22
Буквально присоединился к этому сайту, чтобы поднять голос «Без надреза никто не услышит, как ты кричишь»
lucasvw

Ответы:


115

AutoHotKey , 7 байтов

a::vk14

// Это верно? Это действительно делать то, что хочет ОП - заменить aна CapsLock (vk14).

Запустите эту программу и введите ввод с клавиатуры.


4
"Это действительно?" OP не указал ограничения ввода или вывода, поэтому я считаю это допустимым.
Нефрин

5
Не вижу слишком много ахк ответов!
HaveSpacesuit

57
Это здорово, но как мне отключить это?
RobbG

69
@RobbG просто набери "killLL utohotkey" ... о боже
Нефрин

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 

Это нечувствительное к регистру нахождение «а»?
Гнудифф

@ Gnudiff \cгде-нибудь в поиске регулярных выражений обеспечивает нечувствительность к регистру
Герман Л

Вам нужно установить определенный флаг для g~$работы? Потому что для меня это инвертирует регистр только до конца строки, а не весь файл, так что это не работает для многострочных файлов для меня.
Cub

1
@Cubic Как я уже писал в ответе, «предполагается, что ввод находится в одной строке»
Герман Л

@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это
Тон Хоспел

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

1
6305%c0, если cесть 13.
Рози Ф

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 Готово. Эту версию Γнемного сложно объяснить, я надеюсь, что вы сможете понять ее.
Згарб

Вау, это медленно. Это просто TIO?
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 байта короче, используя совпадающие спички
Лев

Мне интересно, как это работает, если у вас есть время, чтобы добавить объяснение. Спасибо!
Сешумара

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 байтах с той же логикой! Попробуйте онлайн! (используйте ввод / вывод вместо консоли, удалите 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
оооооо, это очень умно 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] злоупотребляют как фальшиво-троичный оператор
  • !!$cПри приведении к принудительному приведению [bool]здесь начинается неопределенное значение, $nullпоэтому оно принудительно возникает как «caps 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|$)
икегами

5

Python, 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

Ожидает указатель на входную строку с нулем в $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

Пример программы на ассемблере с использованием подпрограммы:

Онлайн демо

Скриншот

Код в синтаксисе 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 спасибо :) Это просто хороший способ практиковаться, я работаю над какой-то игрой, а недавно и демо-кодом для этой милой старой машины :)
Феликс Палмен,

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

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

5

C 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

Haskell , 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функцию, которая отображает строчные и прописные буквы, а прописные - строчные. Это на самом деле большинство нашего bytecount. Затем мы определяем функцию 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

Wolfram Language (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возвращает строку (истинное значение), если была сделана замена, и возвращает в 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 байт . Ссылка была слишком длинной, если я включил все контрольные примеры.
Asone Tuhid

@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]'

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

Это просто перебирает строку с циклом for, и на каждой итерации проверяет, является ли текущая буква a, если так, то переворачивает регистр всей строки (метод отсюда ), а если нет, то печатает текущую букву.


1
Соглашение для кода гольф заключается в том, что весь код должен быть включен. Это означает , что вы должны принять вход в качестве параметра функции и фактически объявить функцию ( с помощью функции ключевого слова в PHP) или иметь полный сценарий (например , используя $argn, $argv, $_GET). Так что на данный момент это неверное представление. Возврат должен быть echoed или returned (разрешено только для функций ofc).
Кристоф

1
Спасибо за это @Christoph, я новичок в игре в гольф :). Я обновил свой ответ сейчас, просто дайте мне знать, если что-то еще не так.
Давид

@ Кристоф Вау! 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 Добавлено объяснение.
Эрик Outgolfer

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

«Н @ aA'm? ~ XHx} @ ш ~? Yo] & ч

Другие методы, которые я пробовал:

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, потому что я никогда не осознавал, что моя машина делает это.
Broadwell

@ mbomb007 ах, я не осознавал, что ОП изменил его; Сейчас я редактирую объяснение, поэтому я включу его в объяснение.
Джузеппе

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

@ninjalj ты тоже игрок в СНОБОЛ или я просто ужасен в этом?
Джузеппе

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

Попробуйте онлайн!

Поскольку у Fortran нет «продвинутых» инструментов для работы со строками, я придумал этого маленького монстра.

Отступы и комментарии:

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

ì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

Грязный , 55 байт

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

Попробуйте онлайн!

Вероятно, может быть примерно на треть короче.
Я напишу объяснение и еще немного поиграю в гольф, когда буду на рабочем столе.


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+.
Bubbler

Почему это было помечено как низкое качество ...?
Nissa


1
Новые сообщения помечаются автоматически, если они короткие и не содержат текста. Добавление описания обычно предотвращает это.
mbomb007

И теперь мне интересно, сколько «А» должно быть в «Пиппери».
Мистер Листер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.