36 votes

Code De Golf: Des Notes De Musique

Le défi

Le code plus court en nombre de caractères, qui sera sortie de la notation musicale basée sur la saisie de l'utilisateur.

L'entrée sera composé d'une série de lettres et de chiffres - lettres représentent le nom de la note et le nombre représentera la longueur de la note. Une note est composé de 4 colonnes verticales. La note de tête sera un capital O, de la tige, si présent 3 lignes de haut, fabriqué à partir du caractère" |, et le drapeau(s) sera faite à partir de barre oblique inverse \.

Valide les longueurs de notes sont none, 1/4 de la note, 1/8 d'une note, 1/16 d'une note et 1/32 d'une note.

       |    |\    |\    |\
       |    |     |\    |\
       |    |     |     |\
 O    O    O     O     O
 1   1/4  1/8  1/16   1/32

Les Notes sont des lieux sur le Personnel, en fonction de leur nom de la note:

  ----

D ----
C     
B ----
A     
G ----
F     
E ----

Toutes les entrées peuvent être supposé pour être valide et sans erreurs - Chaque note séparés par un espace blanc sur une seule ligne, avec au moins une bonne note.

Des cas de Test

Input:
    B B/4 B/8 B/16 B/32 G/4 D/8 C/16 D B/16
Output:
                              |\               
    --------------------------|---|\--------
          |   |\  |\  |\      |   |\      |\
    ------|---|---|\--|\-----O----|--O----|\
          |   |   |   |\  |      O        | 
    -O---O---O---O---O----|--------------O--
                          |                 
    ---------------------O------------------

    ----------------------------------------


Input:
    E/4 F/8 G/16 A/32 E/4 F/8 G/16 A/32 
Output:

    --------------------------------

    --------------|\--------------|\
              |\  |\          |\  |\ 
    ------|\--|\--|\------|\--|\--|\
      |   |   |  O    |   |   |  O  
    --|---|--O--------|---|--O------
      |  O            |  O          
    -O---------------O--------------


Input:
    C E/32 B/8 A/4 B F/32 B C/16
Output:

    ------------------------------|\
              |\                  |\
    ----------|---|---------------|-
     O        |   |              O   
    ---------O----|--O----|\-O------
          |\     O        |\        
    ------|\--------------|\--------
          |\             O           
    -----O--------------------------

Code de comptage d'entrée/de sortie (j'.e programme complet).

23voto

strager Points 41713

Golfscript (112 caractères)

' '%:A;10,{):y;A{2/.0~|1=~:r;0=0=5\- 7%
4y@--:q'  '' O'if-4q&!q*r*{16q/r<'|\\'
'| 'if}'  'if+{.32=y~&{;45}*}%}%n}%

22voto

mob Points 61524

Perl, 126 caractères (115/122 avec des interrupteurs)

Perl dans 239 226 218 216 183 180 178 172 157 142 136 133 129 128 126 caractères

Cette 126 caractère solution en Perl est le résultat d'une longue collaboration entre moi-même et A. Rex.

@o=($/)x10;$/=$";map{m[/];$p=4+(5-ord)%7;
$_.=--$p?!($p&~3)*$'?16<$p*$'?"  |\\":"  | ":$/x4:" O  ",
$|--&&y@ @-@for@o}<>;print@o

A. Rex propose également une solution pour exécuter avec l' perl -ap de l'interrupteur. Avec 111(!) les personnages de cette solution ainsi que les 4 coups pour le commutateur de ligne de commande, cette solution a un score total de 115.

$\="$:
"x5;$p=4+(5-ord)%7,s#..##,$\=~s#(.)\K$#--$p?
$_*!($p&~3)?"$1|".(16<$p*$_?"\\":$1).$1:$1x4:O.$1x3#gemfor@F

Le premier saut de ligne dans cette solution est importante.

Ou 122 caractères, l'incorporation de ces commutateurs dans la ligne shebang:

#!perl -ap
$\="$:
"x5;$p=4+(5-ord)%7,s#..##,$\=~s#(.)\K$#--$p?$_*!($p&~3)?"$1|".(16<$p*$_?
"\\":$1).$1:$1x4:O.$1x3#gemfor@F

(les deux premières retours à la ligne sont importants).

Demi-notes peuvent être pris en charge avec un supplément de 12 caractères:

@o=($/)x10;$/=$";map{m[/];$p=4+(5-ord)%7;
$_.=--$p?!($p&~3)*$'?16<$p*$'?"  |\\":"  | ":$/x4:$'>2?" @  ":" O  ",
$|--&&y@ @-@for@o}<>;print@o

15voto

KirarinSnow Points 1022

LilyPond - 244 octets

Techniquement parlant, ce n'adhèrent pas à la spécification de la sortie, la sortie est joliment gravé PDF plutôt qu'un pauvre texte ASCII remplacer, mais j'ai pensé que le problème était en train de pleurer pour un LilyPond solution. En fait, vous pouvez supprimer le "\autoBeamOff\cadenzaOn\stemUp" à faire encore plus de bien formaté. Vous pouvez également ajouter "\midi{}" après le "\layout{}" pour obtenir un fichier MIDI à écouter.

o=#(open-file"o""w")p=#ly:string-substitute
#(format o"~(~a"(p"2'1""2"(p"4'1""4"(p"6'1""6"(p"8'1""8"(p"/""'"(p"C""c'"(p"D""d'"(p" ""/1"(p"
"" "(ly:gulp-file"M")))))))))))#(close-port o)\score{{\autoBeamOff\cadenzaOn\stemUp\include"o"}\layout{}}

Utilisation: lilypond thisfile.ly

Notes:

  1. L'entrée doit être dans un fichier nommé "M" dans le même répertoire que le programme.
  2. Le fichier d'entrée doit se terminer par un saut de ligne. (Ou enregistrer 9 octets de la fin dans un espace).
  3. La sortie est un fichier PDF nommé "thisfile.pdf", où "thisfile.ly" est le nom du programme.
  4. J'ai testé avec LilyPond 2.12.2; d'autres versions pourraient ne pas fonctionner.

Je n'ai pas fait beaucoup dans LilyPond, donc je ne suis pas sûr que c'est la meilleure façon de le faire, car c'est de convertir l'entrée de LilyPond format, l'écrire dans un fichier auxiliaire, puis de la lire. Actuellement, je ne peux pas intégré dans LilyPond analyseur/évaluateur de travail. :(

En train de travailler sur une sortie ASCII solution.... :)

14voto

strager Points 41713

C89 (186 caractères)

#define P,putchar(
N[99];*n=N;y;e=45;main(q){for(;scanf(" %c/%d",n,n+1)>0;n
+=2);for(;y<11;q=y-(75-*n++)%7 P+q-4?e:79)P*n&&q<4&q>0?
124:e)P*n++/4>>q&&q?92:e))*n||(e^=13,n=N,y++P+10))P+e);}

Demi-note de soutien (+7 caractères)

#define P,putchar(
N[99];*n=N;y;e=45;main(q){for(;scanf(" %c/%d",n,n+1)>0;n
+=2);for(;y<11;q=y-(75-*n++)%7 P+q-4?e:v<4?79:64)P*n&&q<4&q>0?
124:e)P*n++/4>>q&&q?92:e))*n||(e^=13,n=N,y++P+10))P+e);}

14voto

gnibbler Points 103484

Python 178 caractères

Les 167 était une fausse alerte, j'ai oublié de supprimer les tiges sur l'ensemble des notes.

R=raw_input().split()
for y in range(10):
 r=""
 for x in R:o=y-(5-ord(x[0]))%7;b=" -"[y&1]+"O\|";r+=b[0]+b[o==3]+b[-(-1<o<3and''<x[1:])]+b[2*(-1<o<":862".find(x[-1]))]
 print r

Python 167 caractères (Cassé)

Pas de place pour le mal des yeux dans celui-ci, bien qu'il y a 2 remplissage des caractères de là, j'ai donc ajouté un smiley. Cette technique repose sur l'unicité du dernier caractère de la longueur des notes, donc de la chance que pour moi, il n'y a pas de 1/2 des notes ou des notes 1/64

R=raw_input().split()
for y in range(10):
 r=""
 for x in R:o=y-(5-ord(x[0]))%7;b=" -"[y&1]+"O\|";r+=b[0]+b[o==3]+b[-(-1<o<3)]+b[2*(-1<o<":862".find(x[-1]))]
 print r

Python 186 caractères <<o>>

Python utilise l' <<o>> mauvais œil de l'opérateur à grand effet ici. L' find() méthode renvoie -1 si l'élément n'est pas trouvé, donc c'est pourquoi D n'a pas besoin d'apparaître dans les notes.


R=raw_input().split()
for y in range(10):
 r=""
 for x in R:o='CBAGFE'.find(x[0])+4;B=" -"[y%2];r+=B+(B,'O')[o==y]+(x[2:]and
y+4>o>y and"|"+(B,'\\')[int(x[2:])<<o>>6+y>0]or B*2)
 print r

11 octets supplémentaires donne une version avec des demi-notes


R=raw_input().split()
for y in range(10):
 r=""
 for x in R:t='CBAGFE'.find(x[0])+4;l=x[2:];B=" -"[y%2];r+=B+(B,'@O'[l
in'2'])[t==y]+(l and y+4>t>y and"|"+(B,'\\')[int(l)>>(6+y-t)>0]or B*2)
 print r
$ echo B B/2 B/4 B/8 B/16 B/32 G/4 D/8 C/16 D B/16| python notes.py 
                              |\            
------------------------------|---|\--------
      |   |   |\  |\  |\      |   |\      |\
------|---|---|---|\--|\-----@----|--O----|\
      |   |   |   |   |\  |      @        | 
-O---O---@---@---@---@----|--------------@--
                          |                 
-------------------------@------------------

--------------------------------------------

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X