# Case-fold German

## Specifications

1. Input will consist only of az plus äöüß-,.;:!?'" in uppercase and/or lowercase.
2. The target case may be taken as any three unique values (please specify what they are) of a consistent type; either three characters, or three numbers, or three bit patterns. (Other formats are currently not allowed to prevent "outsourcing" the answer to the case specification. Comment if you think that an additional format should be allowed.)
3. Titlecase means uppercase everything except letters that follow a letter (letters are az plus äöüß).

## Gotchas

1. When ß needs to be uppercase, it must become ẞ. Some case-folding built-ins and libraries do not do this.

2. When ß needs to be titlecase, it must become Ss. Some case-folding built-ins and libraries do not do this.

3. ss may occur in the text, and should never be converted to ß or ẞ.

## Examples

Upper case die Räder sagen "ßß ss" für dich, wegen des Öls!
is DIE RÄDER SAGEN "ẞẞ SS" FÜR DICH, WEGEN DES ÖLS!

Lower case die Räder sagen "ßß ss" für dich, wegen des Öls!
is die räder sagen "ßß ss" für dich, wegen des öls!

Title case die Räder sagen "ßß ss" für dich, wegen des Öls!
is Die Räder Sagen "Ssß Ss" Für Dich, Wegen Des Öls!

• What would be the outputs for Ss? Also, the example input is missing a ss – Rod Jan 11 '18 at 14:48
• @Rod SS Ss ss. Can you tell me why that's unclear? – Adám Jan 11 '18 at 15:00
• Related – Poke Jan 11 '18 at 15:02
• Am I allowed to make the three unique values Python functions? (see my answer) – HyperNeutrino Jan 11 '18 at 15:05
• No, that's exactly what intended to prevent by specifying that the three unique values must be either characters, numbers or bit patterns. – Adám Jan 11 '18 at 15:20

# Japt, 42 40 bytes

Saved 2 bytes thanks to @Oliver

r'ßQ=7838d)u mV,@W¦vW=X ?Xv :X¥Q?"Ss":Xu


Whew, that took quite some effort. Input is the string to convert, and a single character: u for uppercase, v for lowercase, m for title case.

Test it online!

• Do you need the }0? – Oliver Jan 12 '18 at 15:55
• @Oliver Yeah, otherwise it'll... wait, maybe not... – ETHproductions Jan 12 '18 at 17:35

# Python 3, 92 bytes

lambda s,c:[str.lower,str.upper,str.title][c](s.replace("ẞ","ß").replace("ß"*c,"ẞ"*c))


Try it online!

• Oh no! Unfortunately, that's a significant part of the challenge. – Erik the Outgolfer Jan 11 '18 at 18:44
• @EriktheOutgolfer fixed, thanks – HyperNeutrino Jan 11 '18 at 20:17

# 05AB1E, 23 bytes

Uses 0 = lower, 1 = upper, 2 = title

•^ŠX•4ôçIiR}:"lu™"¹è.V


Try it online!

# Jelly, 50 bytes

⁽ñWỌ”ß;y⁸Œu
Ñ⁾SsÇ⁼?€1¦”ß
Œl
Çe€“Ġẹṇṣ‘ỌÇ;Øa¤Œg⁸ṁ⁹Ŀ€


Try it online!

Full program.

Phew, this took much time to golf...

Argument 1: String (may need to be escaped)
Argument 2: 1 for uppercase, 2 for title case, 3 for lowercase.

# Clean, 649279275274 246 bytes

Yes, that's 123 122 94 bytes of imports, which is already longer than every other answer.

from StdList import++,map,flatten
import StdLib,StdInt,StdBool,Text.Unicode,Text.Unicode.UChar
$=fromInt ? =isAlpha ^ =toUpper @0s=map^s @1s=map toLower s @2s=flatten(map(\[h:t]=if($223==h||h> $999)[$83,\$115][^h]++ @1t)(groupBy(\a b= ?a== ?b)s))


Try it online!

Defines the function @, taking an Int and a UString, and returning a UString.
Conveniently, UString (Clean's default way of handling Unicode), is just a type alias for [Int] - which is a list of Int containing unicode codepoints of the characters in the string.
Inconveniently, Text.Unicode.UChar is really long, and I can't import StdEnv because the definitions in StdChar conflict with the definitions in Text.Unicode.UChar` (as they are not intended for use together).

The three values are 0, 1, and 2 for Upper, Lower, and Title case.