Tastiera di pianoforte ASCII


24

I tasti del piano sono larghi 3 caratteri e alti 7 caratteri. Tuttavia, se ogni chiave fosse larga 3 caratteri, non ci sarebbe abbastanza spazio per le chiavi nere. Ecco perché alcuni dei tasti bianchi hanno parti di essi ritagliate. Esistono 3 tipi di tasti bianchi.

Tasti con la metà destra mancante (R):

____
|  |
|  |
|  |
|  |
|   |
|   |
|___|

Tasti con la metà sinistra mancante (L):

 ____
 |  |
 |  |
 |  |
 |  |
|   |
|   |
|___|

E i tasti con le metà sinistra e destra mancanti (M):

 ___
 | | 
 | | 
 | | 
 | | 
|   |
|   |
|___|

Su una tastiera reale, il modello di questi va così:

RMLRMML, RMLRMML, RMLRMML...

e si ripete per un totale di 88 tasti. Ora non puoi vederlo quando i tasti sono mostrati singolarmente, ma quando li spingi insieme, puoi vedere i tasti neri.

_________________________________________________________
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|

Il tuo compito

Dato un numero intero positivo N , stampa questa arte ASCII di un piano con N tasti bianchi. Dovresti essere in grado di gestire qualsiasi N da 1 a 52 inclusi (poiché i pianoforti a 88 tasti reali hanno 52 tasti bianchi). Ecco l'output di test da 1 a 8, e successivamente lo schema aumenta in modo simile.

1
____
|  |
|  |
|  |
|  |
|   |
|   |
|___|

2
________
|  | | |
|  | | |
|  | | |
|  | | |
|   |   |
|   |   |
|___|___|

3
_____________
|  | | | |  |
|  | | | |  |
|  | | | |  |
|  | | | |  |
|   |   |   |
|   |   |   |
|___|___|___|

4
________________
|  | | | |  |  | 
|  | | | |  |  | 
|  | | | |  |  | 
|  | | | |  |  | 
|   |   |   |   |
|   |   |   |   |
|___|___|___|___|

5
____________________
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|   |   |   |   |   |
|   |   |   |   |   |
|___|___|___|___|___|

6
________________________
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|___|___|___|___|___|___|

7
_____________________________
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|

8
________________________________ 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|

E, ultimo ma non meno importante, ecco un output completo di 52 tasti:

_________________________________________________________________________________________________________________________________________________________________________________________________________________
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|

Le scappatoie standard sono vietate e vince la risposta più breve in byte!


Cosa sono le "scappatoie standard"?
Wildcard


Sono consentiti spazi finali su qualsiasi / tutte le linee? Che ne dici di una nuova riga finale?
Ho suonato

1
@AlexL. Poiché i veri pianoforti a 88 tasti hanno 55 tasti bianchi .
DJMcMayhem

1
@BMac> _> Non ... <_ <Non ho idea di cosa tu stia parlando. Ho detto 52, vedi! Puoi vederlo chiaramente nel R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Uh, intendo lo stato del post in questo momento! Comunque, per fortuna che probabilmente non infrangerà alcuna risposta esistente, dal momento che la maggior parte di loro probabilmente funziona a 55+.
DJMcMayhem

Risposte:


4

Pyth, 68 65 63 byte

*lJ:+\|s@Lj;*L" |"_j4536 7*4Q" $"k\_jb+*4]J*2]K+\|*Q"   |":Kd\_

Provalo online!

Suite di test.

In questa versione, ho appena sostituito i compiti (J e K) all'interno per salvare 2 byte. Pertanto, leggi la versione seguente.

Versione precedente a 65 byte con spiegazione

J:+\|s@Lj;*L" |"_j4536 7*4Q" $"kK+\|*Q"   |"*lJ\_jb+*4]J*2]K:Kd\_

Provalo online!

J:+\|s@Lj;*L" |"_j4536 7*4Q" $"k    This part generates the most irregular line.

        j;*L" |"_j4536 7            Generate the whole line by black magic
      @L                *4Q         Get the first (4*input) characters of it, with wrapping.
  +\|                               Add "|" in front of it (we took away the first "|")
 :                         " $"k    Replace the ending space by nothing
J                                   Store the line to J.


K+\|*Q"   |"      This part generates the line just below the irregular line.
    *Q"   |"      Repeat "   |" input times
 +\|              Prepend "|"
K                 Store to K


*lJ\_     Now we can actually start printing

*  \_     Repeat "_" ...
 lJ                      [the length of J] times
          (and implicitly print it out)


jb+*4]J*2]K

   *4]J             Repeat J 4 times
       *2]K         Repeat K 2 times
  +                 Concatenate them together
jb                  Join with newlines
                    (and implicitly print it out)

:Kd\_

:K      Replace in K
  d                  " "
   \_                    by "_"
        (and implicitly print it out)

Magia nera

We find the irregular line from input=7, and cut out the first "|":
"  | | | |  |  | | | | | |  |"
 2  1 1 1 2  2  1 1 1 1 1 2

j;*L" |"_j4536 7    Black magic.

         j4536 7    4536 converted to base 7: [1,6,1,4,0]
        _           Reverse: [0,4,1,6,1]
  *L" |"            Repeat " |" <each element> times:
                    [""," | | | |"," |"," | | | | | |"," |"]
j;                  Join by whitespace:
                    "  | | | |  |  | | | | | |  |"

Ho appena preso la tua battuta. Gemiti ...
Neil,

11

JavaScript (ES6), 155 149 147 byte

n=>[`_`[r=`repeat`](n*4+(9>>n%7&1)),s=[...Array(n*12/7|0)].map((_,i)=>1998>>i%12&1?` |`:`  |`).join``,s,s,s,s=`   |`[r](n),s,`___|`[r](n)].join`\n|`

Dove \nrappresenta il carattere letterale di newline. Sfrutta il fatto che tutte le linee dopo il primo iniziano con un |personaggio. Spiegazione:

f=
n=>[                        // Start by building up a list of rows
 `_`[r=`repeat`](n*4+       // 4 underscores per key
  (9>>n%7&1)),              // Third and seventh keys have one extra
 s=[...Array(n*12/7|0)]     // Calculate total of white and black keys
  .map((_,i)=>              // Process each key in turn
   1998>>i%12&1?` |`:`  |`  // Bitmap of narrow and wide keys
  ).join``,                 // Join the keys together
 s,s,s,                     // Repeated 4 times in total
 s=`   |`[r](n),            // Full width part of the white keys
 s,                         // Repeated twice in total
 `___|`[r](n)               // Base of the white keys
].join`\n|`                 // Join the rows together
<input type="number" oninput="o.textContent=f(this.value);"><pre id=o>

Modifica: salvato 2 byte correggendo la lettura errata delle specifiche sull'altezza dei tasti.


2
Lei, signore, mi ha fatto impazzire.
Robbie Coyne,

Oh va bene, puoi aggiungere una sorta di procedura dettagliata?
nobe4,

Se possibile, aggiungi uno snippet eseguibile.
Bálint,

1

Rubino, 119 byte

->n{puts ?_*(1+n*4+(0<=>-n%7%4)),(0..6).map{|i|("01"+("%b"%[0xAADAAAD,13][i/4]*99)).tr('10',' |_|'[i/6*2,2])[0,1+n*4]}}

Non registrato nel programma di test

f=->n{
  puts ?_*(1+n*4+(0<=>-n%7%4)),           #Draw 1+n*4 _'s for top row (one less if -n%7%4>0, black note), then...
  (0..6).map{|i|                          #Cycle through remaining 7 rows
    ("01"+("%b"%[0xAADAAAD,13][i/4]*99)).   #Generate string version of binary number corresponding to pattern, repeat 99 times.
    tr('10',' |_|'[i/6*2,2]                 #Binary 1-> space or underscore. Binary 0 -> | (These choices ensured no leading 0)
    )[0,1+n*4]                              #truncate to the right amount of keys.
  }
}


10.times{|j|f[j]}

1

> <>, 188 182 byte

&0"_"o011.
.\:7%8g95*-"_"o1-:a1@@?.~~~1+:&:&=1+1$
.v~:7=?;ao"|"o1+:0$0$
.>:7%8g"0"-4*:9go1+:9go1+:9go1+9go1+:&:&=3$-1$
 ^
.>"| _"{:}7=?$~::oooo1+:&:&(3*2+1$
>^
^
0120112
  | | | |  |

Il numero di tasti bianchi da visualizzare dovrebbe essere presente nello stack all'avvio del programma.

Modifica : sono riuscito a radere alcuni byte combinando l'output per le righe 5/6 e 7. Versione precedente:

&0"_"o011.
.\:7%8g95*-"_"o1-:a1@@?.~~~1+:&:&=1+1$
.v~ao"|"o1+:0$0$.
.>:7%8g"0"-4*:9go1+:9go1+:9go1+9go1+:&:&=3$-1$
 ^
.>"|   "oooo1+:&:&(3*2+1$
 ^
 "|___"oooo1+:&:&=?;
0120112
  | | | |  |

1

PHP, 238 byte

$n=$argv[1];$s=str_repeat;echo'_'.$s($a=$s('_',28),$m=($n-$r=$n%7)/7).substr($a,0,$k=4*$r-($r&&$r!=3))."\n",$g='|'.$s($b='  | | | |  |  | | | | | |  |',$m).substr($b,0,$k)."\n",$g,$g,$g,$h='|'.$s('   |',$n)."\n",$h,'|'.$s('___|',$n)."\n";

Come al solito, anteponi il codice con <?php, mettilo in un file PHP (chiamiamolo keyboard.php) ed eseguilo usando:

$ php -d error_reporting=0 keyboard.php 55

Altri due byte possono essere salvati su PHP7 comprimendo l'inizializzazione di $ne $snel loro primo utilizzo:

echo'_'.($s=str_repeat)($a=$s('_',28),$m=($n-$r=($n=$argv[1])%7)/7).substr($a,0,$k=4*$r-($r&&$r!=3))."\n",$g='|'.$s($b='  | | | |  |  | | | | | |  |',$m).substr($b,0,$k)."\n",$g,$g,$g,$h='|'.$s('   |',$n)."\n",$h,'|'.$s('___|',$n)."\n";

Il codice ungolf, una suite di test e altri gadget sono disponibili su github .


1

Python 3 2, 191 185 180 182 171 145 144 133 132 byte

def k(n):print"\n|".join(["_"*(4*n+(9>>n%7&1))]+[''.join("   ||"[1998>>j%12&1::2]for j in range(n*12/7))]*4+["   |"*n]*2+["___|"*n])

Questo potrebbe usare un po 'di golf, ma ho già armeggiato con il codice così tanto che potrei non vedere dove si trovano i punti golfabili. Tutti i suggerimenti per il golf sono i benvenuti.

Modifica: lettura errata delle specifiche sull'altezza dei tasti. Questo errore è stato corretto.

Modifica: preso in prestito le 12 idee chiave di Neil dalla sua risposta Javascript, rimosso alcune parentesi e passato a Python 2 per salvare 11 byte.

Modifica: molte modifiche per portare la funzione in un forciclo.

Modifica: ora un programma anziché una funzione.

Modifica: ora usando print"\n|".join()come suggerito da Neil per salvare 11 byte. Trasformato il programma in una funzione per salvare un byte.


Penso che potresti risparmiare altri 10 byte usando il mio "\n|".jointrucco.
Neil

Ah, mi ero dimenticato di rimuovere lo spazio tra printe "\n|"!
Neil,

0

C # 1683 byte

Quindi .... dopo aver visto la risposta di Neil sopra questo è abbastanza imbarazzante, ma lo pubblicherò comunque perché mi ci è voluto un po '(benedici). Ho usato C # per creare il mio. All'interno della classe "Fncs" ho creato un array dell'ordine tipico delle chiavi. Quindi, ho creato una funzione che può consentire all'utente di ottenere un indice appropriato per questo array basato su un dato intero. Per modificare singole righe, ho creato una classe "PianoKeyboard" che contiene un dizionario che memorizza più stringhe che rappresentano le singole righe. Infine, ho creato la funzione "DrawKey" che aggiunge il testo appropriato alle singole righe e la funzione "GetKeys" che restituisce il valore complessivo della stringa.

namespace ASCIIPiano{public enum WhiteKeyType{Left,Middle,Right}public static class Fncs{public static WhiteKeyType[] Order{get{return new WhiteKeyType[]{WhiteKeyType.Left,WhiteKeyType.Middle,WhiteKeyType.Right,WhiteKeyType.Left,WhiteKeyType.Middle,WhiteKeyType.Middle,WhiteKeyType.Right};}}public static PianoKeyboard DrawKey(this PianoKeyboard keyboard, WhiteKeyType type){keyboard.Append(1,"_____");if (type == WhiteKeyType.Left){keyboard.Append( 2,"|  | ");keyboard.Append( 3,"|  | ");keyboard.Append( 4,"|  | ");keyboard.Append( 5, "|  | ");}else if (type == WhiteKeyType.Middle){keyboard.Append(2, " | | ");keyboard.Append(3," | | ");keyboard.Append( 4," | | ");keyboard.Append(5," | | ");}else{keyboard.Append( 2," |  |");keyboard.Append(3, " |  |");keyboard.Append(4," |  |");keyboard.Append(5, " |  |");}keyboard.Append(6,"|   |");keyboard.Append(7,"|   |");keyboard.Append(8,"|___|");return keyboard;}public static int GetWhiteKeyIndex(this int number){return number % 7;}public static string GetKeys(this int quantityofwhitekeys){PianoKeyboard keyboard = new PianoKeyboard();for (int i = 0; i < quantityofwhitekeys; i++){WhiteKeyType key=Fncs.Order[i.GetWhiteKeyIndex()];keyboard.DrawKey(key);}return keyboard.TOTALSTRING;}}public class PianoKeyboard{public PianoKeyboard(){}private Dictionary<int, string> lines = new Dictionary<int, string>();public void Append(int index,string value){if (index > 8 || index < 1){throw new Exception("URGH!");}else{if (lines.Keys.Contains(index)){lines[index] += value;}else{lines.Add(index, value);}}}public string TOTALSTRING{get{string returner = "";foreach (int key in lines.Keys){returner += lines[key] + "\n";}return returner;}}}}

1
Ciao, benvenuto in PPCG! Come avrai notato, le sfide del code-golf riguardano la scrittura del codice più breve possibile. Lingue come C #, Java e praticamente qualsiasi linguaggio OO sono quindi spesso una cattiva scelta. Tuttavia, può essere una buona pratica scrivere codice breve quindi non sto cercando di scoraggiarti dal farlo :) Per quanto riguarda la tua risposta, è un bel modo di risolvere questo problema se non dovessi mantenere la lunghezza del codice mente! Buon divertimento e buona fortuna cercando di scrivere un piccolo codice C # :)
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub Grazie, in realtà sono nuovo di questo sito (ovviamente). Un po 'nuovo di programmazione, ma farò del mio meglio ^ _ ^
Robbie Coyne,

Divertente vedere una risposta 4KB tra tutte le risposte <200 byte. Personalmente mi piace anche scrivere il codice Java il più breve possibile per queste sfide di Codegolf, dal momento che non ho mai usato alcun linguaggio codegolf. Ovviamente Java e C # non possono mai competere con altre risposte, ma è divertente provare a creare codice il più breve possibile. Ecco un post che potresti trovare interessante: Suggerimenti per giocare a golf in C # . PS: ho copiato il tuo codice in un file per vedere l'esatta quantità di byte, ovvero 4.052 . ;) Comunque, benvenuto in PPCG!
Kevin Cruijssen,

2
Benvenuto in PPCG, ma questa risposta deve essere completamente giocata a golf. Vedo spazi bianchi e commenti che possono essere rimossi.
R

1
1 .: Rinomina le tue variabili, in modo che siano lunghe 1 carattere 2 .: Aggiungi sempre un conteggio di byte corretto, deve essere preciso al byte
Bálint,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.