COCI '12 Contest 5 #1 Ljestvica

View as PDF

Submit solution


Points: 5 (partial)
Time limit: 1.0s
Memory limit: 32M

Problem type

Veronica attends a music academy. She was given a music sheet of a composition with only notes (without annotations), and needs to recognise the scale used. In this problem, we will limit ourselves to only the two most frequently used (and usually taught in schools first) scales: A-minor and C-major. This doesn't make them simpler or more basic than other minor and major scales – all minor scales are mutually equivalent save for translation, and so are major scales.

Still, out of the 12 tones of an octave \{A, A\#, B, C, C\#, D, D\#, E, F, F\#, G, G\# \} used in modern music, A-minor and C-major scales do use the tones with shortest names: A-minor is defined as an ordered septuple (A, B, C, D, E, F, G), and C-major as (C, D, E, F, G, A, B).

Notice that the sets of tones of these two scales are equal. What's the difference? The catch is that not only the set of tones, but also their usage, determines a scale. Specifically, the tonic (the first tone of a scale), subdominant (the fourth tone) and dominant (the fifth tone) are the primary candidates for accented tones in a composition. In A-minor, these are A, D, and E, and in C-major, they are C, F, and G. We will name these tones main tones.

Aren't the scales still equivalent save for translation? They are not: for example, the third tone of A-minor (C) is three half-tones higher than the tonic (A), while the third tone of C-major (E) is four halftones higher than the tonic (C). The difference, therefore, lies in the intervals. This makes minor scales "sad" and major scales "happy".

Write a program to decide if a composition is more likely written in A-minor or C-major by counting whether there are more main tones of A-minor or of C-major among the accented tones (the first tones in each measure). If there is an equal number of main tones, determine the scale based on the last tone (which is guaranteed to be either A for A-minor or C for C-major in any such test case).

For example, examine the well-known melody "Frère Jacques":

\displaystyle CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C

The character | separates measures, so the accented tones are, in order: C, E, C, E, E, G, E, G, G, E,
G, E, C, C, C, C. Ten of them (C, C, G, G, G, G, C, C, C, C) are main tones of C-major, while six (E,
E, E, E, E, E) are main tones of A-minor. Therefore, our best estimate is that the song was written in C-major.

Input Specification

The first and only line of input contains a sequence of at least 2, and at most 100, characters from the set \{A, B, C, D, E, F, G, |\}. This is a simplified notation for a composition, where the character | separates measures. The characters | will never appear adjacent to one another, at the beginning, or at the end of the sequence.

Output Specification

The first and only line of output must contain the text C-dur (for C-major) or A-mol (for A-minor).

Sample Input 1

AEB|C

Sample Output 1

C-dur

Sample Input 2

CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C

Sample Output 2

C-dur

Comments


  • -1
    littleP  commented on Oct. 23, 2024, 6:11 a.m. edited

    Guys can I have a help, please? I don't really understand why my code fails it seems good to me and on the input as stated in the example it work. The problem that I'm finding really hard on this platform is why code that work fails and the platform doesn't give you a lot of information on what's wrong. Any way this is my code if someone can check it and help me to figure out what's wrong I'll be very grateful.

    notes = {'A', 'B', 'C', 'D', 'E', 'F', 'G', '|'}
    
    main_tones_aminor = {'A', 'D', 'E'}
    main_tones_cmajor = {'C', 'F', 'G'}
    
    composition = input('Write compostion: --> ')
    count_main_a = 0
    count_main_c = 0
    scale = ''
    
    # check length 2 <= composition <= 100
    if 2 <= len(composition) <= 100:
        first_note_mesure = [note[0] for note in composition.split(sep='|')]
        for accent in first_note_mesure:
            if accent in main_tones_aminor:
                count_main_a += 1
            elif accent in main_tones_cmajor:
                count_main_c += 1
    
        if count_main_c == count_main_a:
            if composition[-1] == 'A':
                scale = 'A-mol'
            elif composition[-1] == 'C':
                scale = 'C-dur'
        elif count_main_a > count_main_c:
            scale = 'A-mol'
        else:
            scale = 'C-dur'
    
    print(scale)
    

  • 0
    Xach  commented on July 29, 2024, 5:48 a.m. edited

    https://dmoj.ca/src/6520873 There is my submission. Can someone help me to understand where is my mistake ?


  • 0
    ahora240  commented on April 4, 2024, 11:15 a.m.

    Thanks to you guys, I did succeed to get the right result. Thanks for leaving the comments


  • 1
    DylanBlue  commented on Feb. 27, 2024, 8:43 p.m.

    Don´t forget taking care about the "B".


    • 0
      UNGVSN  commented on May 2, 2024, 12:31 a.m.

      do you mean the composition with 'B' as the only tone?


  • 0
    daveys  commented on Jan. 4, 2024, 10:45 p.m.

    That totally fooled me for ages! As usual with these things, the key seems to be really taking time to understand the question and also make sure that all the sample cases produce the results as per the sample outputs!


  • 0
    Mick  commented on Dec. 19, 2023, 7:43 a.m. edited

    Whats a NameError?

    EDIT Found the problem I misspelled a variable at the end :)


  • 2
    suraj_thadarai  commented on Nov. 26, 2022, 9:47 p.m.

    Check for this test case as well If there is an equal number of main tones, determine the scale based on the last tone (which is guaranteed to be either A for -minor or C for -major in any such test case).


  • 2
    Dragoicho  commented on Sept. 22, 2022, 9:21 p.m.

    Why is the first sample output C-Major? There is 1 A and 1 E, which makes 2 notes for a-minor, while there is only 1 C, so 1 note for C-Major. The description says the final note only decides the key if the number of notes in a-minor and C-Major are the same.


    • 2
      panzer_shrek  commented on Sept. 22, 2022, 10:02 p.m. edited

      Write a program to decide if a composition is more likely written in A-minor or C-major by counting whether there are more main tones of A-minor or of C-major among the accented tones (the first tones in each measure).

      So you count only the first note, and since there's only A and C, and C is the last note, it's C-major


  • 22
    tomme2009  commented on April 20, 2022, 7:09 p.m. edited

    A thing to check if your code is failing only some of the tests. In case the total main notes of A-minor and C-major are equal, the determining factor is not the last main note, but the last note of the entire composition.


    • 1
      Red_Olaf  commented on May 5, 2022, 9:39 p.m.

      Thank you! The light bulb popped up when I read what you wrote.