NAMES = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]def semitone(letter): # 음이름 글자가 C에서 반음 몇 개 위인지 (match는 다음 case로 이어 내려가지 않는다) match letter: case "C": return 0 case "D": return 2 case "E": return 4 case "F": return 5 case "G": return 7 case "A": return 9 case _: return 11 # Bn, k = map(int, input().split())out = []for note in input().split(): p = int(note[-1]) * 12 + semitone(note[0]) # 음 번호: 옥타브와 음이름을 한 수로 if len(note) == 3: p += 1 if note[1] == "#" else -1 p += k out.append(NAMES[p % 12] + str(p // 12))print(" ".join(out))
JavaScriptmain.js · 25 行
const NAMES = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];// 음이름 글자가 C에서 반음 몇 개 위인지function semitone(letter) { switch (letter) { case "C": return 0; case "D": return 2; case "E": return 4; case "F": return 5; case "G": return 7; case "A": return 9; default: return 11; // B }}const lines = require("fs").readFileSync(0, "utf8").split("\n");const k = Number(lines[0].trim().split(/\s+/)[1]);const out = lines[1].trim().split(/\s+/).map((note) => { // 음 번호: 옥타브와 음이름을 한 수로 합친다 let p = Number(note[note.length - 1]) * 12 + semitone(note[0]); if (note.length === 3) p += note[1] === "#" ? 1 : -1; p += k; return NAMES[p % 12] + Math.floor(p / 12);});console.log(out.join(" "));
TypeScriptmain.ts · 27 行
import { readFileSync } from "node:fs";const NAMES: string[] = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];// 음이름 글자가 C에서 반음 몇 개 위인지function semitone(letter: string): number { switch (letter) { case "C": return 0; case "D": return 2; case "E": return 4; case "F": return 5; case "G": return 7; case "A": return 9; default: return 11; // B }}const lines: string[] = readFileSync(0, "utf8").split("\n");const k: number = Number(lines[0].trim().split(/\s+/)[1]);const out: string[] = lines[1].trim().split(/\s+/).map((note: string): string => { // 음 번호: 옥타브와 음이름을 한 수로 합친다 let p: number = Number(note[note.length - 1]) * 12 + semitone(note[0]); if (note.length === 3) p += note[1] === "#" ? 1 : -1; p += k; return NAMES[p % 12] + Math.floor(p / 12);});console.log(out.join(" "));
JavaMain.java · 35 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { static final String[] NAMES = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; // 음이름 글자가 C에서 반음 몇 개 위인지 (화살표 switch는 이어 내려가지 않는다) static int semitone(char letter) { return switch (letter) { case 'C' -> 0; case 'D' -> 2; case 'E' -> 4; case 'F' -> 5; case 'G' -> 7; case 'A' -> 9; default -> 11; // B }; } public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int k = Integer.parseInt(in.readLine().trim().split("\\s+")[1]); StringBuilder out = new StringBuilder(); for (String note : in.readLine().trim().split("\\s+")) { // 음 번호: 옥타브와 음이름을 한 수로 합친다 int p = (note.charAt(note.length() - 1) - '0') * 12 + semitone(note.charAt(0)); if (note.length() == 3) p += note.charAt(1) == '#' ? 1 : -1; p += k; if (out.length() > 0) out.append(' '); out.append(NAMES[p % 12]).append(p / 12); } System.out.println(out); }}
C#Main.cs · 34 行
using System;using System.Collections.Generic;class Program{ static readonly string[] Names = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" }; // 음이름 글자가 C에서 반음 몇 개 위인지 static int Semitone(char letter) => letter switch { 'C' => 0, 'D' => 2, 'E' => 4, 'F' => 5, 'G' => 7, 'A' => 9, _ => 11, // B }; static void Main() { int k = int.Parse(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries)[1]); var result = new List<string>(); foreach (string note in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries)) { // 음 번호: 옥타브와 음이름을 한 수로 합친다 int p = (note[note.Length - 1] - '0') * 12 + Semitone(note[0]); if (note.Length == 3) p += note[1] == '#' ? 1 : -1; p += k; result.Add(Names[p % 12] + (p / 12)); } Console.WriteLine(string.Join(" ", result)); }}
C++main.cpp · 35 行
#include <iostream>#include <string>using namespace std;const string NAMES[12] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};// 음이름 글자가 C에서 반음 몇 개 위인지int semitone(char letter) { switch (letter) { case 'C': return 0; case 'D': return 2; case 'E': return 4; case 'F': return 5; case 'G': return 7; case 'A': return 9; default: return 11; // B }}int main() { int n, k; cin >> n >> k; for (int i = 0; i < n; i++) { string note; cin >> note; // 음 번호: 옥타브와 음이름을 한 수로 합친다 int p = (note.back() - '0') * 12 + semitone(note[0]); if (note.size() == 3) p += note[1] == '#' ? 1 : -1; p += k; if (i) cout << ' '; cout << NAMES[p % 12] << p / 12; } cout << '\n'; return 0;}
Cmain.c · 36 行
#include <stdio.h>#include <string.h>static const char *NAMES[12] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};/* 음이름 글자가 C에서 반음 몇 개 위인지 */static int semitone(char letter) { int s; switch (letter) { case 'C': s = 0; break; case 'D': s = 2; break; case 'E': s = 4; break; case 'F': s = 5; break; case 'G': s = 7; break; case 'A': s = 9; break; default: s = 11; break; /* B */ } return s;}int main(void) { int n, k; char note[8]; scanf("%d %d", &n, &k); for (int i = 0; i < n; i++) { scanf("%7s", note); size_t len = strlen(note); /* 음 번호: 옥타브와 음이름을 한 수로 합친다 */ int p = (note[len - 1] - '0') * 12 + semitone(note[0]); if (len == 3) p += note[1] == '#' ? 1 : -1; p += k; printf("%s%s%d", i ? " " : "", NAMES[p % 12], p / 12); } printf("\n"); return 0;}
Craykonmain.cray · 53 行
names = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];// 음이름 글자가 C에서 반음 몇 개 위인지반음(letter){ s = 11; // B 选择 (letter) { 情况 "C": s = 0; 跳出; 情况 "D": s = 2; 跳出; 情况 "E": s = 4; 跳出; 情况 "F": s = 5; 跳出; 情况 "G": s = 7; 跳出; 情况 "A": s = 9; 跳出; } 返回 s;}first = 控制台.读数字();k = first[1];notes = 控制台.读行().去空白().分割(" ");out = [];遍历 (note 在 notes){ // 음 번호: 옥타브와 음이름을 한 수로 합친다 p = note[note.长度 - 1].转数字() * 12 + 반음(note[0]); 如果 (note.长度 == 3) { 如果 (note[1] == "#") { p = p + 1; } 否则 { p = p - 1; } } p = p + k; out.添加(names[p % 12] + 数学.商(p, 12));}控制台.输出(out.连接(" "));