35
\$\begingroup\$

Your input will be an English sentence, phrase, or word. It will only contain a-zA-Z' -,.!?. Your task is to take the input, remove spaces, and then redistribute capitalization such that letters at indexes that were capitalized before (and only letters at indexes that were capitalized before) are capitalized.

For example, if the input is A Quick Brown Fox Jumped Over The Lazy Dog, the (0-based) indexes of the capital letters are 0, 2, 8, 14, 18, 25, 30, 34, 39. Next, remove spaces from the input: AQuickBrownFoxJumpedOverTheLazyDog. Next, lowercase all letters, but uppercase those at 0, 2, 8, 14, 18, 25, 30, 34, 39: AqUickbrOwnfoxJumpEdovertHelazYdog, which is your output.

Input

Your input will be an English sentence, phrase, or word. It can only contain lowercase letters, uppercase letters, hyphens, apostrophes, commas, periods, question marks, exclamation marks, and spaces.

Output

The input with spaces removed, lowercase-d, with letters at the index of capital letters in the input uppercase-d.

NOTE: Your program cannot crash (error such execution terminates) with an IndexOutOfRange or similar error.

Test Cases

Hi! Test!
Hi!tEst!
A Quick Brown Fox Jumped Over The Lazy Dog
AqUickbrOwnfoxJumpEdovertHelazYdog
testing TESTing TeStING testing testing TESTING
testingtESTIngteStInGTEstingtestingtestiNG
TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO
TESTING.........success!eureKA???!!!maybe,don't,nooooo
Enter PASSWORD ---------
Enterpassword---------
A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z
AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz
 TEST
teST
asked Jun 28, 2017 at 21:06
\$\endgroup\$
6
  • \$\begingroup\$ Sandbox \$\endgroup\$ Commented Jun 28, 2017 at 21:06
  • \$\begingroup\$ 'For example, if the input is "A Quick Brown Fox Jumped Over The Lazy Dog", the (0-based) indexes of the capital letters are 0, 2, 8, 14, 18, 23, 27, 32' They are 0, 2, 8, 14, 18, 25, 30, 34, 39 \$\endgroup\$ Commented Jun 28, 2017 at 21:18
  • \$\begingroup\$ Traling spaces not allowed, I assume? \$\endgroup\$ Commented Jun 28, 2017 at 21:38
  • \$\begingroup\$ @LuisMendo your assumption is correct. This is code-golf, right? :P \$\endgroup\$ Commented Jun 28, 2017 at 21:40
  • \$\begingroup\$ Can we assume the first character won't be a space? \$\endgroup\$ Commented Jun 29, 2017 at 4:47

43 Answers 43

1
2
14
\$\begingroup\$

C (gcc), (削除) 82 (削除ここまで) (削除) 79 (削除ここまで) (削除) 74 (削除ここまで) (削除) 72 (削除ここまで) (削除) 69 (削除ここまで) (削除) 67 (削除ここまで) 66 bytes

f(c){for(char*s=c,*p=c;c=*s++;c&&putchar(c^(*p++|~c/2)&32))c&=95;}

Try it online!

answered Jun 29, 2017 at 0:58
\$\endgroup\$
1
  • \$\begingroup\$ this will segfault if the char* doesn't fit in an int, which can be fixed for +2 bytes \$\endgroup\$ Commented Aug 2, 2022 at 17:58
8
\$\begingroup\$

Jelly, (削除) 14 (削除ここまで) 13 bytes

nŒlTɓḲFŒlŒuṛ¦

Try it online!

How it works

nŒlTɓḲFŒlŒuṛ¦ Main link. Argument: s (string)
 Œl Convert s to lowercase.
n Perform character-wise "not equal" comparison.
 T Get the indices of all truthy elements, i.e., the indices of all
 uppercase letters in s. Let's call the resulting array J.
 ɓ Begin a dyadic chain with left argument s and right argument J.
 ḲF Split s at spaces and flatten, removing the spaces.
 Œl Convert s to lowercase.
 ¦ Sparse application:
 Œu Convert s to uppercase.
 ṛ Take the resulting items of the uppercased string at all indices
 in J, the items of the lowercased string at all others.
answered Jun 28, 2017 at 21:33
\$\endgroup\$
7
\$\begingroup\$

Python 2, 114 bytes

x=input()
X=x.replace(' ','')
print''.join([X[i].upper()if x[i].isupper()else X[i].lower()for i in range(len(X))])

Try it online!

Equivalently:

Python 2, 114 bytes

lambda x:''.join([[str.lower,str.upper][x[i].isupper()](x.replace(' ','')[i])for i in range(len(x)-x.count(' '))])

Try it online!

answered Jun 28, 2017 at 21:31
\$\endgroup\$
2
  • \$\begingroup\$ ''.join([(X[i].lower,X[i].upper)[x[i].isupper()]()for i in range(len(X))]) for -5 bytes. \$\endgroup\$ Commented Jun 29, 2017 at 12:08
  • \$\begingroup\$ 96 bytes: x=input();print''.join([(c+c).title()[1-x[i].isupper()]for i,c in enumerate(x.replace(' ',''))]) \$\endgroup\$ Commented Jan 30, 2024 at 10:58
7
\$\begingroup\$

Python 3, (削除) 78 (削除ここまで) (削除) 75 (削除ここまで) 72 bytes

s=input()
for c in s:s=s[c>' '!=print(end=(c+c).title()[s<'@'or'['<s]):]

Thanks to @xnor for golfing off 6 bytes!

Try it online!

answered Jun 29, 2017 at 4:21
\$\endgroup\$
6
  • \$\begingroup\$ Can you just compare s instead of s[0]? \$\endgroup\$ Commented Jun 29, 2017 at 4:33
  • \$\begingroup\$ Yes, of course. Thanks! \$\endgroup\$ Commented Jun 29, 2017 at 4:35
  • 2
    \$\begingroup\$ (c*2).title() can get you both cases, though switched. \$\endgroup\$ Commented Jun 29, 2017 at 4:52
  • \$\begingroup\$ Another 3 bytes. Thanks again! \$\endgroup\$ Commented Jun 29, 2017 at 5:04
  • \$\begingroup\$ Tricky! Took me a while to figure out that c>' '!=f() is equivalent to (c>' ') and (' '!=f()). \$\endgroup\$ Commented Jun 29, 2017 at 7:41
5
\$\begingroup\$

05AB1E, (削除) 15 (削除ここまで) 14 bytes

-1 byte thanks to Emigna

ðKuvy1Nè.lil}?

Try it online!

ðK # Remove spaces
 u # Convert to uppercase
 vy # For each character...
 1Nè # Get the character at the same index from the original input
 .lil} # If it was a lowercase letter change this one to lowercase
 ? # Print without a newline
answered Jun 28, 2017 at 21:18
\$\endgroup\$
1
  • \$\begingroup\$ You save a byte if you uppercase the space-removed string and lowercase it in the condition. \$\endgroup\$ Commented Jun 29, 2017 at 7:35
5
\$\begingroup\$

Haskell, (削除) 98 (削除ここまで) (削除) 95 (削除ここまで) (削除) 89 (削除ここまで) (削除) 88 (削除ここまで) 81 bytes

Thanks to @name, @nimi, @Zgarb, and @Laikoni for helping shave off 14 bytes total

import Data.Char
\s->zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s

Ungolfed:

import Data.Char
\sentence -> zipWith (\oldChar newChar ->
 if isUpper oldChar
 then toUpper newChar
 else toLower newChar)
 sentence
 (filter (/= ' ') sentence)
answered Jun 28, 2017 at 23:19
\$\endgroup\$
6
  • \$\begingroup\$ On mobile, but looks like you can save some bytes with filter(/=' ') \$\endgroup\$ Commented Jun 29, 2017 at 3:29
  • \$\begingroup\$ Yep, certainly can. Missed the part of the spec noting that spaces were the only whitespace that needed removing. \$\endgroup\$ Commented Jun 29, 2017 at 4:43
  • 1
    \$\begingroup\$ filter(>' ') for one byte less \$\endgroup\$ Commented Jun 29, 2017 at 5:33
  • 2
    \$\begingroup\$ I think the body of the lambda can be shortened to last(toLower:[toUpper|isUpper p])c \$\endgroup\$ Commented Jun 29, 2017 at 6:39
  • \$\begingroup\$ Switching the arguments of zipWith should save one more byte: f s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s. \$\endgroup\$ Commented Jun 29, 2017 at 7:07
5
\$\begingroup\$

V, 24 bytes

ÄVuÓó
ejlDò/2円lõ
vuk~òGd

Try it online!

These kind of challenges are exactly what V was made for. :)

Explanation:

Ä " Duplicate this line
 Vu " Convert it to lowercase
 Óó " Remove all spaces
e " Move to the end of this line
 j " Move down a line (to the original)
 l " Move one char to the right
 D " And delete the end of this line
 ò " Recursively:
 / " Search for:
 õ " An uppercase character
 2円l " On line 2
 " (This will break the loop when there are no uppercase characters left)
vu " Convert it to lowercase
 k " Move up a line
 ~ " Convert this to uppercase also
 ò " Endwhile
 G " Move to the last line
 d " And delete it
answered Jun 28, 2017 at 21:18
\$\endgroup\$
1
  • \$\begingroup\$ @DLosc Good questions! The newlines signal the end of a regex command, such as a substitute (remove) or search command. More detail is on this page: github.com/DJMcMayhem/V/wiki/Regexes \$\endgroup\$ Commented Jun 29, 2017 at 19:13
5
\$\begingroup\$

Python 2, 100 bytes

s=input()
print"".join([c.lower(),c.upper()][s[i].isupper()]for i,c in enumerate(s.replace(" ","")))
answered Jun 29, 2017 at 19:12
\$\endgroup\$
1
  • 3
    \$\begingroup\$ Welcome to PPCG, and very good first answer! \$\endgroup\$ Commented Jun 29, 2017 at 19:15
4
\$\begingroup\$

JavaScript (ES6), (削除) 94 (削除ここまで) (削除) 91 (削除ここまで) (削除) 85 (削除ここまで) (削除) 84 (削除ここまで) 81 bytes

s=>s.replace(r=/./g,c=>1/c?"":c[`to${r<s[x]&s[x++]<{}?"Upp":"Low"}erCase`](),x=0)
  • 6 bytes saved with assistance from ETHproductions & Arnauld.
  • 3 bytes saved thanks to l4m2

Try it online!

answered Jun 28, 2017 at 22:21
\$\endgroup\$
6
  • \$\begingroup\$ Ninjad :P codegolf.stackexchange.com/a/128951/65836 \$\endgroup\$ Commented Jun 28, 2017 at 22:22
  • \$\begingroup\$ Could you do '@'<s[i]&s[i]<'['?? \$\endgroup\$ Commented Jun 28, 2017 at 23:42
  • \$\begingroup\$ @StepHen: Aw, man, didn't see that last night while I was working on this. \$\endgroup\$ Commented Jun 29, 2017 at 7:38
  • \$\begingroup\$ @ETHproductions: I was wondering if that might be shorter but I was too lazy to look up which characters I'd need to use :D Turns out it doea save a byte; thanks. \$\endgroup\$ Commented Jun 29, 2017 at 7:40
  • \$\begingroup\$ Fail but your last version work and same length \$\endgroup\$ Commented Nov 27, 2023 at 14:31
4
\$\begingroup\$

R, (削除) 96 (削除ここまで) 95 bytes

\(s,p=utf8ToInt(s)){p[U]=p[U<-p%%65<26]+32
r=p[p>32]
r[V]=r[V<-U[seq(r)]&r>96]-32
intToUtf8(r)}

Attempt This Online!

Alternative

\(s,`?`=utf8ToInt,r=?tolower(s)){r=r[r>32]
r[V]=r[V<-(?s)[seq(r)]%%65<26&r>96]-32
intToUtf8(r)}

Attempt This Online!

Based on int 21h -- Glory to Ukraine --'s R answer, but operates on character codes instead of strings.

answered Jun 3, 2024 at 12:15
\$\endgroup\$
1
  • \$\begingroup\$ Nice one! I have tried with utf8ToInt too but have failed because of the punctuation \$\endgroup\$ Commented Jun 3, 2024 at 13:37
3
\$\begingroup\$

Alice, 32 bytes

/..- ~l+u~mSloy
\ia''-y.'Qa.+a@/

Try it online!

Explanation

This is a standard template for programs that work entirely in ordinal mode. Unwrapped, the program is as follows:

i.' -l.uQm.lay.a-'~y+'~aS+o@
i take input as string
. duplicate
' - remove spaces from copy
l.u create all-lowercase and all-uppercase versions
Q reverse stack, so original string is on top
m truncate original string to length of spaces-removed string
.lay convert everything except uppercase characters to \n
.a-'~y convert everything except \n (i.e., convert uppercase characters) to ~
+ superimpose with lowercase string
 \n becomes the corresponding lowercase character, and ~ remains as is
'~aS convert ~ to \n
+ superimpose with uppercase string
 lowercase in existing string stays as is because it has a higher code point
 \n becomes corresponding uppercase character
o output
@ terminate
answered Jun 29, 2017 at 5:24
\$\endgroup\$
3
\$\begingroup\$

Retina, (削除) 77 (削除ここまで) 71 bytes

.+
$&¶$&
T`L `l_`.+$
+`((.)*)[A-Z].*(¶(?<-2>.)*)
1ドル3ドル 
.+¶
T`l `L_` .?

Try it online! Link includes test suite. Explanation: The first stage duplicates the line while the second stage lowercases the duplicate and deletes its spaces. The third stage then loops through each uppercase letter from right to left and attempts to place a space before the corresponding character on the second line. The first line is deleted and the spaces are used to uppercase the relevant characters of the result. Edit: Saved 6 bytes thanks to @Kobi.

answered Jun 28, 2017 at 23:13
\$\endgroup\$
2
  • \$\begingroup\$ Small question: Are the (.?) and 4ドル parts needed? It looks like having an optional group at the end does nothing. \$\endgroup\$ Commented Jun 29, 2017 at 11:38
  • \$\begingroup\$ @Kobi Nothing small about that question! It had originally been part of an attempt at using lookarounds to match the characters to be uppercased directly instead of having to translate them as a separate step. \$\endgroup\$ Commented Jun 29, 2017 at 12:26
3
\$\begingroup\$

Java 8, (削除) 184 (削除ここまで) (削除) 177 (削除ここまで) 161 bytes

s->{String r="";for(int i=0,j=i,t,u;i<s.length;){t=s[i++];if(t>32){u=s[j++];r+=(char)(t<65|t>90&t<97|t>122?t:u>64&u<91?t&~32:u>96&u<123|u<33?t|32:t);}}return r;}

Can definitely be golfed some more..
- 16 bytes thanks to @OlivierGrégoire by taking the input as char[] instead of String.

Explanation:

Try it here.

s->{ // Method with char-array parameter and String return-type
 String r=""; // Result-String
 for(int i=0,j=i,t,u; // Some temp integers and indices
 i<s.length;){ // Loop over the String
 t=s[i++]; // Take the next character and save it in `t` (as integer)
 // and raise index `i` by 1
 if(t>32){ // If `t` is not a space:
 u=s[j++]; // Take `u` and raise index `j` by 1
 r+= // Append the result-String with:
 (char) // Integer to char conversion of:
 (t<65|t>90&t<97|t>122? // If `t` is not a letter:
 t // Simply use `t` as is
 :u>64&u<91? // Else if `u` is uppercase:
 t&~32 // Take `t` as uppercase
 :u>96&u<123|u<33? // Else if `u` is lowercase or a space:
 t|32 // Take `t` as lowercase
 : // Else:
 t); // Take `t` as is
 }
 } // End of loop
 return r; // Return result-String
} // End of method
Olivier Grégoire
14.5k3 gold badges33 silver badges56 bronze badges
answered Jun 29, 2017 at 7:36
\$\endgroup\$
2
  • 1
    \$\begingroup\$ Take a char[] instead of a String for this one, you'll save up plenty of bytes! \$\endgroup\$ Commented Jun 30, 2017 at 7:57
  • \$\begingroup\$ On the other hand, I answered too with another algorithm. And here, I take the opposite arguments: in = String, out = char[] :-) \$\endgroup\$ Commented Jun 30, 2017 at 8:39
3
\$\begingroup\$

Perl 5, 40 bytes

37 bytes of code + -F flag. (note that on old versions of Perl, you might need to add -an flags)

print$F[$i++]=~/[A-Z]/?uc:lc for/\S/g

Try it online!

Explanations:
Thanks to -F, @F contains a list of every characters of the input.
for/\S/g iterates over every non-space character of the input. We use $i to count at which iteration we are. If $F[$i++] is an uppercase character (/[A-Z]/), then we print the uppercase current character (uc), otherwise, we print it lowercase (lc). Note that uc and lc return their argument unchanged if it isn't a letter.


Previous version (less golfed: 47 bytes):

 s/ //g;s%.%$_=$&;$F[$i++]=~/[A-Z]/?uc:lc%ge

Try it online!

answered Jul 4, 2017 at 9:41
\$\endgroup\$
3
\$\begingroup\$

Perl, (削除) 95 (削除ここまで) 94 + 1 = 95 bytes

+1 byte penalty for -n

Save one byte by replace from s/\s//g to s/ //g

$s=$_;s/ //g;$_=lc($_);while(/(.)/gs){$p=$&;$p=uc($p)if(substr($s,$-[0],1)=~/[A-Z]/);print$p;}

Try it online!

Explanation:

  1. Make copy of input string.

  2. Remove all spaceses and transform string to lower case.

  3. Then start loop over each letter. Test letter in same position in saved string for upper case. If it upper - make current letter captitalized. Print letter.

Note that perl need to be run with "-n" command line switch

\$\endgroup\$
4
  • \$\begingroup\$ Welcome to PPCG! If you would like, you can add a link to Try It Online: tio.run/# (I would add it, but I don't know if this is Perl 5 or Perl 6) \$\endgroup\$ Commented Jul 3, 2017 at 18:25
  • 1
    \$\begingroup\$ I think that you need to count +1 byte for the -n flag. Other than that, this looks good! Welcome to the site! :) \$\endgroup\$ Commented Jul 3, 2017 at 18:25
  • \$\begingroup\$ @StepHen it's Perl 5, colud you add link? I failed to run my code there in propper way. \$\endgroup\$ Commented Jul 4, 2017 at 17:44
  • \$\begingroup\$ Happy to see a new Perl golfer! I've added the TIO link to your answer and improved the formatting. \$\endgroup\$ Commented Jul 4, 2017 at 18:06
3
\$\begingroup\$

Charcoal, 18 bytes

⪫E⪫⪪θ ω⎇Noα§θκ↥ι↧ιω

Try it online! Link is to verbose version of code. Explanation:

 θ Input string
 ⪪ Split on spaces
 ⪫ ω Join together
 E Loop over each character
 §θκ Get character from original string
 Noα Search uppercase letters
 ⎇ If true (nonzero)
 ↥ι Uppercase the current character
 ↧ι Else lowercase the current character
⪫ ω Join together
 Implicitly print

The recent addition of StringMap shaves off a couple of bytes:

⭆⪫⪪θ ω⎇Noα§θκ↥ι↧ι

is roughly equivalent to ⪫E...ω.

answered Dec 1, 2017 at 20:56
\$\endgroup\$
1
  • \$\begingroup\$ Save two more bytes by replacing ⪫⪪θ ω with −θ . \$\endgroup\$ Commented Jun 4, 2024 at 16:45
3
\$\begingroup\$

Python 3, (削除) 117 (削除ここまで) (削除) 114 (削除ここまで) 98 bytes

s=input()
i,*y=0,*s.replace(' ','').lower()
for c in y:print(end=[c,c.upper()]['@'<s[i]<'[']);i+=1

Try It Online!

Edit: 3 bytes saved by UndoneStudios.

Edit: 14 bytes saved by Unrelated String.

This is pretty much my first code golf, so it's likely to be bad, minus help from comments below!

P.S. Yes, it's dumb that defining and incrementing i saves bytes over range(len(y)). Oh well.


Python 3, 85 bytes

lambda s:''.join([c,c.upper()]['@'<b<'[']for b,c in zip(s,s.replace(' ','').lower()))

Try It Online!

This solution is entirely due to att; I'm keeping it separate because the strategy seems to me to have changed enough.

answered Jun 28, 2017 at 21:28
\$\endgroup\$
13
  • 1
    \$\begingroup\$ Welcome to PPCG! Nice first submission! However, complying to our site's I/O standards, your submission must either be a function of a string or take input; you cannot assume input is in a variable. Hope you enjoy your stay! :) \$\endgroup\$ Commented Jun 28, 2017 at 21:29
  • \$\begingroup\$ Thanks; edited a function in, but also saved 5 bytes in the body :D \$\endgroup\$ Commented Jun 28, 2017 at 21:35
  • 1
    \$\begingroup\$ @LukeSawczak save a ton of bytes by changing to one space for indentation, and maybe add a Try It Online! link if you want to \$\endgroup\$ Commented Jun 28, 2017 at 21:37
  • 1
    \$\begingroup\$ You can remove the space after return. \$\endgroup\$ Commented Jun 28, 2017 at 21:45
  • 2
    \$\begingroup\$ shaved it down a bit more \$\endgroup\$ Commented Nov 28, 2023 at 1:55
3
\$\begingroup\$

Go, 184 bytes

import(."strings";u"unicode")
func f(s string)string{S:=[]rune(ReplaceAll(ToLower(s)," ",""))
for i:=range s{if i<len(S)&&u.IsUpper(rune(s[i])){S[i]=u.ToUpper(S[i])}}
return string(S)}

Attempt This Online!

answered Nov 28, 2023 at 14:24
\$\endgroup\$
3
\$\begingroup\$

Noulith, 88 bytes

\s->(for(p<<-s.lower filter (!=' '))yield if(s[p[0]].is_upper)p[1].upper else p[1])join""

Try it online!

answered Nov 28, 2023 at 14:48
\$\endgroup\$
3
\$\begingroup\$

Java (JDK), 84 bytes

s->{int j=0,c;for(var k:s)if((c=k&95)>0)System.out.printf("%c",c^(s[j++]|~c/2)&32);}

Try it online!

Credits :

  • Dennis for the bit twiddling as it's a good way to shorten the answer
  • Fhuvi for trimming 12 bytes.
answered Jun 30, 2017 at 8:36
\$\endgroup\$
1
  • \$\begingroup\$ @ceilingcat that doesn't work: Hi! Test! should become Hi!tEst!, but with your solution it becomes Hi!Test. \$\endgroup\$ Commented Nov 10, 2019 at 11:40
3
\$\begingroup\$

Vyxal, 4 bytes

ȧ⇩$•

Try it Online!

Helps to have a "with capitalisation of" built-in

Explained

ȧ⇩$•­⁡​‎‎⁡⁠⁡‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁢‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁣‏⁠‎⁡⁠⁤‏‏​⁡⁠⁡‌⁤​‎‏​⁢⁠⁡‌­
ȧ # ‎⁡Remove whitespace from the input
 ⇩ # ‎⁢and lowercase it
 $• # ‎⁣Transfer the capitalisation of the original input to the stripped input.
# ‎⁤The reason for `•` doing this is because on lists, `•` is mould. Therefore, the idea was that it "moulds" one string to the capitalization of the other
💎

Created with the help of Luminespire.

answered Jan 30, 2024 at 12:15
\$\endgroup\$
3
\$\begingroup\$

Uiua SBCS , 16 bytes

 ̄⍜▽ ̄:⌵▽⊸≠@ :=1⊸±

Try it!

answered Jun 3, 2024 at 1:39
\$\endgroup\$
1
3
\$\begingroup\$

SM83, 25 bytes

Makes use of the fact that all the legit punctuation is less than @ and therefore has bit 6 turned off, so we can assume that if bit 6 is on it's a letter.

54 5D 1A 13 FE 20 28 FA 47 A6 CB 77 78 28 05 E6
20 CB AE B6 22 B7 20 EA C9

Disassembled:

f:
 ld d,h // 54 // copy hl into de
 ld e,l // 5D
l:
 ld a,(de) // 1A // a = *(de++)
 inc de // 13
 cp a,' ' // FE 20 // if a == ' '
 jr z,l // 28 FA // loop back
 ld b,a // 47 // safeguard a
 and (hl) // A6 // AND with *hl
 bit 6,a // CB 77 // are both letters?
 ld a,b // 78 // copy back
 jr z,s // 28 05 // if so jump straight to store
 and 20ドル // E6 20 // otherwise mask off all but 5th bit
 res 5,(hl) // CB AE // and erase 5th bit of *hl
 or (hl) // B6 // and or them together
s:
 ld (hl+),a // 22 // *(hl++) = a
 or a // B7 // cheap test for 0
 jr nz,l // 20 EA // jump back if wasn't null
 ret // C9 // return
answered Jun 3, 2024 at 2:24
\$\endgroup\$
3
\$\begingroup\$

R, (削除) 106 (削除ここまで) 101 bytes

-5 bytes thanks to Giuseppe

\(s,`+`=casefold,l=+gsub(" ","",s)){for(i in el(gregexpr("[A-Z]",s)))substr(l,i,i)=substr(l,i,i)+1;l}

Attempt This Online!

Pretty close to my target <100 bytes:)

In this approach some code is reduced by using a single function casefold (with a short alias) instead of the usual tolower/toupper couple.

An attempt to remove the curly braces did not improve the byte count.

answered Jun 2, 2024 at 21:26
\$\endgroup\$
5
  • 2
    \$\begingroup\$ Broken the 100 byte target: codegolf.stackexchange.com/a/273422/55372 \$\endgroup\$ Commented Jun 3, 2024 at 12:16
  • 1
    \$\begingroup\$ you don't need to use strsplit; substr<- and gregexpr can get you a couple bytes: ATO \$\endgroup\$ Commented Jun 4, 2024 at 14:34
  • 1
    \$\begingroup\$ using casefold is probably another few bytes. \$\endgroup\$ Commented Jun 4, 2024 at 14:35
  • 1
    \$\begingroup\$ @Giuseppe thanks! this is totally different from my original answer though =) \$\endgroup\$ Commented Jun 4, 2024 at 15:17
  • 1
    \$\begingroup\$ oh that <- should be an =! \$\endgroup\$ Commented Jun 4, 2024 at 15:55
2
\$\begingroup\$

MATL, 18 bytes

kXz"@GX@)tk<?Xk]&h

Same approach as Riley's 05AB1E answer.

Try it online!

answered Jun 28, 2017 at 21:39
\$\endgroup\$
2
\$\begingroup\$

C# (.NET Core), (削除) 108 (削除ここまで) 101 bytes

using System.Linq;s=>s.Replace(" ","").Select((c,i)=>s[i]>64&s[i]<91?char.ToUpper(c):char.ToLower(c))

Try it online!

  • 7 bytes saved after realizing that the char class has static ToUpper() and ToLower() methods.
answered Jun 29, 2017 at 6:28
\$\endgroup\$
2
\$\begingroup\$

Charcoal, 33 bytes

A0χFLθ¿=§θι A+1χχ¿Noα§θ−ιχ↥§θι↧§θι

Try it online!

As I still don't know how to pass a string with whitespaces as a single input parameter into Charcoal code, I just assign in the header the test string to the Charcoal variable that represents what would be the first input (θ):

AA Quick Brown Fox Jumped Over The Lazy Dogθ

So the code has the same number of bytes as if the string were passed as first input.

You can see here the verbose version of the code.

answered Jun 29, 2017 at 10:12
\$\endgroup\$
2
  • 1
    \$\begingroup\$ I said in another answer but just in case you forget, just input as a python array with one element \$\endgroup\$ Commented Jul 27, 2017 at 2:38
  • \$\begingroup\$ I just require the input to have a trailing newline. \$\endgroup\$ Commented Dec 1, 2017 at 16:58
2
\$\begingroup\$

PHP, 181 bytes

I try get the minor numbers of bytes,this is my code:

<?php
$s=readline();
preg_match_all('/[A-Z]/',$s,$m,PREG_OFFSET_CAPTURE);
$s=strtolower(str_replace(' ','',$s));
while($d=each($m[0]))$s[$d[1][1]]=strtoupper($s[$d[1][1]]);
echo $s;

Try it online!

answered Jun 30, 2017 at 3:44
\$\endgroup\$
1
  • \$\begingroup\$ Instead of a Constant PREG_OFFSET_CAPTURE you can use the value 256 , $argn is a shorter variable as readline() for an input and I think ctype_upper and use of lcfirst and ucfirst will save lots of bytes with one loop and use of $$i and ternary operator \$\endgroup\$ Commented Jul 2, 2017 at 22:24
2
\$\begingroup\$

Common Lisp, 104 bytes

(defun f(s)(map'string(lambda(x y)(if(upper-case-p x)(char-upcase y)(char-downcase y)))s(remove #\ s)))

Try it online!

Unusually short for the wordy Common Lisp!

Straightforward code:

(defun f (s) ; receive the string as parameter
 (map 'string ; map the following function of two arguments
 (lambda (x y) ; x from the original string, y from the string with removed spaces
 (if (upper-case-p x) ; if x is uppercase
 (char-upcase y) ; get y uppercase
 (char-downcase y))) ; else get y lowercase
 s
 (remove #\ s)))
answered Jun 30, 2017 at 4:59
\$\endgroup\$
2
\$\begingroup\$

Google Sheets, 213 bytes

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Z]"),MID(UPPER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1),MID(LOWER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1))))

Input is in cell A1 and the formula breaks down like this:

  • ArrayFormula() lets us evaluate each term of ROW() independently
  • JOIN() concatenates all those independent results into a single string
  • IF(REGEXMATCH(),UPPER(),LOWER() is what makes it alternate using upper or lower case depending on what the case was at that position in the input
  • ROW(OFFSET()) returns an array of values 1 to A1.length that can be fed into the MID() function so we can evaluate each character in turn

Results of test cases: (It's easier to read if you click though to the larger version.)

TestCases

answered Jun 30, 2017 at 15:52
\$\endgroup\$
1
2

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.