Büyük-Küçük İkili


15

Akorların bir listesi onları 'Büyük' ​​veya 'Küçük' olarak etiketlediğinde.

Giriş

Giriş, boşlukla ayrılmış 3 notadan oluşan, her satırda bir tane olan akorların bir listesi olacaktır. Her nota büyük harfli ( A- G) nota adından ve isteğe bağlı bir kazara ( #veya b) oluşur. Akorlar herhangi bir ters çevrilmiş olabilir (yani notalar herhangi bir sırada olabilir).

Çıktı

Akor büyükse, 'Major' çıkışını verin. Akor küçükse, 'Minor' verin. Akor ne büyük ne de küçükse, boş bir satır verin.

Misal

Giriş

C E G
F Ab C
C Eb Gb
E G B
Db F Ab
Bb G D
D A Gb

Çıktı

Major
Minor

Minor
Major
Minor
Major

Test komut dosyaları

Geçmişteki bazı sorularımda olduğu gibi, bu soru için bazı test senaryoları sağlamak için bir kez daha Joey ve Ventero tarafından oluşturulmuş bazı test komut dosyalarını tekrar kullandım :

Kullanımı: ./test [your program and its arguments]

Ödüller

Spesifikasyonu karşıladığını doğrulayabildiğim, testleri geçtiğini ve golfte bazı girişimlerde bulunduğunu doğrulayabildiğim her giriş benden bir upvote alacak (bu yüzden lütfen cevabınızla birlikte kullanım talimatlarını sağlayın). 13/10/2012 sonuna kadar en kısa çözüm kazanan olarak kabul edilecektir.

Biraz teori

Müzik teorisi bilgisi olmayanlarınız için rekabet edebilmeniz için yeterli bilgi.

Bir majör veya minör akor, belirli bir yarı ton paterni ile ayrılmış üç notadan oluşur. Akorun kökünün (alt nota) 0 olduğunu düşünürsek, büyük bir akor 0-4-7 paterni ve küçük bir akor 0-3-7 paternidir. Bazı notaların yarı tonlu, bazılarının da tonlu olması gerçeği daha garip hale getiriyor. Ab- ' den yarı tonların yayılması G#aşağıdaki gibidir:

G#/Ab A A#/Bb B/Cb B#/C C#/Db D D#/Eb E/Fb E#/F F#/Gb G G#/Ab
  0   1   2    3     4    5   6   7    8     9    10  11  12

G#/AbG#ile aynı not olduğu anlamına gelir Ab. Bundan görebiliyoruz ki akor Ab C Ebbüyük bir akor ve bu Ab Cb Ebda küçük.

Komplike ayrıca önemli için, akor Eb Cb Abaynı olarak kabul edilir Ab Cb Eb, Cb Eb Abve Cb Ab Ebvb. Bu varyasyonların her biri hala küçük bir akordur.


2
Bence bash test cihazınızın girişlere ve beklenen cevapların değişmesine ihtiyacı var.
flodel

@flodel Evet, haklısın. Üzgünüm, şimdi düzelttim. Powershell test komut dosyasının da aynı soruna sahip olmadığını kontrol etmem gerekecek.
Gareth

Yanıtlar:


3

GolfScript, 83 karakter

n%{' '%{1\{'A#BC D EF G'?+}/.}%$(+2/{~- 12%}%.(+.(+]$0=.$]10,7>?'MMaijnoorr

'>2%}%

Bu hızlı bir ilk çözümdür; Eminim bu daha da golf edilebilir. Yorumlarda flodel tarafından belirtilen hatayı düzelttikten sonra bash test paketini geçer.

Düzenleme 1: Standartlaştırılmış majör ve minör akor düzenlerini tanımanın daha kısa bir yoluyla kaydedilen 5 karakter.

Edit 2: Grc'nin çözümünden esinlenen daha kompakt çıktı kodlamasıyla 2 karakter daha kaydetti. (Teşekkürler!) Bir yan etki olarak, kod şimdi çıktıdan sonra fazladan boş bir satır yazdırıyor, ancak test koşum takımı bunu kabul ediyor gibi görünüyor, bu yüzden tamam. :)

Şöyle çalışır:

  • Dış döngü n%{ }%n*, girişi satırlara ayırır, her satır için parantez içindeki kodu çalıştırır ve sonuçları yeni satırlarla birleştirir.

  • ' '%her satırı bir not dizisine böler. Bu notların her biri için, 1\{'A#BC D EF G'?+}/daha sonra dizedeki karakterlerinin her birini arayarak 'A#BC D EF G've konumları ekleyerek (özellikle de dahil olmak üzere dizede bulunmayan herhangi bir karakter için -1 olacak) bu notu bir yarı ton numarasına dönüştürür b. (Ben emin daha önce kullanılan bu hileyi görmüştüm.) Son olarak, .giriş örneğin döngünün sonunda, böylece her sayı kopyalar F Ab Chaline getirilmiştir [9 9 0 0 4 4].

  • Daha sonra notları ile $sıralarız, ilk notu sonuna kadar (+taşırız ve diziyi çiftlere böleriz 2/, böylece şimdi örneğin görünür [[9 0] [0 4] [4 9]]. Daha sonra, {~- 12%}%her bir not çiftini örnek modumuza dönüştürerek fark modulo 12'ye eşler [9 8 7].

  • Ardından, .(+dizinin bir kopyasını oluşturur ve öğelerini bir konum sola döndürür. Bunu iki kez yapıyoruz ve kopyaları ile bir dizi halinde topluyoruz ], böylece örneğimiz artık benziyor [[9 8 7] [8 7 9] [7 9 8]].

  • Daha sonra bu dizi dizisini şu şekilde sıralarız $ve ilk öğeyi - bu durumda [7 9 8]- ile alırız 0=. Daha sonra bu dizinin ( .) bir kopyasını yaparız, sıralar ( ), $sıralanmamış ve sıralanmamış diziyi başka bir dizi dizisine ( ]) ekleriz ve dizinin ilk oluşumunu ararız [7 8 9]( 10,7>iki karakter kaydetmek için yazılır) ) içinde.

  • Bu bize ya 0(sıralanmamış dizi [7 8 9]ve dolayısıyla akor 1büyükse ), (sıralanmamış dizi bir permütasyon ise [7 8 9], ilk öğesinin en küçük olması gerektiğinde, sadece [7 9 8]akoru küçük yapmak) veya -1(sıralanan dizi bile eşit değilse [7 8 9]).

  • Bu sayı daha sonra dizeye bir başlangıç ​​endeksi olarak kullanılır "MMaijnoorr\n\n"(burada \ns kodda gerçek satır beslemeleri olarak verilir), bu karakteri ve sonraki her ikinci çıkışı çıkış olarak alırız. Dizin -1 ise, dizenin son karakterinden başlarız, bu sadece bir satır beslemesidir.


Güzel açıklama. Ben her zaman GolfScript ile aynı zorluk yaşıyorum - Ben test etmek için bir seferde bir satır çağırabilir echo "G# B# Eb" | ruby golfscript.rb ilmari.gsama üzerinde test komut dosyası nasıl çalıştırabilirim? Denedim ./test ruby golfscript.rb ilmari.gsama hiçbirine sahip değildi. (Sana zaten bir +1 verdim çünkü açıkçası çalışıyor, ama sadece merak ediyorum)
Gareth

1
@Gareth: Bu, bash test komut dosyasında bir hata gibi görünüyor - birden fazla argümanı doğru işlemiyor. Bunu düzeltmek için, yerine args="$@"ile args=("$@")ve got=$("$cmd" "$args")ile got=$("$cmd" "${args[@]}"). (Veya sadece golfscript.rbçalıştırılabilir yapın ve çalıştırın ./test ./golfscript.rb chords.gs.)
Ilmari Karonen

4

Python, 160

f='A#BC D EF G3453543'.find
try:
 while 1:x,y,z=sorted(map(lambda x:f(x[0])+f(x[1:])+1,raw_input().split()));print'MMianjoorrr'[f(`y-x`+`z-y`)/14:-1:2]
except:0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.