Kod obliczeniowy Pi Golf [zamknięty]


17

Wyzwanie

Musisz obliczyć pi w najkrótszej możliwej długości. Możesz dołączyć do dowolnego języka i możesz użyć dowolnej formuły do ​​obliczenia liczby pi. Musi być w stanie obliczyć liczbę pi z co najmniej 5 miejscami po przecinku. Najkrótszy, mierzony byłby w postaciach. Konkurs trwa 48 godzin. Zaczynać.


Uwaga : To podobne pytanie stwierdza, że ​​PI musi być obliczone przy użyciu serii 4 * (1 - 1/3 + 1/5 - 1/7 +…). To pytanie nie ma tego ograniczenia, a w rzeczywistości wiele odpowiedzi tutaj (w tym najbardziej prawdopodobne, że wygra) byłoby nieważnych w tym drugim pytaniu. To nie jest duplikat.


5
@hvd Jak myślisz, dlaczego należy go zdyskwalifikować? Pasuje do specyfikacji ...
Dr Belisarius

5
@hvd acos (-1). Wygrałem!
Level River St

4
To wygląda dziwnie, niekonsekwentnie. Obliczanie π musi polegać na dzieleniu koła przez jego średnicę lub innej operacji dającej π. Jeśli zaakceptujemy robienie 355/113 - które nie ma nic wspólnego z π poza szczęściem - jak @ace, to logicznie powinniśmy zaakceptować robienie 3.14159 .
Nicolas Barbulesco,

7
Nie rozumiem, dlaczego ludzie lubią to pytanie. To jedno z najbardziej niezdefiniowanych i nieciekawych pytań, jakie tu widziałem. Jedyna różnica między tym a światem hello polega na tym, że ma to coś wspólnego z Pi.
Cruncher

8
Aby pytanie było interesujące, potrzebuje funkcji oceniania, która nagradza cyfry pi na bajt kodu.
Ben Jackson

Odpowiedzi:


56

Python3, 7

Działa w interaktywnej powłoce

355/113

Wynik: 3.1415929203539825 popraw do 6 miejsc po przecinku

I wreszcie mam rozwiązanie, które bije APL!

Och, a jeśli się zastanawiasz, ten stosunek nazywa się the 率 (dosłownie „dokładny stosunek”) i jest proponowany przez chińskiego matematyka Zu Chongzhi (429-500 ne). Powiązany artykuł na Wikipedii można znaleźć tutaj . Zu podał również stosunek 22/7 jako „przybliżony stosunek” i jest znany jako pierwszy matematyk, który zaproponował, że 3,1415926 <= pi <= 3,1415927


12
mhmh - to właściwie odpowiedź na poliglota. Działa również w Smalltalk!
blabla999

7
Bluźnierstwo! To tylko obliczenie!
mniip

3
cóż, to podział, a jego precyzja spełnia wymóg ... (a nawet Biblia jest mniej dokładna; nie nazwałbyś tego bluźnierstwem - prawda? 3 * ;-)
blabla999

29
Niezręczny moment, kiedy napisałem to jako poważną odpowiedź, ale wszyscy interpretują to jako żart ...
user12205

20
Najwyżej oceniane odpowiedź: 355/113. Najniższa głosowało odpowiedź: 3+.14159. Naprawdę nie widzę dużej różnicy.
primo

49

PHP - 132 127 125 124 bajty

Podstawowa symulacja Monte-Carlo. Co 10 mln iteracji drukuje bieżący stan:

for($i=1,$j=$k=0;;$i++){$x=mt_rand(0,1e7)/1e7;$y=mt_rand(0,1e7)/1e7;$j+=$x*$x+$y*$y<=1;$k++;if(!($i%1e7))echo 4*$j/$k."\n";}

Dzięki cloudfeet i zamnuts za sugestie!

Przykładowe dane wyjściowe:

$ php pi.php
3.1410564
3.1414008
3.1413388
3.1412641
3.14132568
3.1413496666667
3.1414522857143
3.1414817
3.1415271111111
3.14155092
...
3.1415901754386
3.1415890482759
3.1415925423731

5
Czekamy na odpowiedź, która naprawdę się liczy!
blabla999

Nie wiem o PHP, ale w JS możesz zrobić coś takiego: $j+=$x*$x+$y*$y<=1;co pozwoliłoby ci zaoszczędzić cztery bajty.
cloudfeet

1
Również $k+=1/4;i print $j/$kmoże być zredukowany do $k++;i print 4*$j/$kna inny bajt.
cloudfeet

@cloudfeet - Dokonane zmiany, potwierdzony kod nadal działa tak samo. Dziękuję Ci!

2
@MarkC - Koncepcyjnie rzuca lotkami losowo w prostokąt od 0,0 do 1,1. Te mniejsze lub równe odległości 1 od 0,0 są uwzględniane w środku, w przeciwnym razie na zewnątrz. Kształt tej odległości 1 ma kształt kwadratu lub π / 4. [Liczba rzutek w ćwiartce koła] / [całkowita liczba rzutek] będzie w przybliżeniu π / 4 wraz ze wzrostem liczby próbek.

31

J 6

{:*._1

Objaśnienie: *.podaje długość i kąt liczby zespolonej. Kąt -1 wynosi pi. {:bierze ogon listy [długość, kąt]

Tylko dla powoli zbieżnych fetyszystów serii, dla 21 bajtów, seria Leibniza:

      +/(4*_1&^%>:@+:)i.1e6
 3.14159

12
Innymi słowy tak jest atan(0) + pi. Nie sądzę, że użycie funkcji trygonometrycznych i samego pi powinno się liczyć jako „obliczenie”.
Jason C

@JasonC Arg(czyli argument liczby zespolonej) nie jest funkcją trygonometryczną, mimo że ma wartości podobne do
arctangentu

1
@mniip Tak, to prawda. To tylko synonim atan (cóż, atan2) w prawdziwych i wymyślonych częściach. Jak widać, z definicji jest on dokładnie równy atan(0) + pi.
Jason C

25

Perl, 42 bajty

map{$a+=(-1)**$_/(2*$_+1)}0..9x6;print$a*4

Oblicza π za pomocą wzoru Leibniza :

Leipniz formula

999999 jest używane jako największa n, aby uzyskać dokładność pięciu cyfr dziesiętnych.

Wynik: 3.14159165358977


To jest fajne! Zainspirowało mnie to do napisania jednego w Javie 8.
David Conrad

19

Piet, wiele kodów

Nie moja odpowiedź, ale to najlepsze rozwiązanie tego problemu, jakie widziałem:

Pi approximation in Piet

Rozumiem, że sumuje piksele w okręgu i dzieli przez promień, a następnie jeszcze raz. To jest:

A = πr²  # solve for π
π = A/r²
π = (A/r)/r

Moim zdaniem lepszym podejściem jest program, który generuje ten obraz w dowolnym rozmiarze, a następnie uruchamia go przez interpretera Piet.

Źródło: http://www.dangermouse.net/esoteric/piet/samples.html


Czy możesz wyjaśnić, co to właściwie robi? (Znam ogólny pomysł Piet, ale wyjaśnienie, w jaki sposób działa ten program, byłoby dobrym dodatkiem do twojej odpowiedzi).
plannapus

Naprawdę nie znam Piet, ale myślę, że to dosłownie mierzy pole czerwonego koła, a następnie dzieli dwukrotnie przez promień, rozwiązując dla π = A / (r * r)
Nie to, że Charles

Obszar jest dość wyraźny, ponieważ gdy wskaźnik wchodzi w czerwone kółko, zlicza liczbę kodów w czerwonym obszarze i przesuwa go na stos przy wychodzeniu (ponieważ punkt wyjścia jest ciemnoczerwony, dlatego nie ma zmiany odcienia, ale o jeden stopień ciemniejszy ), to część „dzielenie przez kwadrat kwadratu promienia”, którą miałem problem ze zrozumieniem.
plannapus

1
@plannapus Promień jest „zakodowany na stałe” w ciemnoczerwonej linii rozciągającej się od lewego górnego rogu do połowy lewej krawędzi (trudno go zobaczyć na obrazku). Piet jest trudny do naśladowania, ale sedno polega na tym, że bloki koloru mają wartość równą ich powierzchni (linia na lewej krawędzi ma r pikseli, koło ma piksele obszaru ), a pomiędzy nimi jest tylko kilka operacji stosu i operacji arytmetycznych. Programy zaczynają się w lewym górnym rogu. Tekst w prawym górnym rogu jest zasadniczo komentarzem.
Jason C

2
@JasonC ah oczywiście! Okrąg dotyka zarówno górnej, jak i dolnej strony, więc ciemnoczerwona linia schodząca od górnej do dokładnie środkowej części jest konieczna! Mądry!
plannapus

18

TECHNICZNIE OBLICZAMY, 9

0+3.14159

TECHNICZNIE JESZCZE OBLICZAMY, 10

PI-acos(1)

OBLICZAMY TAK TWARDO, 8

acos(-1)

I PRZYPADKOWO PI, 12

"3.14"+"159"

I technicznie ta odpowiedź śmierdzi.


31
Więc nagłówek, bardzo duży tytuł, bardzo ból dla moich oczu, wow.
Pierre Arlaud

1
pluzz wan za dużo lulz, thankz
Jonathan Van Matre

Hej kochanie, chcesz rozwinąć moją serię Taylor?
Jason C


@ SimonT Nie odpowiedziałeś na moje pytanie dotyczące serii Taylor. Ale kiedy o tym myślisz, zobacz moje komentarze do pytania i większość innych odpowiedzi tutaj. : P
Jason C

14

APL - 6

2ׯ1○1

Wyjścia 3.141592654. Oblicza dwa razy wartość arcus sinus 1.

13-znakowym rozwiązaniem byłoby:

--/4÷1-2×⍳1e6

To wychodzi 3.141591654dla mnie, co pasuje do żądanej precyzji.
Do + 4/1 - 4/3 + 4/5 - 4/7 ...obliczeń wykorzystuje jednak proste serie.


1
Wow, to jedna powolna konwergencja!

Moją pierwszą myślą było „dlaczego nie ¯2○¯1?” (Tj. Acos -1). Ale to daje złożone przybliżenie repl.it ( 3.1415926425236J¯1.1066193467303274e¯8). Wiesz, dlaczego? Czy wszystkie implementacje to robią?
James Wood

+1 za drugie rozwiązanie. 2 * asin(1)jest trochę oszustwem.
Jason C

@JamesWood Nie znam APL, ale gdybym musiał zgadywać, powiedziałbym, że próbował zrobić sqrt(1-theta^2)(który pojawia się w wielu tożsamościach trig) w pewnym momencie i gdzieś stracił trochę precyzji, co ostatecznie zakończyło się nieco negatywnie 1-theta^2.
Jason C

1
Dziwne jest to, że wciąż istnieje niewielka część wyobrażona acos -0.75. Nie ma mowy, aby można było obliczyć, 1 - 0.75 ^ 2że jest ujemny.
James Wood

14

J - 5 bajtów

|^._1

To oznacza |log(-1)|.


Sprytne wykorzystanie Tożsamości Eulera.
primo

1
Cool, kolejna algebraiczna odpowiedź na tożsamość. Mniej więcej tak sprytny jak ln(e^(42*pi))/42lub pi*113/113.
Jason C

Działa również w TI-BASIC
Timtech

1
(Całkowicie niezwiązany, chciałbym móc używać LaTeXa na codegolf.)
Jason C

1
(Odpowiedź na całkowicie niezwiązane pytanie, radzę sobie z wykresami Google, na przykład tutaj .) Na ten temat jest to najmilsza odpowiedź, dlatego powinna zostać zaakceptowana.
primo

14

Kalkulator Google, 48

stick of butter*(26557.4489*10^-9)/millimeters^3

Bierze kij masła, wykonuje zaawansowane obliczenia, robi z niego pi. Pomyślałem, że skoro wszyscy robią proste odpowiedzi matematyczne, dodam nieco bardziej unikalną.

Przykład


3
To stick of butterjest słodkie i zabawne, ale w gruncie rzeczy jest to kolejna pi*x/x+y-yalgebraiczna tożsamość.
Jason C

10
Jest tak wiele lepszych sposobów na zrobienie pi za pomocą kija masła
Nie że Charles

Próbowałeś robić masło z kijem pi?
mbomb007 19.04.16

12

Oktawa, 31

quad(inline("sqrt(4-x^2)"),0,2)

Oblicza powierzchnię jednej czwartej okręgu o promieniu 2 poprzez całkowanie numeryczne.

octave:1> quad(inline("sqrt(4-x^2)"),0,2)
ans =     3.14159265358979

1
Ładny! +1, gdy moje głosy się naładują.
Jason C


10

Python, 88

Rozwiązanie :

l=q=d=0;t,s,n,r=3.,3,1,24
while s!=l:l,n,q,d,r=s,n+q,q+8,d+r,r+32;t=(t*n)/d;s+=t
print s

Przykładowe dane wyjściowe w powłoce Pythona:

>>> print s
3.14159265359

Udaje się uniknąć importu. Można go łatwo zamienić na bibliotekę dziesiętną o dowolnej precyzji; wystarczy wymienić 3.z Decimal('3')ustaw precyzję przed i po, to jednoskładnikowa plus wynik precyzji konwersji.

I w przeciwieństwie do całej partii tutaj odpowiedzi, rzeczywiście oblicza π zamiast opierania się na wbudowanym w stałych lub matematyki oszustwo, to znaczy math.acos(-1), math.radians(180)itp


9

język asemblera x86 (5 znaków)

fldpi

Whether this loads a constant from ROM or actually calculates the answer depends on the processor though (but on at least some, it actually does a calculation, not just loading the number from ROM). To put things in perspective, it's listed as taking 40 clock cycles on a 387, which is rather more than seems to make sense if it were just loading the value from ROM.

If you really want to ensure a calculation you could do something like:

fld1
fld1
fpatan
fimul f

f dd 4

[for 27 characters]


1
Czy możesz wyjaśnić, proszę?
Nicolas Barbulesco,

A na niektórych procesorach, jakie obliczenia by fldpito zrobiły?
Nicolas Barbulesco

1
Nie sądzę, aby użycie polecenia, które ładuje pi (lub nawet oblicza je w oparciu o czyjąś implementację asin lub jakąkolwiek istniejącą implementację funkcji trig) w ogóle nie ma znaczenia w duchu „obliczania” czegokolwiek (czynnik „asemblera” nie robi ” naprawdę to zmieniam). Być może przenieś to na najkrótszą możliwą implementację asemblera i można to nazwać „obliczeniem”.
Jason C

2
@JasonC: Sounds like an entirely arbitrary notion to me, with no more real sense than my deciding that people had to implement addition, subtraction, multiplication and division on their own if they're doing to use them.
Jerry Coffin

3
@JerryCoffin Instead of arguing technicalities, suffice it to say that neither asin(-1) nor fldpi are particularly interesting or creative. There's not much purpose in competing to see whose favorite language has the shortest name for predefined trig functions and pi constants.
Jason C

8

bc -l, 37 bytes

for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p

Nie widzę żadnych innych odpowiedzi za pomocą produktu Wallis , więc ponieważ nazwano go na cześć mojego imiennika (mój wykładowca Historii matematyki wyszedł z tego bardzo dobrze), nie mogłem się oprzeć.

Okazuje się, że jest to całkiem niezły algorytm z perspektywy golfa, ale jego tempo konwergencji jest fatalne - zbliża się do 1 miliona iteracji tylko po to, aby uzyskać 5 miejsc po przecinku:

$ time bc -l<<<'for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p'
3.14159074622629555058

real    0m3.145s
user    0m1.548s
sys 0m0.000s
$ 

bc -l, 15 bajtów

Alternatywnie możemy użyć Newtona-Raphsona do rozwiązania sin(x)=0, z początkowym przybliżeniem 3. Ponieważ jest to zbieżne w tak małej liczbie iteracji, po prostu zapisujemy na stałe 2 iteracje, co daje 10 miejsc po przecinku:

x=3+s(3);x+s(x)

Iteracyjna formuła według Newtona-Raphsona jest następująca:

x[n+1] = x[n] - ( sin(x[n]) / sin'(x[n]) )

sin'=== cosi cos(pi)=== -1, więc po prostu przybliżamy costermin, aby uzyskać:

x[n+1] = x[n] + sin(x[n])

Wynik:

$ bc -l<<<'x=3+s(3);x+s(x)'
3.14159265357219555873
$ 

+1 now that's more like it!
Jason C

@JasonC What is your opinion of application of Newton-Raphson to solve sin(x)=0 (see edit)?
Digital Trauma

6

python - 47 45

pi is actually being calculated without trig functions or constants.

a=4
for i in range(9**6):a-=(-1)**i*4/(2*i+3)

result:

>>> a
3.1415907719167966

Should be able to save a byte by dropping the zero after the decimal place for forced float interpretation. :) Bonus points for brevity, but I like mine for arbitrary accuracy and lower memory utilization. (Edited to scratch the parenthesis idea; I see what's going on there and my isolated test didn't catch the issue.)
amcgregor

Uh… no. After your modification this no longer gives valid output. (265723 ≭ π) You still need the period, just not the trailing zero.
amcgregor

@amcgregor use python 3?
qwr

I do, though I primarily develop under 2.7 and make my code work in both. However on the stock Mac 10.9 python3 installation your code causes a segmentation fault.
amcgregor

@amcgregor I just tested it, it works for me (python 3.3.4)
qwr

6

C, 99

Directly computes area / r^2 of a circle.

double p(n,x,y,r){r=10000;for(n=x=0;x<r;++x)for(y=1;y<r;++y)n+=x*x+y*y<=r*r;return(double)n*4/r/r;}

This function will calculate pi by counting the number of pixels in a circle of radius r then dividing by r*r (actually it just calculates one quadrant). With r as 10000, it is accurate to 5 decimal places (3.1415904800). The parameters to the function are ignored, I just declared them there to save space.


6

Javascript, 43 36

x=0;for(i=1;i<1e6;i++){x+=1/i/i};Math.sqrt(6*x)

x becomes zeta(2)=pi^2/6 so sqrt(6*x)=pi. (47 characters)

After using the distributive property and deleting the curly brackets from the for loop you get:

x=0;for(i=1;i<1e6;i++)x+=6/i/i;Math.sqrt(x)

(43 characters)

It returns:

3.14159169865946

Edit:

I found an even shorter way using the Wallis product:

x=i=2;for(;i<1e6;i+=2)x*=i*i/(i*i-1)

(36 characters)

It returns:

3.141591082792245

6

Python, Riemann zeta (58 41 char)

(6*sum(n**-2for n in range(1,9**9)))**0.5

Or spare two characters, but use scipy

import scipy.special as s
(6*s.zeta(2,1))**0.5

Edit: Saved 16 (!) characters thanks to amcgregor


1
Can potentially avoid the math import and sqrt call by pivoting to exponentiation instead: (6*sum(n**-2 for n in range(1,9**9)))**0.5
amcgregor

5

Javascript: 99 characters

Using the formula given by Simon Plouffe in 1996, this works with 6 digits of precision after the decimal point:

function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*(2<<(n-1))*f(n)*f(n)/f(2*n);alert(y)

This longer variant (130 characters) has a better precision, 15 digits after the decimal point:

function e(x){return x<1?1:2*e(x-1)}function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*e(n)*f(n)*f(n)/f(2*n);alert(y)

I made this based in my two answers to this question.


5

Ruby, 54 50 49

p (0..9**6).map{|e|(-1.0)**e/(2*e+1)*4}.reduce :+

Online Version for testing.

Another version without creating an array (50 chars):

x=0;(0..9**6).each{|e|x+=(-1.0)**e/(2*e+1)*4}; p x

Online Version for testing.


It's interesting to see the language differences that such compact solutions can give. For example, the Python translation of the above is 105 characters (after using some trivial code compression tricks): a=__import__;reduce(a('operator').__add__,a('itertools').imap(lambda e:(-1.0)**e/(2*e+1)*4,xrange(9**6))) -- note the use of xrange/imap; in Python 3 you can avoid this; basically I don't want all of your RAM to get consumed constructing a list with so many entries.
amcgregor

1
You're absolutely right. It is often very convenient to use (especially Ruby's) Array and Enumerable functions, though it might really not be the best idea in terms of performance and speed... Well, thinking about that, it should be possible to do the calculation with the Range.each method instead of creating a map.
David Herrmann

Yes, it's possible - just one character more...
David Herrmann

Your first answer is not as precise as your second.
Josh

Could you elaborate, please? Same algorithm, same output for me?
David Herrmann

5

TI CAS, 35

lim(x*(1/(tan((180-360/x)/2))),x,∞)

1
I looked back at this and i completely forget how it works :P
TheDoctor

5

Perl - 35 bytes

$\=$\/(2*$_-1)*$_+2for-46..-1;print

Produces full floating point precision. A derivation of the formula used can be seen elsewhere.

Sample usage:

$ perl pi.pl
3.14159265358979

Arbitrary Precision Version

use bignum a,99;$\=$\/(2*$_-1)*$_+2for-329..-1;print

Extend as needed. The length of the iteration (e.g. -329..-1) should be adjusted to be approximately log2(10)3.322 times the number of digits.

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211707

Or, using bigint instead:

use bigint;$\=$\/(2*$_-1)*$_+2e99for-329..-1;print

This runs noticably faster, but doesn't include a decimal point.

3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

5

C# 192

class P{static void Main(){var s=(new System.Net.WebClient()).DownloadString("http://www.ctan.org/pkg/tex");System.Console.WriteLine(s.Substring(s.IndexOf("Ver&shy;sion")+21).Split(' ')[0]);}}

Outputs:

3.14159265

No math involved. Just looks up the current version of TeX and does some primitive parsing of the resulting html. Eventually it will become π according to Wikipedia.


I'm 5 years late, but this is a standard loophole that was created 4 days before this answer.
Benjamin Urquhart

5

Python 3 Monte Carlo (103 char)

from random import random as r
sum(1 for x,y in ((r(),r()) for i in range(2**99)) if x**2+y**2<1)/2**97

5

Game Maker Language, 34

Assumes all uninitialized variables as 0. This is default in some versions of Game Maker.

for(i=1;i<1e8;i++)x+=6/i/i;sqrt(x)

Result:

3.14159169865946

very nice. also, in C float k(){double x=0,i=0;for(;i++<999999;)x+=6/i/i;return sqrt(x);} is shorter than this one
izabera

even shorter with 1e8 instead of 999999
izabera

Could you use for(i=1;i<1e8;)x+=6/i/i++;sqrt(x) to save a byte (or alternatively for(i=1;i++<1e8;))?
mbomb007

@mbomb007 Unfortunately not, GML requires all 3 parameters.
Timtech

4

Java - 83 55

Shorter version thanks to Navin.

class P{static{System.out.print(Math.toRadians(180));}}

Old version:

class P{public static void main(String[]a){System.out.print(Math.toRadians(180));}}

This doesn't do any calculation.
Hosch250

I don't understand the downvote, although - I'd answered with "Math.toRadians(180)". It is also questionable, who computes pi: the compiler or the program. But that was not part of the question.
blabla999

2
@user2509848 It most certainly does: it multiplies 180 by pi/180.
AJMansfield

You mean it multiplies pi by 1? It is essentially the same thing. I did not downvote it, but I don't think it really counts.
Hosch250


4

R: 33 characters

sqrt(8*sum(1/seq(1,1000001,2)^2))
[1] 3.141592

Hopefully this follows the rules.


3

Ruby, 82

q=1.0
i=0
(0.0..72).step(8){|k|i+=1/q*(4/(k+1)-2/(k+4)-1/(k+5)-1/(k+6))
q*=16}
p i

Uses some formula I don't really understand and just copied down. :P

Output: 3.1415926535897913


3

Ruby, 12

p 1.570796*2

I am technically "calculating" pi an approximation of pi.


No, you are not technically calculating pi. You are technically calculating 3.141592, which happens to be close to pi, but will never converge to exactly acos(-1).
wchargin

@Wchar Ok, edited
Doorknob

3
I don't think hard-coding pi/2 then multiplying it by 2 really counts; the point is to calculate pi, not obfuscate a numeric literal.
Jason C

3

JavaScript - 19 bytes

Math.pow(29809,1/9)

Calculates the 9th root of 29809.

3.1415914903890925
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.