পূর্ণাঙ্গ জটিলতা


29

আপনার টাস্কটি এমন একটি প্রোগ্রাম লিখতে হবে যা ইনপুট এন এ, প্রতিটি সংখ্যার ন্যূনতম এক্সপ্রেশনটি n এর মাধ্যমে অর্পণ করে। বাইটের মধ্যে সংক্ষিপ্ততম প্রোগ্রামটি জিতেছে।

একটি ন্যূনতম এক্সপ্রেশনটি সংখ্যার সাথে সংখ্যায় কম 1 ব্যবহার করে প্রদত্ত সংখ্যার ফলে 1 এবং এর যোগ এবং গুণনের সাথে মিলিত হয়। উদাহরণস্বরূপ, এগারোটি 23হিসাবে প্রকাশ করা 23=((1+1+1)(1+1)+1)(1+1+1)+1+1হয়, যা সর্বনিম্ন।

প্রয়োজনীয়তা:

  1. প্রোগ্রামটি অবশ্যই ইনপুট হিসাবে ইতিবাচক প্রাকৃতিক সংখ্যা নেবে।
  2. আউটপুট অবশ্যই এই ফর্ম্যাটে থাকতে হবে: 20 = ((1+1+1)(1+1+1)+1)(1+1)
  3. আপনার আউটপুটে অকারণে প্রথম বন্ধনী নাও থাকতে পারে 8 = ((1+1)(1+1))(1+1)
  4. গুণ চিহ্নটি *isচ্ছিক।
  5. স্পেসগুলি alচ্ছিক।
  6. আপনি আউটপুট দেওয়া মান সব সম্ভব সমীকরণ হবে না: উদাহরণস্বরূপ, আপনি আউটপুট চয়েস থাকে 4=1+1+1+1বা 4=(1+1)(1+1)। আপনি উভয় আউটপুট করতে হবে না।
  7. প্রতিটি ভাষায় সংক্ষিপ্ততম প্রোগ্রাম (বাইটে) জয়লাভ করে।
1 = 1
2 = 1 + 1 টি
3 = 1 + 1 + 1
4 = 1 + 1 + 1 + 1
5 = 1 + 1 + 1 + 1 + 1
6 = (1 + 1 + 1) (1 + 1)
7 = (1 + 1 + 1) (1 + 1) +1
8 = (1 + 1 + 1 + 1) (1 + 1)
9 = (1 + 1 + 1) (1 + 1 + 1)
10 = (1 + 1 + 1) (1 + 1 + 1) +1
11 = (1 + 1 + 1) (1 + 1 + 1) + 1 + 1
12 = (1 + 1 + 1) (1 + 1) (1 + 1)
13 = (1 + 1 + 1) (1 + 1) (1 + 1) +1
14 = ((1 + 1 + 1) (1 + 1) +1) (1 + 1)
15 = (1 + 1 + 1 + 1 + 1) (1 + 1 + 1)
16 = (1 + 1 + 1 + 1) (1 + 1) (1 + 1)
17 = (1 + 1 + 1 + 1) (1 + 1) (1 + 1) +1
18 = (1 + 1 + 1) (1 + 1 + 1) (1 + 1)
19 = (1 + 1 + 1) (1 + 1 + 1) (1 + 1) +1
20 = ((1 + 1 + 1) (1 + 1 + 1) +1) (1 + 1)

এখানে আরও কয়েকটি পরীক্ষার কেস দেওয়া আছে: (মনে রাখবেন, একই সংখ্যার 1 এর সাথে অন্যান্য এক্সপ্রেশনগুলিও অনুমোদিত)

157=((1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1

444=((1+1+1)(1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)

1223=((1+1+1)(1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)(1+1+1+1+1)+1+1+1

15535=((((1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)((1+1+1)(1+1)+1)+1)(1+1+1)+1)(1+1+1)(1+1+1)+1

45197=((((1+1+1)(1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1+1)+1+1

শুভকামনা! - কচ্ছপ


1
1) আপনার বুলেট # 6 টি সমাপ্ত হয়নি (এটির জন্য উদাহরণ আউটপুটটি অনুপস্থিত n=20) এবং 2) আপনি শুরুতেই বলেছিলেন যে সমীকরণের জটিলতা, যা সমীকরণ থেকে পৃথক, আউটপুট হতে হবে, তবে আপনি এটিতে অন্তর্ভুক্ত করবেন না একেবারে প্রথম উদাহরণ ব্যতীত অন্য কোনও উদাহরণ।
এল'েন্ডিয়া স্টারম্যান

আমি এখনও পরিষ্কার না। আপনি কি কেবল সমীকরণটি আউটপুট করেন?
xnor

হ্যাঁ। পূর্ণসংখ্যা জটিলতা আউটপুট করা উচিত নয়। আমি এটাও স্পষ্ট করে বলব। ভুলের জন্য দুঃখিত. :(
টার্টল

উফফ, আমি আপনার প্রয়োজনীয়তার তালিকায় বুলেট # 5 বলেছিলাম যখন আমি # 5 গুলি বলেছিলাম। অন্য সমস্যা হিসাবে, এটি সংশোধন করার জন্য ধন্যবাদ। :)
এল'েন্দিয়া স্টারম্যান

1
সম্পর্কিত: oeis.org/A005245 oeis.org/A061373 এবং অবশেষে oeis.org/A091333
flawr

উত্তর:


10

পাইথ, 60 বাইট

LjWqeb\1b`()L?tbho/N\1++'tb"+1"m+y'/bdy'df!%bTr2b1VSQ++N\='N

প্রদর্শন

পাইথের স্বয়ংক্রিয় ফাংশন স্মৃতিচারণের জন্য ধন্যবাদ, অনলাইন সংকলক সময় শেষ হওয়ার আগে 1223 এ পৌঁছাতে পারে।

1223=((1+1+1)(1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)(1+1+1+1+1)+1+1+1

বিরক্তিকর নোটে

1223=(3^5+1)*5+3

এটি একটি পুনরাবৃত্ত ফাংশন ব্যবহার করে ', যা সমস্ত সম্ভাব্য পণ্য এবং অঙ্কগুলি গণনা করে যা কাঙ্ক্ষিত আউটপুট দিতে পারে, প্রতিটি চূড়ান্ত ক্রিয়াকলাপের সাথে সংক্ষিপ্ততম স্ট্রিংটি খুঁজে পায়, তারপরে তাদের 1গণনা করে তুলনা করে এবং প্রথমটি প্রদান করে।

এটি একটি সহায়ক ফাংশন ব্যবহার করে y, যা কোনও এক্সপ্রেশনকেই প্রথম বন্ধনীকরণের প্রয়োজন হলে তা বন্ধুত্বপূর্ণ করে।

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

আউটপুট এর চূড়ান্ত লাইন:

15535=((((1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)((1+1+1)(1+1)+1)+1)(1+1+1)+1)(1+1+1)(1+1+1)+1

real    7m8.430s
user    7m7.158s
sys 0m0.945s

সংক্ষিপ্ত বিবৃতিতে,

15535=(((3^4+1)*(3*2+1)+1)*3+1)*3^2+1

7

সিজেম, 105 102 98 96 বাইট

q~{)'=1$2,{:I{I1$-'+}%3/1>Imf'*+aImp!*+{)\{j}%\+}:F%{e_"+*"-:+}$0=}j2,{F)_'*={;{'(\')}%1}&*}jN}/

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

টেস্ট রান

বৃহত্তর পরীক্ষার ক্ষেত্রে অনলাইন দোভাষীটি খুব ধীর। এমনকি জাভা ইন্টারপ্রেটারের সাথেও, বৃহত্তর পরীক্ষার কেসগুলিতে একটি দীর্ঘ সময় লাগবে এবং উল্লেখযোগ্য পরিমাণ মেমরির প্রয়োজন হবে।

$ time cjam integer-complexity.cjam <<< 157
1=1
2=1+1
3=1+1+1
4=1+1+1+1
5=1+1+1+1+1
6=(1+1)(1+1+1)
7=1+(1+1)(1+1+1)
8=(1+1)(1+1)(1+1)
9=(1+1+1)(1+1+1)
10=1+(1+1+1)(1+1+1)
11=1+1+(1+1+1)(1+1+1)
12=(1+1)(1+1)(1+1+1)
13=1+(1+1)(1+1)(1+1+1)
14=(1+1)(1+(1+1)(1+1+1))
15=(1+1+1)(1+1+1+1+1)
16=(1+1)(1+1)(1+1)(1+1)
17=1+(1+1)(1+1)(1+1)(1+1)
18=(1+1)(1+1+1)(1+1+1)
19=1+(1+1)(1+1+1)(1+1+1)
20=(1+1)(1+1)(1+1+1+1+1)
21=(1+1+1)(1+(1+1)(1+1+1))
22=1+(1+1+1)(1+(1+1)(1+1+1))
23=1+1+(1+1+1)(1+(1+1)(1+1+1))
24=(1+1)(1+1)(1+1)(1+1+1)
25=1+(1+1)(1+1)(1+1)(1+1+1)
26=(1+1)(1+(1+1)(1+1)(1+1+1))
27=(1+1+1)(1+1+1)(1+1+1)
28=1+(1+1+1)(1+1+1)(1+1+1)
29=1+1+(1+1+1)(1+1+1)(1+1+1)
30=(1+1)(1+1+1)(1+1+1+1+1)
31=1+(1+1)(1+1+1)(1+1+1+1+1)
32=(1+1)(1+1)(1+1)(1+1)(1+1)
33=1+(1+1)(1+1)(1+1)(1+1)(1+1)
34=(1+1)(1+(1+1)(1+1)(1+1)(1+1))
35=(1+1+1+1+1)(1+(1+1)(1+1+1))
36=(1+1)(1+1)(1+1+1)(1+1+1)
37=1+(1+1)(1+1)(1+1+1)(1+1+1)
38=(1+1)(1+(1+1)(1+1+1)(1+1+1))
39=(1+1+1)(1+(1+1)(1+1)(1+1+1))
40=(1+1)(1+1)(1+1)(1+1+1+1+1)
41=1+(1+1)(1+1)(1+1)(1+1+1+1+1)
42=(1+1)(1+1+1)(1+(1+1)(1+1+1))
43=1+(1+1)(1+1+1)(1+(1+1)(1+1+1))
44=(1+1)(1+1)(1+1+(1+1+1)(1+1+1))
45=(1+1+1)(1+1+1)(1+1+1+1+1)
46=1+(1+1+1)(1+1+1)(1+1+1+1+1)
47=1+1+(1+1+1)(1+1+1)(1+1+1+1+1)
48=(1+1)(1+1)(1+1)(1+1)(1+1+1)
49=1+(1+1)(1+1)(1+1)(1+1)(1+1+1)
50=(1+1)(1+1+1+1+1)(1+1+1+1+1)
51=(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
52=(1+1)(1+1)(1+(1+1)(1+1)(1+1+1))
53=1+(1+1)(1+1)(1+(1+1)(1+1)(1+1+1))
54=(1+1)(1+1+1)(1+1+1)(1+1+1)
55=1+(1+1)(1+1+1)(1+1+1)(1+1+1)
56=(1+1)(1+1)(1+1)(1+(1+1)(1+1+1))
57=(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
58=1+(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
59=1+1+(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
60=(1+1)(1+1)(1+1+1)(1+1+1+1+1)
61=1+(1+1)(1+1)(1+1+1)(1+1+1+1+1)
62=(1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
63=(1+1+1)(1+1+1)(1+(1+1)(1+1+1))
64=(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
65=1+(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
66=(1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
67=1+(1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
68=(1+1)(1+1)(1+(1+1)(1+1)(1+1)(1+1))
69=1+(1+1)(1+1)(1+(1+1)(1+1)(1+1)(1+1))
70=(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
71=1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
72=(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
73=1+(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
74=(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
75=(1+1+1)(1+1+1+1+1)(1+1+1+1+1)
76=(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1))
77=1+(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1))
78=(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
79=1+(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
80=(1+1)(1+1)(1+1)(1+1)(1+1+1+1+1)
81=(1+1+1)(1+1+1)(1+1+1)(1+1+1)
82=1+(1+1+1)(1+1+1)(1+1+1)(1+1+1)
83=1+1+(1+1+1)(1+1+1)(1+1+1)(1+1+1)
84=(1+1)(1+1)(1+1+1)(1+(1+1)(1+1+1))
85=1+(1+1)(1+1)(1+1+1)(1+(1+1)(1+1+1))
86=(1+1)(1+(1+1)(1+1+1)(1+(1+1)(1+1+1)))
87=(1+1+1)(1+1+(1+1+1)(1+1+1)(1+1+1))
88=(1+1)(1+1)(1+1)(1+1+(1+1+1)(1+1+1))
89=1+(1+1)(1+1)(1+1)(1+1+(1+1+1)(1+1+1))
90=(1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
91=1+(1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
92=1+1+(1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
93=(1+1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
94=1+(1+1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
95=(1+1+1+1+1)(1+(1+1)(1+1+1)(1+1+1))
96=(1+1)(1+1)(1+1)(1+1)(1+1)(1+1+1)
97=1+(1+1)(1+1)(1+1)(1+1)(1+1)(1+1+1)
98=(1+1)(1+(1+1)(1+1+1))(1+(1+1)(1+1+1))
99=(1+1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
100=(1+1)(1+1)(1+1+1+1+1)(1+1+1+1+1)
101=1+(1+1)(1+1)(1+1+1+1+1)(1+1+1+1+1)
102=(1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
103=1+(1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
104=(1+1)(1+1)(1+1)(1+(1+1)(1+1)(1+1+1))
105=(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
106=1+(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
107=1+1+(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
108=(1+1)(1+1)(1+1+1)(1+1+1)(1+1+1)
109=1+(1+1)(1+1)(1+1+1)(1+1+1)(1+1+1)
110=1+1+(1+1)(1+1)(1+1+1)(1+1+1)(1+1+1)
111=(1+1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
112=(1+1)(1+1)(1+1)(1+1)(1+(1+1)(1+1+1))
113=1+(1+1)(1+1)(1+1)(1+1)(1+(1+1)(1+1+1))
114=(1+1)(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
115=1+(1+1)(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
116=(1+1)(1+1)(1+1+(1+1+1)(1+1+1)(1+1+1))
117=(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
118=1+(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
119=(1+(1+1)(1+1+1))(1+(1+1)(1+1)(1+1)(1+1))
120=(1+1)(1+1)(1+1)(1+1+1)(1+1+1+1+1)
121=1+(1+1)(1+1)(1+1)(1+1+1)(1+1+1+1+1)
122=(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1+1+1))
123=(1+1+1)(1+(1+1)(1+1)(1+1)(1+1+1+1+1))
124=(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
125=(1+1+1+1+1)(1+1+1+1+1)(1+1+1+1+1)
126=(1+1)(1+1+1)(1+1+1)(1+(1+1)(1+1+1))
127=1+(1+1)(1+1+1)(1+1+1)(1+(1+1)(1+1+1))
128=(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
129=1+(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
130=(1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1+1))
131=1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1+1))
132=(1+1)(1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
133=(1+(1+1)(1+1+1))(1+(1+1)(1+1+1)(1+1+1))
134=1+(1+(1+1)(1+1+1))(1+(1+1)(1+1+1)(1+1+1))
135=(1+1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
136=1+(1+1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
137=1+1+(1+1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
138=(1+1)(1+1+1)(1+1+(1+1+1)(1+(1+1)(1+1+1)))
139=1+(1+1)(1+1+1)(1+1+(1+1+1)(1+(1+1)(1+1+1)))
140=(1+1)(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
141=1+(1+1)(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
142=(1+1)(1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1)))
143=(1+1+(1+1+1)(1+1+1))(1+(1+1)(1+1)(1+1+1))
144=(1+1)(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
145=1+(1+1)(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
146=(1+1)(1+(1+1)(1+1)(1+1)(1+1+1)(1+1+1))
147=(1+1+1)(1+(1+1)(1+1+1))(1+(1+1)(1+1+1))
148=(1+1)(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
149=1+(1+1)(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
150=(1+1)(1+1+1)(1+1+1+1+1)(1+1+1+1+1)
151=1+(1+1)(1+1+1)(1+1+1+1+1)(1+1+1+1+1)
152=(1+1)(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1))
153=(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
154=1+(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
155=(1+1+1+1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
156=(1+1)(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
157=1+(1+1)(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))

real    0m3.896s
user    0m4.892s
sys     0m0.066s

পর্যাপ্ত সময় দেওয়া, এটি পরবর্তী পরীক্ষার ক্ষেত্রে এই সমাধানগুলি উত্পাদন করে:

444=(1+1)(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
1223=1+1+(1+1+1)(1+1+(1+1+1)(1+1+1))(1+(1+1)(1+1)(1+1+1)(1+1+1))

এটা কিভাবে কাজ করে?
flawr

@ ফ্লোয়ার আমি এখনও আরও কিছুটা গল্ফের আশা করছি। আমি শেষ হয়ে গেলে / ছেড়ে দিলে আমি একটি ব্যাখ্যা যুক্ত করব।
ডেনিস

4

জুলিয়া, 229 বাইট

n->(F=i->K[i]>0?E[i]:"("E[i]")";C=[1;3:n+1];K=0C;E=fill("1",n);for s=1:n for i=1:s÷2 (D=C[i]+C[s-i])<C[s]?(C[s]=D;E[s]=E[i]"+"E[s-i];K[s]=0):s%i>0||(D=C[i]+C[j=s÷i])<C[s]&&(C[s]=D;E[s]=F(i)F(j);K[s]=1)end;println("$s="E[s])end)

এটি আসলে বেশ দ্রুত। ফাংশনটি নির্ধারণ fএবং চলমান @time f(15535)আউটপুট দেয় (কেবলমাত্র শেষ দুটি লাইন)

15535=1+(1+1+1)(1+1+1)(1+(1+1+1)(1+(1+(1+1)(1+1+1))(1+(1+1+1)(1+1+1)(1+1+1)(1+1+1))))
32.211583 seconds (263.30 M allocations: 4.839 GB, 4.81% gc time)

এবং জন্য @time f(45197), এটা দেয়

45197=1+1+(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1+1)(1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1)(1+1+1))))
289.749564 seconds (2.42 G allocations: 43.660 GB, 4.91% gc time)

সুতরাং, কোড কি করছে? সরল - সংখ্যার জন্য Cবর্তমানের Cএকাউন্টটি ধরে রাখে, বন্ধনীর Kসাথে লেনদেনের উদ্দেশ্যে এক্সপ্রেশনটি মূলত, যোগফল বা কোনও পণ্য, কিনা তা খতিয়ে রাখার একটি সূচক অ্যারে এবং এক্সপ্রেশনটি নিজেই Eধরে রাখে E। এর মধ্য s=1দিয়ে যেতে চেষ্টা nকরে কোডটি sযোগফল বা কোনও পণ্য অনুসন্ধান করে নিম্ন মানের ক্ষেত্রে সংখ্যার সর্বনিম্ন উপস্থাপনের জন্য অনুসন্ধান করে । যদি এটি কোনও পণ্য হয়, তবে এটি দুটি উপাদান পরীক্ষা করে এবং যদি তাদের পরিমাণ হয় তবে তাদের চারপাশে বন্ধনী রাখে। Fবাইটগুলি সংরক্ষণ করার জন্য, এই চেকটি ফাংশনে করা হয় (কারণ এটি দুটি কারণের জন্য দু'বার করতে হবে)।

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