Фортепианная клавиатура ASCII


24

Клавиши пианино имеют 3 символа в ширину и 7 символов в высоту. Однако, если бы каждая клавиша была шириной 3 символа, для черных клавиш было бы недостаточно места. Вот почему некоторые из белых клавиш имеют вырезанные части. Есть 3 типа белых клавиш.

Ключи с правой половиной отсутствуют (R):

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

Ключи с отсутствующей левой половиной (L):

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

И ключи с левой и правой половинками отсутствуют (M):

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

На настоящей клавиатуре шаблон выглядит так:

RMLRMML, RMLRMML, RMLRMML...

и повторяется в общей сложности 88 клавиш. Теперь вы не можете видеть это, когда клавиши отображаются по отдельности, но, когда вы нажимаете их вместе, вы можете видеть черные клавиши.

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

Твое задание

Если дано положительное целое число N , напечатайте это ASCII-искусство пианино с N белыми клавишами. Вы должны иметь возможность обрабатывать любое N от 1 до 52 включительно (поскольку настоящие пианино с 88 клавишами имеют 52 белых клавиши). Вот результат теста от 1 до 8, и после этого шаблон увеличивается аналогичным образом.

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

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

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

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

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

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

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

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

И последнее, но не менее важное, вот полный вывод из 52 ключей:

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

Стандартные лазейки запрещены, и выигрывает самый короткий ответ в байтах!


Что такое "стандартные лазейки"?
Wildcard


Разрешены ли конечные пробелы в любой / всех строках? Как насчет конечного перевода строки?
Сок

1
@AlexL. Поскольку настоящие 88-клавишные пианино имеют 55 белых клавиш .
DJMcMayhem

1
@BMac> _> Я не ... <_ <Понятия не имею, о чем ты. Я сказал 52, видите! Вы можете ясно видеть это в R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Uh, я имею в виду состояние должности прямо сейчас! Во всяком случае, к счастью, это, вероятно, не сломает никаких существующих ответов, так как большинство из них, вероятно, работают до 55+ в любом случае.
DJMcMayhem

Ответы:


4

Pyth, 68 65 63 байта

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

Попробуйте онлайн!

Тестирование.

В этой версии я просто заменил назначения (J и K) внутри, чтобы сохранить 2 байта. Поэтому читайте версию ниже.

Предыдущая 65-байтовая версия с пояснениями

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

Попробуйте онлайн!

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)

Черная магия

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

Я только что получил твою шутку. Стон ...
Нейл

11

JavaScript (ES6), 155 149 147 байт

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

Где \nпредставляет буквальный символ новой строки. Использует тот факт, что все строки после первого начинаются с |символа. Объяснение:

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>

Редактировать: Сохранено 2 байта, исправляя неправильное прочтение спецификации по высоте клавиш.


2
Вы, сэр, просто взорвали мой разум.
Робби Койн

О, это хорошо, вы можете добавить какое-нибудь прохождение?
nobe4

Вы должны добавить исполняемый фрагмент, если можете.
Балинт

1

Рубин, 119 байт

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

Неуправляемый в тестовой программе

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 байта

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

Количество белых клавиш для отображения должно присутствовать в стеке при запуске программы.

Изменить : мне удалось сбрить несколько байтов путем объединения вывода для строк 5/6 и 7. Предыдущая версия:

&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 байт

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

Как обычно, добавьте код <?php, вставьте его в файл PHP (назовем его keyboard.php) и запустите, используя:

$ php -d error_reporting=0 keyboard.php 55

Еще два байта могут быть сохранены в PHP7 путем сжатия инициализации $nи $sих первого использования:

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

Ungolfed кода, набор тестов и другие лакомства можно найти на GitHub .


1

Python 3 2, 191 185 180 182 171 145 144 133 132 байта

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

Для этого можно было бы поиграть в гольф, но я уже так много поиграл с кодом, что, возможно, не увижу, где находятся места для игры в гольф. Любые предложения по игре в гольф приветствуются.

Изменить: неправильно прочитать спецификации на высоту клавиш. Эта ошибка была исправлена.

Редактировать: Заимствовал 12 ключевых идей Нейла из его ответа Javascript, удалил некоторые скобки и переключился на Python 2, чтобы сохранить 11 байтов.

Редактировать: множество изменений, чтобы свести функцию к одному forциклу.

Редактировать: теперь программа вместо функции.

Изменить: Теперь, используя, print"\n|".join()как предложил Нил, чтобы сохранить 11 байтов. Превратил программу обратно в функцию сохранения байта.


Я думаю, вы могли бы сэкономить еще 10 байтов, используя мой "\n|".joinтрюк.
Нил

Ах, я забыл убрать пробел между printи "\n|"!
Нил

0

C # 1683 байт

Так что ... увидев ответ Нейла выше, это довольно смущает, но я все равно выложу его, потому что это заняло у меня некоторое время (благослови). Я использовал C # для создания моего. Внутри класса «Fncs» я создал массив типичного порядка ключей. Затем я создал функцию, которая может позволить пользователю получить соответствующий индекс для этого массива на основе заданного целого числа. Чтобы редактировать отдельные строки, я создал класс «PianoKeyboard», который содержит словарь, в котором хранятся несколько строк, представляющих отдельные строки. Наконец, я создал функцию «DrawKey», которая добавляет соответствующий текст к отдельным строкам, и функцию «GetKeys», которая возвращает общее значение строки.

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
Привет, добро пожаловать в PPCG! Как вы, возможно, заметили, проблемы с гольф-кодом заключаются в написании кратчайшего кода. Такие языки, как C #, Java и, в основном, любой ОО-язык, чаще всего являются плохим выбором. Тем не менее, это может быть хорошей практикой для написания короткого кода, поэтому я не пытаюсь отговорить вас от этого :) Что касается вашего ответа, это хороший способ решить эту проблему, если вы не будете хранить длину кода в разум! Удачи и удачи, пытаясь написать небольшой код C # :)
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub Спасибо, я на самом деле новичок в этом сайте (конечно). Вроде и новичок в программировании, но я приложу все усилия ^ _ ^
Робби Койн

Забавно видеть ответ 4KB между всеми ответами <200 байт. Мне лично также нравится писать код Java как можно короче для этих задач Codegolf, так как я никогда не использовал никакого языка Codegolf вообще. Конечно, Java и C # никогда не могут конкурировать с другими ответами, но интересно попробовать сделать код максимально коротким. Вот пост, который может вас заинтересовать: Советы по игре в код на C # . PS: я скопировал ваш код в файл, чтобы увидеть точное количество байтов: 4,052 . ;) В любом случае, добро пожаловать в PPCG!
Кевин Круйссен

2
Добро пожаловать в PPCG, но этот ответ должен быть в полной мере. Я вижу пробелы и комментарии, которые можно удалить.
Rɪᴋᴇʀ

1
1 .: Переименуйте свои переменные, чтобы они были длиной в 1 символ 2: Всегда добавляйте правильное количество байтов, оно должно быть точным
Bálint
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.