Teclado de piano ASCII

24

As teclas do piano têm 3 caracteres de largura e 7 caracteres de altura. No entanto, se cada tecla tivesse 3 caracteres de largura, não haveria espaço suficiente para as teclas pretas. É por isso que algumas das teclas brancas têm partes delas cortadas. Existem 3 tipos de teclas brancas.

Teclas com a metade direita faltando (R):

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

Teclas com a metade esquerda ausente (L):

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

E as teclas com as metades esquerda e direita ausentes (M):

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

Em um teclado real, o padrão é o seguinte:

RMLRMML, RMLRMML, RMLRMML...

e repete-se para um total de 88 teclas. Agora você não pode vê-lo quando as teclas são mostradas individualmente, mas quando você as junta, pode ver as teclas pretas.

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

Sua tarefa

Dado um número inteiro positivo N , imprima essa arte ASCII de um piano com N teclas brancas. Você deve ser capaz de lidar com qualquer N de 1 a 52, inclusive (já que os pianos de 88 teclas reais têm 52 teclas brancas). Aqui está a saída de teste de 1 a 8 e, depois disso, o padrão aumenta de maneira semelhante.

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

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

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

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

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

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

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

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

E por último mas não menos importante, aqui está uma saída completa de 52 teclas:

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

As brechas padrão são proibidas e a resposta mais curta em bytes vence!

DJMcMayhem
fonte
O que são "brechas padrão"?
Curinga
São permitidos espaços à direita em qualquer / todas as linhas? Que tal uma nova linha à direita?
Sok
11
@AlexL. Como os pianos de 88 teclas reais possuem 55 teclas brancas .
DJMcMayhem
11
@BMac> _> Eu não ... <_ <Eu não tenho idéia do que você está falando. Eu disse 52, veja! Você pode vê-lo claramente no R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Uh, quero dizer o estado da postagem agora! De qualquer forma, felizmente isso provavelmente não quebrará nenhuma resposta existente, pois a maioria delas provavelmente trabalha com mais de 55 anos.
DJMcMayhem

Respostas:

4

Pitão, 68 65 63 bytes

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

Experimente online!

Suíte de teste.

Nesta versão, substituí as atribuições (J e K) dentro para economizar 2 bytes. Portanto, leia a versão abaixo.

Versão anterior de 65 bytes com explicação

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

Experimente 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 negra

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:
                    "  | | | |  |  | | | | | |  |"
Freira Furada
fonte
Acabei de entender sua piada. Groan ...
Neil
11

JavaScript (ES6), 155 149 147 bytes

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|`

Onde \nrepresenta o caractere literal de nova linha. Aproveita o fato de que todas as linhas após a primeira começam com um |personagem. Explicação:

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>

Edit: Salvo 2 bytes, corrigindo minha leitura incorreta das especificações na altura das chaves.

Neil
fonte
2
Você, senhor, apenas me deixou louco.
Robbie Coyne
Oh, isso é bom, você pode adicionar algum tipo de explicação?
nobe4
Você deve adicionar um trecho executável, se puder.
Bálint
1

Ruby, 119 bytes

->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]}}

Ungolfed in program program

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]}
Level River St
fonte
1

> <>, 188 182 bytes

&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
  | | | |  |

O número de teclas brancas a serem exibidas deve estar presente na pilha no início do programa.

Edit : eu consegui raspar alguns bytes combinando a saída das linhas 5/6 e 7. Versão anterior:

&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
  | | | |  |
Sok
fonte
1

PHP, 238 bytes

$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";

Como de costume, acrescente o código <?php, coloque-o em um arquivo PHP (vamos chamá-lo keyboard.php) e execute-o usando:

$ php -d error_reporting=0 keyboard.php 55

Mais dois bytes podem ser salvos no PHP7 pressionando a inicialização $ne $so primeiro uso:

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";

O código não-protegido, uma suíte de testes e outros itens podem ser encontrados no github .

axiac
fonte
1

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

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])

Isso poderia ser um pouco de golfe, mas eu já brinquei tanto com o código que talvez não veja onde estão os pontos de golfe. Todas as sugestões de golfe são bem-vindas.

Edit: Leia mal as especificações na altura das teclas. Este bug foi corrigido.

Edit: A idéia-chave 12 de Neil emprestada de sua resposta Javascript, removeu alguns parênteses e mudou para Python 2 para salvar 11 bytes.

Editar: Muitas alterações para reduzir a função a um forloop.

Edit: Agora um programa em vez de uma função.

Edit: Agora usando print"\n|".join()como sugerido por Neil para salvar 11 bytes. Tornou o programa novamente em uma função para salvar um byte.

Sherlock9
fonte
Eu acho que você poderia salvar outros 10 bytes usando meu "\n|".jointruque.
Neil
Ah, eu tinha esquecido de remover o espaço entre printe "\n|"!
819 Neil
0

Bytes em C # 1683

Então .... depois de ver a resposta de Neil acima, isso é muito embaraçoso, mas eu vou postar mesmo assim porque demorei um pouco (abençoe). Eu usei o C # para criar o meu. Dentro da classe "Fncs", criei uma matriz da ordem típica de chaves. Em seguida, criei uma função que permite ao usuário obter um índice apropriado para essa matriz com base em um determinado número inteiro. Para editar linhas individuais, criei uma classe "PianoKeyboard" que contém um dicionário que armazena várias seqüências representando as linhas individuais. Por fim, criei a função "DrawKey", que anexa o texto apropriado às linhas individuais e a função "GetKeys", que retorna o valor geral da string.

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;}}}}
Robbie Coyne
fonte
11
Olá, seja bem-vindo ao PPCG! Como você deve ter notado, os desafios do código-golfe são sobre escrever o código mais curto possível. Idiomas como C #, Java e basicamente qualquer linguagem OO são, portanto, uma má escolha. No entanto, pode ser uma boa prática escrever código curto, para que não tente desencorajá-lo a fazê-lo :) Quanto à sua resposta, é uma boa maneira de resolver esse problema se você não mantiver o comprimento do código em mente! Divirta-se e boa sorte tentando escrever um código pequeno C # :)
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Obrigado, sou novo neste site (é claro). Meio novo na programação também, mas farei o meu melhor ^ _ ^ #
Robbie Coyne
Engraçado ver uma resposta de 4KB entre todas as respostas de <200 bytes. Pessoalmente, também gosto de escrever código Java o mais curto possível para esses desafios do Codegolf, pois nunca usei nenhuma linguagem de codegolf. É claro que Java e C # nunca podem competir com outras respostas, mas é divertido tentar criar o código o mais curto possível. Aqui está um post que você pode achar interessante: Dicas para jogar golfe em código em C # . PS: Copiei seu código em um arquivo para ver a quantidade exata de bytes, que é: 4.052 . ;) De qualquer forma, bem-vindo ao PPCG!
Kevin Cruijssen
2
Bem-vindo ao PPCG, mas esta resposta precisa ser totalmente aproveitada. Vejo espaços em branco e comentários que podem ser removidos.
Rɪᴋᴇʀ
11
1 .: renomear suas variáveis, por isso eles são um caráter de longo 2 .: Sempre adicionar uma contagem de bytes adequada, ele precisa tk ser byte precisa
Bálint