Клавіатура фортепіано 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:
                    "  | | | |  |  | | | | | |  |"

Я тільки що отримав твій жарт. Groan ...
Ніл

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

Ungolfed в тестовій програмі

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

Невідомі коди, тестовий набір та інші смаколики можна знайти на Github .


1

Пітон 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])

Це могло б використовувати трохи гольфу, але я вже так сильно зіткнувся з кодом, що, можливо, я не бачу, де знаходяться плями для гольфу. Будь-які пропозиції щодо гольфу вітаються.

Редагувати: неправильно прочитати специфікацію висоти клавіш. Цю помилку виправлено.

Редагувати: з його відповіді на Javascript я запозичив 12 ключових ідей Ніла , видалив круглі дужки та перейшов на 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 та в основному будь-яка мова OO, є найчастіше поганим вибором. Однак, це може бути чудовою практикою писати короткий код, тому я не намагаюся вас відштовхувати від цього :) Що стосується вашої відповіді, це непоганий спосіб вирішити цю проблему, якщо ви не дотримаєтеся довжини коду в розум! Весело та удачі, намагаючись написати невеликий C # код :)
Bassdrop Cumberwubwwwwub

@BassdropCumberwubwubwub Спасибі, я фактично новачок на цьому сайті (звичайно). Якимось новим для програмування теж, але я зроблю все можливе ^ _ ^
Роббі Койн

Смішно бачити відповідь у 4 КБ між усіма <200 байтними відповідями. Я особисто також люблю писати Java-код якомога коротше для цих проблем Codegolf, оскільки я ніколи не використовував жодної мови кодогольфа. Звичайно, Java та C # ніколи не можуть конкурувати з іншими відповідями, але приємно намагатися створити код якомога коротше. Ось публікація, яка вам може бути цікавою: Поради щодо кодового гольфу в C # . PS: Я скопіював ваш код у файл, щоб побачити точну кількість байтів, яка становить: 4 052 . ;) У будь-якому випадку, ласкаво просимо до PPCG!
Kevin Cruijssen

2
Ласкаво просимо до PPCG, але цю відповідь потрібно повністю розіграти. Я бачу пробіли та коментарі, які можна видалити.
Rɪᴋᴇʀ

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