不带数学的输出Pi [关闭]


56

用尽可能少的字节,您的工作是编写一个输出以下程序:

3.14

为了庆祝Pi晚会!:)

规则

您可以按照自己喜欢的方式进行操作,但是有一些限制。

  • 您可能无法在程序中的任何地方使用算术运算。这包括+-*/%^(幂),等...这也包括递增(通常++),递减(--),位操作,任何内置函数可以被用作替换如sum()prod()mod()double()pow()sqrt()inc()dec()等...(作者酌情决定)
  • 数字314可能不会出现在代码中的任何位置。
  • 你可能使用任何预定义变量/常量,你的语言可能作为替代314。(作者酌情决定)
  • 您也可以使用任何三角函数等sin()cos()tan()arcsin()arccos()arctan()sinh()cosh()tanh(),等...(作者的自由裁量权)
  • 不得使用Pi(或3.14)的内置值或预定义值。没有网络请求
  • 您的程序不能要求任何输入(除了运行它)。
  • 3.14是您唯一可以输出的东西,它不能成为更长/更大输出的一部分。

优胜者

4月18日字节数最少的答案将获胜。祝好运!

期待从聪明的头脑中得到聪明的答案!anyone人?:P


3
您可能需要澄清^是乘幂运算符,而不是按位XOR运算符。
ace_HongKongIndependence 2014年

2
是否允许按位运算符?
ProgramFOX

1
@ProgramFOX好吧,它们可以用作常规操作的替代品,所以,不是。不允许。我将编辑帖子。
kukac67

1
允许网络请求?
2014年

7
@swish:我不会使用网络请求,因为它属于不再有趣
ProgramFOX 2014年

Answers:


25

果酱-8 6

S`,'.E

CJam是我正在开发的一种新语言,类似于GolfScript- http: //sf.net/p/cjam 。
这里是解释:

S是预初始化为空格的变量(“”)
`生成最后一个值的字符串表示形式-恰好是" "(3个字符)
,计算字符串长度(3)
'.是点字符
E是预初始化为14的变量;3、1和4不允许使用,但它并没有说明14 :)

归功于Doorknob的反推想法


1
@Brilliand我会接受使用E
kukac67

6
@ kukac67虽然我尚未正式发布(今天发布),但我已经通过hg提供了当前的CJam代码。如果您在发布问题前1天获得了CJam代码,它将正确运行我的程序(因此我没有为解决此问题进行任何更改)。但是我还是不介意。
aditsu

33
是时候开发HQ9 +π...了
Nzall 2014年

2
@AnonymousPi每个人都可以对其选择的答案进行投票。也许他们对其他答案的印象更深刻,即使他们不那么简短。
2014年

2
为什么将变量预初始化为14?
user2357112 2014年

113

PHP-22个字节

<?=date('n.j',8899e5);

1998年的Pi日真的很棒!


13
@ kukac67:n.j是的格式,8899e5是3月14日的1998年的Unix时间戳
ProgramFOX

7
聪明了。
Amal Murali 2014年

7
您可以删除来​​保存7个字符,8899e5。每年一次是正确的。
Damir Kasipovic

1
@Timo您是正确的,但其中包含非法数字“ 3”;)。
Blackhole,2014年

18
@Blackhole 20个字节:<?=date('w.W',78e5);1970年4月1日是第14周的星期三。–
primo

92

C,39

假设机器是低端的,并使用IEEE浮点标准。

main(){printf("%.2f",*(float*)"P@I@");}

有趣的事实是,"P@I@"实际上是不相关的PI,但等同于0x40494050它是表示3.144550323486328

http://ideone.com/uXVEtl


3
太棒了
wchargin

1
您的代码假定在低端字节序计算机上进行类型调整。
Nayuki 2014年

@NayukiMinase,是的,您是对的,值得指出。并且还假定使用IEEE浮点标准。
Michael M.

它包含未定义的行为(可变参数函数的隐式声明)
rubenvb 2014年

5
这段代码实际上假设该机器是Michael的机器 :-)。
Konrad Borowski14年

50

dc11 9个字节

zE[.]znPp
  • z 将当前堆栈深度(0)推入堆栈
  • E按E 16(== 14 10
  • [.] 推字符串“。”
  • z 将当前堆栈深度(3)推入堆栈
  • n 弹出3并打印为数字
  • P弹出“。” 并打印为字符
  • p 弹出14,并用换行符打印为数字

输出:

$ dc <<< zE[.]znPp
3.14
$ 

那么“使用输入库”是运算符吗?有点像算术运算,但可能仍然有效。
Brilliand 2014年

@Brilliand在这个问题上,我什么都看不到,禁止基本转换。实际上,OP在这里的评论中似乎鼓励基本转换。codegolf.stackexchange.com
Digital Trauma

我同意这是有效的;我只是在想,当基本转换是运算符而不是数字语法的一部分时,它将模糊内联数据和算术运算之间的界限。
Brilliand 2014年

我认为这应该是15个字节?
注册用户

9
@AdityaPatil为什么?dc就像这里的所有其他语言一样,是一种语言和口译员。 dc -e 只是该解释器的调用。我可以很容易地将9字节程序保存在文件中并运行dc pi.dc。如果需要计算这些字节,则所有其他语言都必须使用相同的字节。例如,包括python 在所有python条目或ruby golfscript.rb 所有golfscript条目中。我认为,除非需要通过特殊的选择,否则此处约定的惯例将不包括这些内容。
Digital Trauma 2014年

42

JavaScript(ES5)20字节

m.buettner的JS解决方案的一种变体。

(x='.'+0xE).length+x

编辑:JavaScript(ES5)18字节

ComFreek使用base64解码功能的想法的变体。

atob('Mw')+'.'+0xE

编辑:Javascript(ES5)16字节

如果+允许一元运算符将字符串强制转换为数字,则可以将其简化为:

+atob('MDMuMTQ')

哇!那真的很聪明!
kukac67

9
@NateEldredge这是字符串连接,不是算术运算。
tomsmeding

+这里被接受使用吗?
phuclv 2014年

1
我发现Javascript解决方案是最优雅的,我打算发布我的Java解决方案,直到我发现其中有一个'4':atob('My4xNA =='),大声笑。
rdev5

1
@丹尼斯,你是对的,它仍然存在。如果我从控制台复制并粘贴结果,它也在那里。我对此不满意,因此我将恢复到16字节解决方案。
nderscore 2014年

39

Haskell,41个字节

什么时候是澳大利亚的pi日?

p=(\(a:n:y:t:i:m:e:_)->[m,a,t,e])['.'..]

编辑添加:像其他Haskell答案一样,它输出一个字符串,因此也带有引号。您可以得分33,并且严格遵守规则,但这并不那么有趣:

p=putStr$map([','..]!!)[7,2,5,8]

哈哈,哇。很好!
Ry-

您能解释一下为什么可行吗?
yhager 2014年

5
我非常喜欢这个,+ 1。但是我认为从技术上讲,“ ..”正在调用增量运算符,这是被禁止的。(实际上,upvoting也将调用增量操作,因此也应予以禁止;-)
Marc van Leeuwen 2014年

实际上,我确实考虑过这一点-我得到的答案更短:p=[2.9,2.92..]!!([0,6..]!!2)...而且在此..看来确实是错误的。但是Haskell是强类型的,我给出的答案的增量Char不是,也不Num是算术-实际上是被禁止的。我需要fromEnum将字符转换回数字以这种方式使用它们。无论如何,我的良心很清楚:)
bazzargh 2014年

6
@yhager:['。'..]是字符序列“ ./0123456 ...”(等)。(a:n:y:t:i:m:e:_)是一种模式匹配,它抽取出前7个字符,[m,a,t,e]将其中的4个重新排序为“ 3.14”。知道这就是您要执行的操作,这就是搜索字典以查找具有正确结构的单词的问题。我做了...例如另一对是“最丑的衣服”。然后你想出一个笑话:)
bazzargh

32

摩尔斯电码,33字节

morse -d ...-- .-.-.- .---- ....-

从技术上讲,信息仅占用21个字节。


11
我们在这里肯定需要摩尔斯电码的更多高尔夫解决方案...
不再

26
从技术上来说,我要说的是21 ,而不是字节
Michael M.14年

14
@Michael因为莫尔斯电码可以是点,破折号或空格,所以存储1个操作是否需要超过1位?
smcg 2014年

5
@smcg ButSpacesAreForWeakPeopleWhoCan'tReadThingsLikeThis
科尔·约翰逊,

8
尽管我喜欢摩尔斯电码(因此也喜欢此解决方案),但并非不违反规则3:“您不得使用您的语言可能具有的任何预定义变量/常量来代替3、1和4。” 甚至规则2:“数字3、1、4可能不会出现在您的代码中的任何地方。”?
kratenko 2014年

27

J- 15 11 10个字符

使用Fantasy使其更短i:

6{i:6.28j8

解释:

  • 6.28j8 -复数6.28 + 8i。
  • i:-这就是魔术发生的地方。i:在复数A + Bi上,B≠0从间隔[-A,A]中获取B + 1个等距点。
  • 6{ -以索引6处的元素为准,恰好是3.14。

以前,我们有以下废话:

|.'.'2}":22b8d5

爆炸解释:

         22b8d5  NB. 8d5 in base 22 = 4163
       ":        NB. convert to string
  '.'2}          NB. change character at index 2 to '.'
|.               NB. reverse to make '3.14'

代替|.'.'2}":22b8d5,您可以通过选择一个不需要逆转的数字来保存2个字符:'.'1}":16bbc6
Rationalis

3
@epicwisdom禁止数字3、1、4。我在表格使用数量41X3,因为我只允许在索引0修改字符和2
algorithmshark

20

Linux命令行,35个字节

这是一个遥不可及的胜利,但在这里是出于乐趣:

ping -w2 67502862|grep -oP '.\..\d'

输出(2秒后):

$ ping -w2 67502862|grep -oP '.\..\d'
3.14
$

引用问题:“没有网络请求。”
门把手

9
@Doorknob ICMP回显请求!= Web请求。无论如何,ping都是4.6.3.14,我没有收到任何答复,因此它不像我从互联网上得到了任何有用的信息
Digital Trauma 2014年

10
@Doorknob但是,如果这仍然困扰您,我们可以这样做:;ping -t${#?} -qc2 67502862|grep -oP '.\..\d'。这会将TTL设置为1,因此路由器将丢弃传出的ICMP回波,直到它到达互联网附近为止
Digital Trauma 2014年

1
您可以使用保存9 s ping -w2 67502862。(忍者编辑,因为在我向w1提出建议之前,几乎违反了规则。)
lolesque 2014年

@lolesque谢谢。虽然不会提高高尔夫成绩;-)
Digital Trauma 2014年

16

GolfScript,18 13 12

'.'.`,\.,n`,

旧版本:

'...','.'.,'....',

这是非常艺术的作品,只有3个独特的角色!;)

这个怎么运作:

# cmd   # stack
'...',  # 3
'.'.    # 3 '.' '.'
,       # 3 '.' 1
'....', # 3 '.' 1 4

这是12字符版本(更有趣的是IMO)的说明:

'.' # '.'
.`, # '.' 3
\.  # 3 '.' '.'
,   # 3 '.' 1
n`, # 3 '.' 1 4

它是因为n`,4,因为n`'"\n"'。的逻辑相同'.'`,。它还交换而不是创建新字符串来保存字符(感谢@algorithmshark)。

备用版本:

'pi ','.'.,'day!',

要么

'Hi ','.'.,'PPCG',

或那些字符串中的任何东西,真的。:P


只有3个不同的角色,很酷:)
aditsu 2014年

'.'.`,\.,n`,工作保存字符?'.'通过复制和交换来重复使用。
algorithmhark

@algorithmshark是的,谢谢!
门把手

这非常聪明!+1
VisioN 2014年

这看起来像莫尔斯电码版本
2014年

14

OP的答案。

Mathematica,21 20 18

这感觉便宜...

Range[2,5,.06][[20]]

要么

Range[2,5,.02][[58]]

弄清楚如何制作它18:

Range[-.86,5][[5]]

哈斯克尔,49 48 12

(48个包含换行符)

p=[-6..]
r=concat$show(p!!9):".":(show$p!!20):[]

通过调用该r函数运行它。

使用上面与Mathematica相同的方法,可以将其键入GHCi:

[-2.86..]!!6

爪哇,87 86

class P{public static void main(String[]a){System.out.print("tri".length()+"."+0xe);}}

斯卡拉,27岁

Score_Under建议从Java翻译。(我不太了解Scala)

print("tri".length+"."+0xe)

哦,0xe很聪明。您介意我通过这种方式改善JS答案吗?;)
Martin Ender 2014年

大多数Java都可以直接转换为scala,如果您真的想节省字节数,通常会更短-如果您将其用作脚本,则整个过程就是:print(“ tri” .length +“。” + 0xe)
Score_Under

是的,我想到的是同一件事,在Julia中,这要短于 [-.86:5][5]11,但由于范围只是数学,所以它没有算在内。
gggg 2014年

12

重击,50

帮助/错误消息不是外部资源,而是命令的输出!

如果有什么是违反规则的,那就是。它使用STDERR了确切命令给出的帮助消息的巧合

ping6

长度为314个字符(至少在Ubuntu 13.10上具有iputils-121221)。编辑:我很欣赏,这比我预期的要轻得多。

m=`ping6|&wc -c`
false
o=$?
echo ${m:0:o}.${m:o:2}

第一行采用帮助消息的字符长度,并将其存储在变量中。

就像我的其他答案一样,接下来的几行通过获取退出状态获得数字1 false(不是很方便,但这毕竟是!),然后使用该值在最后一行插入小数点

输出: 3.14


您是天才吗
2014年

1
嗯,在Ubuntu 12.04(iputils-101006)上为“ 2.81”。+1相同;-)
数字创伤2014年

@DigitalTrauma根据info ping6我的iputils-121221


2
甚至更短:ping6|&wc -c|sed 's/./&./'
malkaroee 2014年

11

Bash + TeX 28字节

如果您安装了TeX:

tex -v|head -c8|cut -d\  -f2

随着软件的改进,TeX的版本号逐渐接近pi。因此,随着时间的流逝,您可以使用此(不一致)实现来打印越来越多的数字!

tex -v|cut -d\  -f2 | head -n1

2011年印制了3.1415926。截至2014年1月,它将打印3.14159265。


我喜欢这个!
gniourf_gniourf 2014年

您可以tex -v|grep -oP '.\..\d'用来保存4个字节。(正则表达式从DigitalTrauma的答案中被盗。)不管怎样,+1是因为我只是想到了相同的答案。
ace_HongKong独立2014年

10

JavaScript,20个字节

'...'.length+'.'+0xe

在控制台中使用它,以便直接打印结果。否则,alert(...)将再添加7个字符。

与我的其他答案相同,我只是注意到JS中的代码要短得多。

0xe在OP的允许下,使用OP的想法来自OP的提交。


1
很好,您可以使用它:)
kukac67

1
备用20字节解决方案:(x='.'+0xE).length+x
nderscore 2014年

@nderscore这是一个非常整洁的想法。如果您将其发布为其他答案,则将得到我的好评;)
Martin Ender

10

GNU日期,17个字节

date -d2/5 +%u.%y

这个只能保证今年有效,但是我认为有关规则没有任何限制;-)

+仅仅是表示格式说明符的开始date,而不是一个算术加法。与相同-,表示输入日期。

输出:

$ date -d2/5 +%u.%y
3.14
$

only guaranteed to work this year很好.. :)
kukac67

10

Bash,17个字节

tr 0 .<<<$[62#MC]

Dash,41个字节

perl -pechomp,s/./$./<<$


..










.

Bash会大声抱怨丢失的结束标记,而Dash不会,因此没有错误消息的Bash解决方案将需要两个额外的字节。
丹尼斯

+1。我猜@TheDoctor忘记单击upvote按钮?
Digital Trauma 2014年

@DigitalTrauma糟糕...已修复
TheDoctor 2014年

7

重击23 22

seq 2 .02 5|sed -n 58p

壳牌(无历史扩展)20

seq 2 .02 5|sed 58!d

seq 2 .06 5|sed -n 20p也可以按照OP的Mathematica答案中的说明进行操作。
user80551 2014年

sed 58!d稍微短一点。
丹尼斯

@Dennis Weird,gnome-terminal的替代品!ddpkg ...这是我运行的最后一个以开头的命令d。可以正常工作,ksh但是zshzsh: event not found: d肯定可以代替某些东西。
user80551 2014年

那是因为Bash的历史扩展。默认情况下,它对于脚本是禁用的,因此,如果将相同的命令保存在pi.sh并执行bash pi.sh,它将正常工作。
丹尼斯

6

Python,39或28、47或34

(感谢Score_Under打了这么多高尔夫球)

print"%s.%s%c"%(len('aaa'),len('a'),52)

+ 这是字符串连接运算符,而不是加法运算符。

复制0xeOP中的技巧,这是@psal的28个字符

print('%X.%s'%(675,0xE))[2:]

旧版本:

print str(len('aaa'))+'.'+str(len('a'))+chr(52)

print str(len('aaa'))+'.'+str(0xe)

print"%s.%s"%(len('aaa'),0xe)

可以通过在打印后删除空格并使用“%s”格式代替str()来缩短第二个。cf print"%s.%s"%(len('aaa'),0xe)为29个字节。您也可以对第一个进行相同操作:print"%s.%s%c"%(len('aaa'),len('a'),52)39个字节。
2014年

@Score_Under哦,我以为%s仍需要使用str。感谢您的提示:)
ace_HongKongIndependence 2014年

1
另一个29字节的解决方案:print('%s,%s'%(0xE9,0xE))[2:]
onionpsy 2014年

1
...并以28个字节为单位:print('%X.%s'%(675,0xE))[2:]
onionpsy 2014年

5

GolfScript,8个字节

'??.'(\(

该程序包含不可打印的ASCII字符,因此无法在此处直接粘贴。而是,上面代码中的问号应替换为字节030E以十六进制表示。

为了方便起见,这是实际程序的十六进制转储。Unix / Linux用户可以通过运行此十六进制转储xxd -r来重建程序:

0000000: 2703 0e2e 2728 5c28                      '...'(\(

说明:

  • 程序的前五个字节形成一个单引号字符串文字,用ASCII码3、14和46(= ASCII周期)编码三个字符。

  • (将字符串中的第一个字符切掉,并将其ASCII码(3)压入堆栈。 \交换堆栈上的前两个项目,将字符串拉回顶部,第二个(将字符串中的另一个字符砍掉,再次将其ASCII码(14)推入堆栈。

因此,在程序末尾,堆栈(不包括空输入字符串)如下所示:

3 "." 14

在程序结束时,GolfScript解释器的默认行为是对所有内容进行字符串化和打印,从而产生所需的输出。


1
快点!我有完全相同的想法,只迟了12个小时。我想我应该在发布前先阅读第2页...哦,回滚,为您+1。
丹尼斯

5

bash-39

我们都知道,Pi的前几位数可以从以下语句计算得出:

请给我一大杯咖啡

我们只需要保留两位小数,对吗?

m=May
i=I
h=have
echo ${#m}.${#i}${#h}

4

Mathematica-78

DateList["March"<>ToString@FromDigits@"E"]~DateString~{"MonthShort",".","Day"}

本着Pi Day的精神!:D
kukac67 2014年

4

Perl,15个 20字节

print 05706=~s/0/./r
print 0xbc6=~s/0/./r

PI__不是与Pi有关的常数吗?
Llamageddon 2014年

这不是一个常数。这是两个字符串进行异或运算。
nderscore 2014年

不允许按位运算符。
kukac67

哦,不是。好吧,这里有我的假设解决方案。就是说,如果不允许按位运算符,除了计算字符串的长度之外,还有其他要做的事情吗?
Llamageddon

有几个答案使用不同基数的数字。
kukac67

4

tr + Bash,17个字节

tr a-j 0-9<<<d.be

-这里的字符不是算术减法运算符。它们指示范围。

输出:

$ tr a-j 0-9<<<d.be
3.14
$

聪明,尽管字符翻译实际上是隐藏的算法。
皮埃尔·阿洛德

@ArlaudPierre是的,尽管我会争辩说这里几乎所有解决方案都以一种或另一种方式隐藏了算术。如果您查看针对这些答案中的任何一个执行的实际机器指令,我认为它们都具有一些按位或算术指令,这些指令禁止该问题显式使用它们。
Digital Trauma

@ArlaudPierre该问题要求输出字符串“ 3.14”。无论使用哪种语言,在引擎盖下的某个地方,这都会退化为write()通话或类似内容。如果没有其他地方,那么在幕后必定会有一些算法来确保写入正确的字节数。我认为问题的关键隐藏必要的算术/按位计算。
Digital Trauma 2014年

4

重击,57

这比大多数答案要长,但是尝试也没有什么不好。

f=`echo aaaaaaaaaaaaa|wc -c`;e=`echo aa|wc -c`;echo $e.$f

3.14

3
抱歉,重新搜索每个人的答案:P,与此同时,我也发现了这一点:c=wc\ -c;echo `$c<<<..`.`$c<<<''``$c<<<...`
Score_Under 2014年

4

C,36

main(){printf("%d\b.%o\b",' ','`');}

1
如果我们将其与我的答案结合起来,我们可以节省2个字节以获得34分main(){printf("%d\b.%d",' ',0xe);}
vsz 2014年

3

JavaScript-23个字节

atob('Mw')+atob('LjE0')

感谢nderscore(请参阅他的评论)!


尼斯:DI甚至都不知道这一点
kukac67 2014年

它包含4虽然;)
nderscore 2014年

@nderscore啊!你是对的!将btoa()工作就是让3.14不知何故?
kukac67

@ kukac67 base64字符集不包含句点:(
nderscore 2014年

3
23个字节的“合法”版本:atob('Mw')+atob('LjE0')和14个字节的“非法”版本:atob("My4xNA")
nderscore 2014年

3

C#

 ((int)'ĺ').ToString("#\\.##");

ĺ是字符314,不是预定义的变量或常数。.ToString将输出格式化为一个数字,一个句点,然后再加上2个数字。


很好,但是当前不输出,并且不能编译。
鲁迪·克肖

Console.Write((((int)'ĺ')。ToString(“#\\。##”)));
Grax32

3

高尔夫脚本,13 10

{xy}.*'.'\

感谢Ilmari Karonen的改进版本!

xy是不可打印的字符(见http://www.asciitable.com/更多信息),分别ETXSO,其解码为3和14。

该代码的作用应该很清楚。

注意:以下规则

You may not use any predefined variables/constants that your language may have as a replacement for 3, 1, and 4. (Author's discretion)

因为ASCII字符既不是变量也不是常量,所以不会被破坏。


The digits 3, 1, and 4 may not appear anywhere in your code.Your program cannot require input of any kind (besides running it).
2014年

数字不会出现在任何地方。没有输入。
Vereos 2014年

您的最终代码是...?
user80551 2014年

{}.*.{}.*,括号内有2个不可打印的字符,分别为(asciitable.comETXSO
Vereos 2014年

2
您可以将其缩短为{xy}.*'.'\ (10个字符)。我的还短。;-)但是+1教给我{ }.*(和{ }.%)的知识,我必须牢记这个技巧。
Ilmari Karonen 2014年

3

该网站的新功能,尚无法发表评论,因此我将在此处发布。只是想知道这个Javascript解决方案:

'...'.length+'.'+0xe

和这个规则:

3.14是唯一可以输出的内容,它不能成为某些较长/较大输出的一部分。

如果在浏览器控制台中运行此代码,则会得到:

"3.14"

或在命令行上使用Node:

'3.14'

但是如果我运行此代码:

parseFloat('...'.length+'.'+0xe)

我得到:

3.14

使用Node.js运行.js文件,我可以编写:

console.log('...'.length+'.'+0xe)

并得到:

3.14

1
最终值可以是哪种类型从来没有限制。因此,字符串或数字无关紧要。字符串周围的引号不被视为输出的一部分。
nderscore 2014年

欢迎来到CodeGolf和编程难题@RobertMunn!这个答案是正确的,因为它遵循所有规则...请记住,console在显示字符串时倾向于将字符串包装在引号中...您已经使用过,+但不是算术上,它被用作连接器,因此是有效的...另外您本可以使用alert而不是console.log... 来使它变小。我们希望您在这里喜欢...
WallyWest

太好了!您应该考虑添加语言名称和字节数(例如Javascript,20)
Vereos 2014年

1
谢谢Ace,我只是在这里学习规则。我不能发表评论,所以我分开发表了,我想这更多是对规则类型的澄清,nderscore和WallyWest为我澄清了。我感谢每个人对新手的耐心。
罗伯特·芒

2

Mathematica,56个字节

(l=ToString@StringLength@#&)@"..."<>"."<>l@"."<>l@"...."

没什么好说的。我将数字生成为字符串长度并将其连接起来。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.