Challenges

# The Camelot Wheel

+3
−0

Given a musical key, output its number and letter on the Camelot Wheel (shown below).

# Input

A musical key as a string, as shown on the wheel. The words "Sharp" and "Flat" may be replaced with symbols (such as "#" and "b") if you wish.

# Output

The number and letter, either as a string, tuple, or array.

Examples:

Input->Output
"E Major" -> "12B"
"F-Sharp Minor" -> "11A"
"Bb Minor" -> "3A"

This is code-golf.

Why does this post require moderator attention?
Why should this post be closed?

+3
−0

# Python 3, 101, 98, 94 bytes

lambda s:f"{(('FCGDAEB'.index(s[0])-~-ord(s[5])*('-'in s)-3*('i'in s)-6)%12)+1}"+'BA'['i'in s]

Try it online!

def f(s):
n="FCGDAEB".index(s[0])-6
if '-' in s:
n -= ord(s[5]-1)
if 'i' in s:
n -= 3

return f"{(n%12)+1}"+'BA'['i'in s]

# Python 3.9, 95, 91 bytes:

lambda s:f"{(('FCGDAEB'.index(s[0])-~-ord(s[5])*('-'in s)-3*(m:='i'in s)-6)%12)+1}"+'BA'[m]

Isn't the walrus operator great?

Why does this post require moderator attention?

+1
−0

# APL (Dyalog Unicode), 110 67 bytes

{(⍕((f⊖⍪'AEBFCGDAEBFD'),r⌽12↑¯6↑5⍴'-')⍳2↑⍵),⎕a⌷⍨1+0≠f←¯3+r←3×'i'∊⍵}

-43 bytes from dzaima.

Requires input exactly as shown in the diagram.

A bit fiddly with the compression, but works correctly.

In both circles, the notes come in the form AEBFCGDAEBFD, so it is rotated as per the level it identifies with.

The hyphens in each note's description also come in the same format(----- ), so that is rotated as per requirement as well.

Based on the above data, we can find the number of the note.

If it's a Major note, then we append a B. Otherwise A.

Why does this post require moderator attention?