Дев'ятна картина


9

Вступ

Я наткнувся на цю (марну) картину днями, поки дивився телевізор. Я назвав його "9 візерунком", тому що перший номер, який використовував його, був 9. Суть його полягає в тому, що ви вводите число (скажімо, x ), а потім повертаєтесь назад:

  • х
  • x + ( x / 3) [назвемо це y ]
  • дві третини y [назвемо це z ]
  • z + 1

Отже, якби я помістив всередині цього шаблону число 9 як х , це вийшло б:

  • 9 ( 9 )
  • 12 ( 9 + 9/3 ) [9 понад 3 - це 3, а 9 + 3 - 12]
  • 8 ( 12 разів дві третини) [третина з 12 - 4, а 4 * 2 - 8]
  • 9 ( 8 + 1 - 9)

Виклик

Напишіть мені функцію (будь-якою мовою програмування), яка приймає число, і виводить цілий масив, використовуючи шаблон.
Приблизно такий псуедо-код:

function ninePattern(int myInt) returns IntegerArray {  
    int iterationA = myInt + (myInt / 3);  
    int iterationB = iterationA * (2 / 3); 
    int iterationC = iterationB + 1;  
    IntegerArray x = [myInt, iterationA, iterationB, iterationC];  
    return x;  
}

Роз'яснення

Обговорення викликали коментарі щодо специфікацій питання. Цей розділ призначений для уточнення деяких із них.

"краще рахувати в байтах, ніж символів"

Я вибирав персонажів, бо (як мінімум, мені було б простіше судити. Звичайно, я не можу це змінити зараз. (багато відповідей уже розміщено)

"округлення"

Закруглення слідує за цією римою:

Якщо 5 або більше, піднесіть бал
Якщо це 4 або менше, нехай відпочиває

Простіше кажучи, якщо це щось на зразок 4,7 або 3,85, округляйте їх до 5 і 4 відповідно.

Приклади

Input => Result
9 => [9, 12, 8, 9]
8 => [8, 11, 7, 8]
6 => [6, 8, 5, 6]
23 => [23, 31, 21, 22]
159 => [159, 212, 141, 142]

Якщо, однак, цифри на зразок 2.3 або 10.435446, округляйте їх до 2 та 10 відповідно.

"підтримка мови"

Ви не можете використовувати функції та / або масиви ЯКЩО ТА ТІЛЬКИ, ЯКЩО обрана вами мова не підтримує їх. Якщо це станеться (навіть якщо це збільшить кількість ваших персонажів), ви повинні їх використовувати .


1
Повинно бути результатом масиву, чи чисельності самі по собі є достатніми (як відповідь Pyth)?
— Девід

2
Ви можете обмежитися лише повноцінними програмами або просто функціями, але є дискусія щодо мета за замовчуванням, яка дає корисну основу на випадок, якщо це вплине на ваше рішення щодо майбутніх проблем. За замовчуванням виклики приймайте обидва, щоб дозволити більше мов змагатися.
— трихоплакс

1
Існують і типові параметри для введення та виводу . Знову ж таки, вам не доведеться слідувати за ними, це просто для того, щоб ви знали.
— трихоплакс

3
-1 для довільних вимог до масиву та функцій, що запобігає конкуренції мовам без типу масиву / списку або функцій.
— Мего

4
Крім того, ви повинні оцінювати учасників в байтах, а не в символах. У нас є пісочниця , де ви можете отримувати відгуки про свою публікацію, перш ніж вона з’явиться в прямому ефірі.
— Loovjo

Відповіді:


11

MarioLANG, 659 621 591 582 556 543 516 458 418 401 352 308 369 байт

округлення досить дороге: /

Спробуйте в Інтернеті

;>>[![( [( [( [( [( [<(([!)))!+(((-<>( >((+
:"==#================"===#== #=====""[ "==
)(  -[!)>>[![)  [)[<(!>)[<)) >))) [!!-[!((
 (  )"#="==#======="=#==="=<="=====##==#==<
 +  +>) )-+<>+)[!)+! +))![-[)>[ [([-[![<<:
 +  )-+ )(=""===#==#  ==#===)"=======#=====
 +  >!>)!>  !(- < !:+:))<  ))!((++)))< 
 )  "#"=#===#===" ======" ===#======="
 !
=#========================

Ну це було веселіше, ніж очікувалося, це, мабуть, не оптимально, але я здогадуюсь, що я туди потрапляю.

Час пояснення:

(для версії 352 байти)

спочатку дістаємо аргумент і друкуємо його:

;
:

досить простий

Потім ми переходимо до основної частини програми: введення поділу / 3

;>>[![              [( [( [<result
:"==#======================"======
)   -[!)>>[![        [<((((!   
)   )"#="==#=========="====#
+(  +>) )  +>(+)[!)+))!
+(  )-+ )  -"====#====#
+   >!>)!  >! -  <
    "#"=#  "#===="
 !
=#

що є дещо зміненою конверсією відділу головного мозку

[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]

які беруть для введення

n 0 d 0 0 

і поверне тобі

0 n d-n%d n%d n/d 

Як тільки ми ділимо поділ, ми використовуємо його, щоб отримати суму n і n / d та роздрукувати її

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))!
+(  )-+ )  -"====#====#
+   >!>)!  >! -  <
    "#"=#  "#===="
 !
=#

Потім нам потрібно зробити ще один поділ: (2 * (n + n / d)) / 3

тому ми отримуємо (2 * (n + n / d)

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))! 2*2n/d>[   -[![  <
+(  )-+ )  -"====#====# ======"======#====
+   >!>)!  >! -  <            !((++))<
    "#"=#  "#===="            #======"
 !
=#

і поставити його з 3 назад у відділ

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))!      )>[   -[![  <
+(  )-+ )  -"====#====#      )"======#====
+   >!>)!  >! -  <       +++))!((++))<
    "#"=#  "#====" ===========#======"
 !
=#=================

в цей момент все вибухає, Маріо застряє в нескінченному циклі, роблячи поділ на більшу і більшу кількість, назавжди.

і щоб встановити, що нам потрібен спосіб розмежувати перший і другий поділ, це врешті-решт, о, радість, у нас є спосіб

;>>[![              [( [( [<([!)!+(((-<
:"==#======================"==#)#====="
)   -[!)>>[![        [<((((!))< >))) [!(((
)   )"#="==#=========="====#)="="=====#==:
+(  +>) )  +>(+)[!)+))!!:+:)))>[   -[![  <
+(  )-+ )  -"====#====#======)"======#====
+   >!>)!  >! -  <       +++))!((++))<
    "#"=#  "#====" ===========#======"
 !
=#=================

в основному ми дивимось, якщо х в

x 0 n d-n%d n%d n/d 

дорівнює 0, якщо це означає, що ми перебуваємо на першому поділі

інакше ми перебуваємо на другому поділі, і ми просто роздруковуємо результат ділення, додаємо 1, а потім знову друкуємо

і вуаля легко як пиріг.


Ласкаво просимо до PPCG!
— Ерік Аутгольфер

Не закручується до специфікацій, наданих цим запитанням (звичайно, я оновив його після того, як ви опублікували свою відповідь, але вам слід принаймні оновити свою відповідь, щоб відповідати новим специфікаціям)
— InitializeSahib

Зроблено. в той час як ми говоримо про тестовий випадок, ви повинні додати 10, щоб мати число, яке ви округлили під час операції кулаком.
— Ефірна жаба

9

Emotinomicon 99 байт, 33 символи

😷😭,😲🆙🆙😼🆙😨😎⏬😎🆙😍➗➕🆙😨😎⏬😎😉✖😍➗🆙😨😎⏬😎😅➕😨

Пояснення:

😷                                 clear output
 😭                                begin quote string
  ,                               
   😲                              end quote string
    🆙                             duplicate top of stack
     🆙                            duplicate top of stack
      😼                           take numeric input
       🆙                          duplicate top of stack
        😨                         pop N and output as a number
         😎                        reverse stack
          ⏬                       pops and outputs top of stack as character
           😎                      reverse stack
            🆙                     duplicate top of stack
             😍                    push 3 to the stack
              ➗                   divide top two elements on stack
               ➕                  add top two elements on stack
                🆙                 duplicate top of stack
                 😨                pop N and output as a number
                  😎               reverse stack
                   ⏬              pops and outputs top of stack as character
                    😎             reverse stack
                     😉            push 2 to the stack
                      ✖           multiply top two elements on stack
                       😍          push 3 to the stack
                        ➗         divide top two elements on stack
                         🆙        duplicate top of stack
                          😨       pop N and output as a number
                           😎      reverse stack
                            ⏬     pops and outputs top of stack as character
                             😎    reverse stack
                              😅   push 1 to the stack
                               ➕  add top two elements on stack
                                😨 pop N and output as a number

3
Так, для нетрадиційних мов! : P
— user48538

4

MATL, 14 байт

Xot4*3/tE3/tQv

Спробуйте в Інтернеті

Досить простий, vоб'єднує стек у масив. Xoперетворюється на цілий тип даних, і всі операції після цього є цілими операціями.


3
Специфікація полягає у поверненні масиву, а не лише в кінцевому результаті.
— Значення чорнила

3
Також знайомтесь із тими, хто позначив їх на видалення через <2 хвилини: D
— Девід

@David D: Я не думаю, що я можу відкликати голоси про видалення
— Downgoat

@David підтримав вашу відповідь як моє співчуття :)
— InitializeSahib

1
Я майже впевнений, що це теж не функція, виправте мене, якщо я помиляюся.
— Мальтісен

4

Чеддар , 27 байт

b=8/9*$0
[$0,$0+$0/3,b,b+1]

$0є змінною з введенням. Cheddar просто не є зграбною мовою ¯ \ _ (ツ) _ / ¯, також це є неконкурентоспроможним, оскільки функція введення Cheddar була створена після цього виклику.

Безголівки:

IterationB := 8 / 9 * $0  // 8/9ths of the Input
[ $0,                     // The input
  $0 + $0 / 3,            // Input + (Input/3)
  IterationB,             // (see above)
  IterationB + 1          // above + 1
]

1
Сльози радості! Це зайшло так далеко! : D
— Conor O'Brien

3

Ява, 86 82 84 85 символів

class c{int[]i(int I){int a=I+(I/3),b=(int)(a*(2d/3d));return new int[]{I,a,b,b+1};}}

Буква, dрозміщена відразу після цілого числа, робить ціле число a double.

Безголівки:

class c{
    int[] i(int I) {
        int a = I + (I / 3),
            b = (int)(a * (2d / 3d));
        return new int[]{I, a, b, b + 1};
    }
}

Без класу ( class c{}становить 8 символів), він зменшується до 76 символів:

int[]i(int I){int a=I+(I/3),b=(int)(a*(2d/3d));return new int[]{I,a,b,b+1};}

Більш точна версія в 110 символів (118 з перерахунком) - вона використовує floats, тому що для кастингу ніхто не має місця Math#round(double):

int[]i(int I){float a=I+(I/3f),b=(a*(2f/3f));return new int[]{I,Math.round(a),Math.round(b),Math.round(b+1)};}

Я думаю, що я повинен навчитися Pyth.
— користувач8397947

5
+1, тому що ви знаєте, java
— Джеймс

1
@dorukayhan Дивно, я, здається, отримую помилку, коли я намагаюся запустити це в Eclipse, він не може перетворити з подвійного в Int. Я побачу, чи зможу я зрозуміти, у чому проблема завтра.
— Loovjo

1
Я щойно виправив код
— user8397947

1
Я бачу, але це не дає правильних результатів для входів, таких як 8 або 10. Перше додавання не працює належним чином, як I + (I / 3)використовується ціле поділ, тобто фракції відкидаються, і тому результат неправильно округлюється.
— Frozn

3

Ява, 56 80 байт

Як зазначали деякі користувачі, це рішення (як і деякі інші у Java) не округляє дані належним чином. Тому зараз я пропоную трохи довше рішення, яке має повернути правильний результат

int[]h(int a){int[]b={a,Math.round(a+a/3f),a=Math.round(a*8f/9),++a};return b;}

або 60 байт версії ламда

a->new int[]{a,Math.round(a+a/3f),a=Math.round(a*8f/9),++a}

Гольф-версія

int[]g(int a){int[]b={a,a+a/3,a*8/9,a*8/9+1};return b;}

і невольф

int[] g(int a) {
        int[] b = { a, a + a / 3, a * 8 / 9, a * 8 / 9 + 1 };
        return b;
    }

або 36 байт, визначених як лямбда

a->new int[]{a,a+a/3,a*8/9,a*8/9+1}


Не має округлення, необхідного Запитанням.
— Марв

1
Як зазначав @Marv, це питання не працює коректно, наприклад, для введення 8 очікуваний результат буде [8,11,7,8], але це [8,10,7,8]
— Frozn

навіщо знижувати? я виправив це, і він працює коректно зараз?
— user902383

Вибачте за протокол після виправлення. Нижній потік заблокований, тому я не можу його видалити, якщо ви не внесете певних змін у свою відповідь (будь-яких
— дрібницьких

@ edc65 ок, зроблено
— користувач902383

2

Java, 64 байти

int[]f(int i){return new int[]{i,i+=i/3+0.5,i-=i/3-0.5,i+=1.5};}

Примітки

  • Це необхідне вбудовування округлення, не впевнений, чи можна робити це коротше, якщо його змішують із рішенням @ user902383.

Безумовно

int[] f(int i) {
    return new int[]{
            i, 
            i += i / 3 + 0.5, 
            i -= i / 3 - 0.5, 
            i += 1.5};
}

Вихід з i = 9

[9, 12, 8, 9]


Як і в рішенні user902383, це працює не правильно, наприклад, для 8 очікуваних [8,11,7,8], але це [8,10,7,8], для 6 очікуваних [6,8,5,6] але є [6,8,6,7]
— Фрозн

3
@Frozn це рішення також не працює належним чином, і для тестових випадків, які ви дали результат, такий же, як і моє старе рішення ideone.com/LVK8FU
— user902383

2

Скретч, 33 байти

Сценарій
Запрошує введення, встановлює aвведення округленим, встановлює bта cїх відповідні зміни, потім говорить всі чотири числа, відокремлені комами.


2

Java 8 лямбда, 109 81 79 75 символів

Тому що ... ти знаєш ... навіть Java може бути в гольфі ...

a->{int b=(int)(.5+a*4./3),c=(int)(.5+b*2./3);return new int[]{a,b,c,++c};}

Лямбда невольф на клас:

class C {  
   static int[] a(int a) {
        int b = (int) (.5 + a * 4. / 3),
            c = (int) (.5 + b * 2. / 3);
        return new int[]{a, b, c, ++c};
    }
}

Я припускаю, що мені дозволяється використовувати longs, оскільки вони також є цілим числом. На жаль, потрібно правильно округлити цілі числа, і, таким чином, "короткий" склад не працює. Використовуючи longs, нам не потрібно повертати результати округлення до ints.

Оновлення

Використовуючи приємний маленький + 0,5 і після цього трюк, ми зберігаємо правильне округлення і зберігаємо 2 символи!

Крім того, цей трюк більше не вимагає використання довгих, тому ми можемо переключитися на гоління з ще чотирьох символів.


Ласкаво просимо до PPCG!
— Ерік Атголфер

Дякую :) Я деякий час стежив за питаннями тут і зрозумів, що це може бути питання, в якому я міг би брати участь, хоча відповідь довший, ніж я очікував.
— Frozn

Я поставлю "+1", сподіваючись, що ви додасте обов'язкове "тому що ... ви знаєте ... Java!"
— Олів’є Дулак

@Frozn Я не впевнений, чи можна видалити a->{і остаточне значення }для -5 байт.
— Ерік Аутгольфер

@OlivierDulac Ще не :)
— Erik the Outgolfer

1

Mathematica - 21 байт

Щойно отримав Mathematica від моїх братів RPi, тож спробував це для розваги, і що краще, ніж виклик PPCG.

{#,4#/3,8#/9,8#/9+1}&

Визначає анонімну функцію. Спробуйте так:

In[26]:= x:={#,4#/3,8#/9,8#/9+1}&                                             

In[27]:= x[9]                                                                 

Out[27]= {9, 12, 8, 9}

Чи дасть це цілі числа в результаті чи дроби?
— Девід

Цілі числа @David, якщо результати не є цілісними, в цьому випадку дроби.
— Мальтісен


1

Луа, 52 байти

Ця програма приймає число за аргументом командного рядка і повертає відповідний масив. Програми в луа технічно є функціями, оскільки перекладач завжди інкапсулює їх у функції. Це також цей механізм, який використовується, коли ви "викликаєте" коди в інших файлах (в основному він використовує loadfile/ dofile).

m=math.floor x=...z=m(x*8/9)return{x,m(x*4/3),z,z+1}

1

Власне, 21 байт

`;;3@/+;32/*;uk1½+♂≈`

Ця програма оголошує функцію, яка виконує необхідні операції на верхньому значенні стека.

Спробуйте в Інтернеті! (додатковий .в кінці оцінює функцію і друкує результат)

Пояснення:

`;;3@/+;32/*;uk1½+♂≈`
 ;;                    make two copies of x
   3@/+                divide by 3, add that to x to get y
       ;32/*           make a copy of y and multiply by 2/3 to get z
            ;u         make a copy of z and add one
              k        push stack as a list
               1½+     add 0.5 to each element
                  ♂≈   apply int() to each element (make integers from floats by flooring; this is equivalent to rounding half-up because of adding 0.5)

1

Mathcad, [tbd] байт

введіть тут опис зображення


Еквівалентність байт кодового гольфу Mathcad ще не встановлена. Якщо вважати число клавіатури приблизним еквівалентом, рішення становить приблизно 40 байт.




1

Javascript, 50 байт

Я конвертую своє Java-рішення в JavaScript і трохи його знежирив.

var r=Math.round,g=a=>[a,r(a+a/3),a=r(a*8/9),++a]

1

C ++ 0x - 95 102 185 189 109 129 символів

int * n(int p){static int a[3];a[0]=p;a[1]=round(p+(p/3));a[2]=round((a[1]/3)*2);a[3]=a[2]+1;return a;}
  • Для цього потрібен заголовок cmath для роботи.

Degolfed

#include <cmath>
int * ninePattern(int p) {
        static int a[3]; // pattern array
        a[0] = p; // sets first iteration
        a[1] = round(p + (p / 3)); // sets second iteration
        a[2] = round((a[1] / 3) * 2); // sets third iteration
        a[3] = a[2] + 1; // sets fourth iteration
        return a; // returns array
}

2
Не будучи експертом C ++, але ви можете скоротити це шляхом повторного використання вже обчислених значень у масиві. Також ви можете видалити пробіл між собою) і {не знаю, наскільки суворий C ++.
— Фрозн

Чи є ці останні два правильними в поточній версії? Тому що я щойно бачив, як ти розраховуєш, p+(p/3)*(2/3)що p+(2*p/9)замість цього(p+(p/3))*(2/3)
— Фрозн

Виявляється, це була помилка з мого боку. Я ставлю - 1 замість +1 за останню ітерацію: P
— InitializeSahib

0

Ерланг, 80 байт

-module(f).
-export([f/1]).
f(X)->Y=X+(X/3),Z=trunc(Y*(2/3)),[X,trunc(Y),Z,Z+1].

Для запуску збережіть як f.erl , компілюйте та викликайте функцію. Він поверне список ints:

fxk8y@fxk8y:/home/fxk8y/Dokumente/erlang/pcg# erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-    threads:10] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> c(f).
{ok,f}
2> f:f(9).
"\t\f\b\t"
3>

Зауважте, що Erlang автоматично перетворює int s в ASCII символи, якщо ви перебуваєте в діапазоні значень ASCII, оскільки Erlang не має типу char . Виклик функції 100 забезпечує кращу читаність [100,133,88,89] .

Безголівки:

-module(f).
-export([f/1]).

f(X) ->
  Y = X+(X/3),
  Z = trunc(Y*(2/3)),
  [X, trunc(Y), Z, Z+1].

0

Ерланг, 46 байт

Відповідь, натхненна @ fxk8y (я не зміг розмістити коментар до його відповіді)

F=fun(X)->Z=round(X*4/9),[X,Z*3,Z*2,Z*2+1]end.

Також ви можете побачити результати за допомогою:

2> io:fwrite("~w~n", [F(9)]).                         
[9,12,8,9]
ok

0

Pyth, 20 байт

m.RdZ[Jc*4Q3Kc*2J3hK

Пояснення:

            (Implicit print)
m           For each d in array, d =
.RdZ        Round d to zero decimal places
[           The array of
  J         The result of setting J to
    c       The float division of
      *4Q   Input * 4
      3     and 3
            ,
  K         The result of setting K to
    c       The float division of
      *2J   J * 2
      3     and 3
            , and
  hK        K + 1.
            (Implicit end array)

Тест тут


0

Джольф, 17 байт

Ώ‘Hγ+H/H3Βώ/γ3hΒ’

Визначає функцію Ώ. Він приймає вкладення неявно, тому він також є повноцінною програмою. Спробуйте тут!


Джолф стає ESMin повільно підтверджується ??? : P
— Пуховик

@Upgoat ey це грецька мова. І знову півночі. : P
— Conor O'Brien

> _> о. Дуже шкода, якщо я розбудив вас> _> _> _>
— Пуховик

@Upgoat ще не спить;)
— Conor O'Brien

: | idk, якщо це добре, що я тебе позичив, прокинув тебе, або погано, що ти все ще
— буваєш

0

Математика, 51 байт

FoldList[#2@#&,{#,Round[4#/3]&,Round[2#/3]&,#+1&}]&

Анонімна функція, яка відповідає поточній (на момент публікації) версії повідомлення, яка передбачає округлення на кожному кроці.

FoldList- типова операція в програмуванні. Він викликається як FoldList[f, list]і два рази аргументує функцію fнеодноразово до результату (або першого елемента списку в першій ітерації), приймаючи наступний елемент списку як свій другий аргумент.

Ungolfed: #2 @ # &це анонімні функції, які застосовують свій другий аргумент до першого. Тому аргумент списку FoldListскладається з послідовних функцій, які слід застосувати до вводу.

FoldList[#2 @ # &,
  {#, (* note the absence of '&' here, 
         this '#' stands for the argument
         of the complete function and is 
         covered by the & at the end      *)
   Round[4 # / 3] &, (* anonymous function that rounds 4/3 of its input *)
   Round[2 # / 3] &, (* ditto, 2/3 *)
   # + 1 &           (* add one function *)
  }] &               (* and the '&' makes the entire 
                        thing an anonymous function,
                        whose argument is the '#' up
                        at the top.                  *)

Оскільки введення є цілим числом, а поділки - на 3, результат ніколи не буде, як 4.5, тому не потрібно турбуватися про правила округлення, коли остання цифра дорівнює 5: вона завжди буде чітко наближена до одного цілого чи іншого.




0

CJam, 21 байт

qi__3d/+mo_2d3/*i_)]`

Відгуки вітаються

Пояснення

  • qi__ - Прочитайте вхід як ціле число і повторіть його двічі
  • 3D/+mo - Розділіть один екземпляр введення на 3, а потім додайте його до другого примірника, щоб зробити y
  • _2d3/*i - Скопіюйте y, потім помножте на .6
  • _)] `- Dupe, приріст, загортання в масив, друк як масив (не в коді через оператора`::)

Редагувати: забули зробити перші три вдвічі, тому програму було порушено. Виправлено.


0

Аксіома, 59 байт

g(x)==round(x)::INT;f(x)==[x,a:=g(x+x/3.),b:=g(a*2./3),b+1]

тест

(3) -> [[i,f(i)] for i in [9,8,6,23,159]]
   (3)
   [[9,[9,12,8,9]], [8,[8,11,7,8]], [6,[6,8,5,6]], [23,[23,31,21,22]],
    [159,[159,212,141,142]]]
                                                      Type: List List Any


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.