The Note of Destiny - placez une note sur un bâton

19

L'apocalypse zombie est arrivée et le monde touche à sa fin. Soudain, quelqu'un découvre une formule qui prend l'heure, la minute et le jour actuels et crache la note parfaite à jouer sur un piano qui tue instantanément tous les zombies qui l'entendent. Malheureusement, il ne reste qu'un seul pianiste dans le monde, et il a oublié comment lire les notes, mais il sait toujours lire les partitions. Bien sûr, c'est une chose très sensible au temps, il semble donc naturel d'avoir un ordinateur pour le faire. 1

Votre défi est de prendre une note, telle que G, et de sortir la note placée sur une portée (en clé de sol), comme ceci:

-----

-----
   |
---|-
   |
--O--

-----

Spécification:

  • Vous devez produire une portée de lignes alternées de -----(5 tirets) et une ligne vierge. Il y aura 5 -----s au total. La note doit être superposée au dessus de cette portée.
  • L'entrée spécifiera où se trouve la note. L'entrée sera:
    • un facultatif Hou L, spécifiant "haut" ou "bas"
    • une lettre de Aà G, spécifiant la hauteur
    • facultatif #ou b, spécifiant pointu ou plat.
  • La "note" est définie comme:
    • Un O(O majuscule) aligné au milieu de la portée, qui est à la place de la note. (La ligne du haut est HF(F élevé) et la ligne du bas est E(un E normal).)
    • Trois |s (barres verticales), la tige, qui sera:
      • un espace à gauche de la note et en descendant (en commençant un espace en dessous de la note) si la note est sur la ligne médiane ( B) ou au-dessus, ou
      • un espace à droite de la note et en remontant (en commençant un espace au-dessus de la note) si la note est en dessous de la ligne médiane.
    • Un #ou bun espace directement à gauche de la note s'il est spécifié dans l'entrée.
  • Des lignes de grand livre doivent être ajoutées si la note est trop haute ou trop basse. Ces lignes seront ---(seulement 3 tirets de largeur, par opposition à 5) et n'apparaîtront que si la note est sur ou au-dessus / en dessous (pour les lignes de livre supérieur / inférieur respectivement) les lignes de livre.
  • Les espaces étrangers peuvent être placés où vous le souhaitez; par exemple, vous pouvez faire en sorte que les lignes vides aient des espaces ou avoir un espace après les lignes du grand livre si cela vous aide à enregistrer des caractères.

Voici une visualisation, pour comprendre plus facilement la spécification, avec tous les noms de notes à côté des lignes:

      HB
 ---  HA
      HG
----- HF
      HE
----- HD
      HC
----- B
      A
----- G
      F
----- E
      D
 ---  C
      LB
 ---  LA
      LG
 ---  LF
... (bottom cut off for brevity, you get the idea anyway)

Voici quelques exemples supplémentaires que vous pouvez utiliser pour tester votre programme:

Contribution: HG#

 #O
-|---
 |
-|---

-----

-----

-----

Contribution: LAb

-----

-----

-----

-----

-----
   |
 --|
   |
 bO-

Contribution: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Contribution: C

-----

-----

-----

-----
   |
---|-
   |
 -O-

Il s'agit de , donc le code le plus court en octets gagnera!

1: exposition la plus réaliste evar! :-P

Poignée de porte
la source
2
Il semble très étrange d'avoir #ou bà droite de la note plutôt qu'à gauche; est-ce vraiment ce qui est nécessaire?
Thomas Baruchel
2
Qu'en est-il de B # et similaires? 1. tracer tel quel; 2. rejeter; 3. convertir silencieusement en C?
Digital Trauma
2
Il peut être préférable d'indiquer explicitement qu'il doit être en clé de sol.
user12205
3
Quelqu'un est-il prêt à tenter cela à Fugue ?
AJMansfield
3
@AJM Oui, ce doit être de l'art ASCII.
Poignée de porte

Réponses:

1

Golfscript, 211 210 209 197 195 192 caractères

À venir pour la victoire (à partir de cet article), une version GolfScript de ma dernière version Python :

"J"\+[0]+.1=71>>3<{}/@7*2/246-@3+7%-:z;:c;21,{..3z<3z
if<\11z>11z
if>|{;}{...2>\12<&\2%.{'-'' 'if}:Q~:9;&Q\.z={c!9{[c]''+}if}{..z>\4z+<&8z>&'|'9if}if\.z='o'9if\..z
4-\<\z<&7z<&'|'9if\;3$n}if}/

Testez-le ici (les 2 premières lignes sont entrées par l'utilisateur, elles proviennent normalement de stdin).

Version «lisible»:

;"HCb"

"J"\+[0]+       #process input
.1=71>>3<       #first char is HJL, second is letter, third is #b or space
{}/             #spill chars onto stack, now we working with ints
@7*2/246-@3+7%- #convert HC/JD/LE etc to a number from 0 to 20
:z;:c;
21,{            #for r in range(21):
  ..3z<3z if<           #either out-of-bounds or process the line
  \11z>11z if>|
  {;}{
    ...2>\12<&\2%.{'-'' 'if}:Q~:9;&Q\        #1st char
    .z={c!9{[c]''+}if}                       #2nd char accidental
       {..z>\4z+<&8z>&'|'9if}if\            #2nd char stem or row
    .z='o'9if\                              #3rd char
    ..z 4-\<\z<&7z<&'|'9if\                 #4th char stem or row
    ;3$                                      #5th char=1st char
    n
  }if
}/
Claudiu
la source
Aaaaaa et battu à nouveau par GolfScript. :) ...
Martin Ender
@ m.buettner: Haha, ça ne finit jamais .. étonnamment proche cependant!
Claudiu
1
Mieux! Maintenant, il me suffit de trouver 6/9 octets pour rattraper: D (bien que je ne vois pas comment je ferais cela)
Martin Ender
@ m.buettner: Vous avez 2 octets de plus! Chacun est pourtant si brutal ... Je vais peut-être devoir m'arrêter pour l'instant. Bonne chance!
Claudiu
2
Oh bon sang ... juste au moment où je pensais avoir battu ton 209. Je pense que j'abandonne. GolfScript prévaut. ;)
Martin Ender
6

Rubis - 271 267 252 249 234 229 220 214 caractères

Je viens littéralement d'apprendre Ruby pour ça. Il y a donc certainement place à amélioration pour jouer au golf. Ou vraiment faire quoi que ce soit. Mais j'avais besoin d'un langage avec des chaînes mutables. :)

def f(n)s=[0]*20
s.fill{|i|i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s[[3,l].min..[11,l].max]end

Assez peu golfé:

def f(note)
  staff=[]
  0.step(20) {|i| staff[i] = " "*5}
  1.step(19,2) {|i| staff[i] = " ---"}
  3.step(11,2) {|i| staff[i] = "-"*5}
  level = 7
  if !(pos="HL".index note[i=0]).nil?
    level = 14*pos
    i += 1
  end
  level += (73-note[i].ord)%7
  staff[level][2] = "O"
  mark = note[-1]
  if !"#b".index(mark).nil?
    staff[level][1] = mark
  end
  offset = (level > 7) ? 3 : 1
  staff[level-2*offset+3,3].map {|line| line[offset] = "|"}
  first = [3,level].min
  last = [11,level].max
  puts s[first..last]
end

Je peux le couper de 2 autres caractères jusqu'à 212 caractères si les premières lignes vierges sont autorisées. Cette solution ne remplit pas les lignes qui ne sont pas imprimées de toute façon:

def f(n)s=[]
[3,l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)].min.step(l>11?l:11){|i|s[i]=i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s
end

Le jeu de Lambda est-il juste? Ensuite, je peux obtenir 210 caractères avec la première approche

f=->n{s=[0]*20
s.fill{|i|i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s[[3,l].min..[11,l].max]}

Ou 207 caractères avec des lignes vierges supplémentaires:

f=->n{s=[]
[3,l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)].min.step(l>11?l:11){|i|s[i]=i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s}

Bien sûr, vous devez maintenant le faire f.call("HGb").

Martin Ender
la source
Ha, +1 pour apprendre une langue entièrement nouvelle! ;-) Voici un conseil: !x.nil?équivaut à !x. Et pour une ligne ifs, if x;y;end;est équivalent à y if x. Vous pouvez également utiliser une nouvelle ligne littérale dans cette chaîne.
Poignée de porte
@ Doorknob merci, je vais essayer de travailler ceux-là!
Martin Ender
@ Doorknob hm, je n'ai fait que iftravailler. Si j'utilise ?\n(si c'est ce que vous vouliez dire), je dois ajouter un espace, donc je ne gagne rien. Et supprimer les .nil?s n'a pas fonctionné du tout (toujours évalué à true).
Martin Ender
Je voulais dire littéralement ajouter une nouvelle ligne entre les deux guillemets. Et je pense que vous avez besoin de parens supplémentaires lors de la suppression .nil?, mais cela en vaut la peine en caractères.
Poignée de porte
@Doorknob ah, non !x.nil?est !!x. :)
Martin Ender
2

Python, 329 309 295 286 280 277 caractères

Golfé un peu plus maintenant. Peut encore être amélioré, mais je ne sais pas si je peux battre les solutions rubis ou golfscript avec cette approche.

R=range
N='J'+raw_input()+' '
X=N[1]>'G'
a,b,c=N[X:3+X]
z=266-ord(a)/2*7+(ord(b)-4)%7
Z=[list((' '*5,(' ---','-'*5)[8<r<18])[r%2])for r in R(21)]
Z[z][2]='o'
if' '<c:Z[z][1]=c
Q=(z<13)*2
for i in(1,2,3):Z[z+i*Q-i][Q+1]='|'
for r in R(max(17,z),min(z-1,8),-1):print''.join(Z[r])

Au départ, j'imprimais ligne par ligne, mais il s'est avéré que cela prenait trop de temps, donc je génère une grille de chaînes, puis je remplis ce qui doit être rempli. L'entrée provient de la ligne de commande, par exemple:

>echo HG# | python note2_golf.py
 #o
-|---
 |
-|---

-----

-----

-----
Claudiu
la source
À la ligne 5, vous pouvez supprimer l'espace avant la deuxième virgule
user12205
@ace: Merci, j'ai raté celui-là
Claudiu
2

GolfScript - 243 232 228 227 caractères

J'ai traduit ma réponse CoffeeScript en GolfScript, qui est beaucoup plus adapté aux manipulations de cordes.

EDIT: enregistré six caractères en utilisant correctement l'opérateur d'incrémentation, trois en faisant bon usage de la pile, six autres en redéfinissant de manière irresponsable les opérateurs que je n'utilise pas, et un de plus en n'imprimant pas l'espace de fin après les lignes de grâce.

Entièrement golfé:

..0="HL"?2+3%:o)2%.@="CDEFGAB"?7o*+:`2%45 32if:r;
).2$,<{=}{;;r}if:&;
[" "5*:|" ---":g]4*[|"-"5*]5*+[|g|]+.
[`<~]\[`>([0=:^&79r^]''+\~]
+17`<`)18if<9`>`9if:j>:t 13`>.2*):x;
4,1>{`j-\2${+}{-}if}%\;
{.@<\t>(:v[x<'|'+x)v>+]\++:t}
/-1%n*

Avec commentaires:

# extract octave
..0="HL"?2+3%:o

# extract note
2%1\-.@="CDEFGAB"?7o*+:k

# line spacer
2%45 32if:r;

# extract accidental
1+.2$,<{=}{;;r}if:a;

# staff
[" "5*:|" --- ":g]4*[|"-"5*]5*+[|g|]+.

# lines below
[k<~]\

# note line and above
[k>([0=:w a 79r w]''+\~]+

# cut off just what we need
17k<1k+18if<
9k>k 9if:j>:t;

# and the note stem
13k>.2*1+:x;4,1>{k j-\2${+}{-}if}%\;

{
  .t<\
  t>(:v[x<'|'+1x+v>+]\++:t;
}/

# now output the note
t-1%n*
couchand
la source
J'aurais été étonné de pouvoir battre une solution GolfScript dans un langage dans lequel je n'ai aucune expérience;)
Martin Ender
1
Je ne suis pas un expert de GolfScript, mais je pense que je suis sorti de presque tous les personnages que je vais en retirer, donc si vous pouvez en trouver deux autres, vous êtes en or!
couchand
Essayez de le saisir Go. il sortira oo|||:)
Jamie
1

Python, 250 245 242 235 caractères

Une approche très différente qui a fini par battre mon autre! Le code de traitement d'entrée est similaire mais c'est à peu près tout.

M=' -'
N=raw_input()+M
a,b,c=('J'+N)[N>'G':][:3]
z=ord(a)*7/2-246-(ord(b)+3)%7
for r in range(21):
 L=M[r%2];F=M[2<r<12and r%2]
 if min(3,z)<=r<=max(11,z):print F+((L,'|')[8>z<r<z+4],(L,c)[M<c])[r==z]+(L,'o')[r==z]+(L,'|')[z-4<r<z>7]+F

J'ai tracé la valeur de chaque caractère en fonction de la ligne et de la colonne, puis j'ai joué à l'impression:

#given row r, with note on row n, how to print each char?
#rows are:
#       HB : 0
#  ---  HA : 1
#       HG : 2
# ----- HF : 3
#       HE : 4
# ----- HD : 5
#       HC : 6
# ----- B  : 7
#       A  : 8
# ----- G  : 9
#       F  : 10
# ----- E  : 11
#       D  : 12
#  ---  C  : 13
#       LB : 14
#  ---  LA : 15
#       LG : 16
#  ---  LF : 17
#       LE : 18
#  ---  LD : 19
#       LC : 20
#chars are:
# 0 | 1 | 2 | 3 | 4
#
# 0,4:
#    if r%2:
#      if 2<r<12: '-'
#      else ' '
#    else: ' '
# 1: ' -b#|'
#    if r==n:
#      if A: c
#      else: ' -'[r%2]
#    elif n<8 and n<r<n+4: '|'
#    else: ' -'[r%2]
# 2: ' -o'
#    if r==n: 'o'
#    else: ' -'[r%2]
# 3: ' -|'
#    if n>7 and n-4<r<n: '|'
#    else: ' -'[r%2]
Claudiu
la source
+1, la dernière ligne semble plus la magie noire de Perl que des trucs
pythoniques
1

Java - 921 907 863 caractères

Je crée chaque chaîne séparément, en stockant chaque chaîne dans un tableau. Parcourez ensuite le tableau et imprimez chaque ligne.

public class D{public static void main(String[]a){char[]z=a[0].toCharArray();char[]y=new char[3];y[0]=('H'==z[0]||'L'==z[0])?z[0]:'N';int o=(y[0]=='N')?0:1;y[1]=z[o++];y[2]=z.length>o?z[o]:'!';int n=y[1]<'C'?((int)(y[1]-'A'))+6:((int)(y[1]-'C'))+1;n=(y[0]=='N')?n+7:(y[0]=='H'?n+14:n);String s="     ";String b=" --- ";String[]u=new String[22];for(int i=1;i<=21;i+=2){u[i]=s;}for(int i=10;i<=18;i+=2){u[i]="-----";}u[20]=n>19?b:s;u[2]=n<3?b:s;u[4]=n<5?b:s;u[6]=n<7?b:s;u[8]=n<9?b:s;char c=u[n].charAt(0);char e=u[n].charAt(1);char[]h=new char[]{c,y[2]=='!'?e:y[2],'O',e,c};u[n]=new String(h);for(int i=0;i<22;i++){if(n<14&&i-n<4&&i>n)u[i]=u[i]!=null?u[i].substring(0,3)+"|"+u[i].charAt(4):s;else if(n>13&&n-i<4&&n>i)u[i]=u[i]!=null?u[i].substring(0,3)+"|"+u[i].charAt(4):s;}for(int i=21;i>=0;i--)if(!(i>n&&i>18||i<n&&i<10))System.u.println((u[i]==null)?s:u[i]);}}

Oh s'il te plait ne me déteste pas, c'est ma première fois. Je ne pourrais trouver aucune FAQ / introduction donc j'espère que mon format de publication est correct. Je ne sais pas à quel point les gens sont sérieux au sujet du nombre de caractères ... version normale du code - en plus, le saut de ligne / espaces (1313 caractères):

public class DisplayNote
{
  public static void main(String[] args)
  {
    char[] z=args[0].toCharArray();
    char[] y=new char[3];
    y[0]=('H'==z[0]||'L'==z[0])?z[0]:'N';
    int o=(y[0]=='N')?0:1;
    y[1]=z[o++];
    y[2]=z.length>o?z[o]:'!';

    int noteValue=y[1]<'C'?((int) (y[1] - 'A')) + 6:((int) (y[1] - 'C')) + 1;
    noteValue=(y[0]=='N')?noteValue+7:(y[0]=='H'?noteValue+14:noteValue);
    String s="     ";
    String b=" --- ";
    String[] out=new String[22];
    for (int i=1;i<=21;i+=2){out[i]=s;}
    for (int i=10;i<=18;i+=2){out[i]="-----";}
    out[20]=noteValue>19?b:s;
    out[2]=noteValue<3?b:s;
    out[4]=noteValue<5?b:s;
    out[6]=noteValue<7?b:s;
    out[8]=noteValue<9?b:s;

    char c=out[noteValue].charAt(0);
    char e=out[noteValue].charAt(1);
    char[] h=new char[]{c,y[2]=='!'?e:y[2],'O',e,c};
    out[noteValue]=new String(h);
    for (int i=0;i<22;i++)
    {
      if (noteValue<14&&i-noteValue<4&&i>noteValue)
        out[i]=out[i]!=null?out[i].substring(0,3)+"|"+out[i].charAt(4):s;
      else if (noteValue>13&&noteValue-i<4&&noteValue>i)
        out[i]=out[i]!=null?out[i].substring(0,3)+"|"+out[i].charAt(4):s;        
    }

    for (int i=21;i>=0;i--)
      if (!(i>noteValue&&i>18||i<noteValue&&i<10))
        System.out.println((out[i]==null)?s:out[i]);
  }
}
Will_61
la source
Je vois des tonnes d'espaces blancs inutiles (en particulier après les points-virgules et autour des opérateurs et des parenthèses et des parenthèses) et de longs noms de variables (comme args).
Poignée de porte
Dans la soumission de comptage de caractères: 921 caractères, tous les espaces sont partis: P
Will_61
La deuxième soumission avec des espaces partout est de permettre aux gens de lire le code, comme je l'ai dit, c'est ma première fois, donc je ne sais pas si nous sommes censés laisser 1 soumission et 1 où vous essayez de réduire la limite de caractères ... ou quoi?
Will_61
Non; Je vois une énorme quantité d'espaces blancs inutiles dans cette version. Par exemple, les espaces après les points-virgules, les espaces autour des opérateurs, les espaces après [], les espaces autour des parenthèses, etc.
Bouton de porte
Je les ai tous supprimés maintenant (je pense) Merci :)
Will_61
1

Haskell 377C

import Data.Char
(<.)=elem
n(c:r)|elem c"HL"=let(s,a)=n r in(s+case c of 'H'->7;_-> -7,a)|1<2=(mod(ord c-67)7-2,case r of[]->' ';[x]->x)
r(s,a)y x=c where d|s>4= -1|1<2=1;c|x<.[0,4]&&(y<0||y>8)=' '|x==2&&y==s='o'|y==s&&x==1&&' '/=a=a|x==2+d&&y<.[s+k*d|k<-[1..3]]='|'|1<2="- "!!mod y 2
g p@(s,a)=unlines$[map(r p y)[0..4]|y<-reverse[min 0 s..max 8 s]]
main=getLine>>=putStr.g.n

Version non golfée:

import Data.Char

fromName ('H':s) = let (step, alter) = fromName s in ((step + 7), alter)
fromName ('L':s) = let (step, alter) = fromName s in ((step - 7), alter)
fromName (x:s) = (mod (ord x - 67) 7 - 2, if null s then ' ' else head s)

renderChar :: (Int, Char) -> Int -> Int -> Char
renderChar (step, alter) y x = let
    dir = if step >  4 then -1 else 1
    normal = "- "!!mod y 2
    stemYs = [step + k * dir | k <- [1..3]]
    c | elem x [0,4] && not(elem y [0,2,4,6,8]) = ' '
      | x == 2 && y == step = 'o'
      | y == step && x == 1 && alter /= ' ' = alter
      | elem y stemYs && x == 2 + dir = '|'
      | otherwise = normal
  in c

render :: (Int, Char)-> String
render (step, alter) = unlines [map (renderChar (step, alter) y) [0..4] | y <- ys] 
  where
    ys = reverse [min 0 step .. max 8 step]

main = getLine >>= (putStr.render.fromName)
Rayon
la source
0

CoffeeScript alphabétisé - 497527 caractères

Je suis sûr qu'il existe une meilleure façon de construire la grille, mais je ne peux pas le comprendre.

Un assistant de golf.

_=(q)->->q.split ""

Échelle principale et personnel de l'AC.

s=_("CDEFGAB")()
l=_ "-----"
e=_ "     "
g=_ " --- "
t=->
  o=[e(),l(),e(),l(),e(),l(),e(),l(),e(),l(),e(),g(),e()]
  o.unshift e(),g() for [0..3]
  o

Notre fonction de notation prendra la représentation sous forme de chaîne d'une note.

f=(i)->
  o=1
  m=t()

Nous allons d'abord déterminer l'octave.

  if /L|H/.test i[0]
    if i[0]=="L" then o=0 else o=2
    i=i[1..]

Puis la note et accidentelle. Je dois aimer la mission de déconstruire.

  [n,a]=i

Convertissons la note et l'octave en index et traçons la note.

  x=7*o+s.indexOf n

  m[x][1]=a if a
  m[x][2]='O'

Nous allons maintenant supprimer autant de personnel que nécessaire.

  j=9
  k=17
  if x>17
    k=x
  else if x<9
    j=x
  u=x-j
  m=m[j..k]

Et la tige de note.

  if x<13
    m[x][3]='|' for x in [u+3...u]
  else
    m[x][1]='|' for x in [u-3...u]

Maintenant, sortons les résultats.

  m.map((p)->p.join '').reverse().join '\n'

Enfin, nous allons exporter la fonction pour les tests de console. Ces personnages ne comptent pas dans le total.

module.exports = f
couchand
la source
En y regardant de plus près, il semble que j'ai foiré lors de la refactorisation de la tige de note, donc cela produit une sortie illégale pour le moment.
couchand
Je l'ai corrigé, mais il a ajouté 30 caractères: - /
couchand
0

C, 325 304

Maintenant 21 octets plus courts grâce à @ace !

i;j;c;n;main(t){char
x[133];for(i;i<132;i++){x[i]="-----\n     \n"[i%12];if((i<18||i>77)&&!((i%12)&11))x[i]=32;}for(;!n;){c=getchar();if(c>71)t=c^72?2:0;else
n=7*t+7-(c-4)%7;}x[i=n*6+2]=79;if((c=getchar())>32)x[i-1]=c;for(t=0,j=n<9?i+5:i-17;t<3;t++,j+=6)x[j]='|';x[n<13?77:n*6+5]=0;puts(x+(n>4?24:n*6));}

Production:

./a.out
HBb
 bO  
 |-- 
 |   
-|---

-----

-----

-----

-----


./a.out
LG#
-----

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  
ossifrage délicat
la source
Les variables globales sont initialisées à zéro par défaut, vous n'avez donc pas besoin d'initialiser net vous pouvez supprimer le i=0dans la première forboucle.
user12205
En outre, dans la première ifinstruction, ((i%12)&11)==0peut être remplacé par !((i%12)&11).
user12205
Enfin, ?:a une priorité très inférieure à ^et <, vous pouvez donc supprimer les crochets des conditions avant le ?. Et vous pouvez remplacer printf("%s",par puts(.
user12205
0

JavaScript 390 388

Un peu un défi, je dois l'admettre ... Je suis sûr qu'il existe des moyens de réduire cela davantage ... Je suis ouvert aux suggestions ...

Première itération

C=(a,x,o,c)=>{a[x]=a[x].substr(0,o)+c+a[x].substr(o+1)};l=7;s=[];for(i=21;i--;)s[i]="    ";for(j=1;19>j;j+=2)s[j]=" ---";for(k=3;12>k;k+=2)s[k]="-----";~(p="HL".indexOf((n=prompt())[i=0]))&&(l=14*p,i++);l+=(73-n.charCodeAt(i))%7;C(s,l,2,"O");m=n[n.length-1];"#"!=m&   "b"!=m||C(s,l,1,m);o=7<l?3:1;for(z=0;3>z;C(s,t=l-2*o+3+z++,o,"|"));S=s.splice(3<=l?3:l,11>=l?11:l);console.log(S.join("\n"))

Deuxième itération (en utilisant n.slice(-1)au lieu de n[n.length-1]), rase 2 octets

C=(a,x,o,c)=>{a[x]=a[x].substr(0,o)+c+a[x].substr(o+1)};l=7;s=[];for(i=21;i--;)s[i]="    ";for(j=1;19>j;j+=2)s[j]=" ---";for(k=3;12>k;k+=2)s[k]="-----";~(p="HL".indexOf((n=prompt())[i=0]))&&(l=14*p,i++);l+=(73-n.charCodeAt(i))%7;C(s,l,2,"O");m=n.slice(-1);"#"!=m& "b"!=m||C(s,l,1,m);o=7<l?3:1;for(z=0;3>z;C(s,t=l-2*o+3+z++,o,"|"));S=s.splice(3<=l?3:l,11>=l?11:l);console.log(S.join("\n"))

Version non golfée:

function C(a,x,o,c){
    a[x]=a[x].substr(0,o)+c+a[x].substr(o+1);
}
l=7;s=[];
for(i=21;i--;){
    s[i]="    ";
}
for(j=1;19>j;j+=2){
    s[j]=" ---";
}
for(k=3;12>k;k+=2){
    s[k]="-----";
}
i=0;n=prompt();
p="HL".indexOf(n[i]);
if(p>=0){
    l=14*p;i++;
}
l+=(73-n.charCodeAt(i))%7;
C(s,l,2,"O");
m=n.slice(-1);
if((m=="#")||m=="b"){
    C(s,l,1,m);
}
o=7<l?3:1;
for(z=0;3>z;z++){
    C(s,t=l-2*o+3+z,o,"|");
}
F=Math.min(3,l);
L=Math.max(11,l);
S=s.splice(F,L);
console.log(S.join("\n"));
WallyWest
la source
Pourriez-vous ajouter une version non lue (lisible), s'il vous plaît?
Martin Ender
@ m.buettner Terminé ... J'espère que cela vous aidera à mieux comprendre ce que j'ai fait :)
WallyWest