এএসসিআইআই পিয়ানো কীবোর্ড


24

পিয়ানো কীগুলি 3 টি অক্ষর প্রশস্ত এবং 7 টি অক্ষর লম্বা। যাইহোক, যদি প্রতিটি কী 3 টি বৈশিষ্ট্য প্রশস্ত থাকে তবে কালো কীগুলির জন্য পর্যাপ্ত জায়গা থাকত না। এজন্য কিছু কিছু সাদা কীতে তাদের কিছু অংশ কেটে দেওয়া হয়েছে। 3 ধরণের সাদা কী রয়েছে।

ডান অর্ধে অনুপস্থিত কীগুলি (আর):

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

বাম অর্ধেক অনুপস্থিত কী (এল):

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

এবং বাম এবং ডান অংশের কীগুলি (এম) হারিয়েছে:

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

একটি বাস্তব কীবোর্ডে, এর ধরণগুলি এরকম হয়:

RMLRMML, RMLRMML, RMLRMML...

এবং মোট 88 কীগুলির জন্য পুনরাবৃত্তি করে। কীগুলি স্বতন্ত্রভাবে প্রদর্শিত হবে তা এখন আপনি দেখতে পাচ্ছেন না, তবে আপনি যখন সেগুলি একসাথে নিক্ষেপ করেন তখন আপনি কালো কীগুলি দেখতে পাবেন।

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

তোমার কাজ

ধনাত্মক পূর্ণসংখ্যার এন দেওয়া হয়েছে , এন হোয়াইট কীগুলির সাহায্যে পিয়ানো এই ASCII-art প্রিন্ট করুন । আপনার 1 থেকে 52 সমেত যে কোনও এন পরিচালনা করতে সক্ষম হবেন (যেহেতু আসল 88-কী পিয়ানোতে 52 টি সাদা কী রয়েছে)। এখানে 1 থেকে 8 পর্যন্ত পরীক্ষার আউটপুট রয়েছে এবং এর পরে একই ধরণে প্যাটার্নটি বৃদ্ধি পায়।

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

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

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

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

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

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

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

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

এবং সর্বশেষে তবে সর্বনিম্ন নয়, এখানে একটি সম্পূর্ণ 52 কী আউটপুট রয়েছে:

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

স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ করা হয়েছে, এবং বাইটের মধ্যে সংক্ষিপ্ত উত্তরটি জিতেছে!


"স্ট্যান্ডার্ড লুফোলস" কী?
ওয়াইল্ডকার্ড


কোনও / সমস্ত লাইনে ফাঁকা স্থান অনুমোদনযোগ্য? ট্রেলিং নিউলাইন কেমন?
Sok

1
@AlexL। যেহেতু আসল 88-কী পিয়ানোতে 55 টি সাদা কী রয়েছে
ডিজেএমসিএমহেম

1
@ বিম্যাক> _> আমি ... <_ <আপনি কী বলছেন তা আমার কোনও ধারণা নেই। আমি বললাম 52, দেখুন! আপনি এটিকে পরিষ্কারভাবে দেখতে পাবেন রাইভিসিয়াসিজিওইনো হায়সি̶সেটটিওরিসায় উহ, আমি এখনই পোস্টটির অবস্থা বোঝাতে চাইছি! যাইহোক, ধন্যবাদ, সম্ভবত এটি কোনও বিদ্যমান উত্তরগুলি ভাঙবে না, যেহেতু তাদের বেশিরভাগই সম্ভবত 55++ তে কাজ করে।
ডিজেএমসিএমহেম

উত্তর:


4

পাইথ, 68 65 63 বাইট

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

এটি অনলাইন চেষ্টা করুন!

পরীক্ষা স্যুট.

এই সংস্করণে, আমি কেবল 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

জাভাস্ক্রিপ্ট (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আক্ষরিক নিউলাইন চরিত্রের প্রতিনিধিত্ব করে। একটি |অক্ষর দিয়ে প্রথম শুরু করার পরে সমস্ত লাইন যুক্ত করে তোলে Le ব্যাখ্যা:

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 লাইনগুলির জন্য আউটপুট একত্রিত করার মাধ্যমে কয়েকটি বাইটগুলি শেভ করতে পেরেছি Previous পূর্ববর্তী সংস্করণ:

&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

পিএইচপি, 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, এটি একটি পিএইচপি ফাইলে রাখুন (এর নাম দিন keyboard.php) এবং এটি ব্যবহার করে চালান:

$ php -d error_reporting=0 keyboard.php 55

আর পিএইচপি 7 এ আরও প্রথম দুটি ব্যবহার শুরু করা যেতে পারে $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

পাইথন 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 চাবি ধারণা তার জাভাস্ক্রিপ্ট উত্তর থেকে, কিছু প্রথম বন্ধনী মুছে, এবং 11 বাইট সংরক্ষণ করতে পাইথন 2 সুইচ।

সম্পাদনা করুন: এক forলুপটিতে ফাংশনটি পেতে অনেকগুলি পরিবর্তন ।

সম্পাদনা: এখন একটি ফাংশন পরিবর্তে একটি প্রোগ্রাম।

সম্পাদনা: এখন print"\n|".join()11 বাইট সংরক্ষণের জন্য নীলের পরামর্শ অনুযায়ী ব্যবহার করা হচ্ছে। বাইট সংরক্ষণের জন্য প্রোগ্রামটিকে কোনও ফাংশনে ফিরিয়েছে।


আমি মনে করি আপনি আমার "\n|".joinকৌশলটি ব্যবহার করে আরও 10 বাইট সঞ্চয় করতে পারবেন ।
নিল

আহা, আমি printএবং এর মধ্যবর্তী স্থানটি সরিয়ে দিতে ভুলে গেছি "\n|"!
নীল

0

সি # 1683 বাইট

তাই .... উপরে নীলের উত্তরটি দেখার পরে এটি বেশ বিব্রতকর, তবে আমি যাইহোক এটি পোস্ট করব 'কারণ এটি আমাকে কিছুটা সময় নিয়েছিল (আশীর্বাদ)। আমি খনি তৈরি করতে সি # ব্যবহার করেছি। "Fncs" শ্রেণীর ভিতরে আমি কীগুলির সাধারণ ক্রমের একটি অ্যারে তৈরি করেছি। তারপরে, আমি একটি ফাংশন তৈরি করেছি যা ব্যবহারকারীকে প্রদত্ত পূর্ণসংখ্যার ভিত্তিতে এই অ্যারেটির জন্য উপযুক্ত সূচক পেতে দেয় to স্বতন্ত্র রেখাগুলি সম্পাদনা করার জন্য, আমি একটি "পিয়ানোকিবোর্ড" শ্রেণি তৈরি করেছি যা একটি পৃথক রেখাকে উপস্থাপন করে একাধিক স্ট্রিং সংরক্ষণ করে এমন একটি অভিধান রয়েছে। অবশেষে, আমি "ড্রইকি" ফাংশন তৈরি করেছি যা পৃথক রেখাগুলিতে এবং "গেটকি" ফাংশনে উপযুক্ত পাঠ্য যুক্ত করে যা সামগ্রিক স্ট্রিংয়ের মান দেয়।

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
হাই, পিপিসিজিতে আপনাকে স্বাগতম! আপনি যেমন খেয়াল করে থাকতে পারেন, কোড-গল্ফ চ্যালেঞ্জগুলি সংক্ষিপ্ততম কোডটি লেখার বিষয়ে। সি #, জাভা এবং মূলত যে কোনও ওও ভাষার মতো ভাষা প্রায়শই খারাপ পছন্দ। তবে শর্ট কোড লেখার পক্ষে এটি দুর্দান্ত অনুশীলন হতে পারে তাই আমি আপনাকে এটি করা থেকে নিরুৎসাহিত করার চেষ্টা করছি না :) আপনার উত্তর হিসাবে, আপনি কোডের দৈর্ঘ্য না রাখলে এই সমস্যাটি সমাধান করার একটি দুর্দান্ত উপায় মন! মজা করুন, এবং শুভকামনা ছোট সি # কোড লেখার চেষ্টা করছেন :)
বাসপ্রডো কম্বারবুবউবউব

@ বাসড্রপকম্বারউবউবউব ধন্যবাদ, আমি এই সাইটে আসলেই নতুন (অবশ্যই)। কিন্ডা প্রোগ্রামিংয়েও নতুন তবে আমি আমার সেরাটা করব ^ _ ^
রবি কোয়েন

সমস্ত <200 বাইট উত্তরগুলির মধ্যে একটি 4KB উত্তর দেখতে মজাদার। আমি ব্যক্তিগতভাবে এই কোডগোল্ফ চ্যালেঞ্জগুলির জন্য যতটা সম্ভব সংক্ষিপ্তভাবে জাভা কোড লিখতে চাই, যেহেতু আমি কোনও কোডগল্ফ ভাষা কখনই ব্যবহার করি নি। অবশ্যই জাভা এবং সি # কখনই অন্য উত্তরের সাথে প্রতিযোগিতা করতে পারে না, তবে যত তাড়াতাড়ি সংক্ষিপ্ত আকারে কোড তৈরি করে দেখতে মজাদার। এখানে একটি পোস্ট আপনাকে আকর্ষণীয় মনে হতে পারে: সি # তে কোড-গল্ফ করার টিপস । PS: বাইটের সঠিক পরিমাণ দেখতে আমি কোনও ফাইলটিতে আপনার কোড অনুলিপি করেছি, যা: 4,052 । ;) যাইহোক, পিপিসিজিতে আপনাকে স্বাগতম!
কেভিন ক্রুইজসেন

2
পিপিসিজিতে আপনাকে স্বাগতম, তবে এই উত্তরটি পুরোপুরি গল্ফ করা দরকার। আমি হোয়াইটস্পেস এবং মন্তব্যগুলি দেখতে পাচ্ছি যা সরিয়ে ফেলা যায়।
আর

1
1 .: আপনার ভেরিয়েবলগুলির নাম পরিবর্তন করুন, সুতরাং এটি 1 অক্ষর দীর্ঘ 2: সর্বদা একটি সঠিক বাইট গণনা যুক্ত করুন, এটি বাইট সুনির্দিষ্ট হতে হবে
বেলিন্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.