Wkład
Symbol dowolnego triadycznego akordu (patrz http://en.wikipedia.org/wiki/Chord_(music)#Triads ).
Wydajność
Nuty składające się na dany akord.
Przykłady
Wejście: AM
Wyjście:A C# E
Wejście: C#m
Wyjście:C# E G#
Wejście: Db+
Wyjście:C# F A
Wejście: C0
Wyjście:C D# F#
Bonusy
-50, jeśli poradzisz sobie również z siódmymi akordami
-150 za faktyczne odtwarzanie dźwięku akordu
-150 za użycie znaków do wydrukowania, aby pokazać, jak grać akord na pianinie; przykład dla AM
:
┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│ │ │ │ │ ┃ ┃ │ │ ┃ ┃ │ │ │ │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘
-100 za użycie znaków do wydrukowania, aby pokazać, jak grać akord na gitarze; przykład dla AM
:
x o o o o o
┌───┬───┬───┬───┬───┐
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ █ █ █ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
(patrz https://en.wikipedia.org/wiki/Box-drawing_character )
Zasady
Wynik musi być programem wiersza polecenia lub skryptem.
Dane wejściowe i wyjściowe mogą mieć dowolną formę, o ile są zgodne ze standardem notacji muzycznej.
Reprezentacja gitary lub fortepianu jest uważana za ważną tylko wtedy, gdy zawiera trzy (triadyczne) lub cztery (siódme) wymagane nuty i nic więcej. Ta sama nuta może występować kilka razy w akordzie.
Zewnętrzne biblioteki nie są dozwolone, z wyjątkiem generowania dźwięku (w którym to przypadku
#include
,import
... Dyrektywy nie są dodawane do liczby znaków).To jest kod golfowy, wygrywa najkrótszy kod!
Trochę teorii muzyki ...
We współczesnej zachodniej muzyce tonalnej każda oktawa składa się z dwunastu następujących po sobie nut:
A
A#
B
C
C#
D
D#
E
F
F#
G
G#
Lub:
La
La#
Si
Do
Do#
Re
Re#
Mi
Fa
Fa#
Sol
Sol#
W tym systemie uważamy, że dwie kolejne nuty (np. A
I A#
, lub E
i F
) są oddzielone jednym półtonem. Ponadto, notatki są rodzajem „zapętlenie”: co natychmiast następuje G#
to A
.
Akord składa się z kilku (2, 3, 4, czasem więcej) nut, które „brzmią razem dobrze”. Na przykład akordy triadowe zawierają trzy różne nuty, a siódmy akord zawiera cztery różne nuty.
Zdefiniujmy cztery triady akordowe jako:
Major triada : zawiera pierwiastek akordu (w tym pytaniu nutę podaną jako dane wejściowe), trzecią część główną dla rdzenia (4 półtony wyższe od rdzenia) i idealną piątą dla rdzenia (7 półtonów powyżej rdzenia ); może to być symbolizowane 0-4-7
Drobna triada , symbolizowana 0-3-7
Rozszerzona triada , symbolizowana 0-4-8
Zmniejszona triada , symbolizowana 0-3-6
Tak na przykład, jeśli chcesz dokonać C-dur triadę , zauważył C
, CM
, Cmaj
, trzeba będzie trzy zauważył:
- 0: root , w tym przypadku a
C
- 4: mniejsza trzecia , 4 półtony wyższe niż korzeń; to jest
E
- 7: idealna piąta , 7 półtonów wyższa od rdzenia: a
G
To właśnie 0-4-7
, 0-3-7
, 0-4-8
i 0-3-6
notacje użyte powyżej średniej! W przypadku siódmego akordu użyj następującego wzoru:
To tyle na dzisiaj! Teraz zadziwi mnie niesamowitym kodem ... Jeśli masz jakieś pytania, dodaj kilka komentarzy poniżej.
Db+
czyDb F A
nie ma tam D # lub G. To może trochę więcej teorii niż to konieczne, formuły były ważną częścią. Jeśli naprawdę chcesz dołączyć wszystkie osiem siódmych akordów wymienionych w wikipedii, powinieneś podać dane wejściowe. Zakładam, że ascii-art fortepian i gitara są elastyczne.Odpowiedzi:
BBC BASIC
Emulator na bbcbasic.co.uk
Rev 1, 340 - 150 klawiatura - 150 gra = 40
Oto najnowsza wersja, w której udało mi się wprowadzić następujące ulepszenia, wydłużając je tylko o kilka dodatkowych postaci.
Dane wejściowe można wygodnie edytować na ekranie przed naciśnięciem klawisza return (wcześniej użyłem GET $, aby uzyskać pojedyncze naciśnięcia klawiszy, ponieważ BBC Basic nie pozwala na dostęp do pojedynczego znaku z ciągu znaków, tak jakby ciąg był tablicą. Teraz używam raczej nieporęczna funkcja MID $, aby wyodrębnić ciąg jednego znaku z ciągu.
Wyświetlane są obie strony klawiatury, a także pełna linia między literami E i F.
Aby zrekompensować znaki dodane przez powyższe, przestawiłem program, aby wyeliminować niepotrzebne instrukcje drukowania, i usunąłem białe znaki, które na pierwszy rzut oka wyglądały, jakby nie można było ich usunąć. W BBC Basic wszystkie wbudowane funkcje są zastrzeżonymi słowami i możesz umieścić przed nimi nazwę zmiennej bez spacji. Nazwy zmiennych nie mogą zaczynać się od słowa zarezerwowanego. Aby program był mniej skomplikowany w czytaniu, zmieniłem wszystkie zmienne na małe litery.
Chociaż prezentacja wygląda znacznie lepiej, następujący program jest
już w pełni golfowy.(Patrz korekta poniżej.) Zasadniczo znaki nowej linii i dwukropki są wymienne, z wyjątkiem przypadków użycia instrukcji IF. W takim przypadku wszystkie instrukcje w tym samym wierszu (oddzielone dwukropkami) należy wykonać warunkowo. Instrukcje po nowej linii nie są kontrolowane przez IF i zawsze będą wykonywane.Program wer. 1 340 znaków
KOREKTA: BBC BASIC RT Russella dla systemu Windows pozwala wyeliminować niektóre znaki nowej linii i dwukropki, zmniejszając całkowitą liczbę do 327, patrz poniżej. Również zapisuje słowa kluczowe w pojedyncze znaki przed zapisaniem, co obniża je do 279.
Wyjście rev 1
Rev 0, 337 - 150 klawiatura - 150 gra = 37Jest to podobna koncepcja do mojej odpowiedzi Arduino, ale zawsze wiedziałem, że mogę pokonać tę liczbę bajtów za pomocą BBC basic. Rozpoznaje tylko ostre narzędzia, ale uważa B # za nieważne, musisz wpisać C. Można to naprawić, jeśli naprawdę uważa się to za ważne.
Zrezygnowałem z gitary i skoncentrowałem się na ulepszeniu klawiatury. Teraz biegnie od C do B, a ja dodałem po lewej stronie klawiatury i linii między E i F. To kosztuje 28 znaków. Prawa strona nie byłaby niczym więcej.
Oto przykładowe wyjście, akord o zmniejszonej A # (który ma dość dziwaczny dźwięk w tej inwersji) i akord B-dur. Pamiętaj, że dane wejściowe nie są wyświetlane na ekranie. Zgodnie z odpowiedzią Arduino obróć ekran w kierunku przeciwnym do ruchu wskazówek zegara, aby wyświetlić.
Wersja bez golfa
źródło
Jak widać, wcale nie próbowałem grać w golfa. Jestem maniakiem muzyki, a mój wkurzony ptaszek ma miejsce, gdy ludzie piszą rzeczy używając niewłaściwego enharmoniki (np. Mówiąc, że akord zmniejszony C to CD # F # zamiast C Eb Gb), więc napisałem ten program, który dostaje enharmonikę dobrze. Robi to, reprezentując każdą nutę jako liczbę idealnych piątych powyżej F.
Jeśli chodzi o to, co warto, jeśli chcesz rozróżnić enharmonikę, każdy interwał muzyczny może być ładnie reprezentowany w programie komputerowym jako liczba doskonałych piątych i liczba oktaw. Na przykład powiększona czwarta to 6 idealnych piątych i -3 oktawy, a zmniejszona piąta to -6 idealnych piątych i 4 oktaw.
Haskell, 441 znaków
Niektóre przykładowe wywołania:
źródło
Arduino
Wejście / wyjście jest wysyłane do / odbierane z Arduino przez port COM. Użytkownik może wchodzić w interakcje z tym za pośrednictwem terminala lub monitora szeregowego w Arduino IDE. Jak mogłeś się domyślić z mojego wyboru platformy, planuję uwzględnić faktyczną grę akordu (chociaż jeszcze tego nie zrobiłem).
Z powodzeniem rozwiązałem problem z klawiaturą i próbowałem zmierzyć się z gitarą, z ograniczonym sukcesem.
Pole akordów ma 130 bajtów, co jest zbyt długie, aby było tego warte. Dlatego wypróbowałem inny sposób, po prostu drukując styl tabulatorów liczb progów. Obecnie jest to 81 bajtów dla premii 81-100 = -19. Jeśli to podejście zostanie uznane za prawidłowe, mogę spróbować je ulepszyć.
Wszystkie użyte akordy to kształty typu D z rdzeniem na 2. strunie, piąte na 3. strunie i trzecie na 1. i 4. strunie. Piąta i szósta struna nie są używane i zaznaczam to X po prawej stronie pola akordów (lewy byłby bardziej zwyczajny, ale przykłady zaznaczone po prawej stronie można znaleźć).
Ponieważ program uważa F za najniższą nutę (dla zgodności z klawiaturą, unikając jednocześnie zbyt wysokich progów z tym kształtem akordu), najwyższym akordem jest E (z rdzeniem na 17. progu.) Zobacz przykładowe wyjście.
Klawiatura odnosi większe sukcesy pod względem golfowym. Działa z FE, a nie z CB z powodów opisanych powyżej. Musi być oglądany przez obrócenie ekranu o 90% w kierunku przeciwnym do ruchu wskazówek zegara, kiedy wyraźnie widać kontury czarnych nut i rozgraniczenie białych nut za pomocą
---
. Linia między B i C może zostać przedłużona o____
kilka dodatkowych bajtów.Następnie spróbuję zagrać nuty. Będzie to interesujące, ponieważ chociaż uważam, że Arduino Uno ma 3 wewnętrzne timery, tylko jedna nuta może być odtwarzana za pomocą wbudowanego polecenia tonu. Istnieje funkcja zewnętrznej biblioteki, która wykorzystuje wszystkie timery sprzętowe (które zepsują serial, ale i tak nie będą potrzebne na tym etapie.) Alternatywnie mogę spróbować wygenerować dźwięki w softare.
Jeśli mi się to uda, zagram w golfa, ale nie sądzę, że to będzie ogólny zwycięzca.
Nieskluczony kod
Przykładowe dane wyjściowe Im mniejsze odstępy między wierszami tekstu, tym lepiej to wygląda. Dlatego wygląda świetnie, kiedy faktycznie edytuję post, ale jest okropny w szarym polu po opublikowaniu. Zamiast tego opublikowałem zrzut ekranu monitora szeregowego Arduino, który ma pośrednie odstępy między wierszami (a tym samym jakość wyświetlania).
źródło
Python3 - 315 znaków
Pierwszy raz w codegolf! Obsługuje obecnie tylko drobne, większe, zmniejszone i wzmocnione akordy.
źródło
'C C# D D# E F F# G G# A A# B'.split(' ')
zamiast literalnej tablicy, aby zapisać niektóre bajty.if('#'in a):j+=1
->if'#'in a:j+=1
= 2 znaki mniej dla każdej instrukcji. Również zmianęy
Dorange()
wyrażenie zapisuje coś zbyt. Witamy! (i pamiętaj, że nowe linie też się liczą;))'C C# D D# E F F# G G# A A# B'.split()
;)y
do przechowywania[1,2,4,5,6]
, dlaczego po prostu nie pominąćy
i zastąpić wiersz 4for i in[1,2,4,5,6]:
? W każdym razie witaj w codegolf i mam nadzieję, że dobrze się tutaj bawisz.Python 506 (Unicode jako 1 znak) -150 (dźwięk) -150 (klawiatura) = 206
Do odtwarzania dźwięku używa
pygame.midi
. Zauważ, żepygame.midi.get_default_output_id()
metoda nie działa zbyt dobrze. Możesz więc spróbować zmienić linięo=Output(get_default_output_id())
nao=Output(1)
,o=Output(2)
itp. Zwykle poprawna wartość wynosi od 0 do 5.Wyniki
źródło
J - 82 znak
Samodzielny, odczytuje z wejścia konsoli. Jeśli potrzebujesz stdin, zmień finał
1
na a3
. Żądanie żadnych bonusów i tylko pokrycie triad.Zamiast ostrej notatki, np.
C#
Musisz użyć równoważnej płaskiej nazwyDb
. (Korekcja za to będzie nadmuchać kodu przez więcej niż trochę). Cztery rodzaje akordów są0
do pomniejszenia,m
dla małoletniego,M
za główny, a+
na powiększone.Logika jest następująca: używamy ostatniego znaku, aby dodać przesunięcie do bazy 0-3-6, która wybiera rodzaj trzeciej i piątej. Tymczasem używamy nuty, aby znaleźć miejsce w skali, z którego można pobrać nuty.
;:
Zarówno sprawia notatkę zgodną z indeksowania w skali na początku, a później (o&.
) zamienia wyciągnął notes w przestrzeń oddziela łańcuch.Przykładowe użycie:
źródło
JavaScript, 224 znaki
To jest mój pierwszy golfowy kod. Myślę, że może być krótszy, ale nie mogę znaleźć bajtów do zapisania.
Podpory główne,
m
dla moll0
na zmniejszony,+
dla powiększona lub 37 bajtów więcejdim
,aug
.źródło
n[m]==0
może być po prostu!n[m]
. To samo dotyczy innego miejsca. Razem możesz łatwo odciąć 6 znaków .n
jest ciągiem znaków,n[m]==0
rzuci0
się"0"
, więc jest równan[m]=="0"
."0" == 0
jest prawdą, ale!"0"
fałszem.AM
. Mogę się również mylić.Python (
143134 znaków)Moje pierwsze wyzwanie w golfa :), nie wiem, czy uda się wygolić więcej bajtów.
Stosowana tutaj notacja to * aug / + maj /, min / - dim
Zasługuję na punkt bonusowy za to, że mam stałą 42 w kodzie: P
źródło
n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
Python 3: 257 - 150 = 107
Tylko 25 znaków za długo, aby pokonać rozwiązanie J! No cóż. Myślę, że jest tu kilka fajnych pomysłów.
Dane wejściowe są jak w przykładach, ale musisz używać ostrych nazw zamiast płaskich nazw. (np. Gb musi być F #)
Wyjście to pojedyncza oktawa fortepianu, widziana z góry i po lewej, z nałożonymi nazwami nut. Powinien to być tylko niewielki odcinek wyobraźni.
źródło
CM
powinniśmy umieć czytaćC E G
...bool(R)
zR|0
?bool(R)
wynosi 1 (prawda), jeśli nie jest pusta, i 0 (fałsz), jeśli jest pusta.|
Operator nie działa z list ...Scala 537 znaków - 50
źródło
Haskell, 273 znaków
Wyniki
źródło