Angry Duck Quack


56

Hiç kimse, ifadenin neyi >:Utemsil etmesi gerektiği konusunda kesin bir şey bilmiyor, ancak birçok bilim adamı öfkeli bir ördek gibi göründüğüne inanıyor . Diyelim ki durum böyle.

Görev

Bir tamsayı Verilen n 0 ve 3 dahil, baskı ya da iade arasındaki

quack

eğer n = 0 ise,

>:U

eğer n = 1 ise,

     U   U
>  : U   U
 >   U   U
>  : U   U
      UUU

Eğer , n = 2, ya da

                  >:U         >:U
>:U               >:U         >:U
   >:U       >:U  >:U         >:U
      >:U         >:U         >:U
         >:U      >:U         >:U
      >:U         >:U         >:U
   >:U       >:U  >:U         >:U
>:U               >:U         >:U
                     >:U>:U>:U

eğer n = 3 ise.

Girişin her zaman geçerli olacağını varsayabilirsiniz. Çıktıda öncü boşluk olmamalıdır, ancak herhangi bir sondaki boşluk yeterli değildir. Ördekler (@kobaltduck istisnası dışında) boşluklara tolerans göstermez. Bayt cinsinden en kısa kod kazanır.


90
İlk önce "ha, ördek nedir?" Diye düşünüyordum. Neyse ki wikipedia sayfasına bir link verdiniz.
Adnan

6
Ördekler boşluklara tolerans göstermez. Ama sen ördek değil kuşsun, bu boşlukları kullanabileceğimiz anlamına mı geliyor? : P
Downgoat

6
@Downgoat Nope. Ayrıca bu düzenleme tamamen gereksizdi, bu yüzden geri aldım.
Alex A.

6
@Downgoat s /: P />: U /
ETHproductions

7
Ördekler boşluklara tolerans göstermez. Bu, arkadaşım, tehlikeli bir klişedir. Senin niyetini bilmiyorsam, suç alabilirim.
kobaltduck

Yanıtlar:


19

CJam, 108 90 85 bayt

"quack"">:U":D"scT¦{$ì"{269b22bSf*D}:F~[ZYB].*s.+s5/"ÿ3nÜïS{JÐø¦yûn"F*33/z]ri=zN*

Bazı karakterlerin yazdırılamaz olduğuna dikkat edin. Çevrimiçi deneyin!

Arka fon

İlk iki çıkış CJam'da sıkıştırılamaz.

Son çıktının sıkıştırılması basittir. Tüm satır beslemelerini çıkardıktan sonra, sonuçtaki dizgiyi oluşumlarında bölebilir ve sonuçtaki >:Uher boşluk dizisinin uzunluğunu hesaplayabiliriz.

Bu dizide sonuçlanır

[18 9 0 15 9 3 7 2 9 6 9 9 9 6 9 6 9 9 3 7 2 9 0 15 9 21 0 0 0]

bu sayede 22 tabanından 269 tabanına dönüştürerek verimli bir şekilde depolayabiliriz.

[255 12 51 110 220 239 83 123 74 208 248 166 121 251 110 17]

Her hane 256'dan küçük olduğundan , tek bir bayt olarak saklayabiliriz.

Son olarak, satırları ve sütunları transpoze edersek üçüncü çıktının sıkıştırılması daha kolay hale gelir:

 > > 
  >  

 : : 

UUUU 
    U
    U
    U
UUUU

Boşluk olmayan karakterler arasındaki boşlukları bir kez daha sayarak diziyi alırız

[1 1 3 8 1 6 0 0 0 5 4 4 0 0 0 0 0]

hangisi olur

[115 159 99 84 166 123 36 236 6]

taban 22'den taban 269'a dönüştürüldüğünde.

Nasıl çalışır

"quack"   e# Push the first output.

">:U":D   e# Push the second output, and save it in D.

e# Push [115 159 99 84 166 123 36 236 6] as bytes.

"scT¦{$ì"

{         e# Define a code block:
  269b22b e#   Transcode from base 269 to base 22.
  Sf*     e#   Replace each digit with a string of that many spaces.
  D       e#   Push D.
}         e#
:F~       e# Save the block in F. Execute it.
[ZYB]     e# Push [3 2 11].
.*        e# Vectorized repeat; push [">>>" "::" "UUUUUUUUUUU"].
s         e# Flatten the array of strings.
.+        e# Append the nth character to the nth string of spaces.
s5/       e# Flatten and split into chunks of length 5.

e# Push [255 12 51 110 220 239 83 123 74 208 248 166 121 251 110 17] as bytes.

"ÿ3nÜïS{JÐø¦yûn"

F         e# Execute F.
*         e# Join the resulting array of strings of spaces, separating by ">:U".
33/       e# Split into chunks of length 33.
z         e# Zip; transpose rows with columns.

]         e# Wrap the entire stack in an array.
ri        e# Read a token from STDIN and interpret it as an integer.
=         e# Retrieve the element at the corresponding index.
z         e# Zip; transpose rows with columns or map "string" to ["string"].
N*        e# Join, separating by linefeeds.

2
:Dİki dizi arasındaki fazlalığı seviyorum .
Zgarb

7
@Zgarb Büyük ördek ağrısından kurtuldu. Ördek şimdi gülümsüyor.
Alex A.

7
"172 ... 162 ... 182 ... Hepsini yenebilirim. Bekle, 90? Oh, Oh, Rakipsiz Dennis ..."
ETHproductions

22

Java, 303 286 bayt

@VoteToClose! İle 17 bayt kaydedildi

Aslında en kısa olmak demek değil, sadece Java'da denemenin eğlenceli olacağını düşündüm.

Yaygın dizeleri temsil eden bir dize değişkenleri listesi oluşturur, ardından tüm çıktıların bir dizisini oluşturur, sonra doğru olanı yazdırır.

String a(int y){String n="\n",d=">:U",A=" ",B=A+A,C=B+B,D=C+C,a="U"+B+" U"+n,G=D+A,H=C+B,c=d+G+d+n,E=B+A,F=C+E;String[]z={"quack",d,C+A+a+">"+B+": "+a+" >"+E+a+">"+B+": "+a+C+B+"UUU",D+D+B+c+d+D+F+c+B+A+d+F+d+B+c+H+d+G+c+G+d+H+c+H+d+G+c+E+d+F+d+B+c+d+D+F+c+D+D+C+A+d+d+d};return z[y];}

Ungolfed:

String a(int y) {
    String n = "\n", d = ">:U", A = " ", B = A + A, C = B + B, D = C + C,
            a = "U" + B + " U" + n, G = D + A, H = C + B, c = d + G + d + n,
            E = B + A, F = C + E;
    String[] z = { "quack", d, C + A + a + ">" + B + ": " + a + " >" + E + a + ">" + B + ": " + a + C + B + "UUU", D + D + B + c + d + D + F + c + B + A + d + F + d + B + c + H + d + G + c + G + d + H + c + H + d + G + c + E + d + F + d + B + c + d + D + F + c + D + D + C + A + d + d + d };
    return z[y];
}

Bu, bu sitedeki ilk cevabım, bu yüzden yanlış bir şey yaptıysam lütfen söyle.


2
İyi görünüyor! Güzel ilk mesaj ve PPCG'ye hoş geldiniz!
Conor O'Brien,

@AlexA. Haber verdiğin için teşekkürler, tamir ettim.
FlyingPiMonster

2
@ kittycat3141 Harika görünüyor. Güzel bir çözüm ve mücadeleme katıldığınız için teşekkür ederiz! :)
Alex A.

Bu anlaşılmaktadır D+Ave C+Byeterli sıklıkta görünür 2 yeni değişkenlere daha da golfed edilecek. Ayrıca for döngüsü olan bir dizi kullanmanın işe yarayacağına dair en ufak bir hissi alıyorum, ancak henüz nasıl olduğunu çözemedim ...
Addison Crump

9

05AB1E , 162 159 157 bayt

kod

Kahretsin, çok uzun, ama en azından bir şey:

">:U"VI3Qið16×7166b1ð:0Y:DUJ,Yð13×JD?X,3838b1ð:0Y:D?X,16255b1ð:0Y:D?X,16367b1ð:0Y:4F?X,}ð21×Y3×J,}¹2Qið4×" U   U"©J,">  :"®JD," >  "?®,,ð6×'U3×J,}¹iY,}"quack

Çevrimiçi deneyin!


açıklama

Kodun ilk bölümü, dizgeye ">:U"Vayarlanan bölümden oluşuyor Y. Ondan sonra, girişin 3'e eşit olup olmadığını kontrol ederiz. Bu I3Qikısımda yapılır . Eşitse, dev magpie'yi yazdırıyoruz:

N = 3

İlk önce ð16×sadece 16 boşluk karakterini iten ile başlar . Ondan sonra bir numara var 7166b. Bu ">:U ", Retina :) 'dan biraz yardım alarak , parçayı kapsıyor . Bu betiği dizgiyi ikili sayıya dönüştürmek için kullandım . Bundan sonra olsun 1ð:0Y:her yerini parçası, 1bir boşluk karakteri ve her ile 0birlikte Yolarak ayarlandı, >:U. Ondan sonra D, bu dize oğalt depolamak Xkullanarak Uve Jyığın oin. Bu ,dizeyi, dizgenin tamamını yeni bir satırla yazdırarak çıkardık. Bundan sonra diğerleri, aynı prensibe dayanır. İf ifadesi ikinci sırada biter }.

Tam dönüşümü burada bulabilirsiniz .

N = 2

Şimdi girişin 2'ye eşit olup olmadığını kontrol ediyoruz. Bu ¹2Qikısımda yapılır . Bundan sonra, eşitse, boşluk karakterini 4 kez kullanarak iteriz ð4×. Ondan sonra " U U"ipi itip kullanarak ©saklıyoruz (Jelly: p'den açıkça çalınan fikir). JYığını yeniden yağdırıp bunu yeni bir satırla basarız. Ondan sonra "> :"dizgeye basar, " U U"kullanırız ®, Jyığını kullanırız ve Dbu dizgiyi çoğaltırız ve ikisini de aynı satıra yazdırırız.

Kısa bilgi yarışması, bu ne yapacak: " > "?®,?

Yukarıdaki dizeyi yazdırdıktan sonra, yüzün ikinci satırının kopyasını alıyoruz ve bunu yazdırıyoruz (çünkü 2. satırla aynı).

Bu davanın kapsadığı son kısım:

ð6×'U3×J,

ð6×        # Push the space character × 6
   'U3×    # Push the "U" character three times
       J,  # Join and print pop with a newline

N = 1

Bunu açıklamak daha kolay:

¹1QiY

¹1Qi   # Check if the input is equal to 1
    Y  # Push the magpie face
       # This is then implicitly printed

N = 0

¹0Qi"quack

¹0Qi        # Check if the input is equal to 0
    "quack  # Weird sound what magpies make
            # Implicitly printed

Açıklama plz? : P
Addison Crump,

@VoteToClose Bitti :)
Adnan

"çok uzun"? Cevabımı gör :-P
Luis Mendo

2
O büyücüler şarlatan TIL. Görünüşe göre.
Alex A.

8

Vitsy , 172 171 159 bayt

Aman Tanrım. Metotların gücünü gösterecek bir şey isteseydim, anladım.

' 'V1+m
'kcauq'Z
'U:>'Z
58m5m6m'   > 'Z5m6m'UUU'68m
f3+bm9mamcm98m2m6bmcmam9mf6+8m3\[2m]
a'U   U'Z
' :  >'Z5m
Z2m98ma2m
\VZ
2mfbm
VVVZ2m78m2mVV7m
8m7m
68m2m9bm

Çevrimiçi Deneyin!

Bunun nasıl yürüdüğü çeşitli yöntemleri çağırmaktır. Açıklama aşağıdadır:

' 'V1+m
' 'V      Save character literal ' ' as a permanent variable.
    1+    Add one to the top item of the stack (input + 1)
      m   Go to that index of code.

'kcauq'Z
'kcauq'   Push 'quack' to the stack.
       Z  Output everything in the stack as a char.

'U:>'Z
'U:>'Z    Ouput ">:U" with the same method as the previous line.

Now on to some more... interesting lines.

58m5m6m'   > 'Z5m6m'UUU'68m
5              Push space, push 4
 8m            Call the 8th line index.
               As we will soon see, the 8th line index duplicates the space
               the number of times specified by the number just before the call 
               (4 in this case)
   5m          Call the 5th line index.
               The 5th line index outputs the 'U   U' and a newline.
     6m        Call the 6th line index.
               The 6th line index outputs '>  : U   U' and a newline.
'   > 'Z       Output ' >   '.
        5m6m   Same method calls as before.
'UUU'          Push 'UUU'.
     68m       Push 6, then call the 8th line index. This gives us the correct padding.

f3+bm9mamcm98m2m6bmcmam9mf6+8m3\[2m]
f3+              Push 18.
   bm            Call the 11th line index.
                 The 11th line index calls the 8th line index (which we've already seen
                 in action) and then the 7th line index, which you can find and explanation
                 for below (it does a lot)
     9m          Call the 9th line index.
                 The 9th line index outputs '>:U               >:U         >:U' (explanation lower)
       am        Call the 10th line index.
                 ...I'm gonna stop explaining these and just tell you to go to the lines now. :P
         cm      Call the 12th line index.
9                Push space, push 9.
 8m              Call the 8th line index (explained below and before).
   2m            Call the 2nd line index.
     6           Push 6.
      bm         Call the 11th line index. We've finished up to '>:U      >:U         >:U' now.
cm               You guessed it! Call the 12th line index. (explanation below)
  am             Call the 10th line index. (explanation below)
    9m           Call the 9th line index. (explanation below)
f6+              Push space, push 19 21.
   8m            Call the 8th line index. (explanation below)
     3\[2m]      Call the 2nd line index thrice.

All of the rest of these methods are supporting methods now.

a'U   U'Z       Output 'U   U' followed by a newline.

' :  >'Z5m      Output '>  : U   U' followed by a newline.

Z2m98ma2m
Z               Output everything currently in the stack.
 2m             Call the 2nd line index.
   9            Push space, push 8.
    8m          Call the 8th line index. (explained below)
      a         Push a newline to the stack.
       2m       Call the 2nd line index.
                This handles the biggest angry duck face's faces showing the eyebrows and eyes.

\VZ
\V    Push space as many times as the top item specifies.
  Z   Output everything in the stack.

2mfbm
2m      Call the 2nd line index.
  f     Push space, push 14.
   bm   Go to the 11th line index.
        This handles the mouth and some parts of the eyebrows of the biggest duck face.

VVVZ2m78m2mVV7m
VVVZ              Output 3 spaces (and whatever was pushed before it)
    2m            Call the 2nd line index.
      7           Push space, push 6.
       8m         Call the 8th line index. (explained... above)
         2m       Call the 2nd line index.
           VV     Push 2 spaces.
             7m   Call the 7th line index.

8m7m     This is pretty damn self-explanatory if you've read this far.

68m2m9bm
6            Push space, push 5.
 8m          Call the 8th line index.
   2m        Call the 2nd line index.
     9       Push space, push 9.
      bm     Call the 11th line index.

Bu kod çok saçma. Ayrıntılı şekli:

toggle single quote;
 ;
toggle single quote;
save top as permanent variable;
push 1;
add top two;
goto top method;
:toggle single quote;
k;
push 12;
push 10;
flatten top two stacks;
q;
toggle single quote;
output stack as chars;
:toggle single quote;
U;
clone current stack;
go forward;
toggle single quote;
output stack as chars;
:push 5;
push 8;
goto top method;
push 5;
goto top method;
push 6;
goto top method;
toggle single quote;
 ;
 ;
 ;
go forward;
 ;
toggle single quote;
output stack as chars;
push 5;
goto top method;
push 6;
goto top method;
toggle single quote;
U;
U;
U;
toggle single quote;
push 6;
push 8;
goto top method;
:push 15;
push 3;
add top two;
push 11;
goto top method;
push 9;
goto top method;
push 10;
goto top method;
push 12;
goto top method;
push 9;
push 8;
goto top method;
push 2;
goto top method;
push 6;
push 11;
goto top method;
push 12;
goto top method;
push 10;
goto top method;
push 9;
goto top method;
push 15;
push 6;
add top two;
push 8;
goto top method;
push 3;
repeat next instruction set top times;
begin recursive area;
push 2;
goto top method;
end recursive area;
:push 10;
toggle single quote;
U;
 ;
 ;
 ;
U;
toggle single quote;
output stack as chars;
:toggle single quote;
 ;
clone current stack;
 ;
 ;
go forward;
toggle single quote;
output stack as chars;
push 5;
goto top method;
:output stack as chars;
push 2;
goto top method;
push 9;
push 8;
goto top method;
push 10;
push 2;
goto top method;
:repeat next instruction set top times;
save top as permanent variable;
output stack as chars;
:push 2;
goto top method;
push 15;
push 11;
goto top method;
:save top as permanent variable;
save top as permanent variable;
save top as permanent variable;
output stack as chars;
push 2;
goto top method;
push 7;
push 8;
goto top method;
push 2;
goto top method;
save top as permanent variable;
save top as permanent variable;
push 7;
goto top method;
:push 8;
goto top method;
push 7;
goto top method;
:push 6;
push 8;
goto top method;
push 2;
goto top method;
push 9;
push 11;
goto top method;

7

JavaScript (ES6), 163 bayt

var solution =

n=>["quack",d=">:U",`5U3U
>2:1U3U
1>3U3U
>2:1U3U
6UUU`,`99090
096090
30702090
609090
906090
609090
30702090
096090
993000`][n].replace(/\d/g,c=>+c?" ".repeat(c):d)
<input type="number" oninput="R.textContent=solution(+this.value)"><pre id="R"></pre>

açıklama

Go-to-sıkıştırmamı JavaScript ile kullanıyor: çalışma uzunluğu kodlaması. Bu 1kadar 9çok alana eşlenecek haneler 0, öfkeli ördek yüzüyle eşleşir ve diğer karakterler aynı kalır.


1
Golf oynamayan bir dil için çok etkileyici, ancak n = 3 merkezinin tam ortasındaki ve altındaki sıralar eksik görünüyor.
ETHProductions

@ETHproductions Oops, orada ne olduğundan emin değilim. Şimdi düzeltildi.
user81655

7

Japt, 116 105 102 99 96 bayt

["quack""c)`+«öÂ[@=^Gñ`1]o2"mc r'4#¿+R "4z>2:z >2z>2:z6UUU"rz" U3U
" '1]®r'1">:U" r"%d"_SpZ}ÃgU

Yazdırılamaz. Çevrimiçi test edin!

Nasıl çalışır

İlk iki dize hiç sıkıştırılmaz. Üçüncüsü, basitçe, her bir boşluk akışını uzunluğuyla ve ardından " U3U"ile değiştirerek sıkıştırılır "z". Sonuncusu daha karmaşık:

  1. 2-9 aralığın her çalışmasını uzunluğu ile değiştirin.
  2. Değiştir >:Uile 1.
  3. Değiştir 191\nile 4. ( 4dizgede başka hiçbir yerde kullanılmaz.)
  4. Her geçerli bayt kodunu ( 10- 255, veya 0A- FF) bu karakter koduyla karakterle eşleyin.

Ortaya çıkan dize sadece 21 19 bayt uzunluğunda, ancak dekompresyon başka bir 31 29 alır .

Dizelerin sıkıştırmasını açtıktan sonra, maddeyi girdi konumunda konumlandırırız U. (Dizi, dizinin sonundan[0,3,2,1] başlayarak sayım yapmasına neden olan bir hata olduğundan dolayı düzenlenir .)

[                      // Create an array of the following:
  "quack"              //  "quack".

  "c)`+«öÂ[@=^Gñ`1]o2" //  Take this string (contains an unprintable).
                       //  Map each char to its char code.
                       //  This produces "994196431712461949164619431712419649931112".
  r'4#¿+R              //  Replace each "4" with the char code of "¿" (191) + a newline.

  "4z>2:z >2z>2:z6UUU" //  Take this string.
  rz" U3U\n"           //  Replace each "z" with " U3U\n".

  '1                   //  "1".
]
®              Ã       // Map each item by this function:
r'1">:U"               //  Replace each "1" with ">:U".
r"%d"_SpZ}             //  Replace each remaining digit Z with Z spaces.

gU                     // Get the item at index -U, wrapping. 
                       // (This should just be U, but there's a bug which negates it.)

5

MATL , 283 182 bayt

@Adnan sayesinde 101 bayt kaydedildi!

Bu, durumları kodlamak için ondalık sayıları kullanır 0... 3durum 2 ve 3 için dört karaktere kadar.

Durumda 3 için @Adnan önerdiği çok güzel bir hile kullanılır: Her bir satırı kodlamak, nereye ikili dizileri tanımlamak 0ve 1uzaya ve karşılık >:Usırasıyla.

~?'quack'}G1=?'>:U'}G2=?' :>U'12336 8466480h2109488h8466480h4032h4YA47-)}268697600 67174401h16795656h67174464h67174912h67174464h16795656h67174401h14680064h"@BP48+]Xh49'>:U'YX48 32YXc

Çevrimiçi deneyin!


3
Nasıl son durum için, kullanımı hakkında bu , yerine 1boşluklu ve 0birlikte >:Udize. Bunun yardımı olur mu bilmiyorum.
Adnan

@Adnan Bu iyi bir fikir!
Luis Mendo

5
@Adnan 101 byte kaydedilen: -O
Luis Mendo

Harika! Çok güzel cevap! :)
Adnan

5

Tarçınlı Sakız, 76 bayt

0000000: 6c33 502b 2c4d 4cce b636 54b3 b30a b536  l3P+,ML..6T....6
0000010: 5253 0081 5010 e6b2 5350 b082 3215 ecb0  RS..P...SP..2...
0000020: 8a42 1487 865a 1bab 2960 00a0 79c8 6c2e  .B...Z..)`..y.l.
0000030: 2026 a002 4221 0430 55c0 5938 cd40 9720   &..B!.0U.Y8.@. 
0000040: 6c06 6177 90e9 17ac 4102 4100            l.aw....A.A.

Bu zorluğun ardından Tarçın Sakızı yaratıldığından beri rekabet etmiyor.

Çevrimiçi deneyin.

açıklama

İlk bayt lmodu belirler: bu durumda Tarçın Sakızına arama tablosu moduna girmesini söyler. Tarçın Sakızı daha sonra (sıkıştırılmış olan zopfli --deflate) ipin geri kalanını şu şekilde açar :

0&quack;1&>:U;2&     U   U
>  : U   U
 >   U   U
>  : U   U
      UUU;3&                  >:U         >:U
>:U               >:U         >:U
   >:U       >:U  >:U         >:U
      >:U         >:U         >:U
         >:U      >:U         >:U
      >:U         >:U         >:U
   >:U       >:U  >:U         >:U
>:U               >:U         >:U
                     >:U>:U>:U

Sonra bölüştürür ;, her bir anahtar-değer çiftini ( &sınırlayıcıyla birlikte) bir sözlüğe koyar ve çıktılar dictionary[input].


5

JavaScript ES6, 232 223 203 188 bayt

Kaydedilen 29 ETHproductions 44 bayt teşekkürler!

n=>[`quack`,r=`>:U`,`     U   U
>  : U   U
 >   U   U
>  : U   U
      UUU`,`00022
10022
0100 1  12
00122
20012
00122
0100 1  12
10022
0000211`.replace(/\d/g,N=>[g=`   `,r,g+g+g+r][N])][n]

Test et!


elbette atob'd olabilir ... eğer değilse, 1ve 0bir trinary numarasına dönüştürülebilir mi?
Downgoat

1
@ Downgoat btoaing ve trinary ikisi de daha uzun.
Conor O'Brien,

Eski cevap, ancak değiştirerek 15 byte gibi kurtarabilecek r+g+g+g+riçin g+g+g+rve buna göre dize ayarlayarak.
ETHproductions

0

GML, 265 bayt

@ Kittycat3141'in mükemmel cevabı, @VoteToClose tarafından iki yeni değişkenle (G ve H adını verdiğim) daha ileri golf önerisi ile mükemmel bir cevap. Ayrıca GML'nin nispeten gevşek sözdizimi ile daha da kısaltmayı başardım.

d=">:U"A=" "B=A+A;C=B+B;D=C+C;G=D+A;H=C+B;a="U"+B+" U"+"#"c=d+G+d+"#"E=B+A;F=C+E;x[0]="quack"x[1]=d;x[2]=C+A+a+">"+B+": "+a+" >"+E+a+">"+B+": "+a+H+"UUU"x[3]=D+D+B+c+d+D+F+c+B+A+d+F+d+B+c+H+d+G+c+G+d+H+c+H+d+G+c+E+d+F+d+B+c+d+D+F+c+D+D+C+A+d+d+d;return x[argument0]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.