Трампу нужна твоя помощь, чтобы остановить Стармена!


33

Человек из звезд пришел на Землю! К счастью, президент Соединенных Штатов Дональд Трамп имеет бесконечный кубик. Используя этот кубик, он может вызвать номер, который вы , мэр Подунка , должны использовать, чтобы определить, кого нужно отправить, чтобы остановить захватчика! Но будьте осторожны, вы можете отправить только ограниченное количество байтов на обратной стороне вашей лягушки !

Учитывая пользовательский ввод (который будет положительным целым числом), вы должны вернуть строку в зависимости от того, к какой категории относится число.

  • Если число является числом Фибоначчи , вы должны вывести Ness .
  • Если число является числом Лукаса , вы должны вывести Лукас .
  • Если число одновременно число Лукаса и число Фибоначчи , то необходимо вывести Travis .
  • Если число ни аа число Лукаса , ни число Фибоначчи , то необходимо вывести Пеппи .

Примеры

Вот несколько тестов:

1 => Трэвис
2 => Трэвис
3 => Трэвис
4 => Лукас
5 => Несс
6 => Пеппи
7 => Лукас
8 => Несс
610 => Несс
722 => Пеппи
843 => Лукас

правила

  • Это , выигрывает самый короткий ответ в байтах.
  • Ваша программа может быть полной или анонимной функцией.

Бонусы

Есть пара бонусов, которые вы можете использовать, чтобы помочь вашей лягушке быстрее передать данные Президенту Трампу:

  • Для -15байтов: если введен номер 2016, вы должны вывести Trump, как он на пике своего президентства.

29
Для записи, я не один из тех Старменов.
El'endia Starman


@DavidCarraher Точно так же, как некоторые определения начинают серию Фибоначчи, в 0, 1то время как другие начинаются с 1, 1, я считаю, что это зависит от используемого вами определения. Нередки случаи, когда числа Лукаса начинаются с 2, 1, например, OEIS имеет обе версии ( 1 , 2 ), но та, которая начинается с 2, - это фаза определения, с которой прошла.
Sp3000

2
Голоса должны быть скрыты, но я до сих пор говорю , что я действительно не люблю политику и что он уже повлиял на мое голосование по этому вопросу. Не мог бы спрашивающий убрать политику из вопроса или хотя бы объяснить мне каламбур, который я мог пропустить? Политическое упоминание вписано в спецификацию навсегда, но оно все еще может быть удалено из названия.
Джон Дворак

3
@JanDvorak: я думаю, что это очень насмешливо. Например, предположим, что президентские сроки составляют 4 года, а следующие выборы состоятся в ноябре 2016 года. Если Трамп окажется на пике своего президентства в 2016 году ...
Эльендия Старман,

Ответы:


4

Pyth, 59 - 15 = 44 байта

или 42 байта после исправления ошибки

&Qr@c."av�a�(s��kW���"\b?q2016Q4/hMst*2.uL,eNsNQ_BS2Q4

HexDump:

0000000: 2651 7240 632e 2261 7601 c061 15dc 2873  &Qr@c."av..a..(s
0000010: fde0 6b57 8bd0 a1ed ed0f 225c 623f 7132  ..kW......"\b?q2
0000020: 3031 3651 342f 684d 7374 2a32 2e75 4c2c  016Q4/hMst*2.uL,
0000030: 654e 734e 515f 4253 3251 34              eNsNQ_BS2Q4

Первые два символа ( &Q) необходимы из-за ошибки разбора Pyth, возникающей Qпосле ."сбоя. Исправление было применено. Если интерпретатор пост-исправления разрешен, -2 байта.


Без нечитаемого сжатия строк:

Pyth, 63 - 15 = 48 байт

49 байт без козыря

@c"Pippi Ness Lucas Travis Trump")?nQ2016/hMst*2.uL,eNsNQ_BS2Q4

Тестирование

Довольно просто, просто сгенерируйте последовательности, продублируйте один и проверьте членство.

Последовательности генерируются, начиная с [1, 2]и [2, 1], а затем применяя правило Фибоначчи.


9

Юлия, 146 142 121 120 байт

n->split("Pippi Lucas Ness Travis")[2any(isinteger,sqrt([5n^2+4,5n^2-4]))+(n∈[2;[(g=golden)^i+(-g)^-i for i=1:n]])+1]

Это создает безымянную функцию, которая возвращает логическое значение. Чтобы назвать его, дайте ему имя, например f=n->....

Ungolfed:

function trump(n::Integer)
    # Determine if n is a Fibonacci number by checking whether
    # 5n^2 ± 4 is a perfect square
    F = any(isinteger, sqrt([5n^2 + 4, 5n^2 - 4]))

    # Determine if n is a Lucas number by generating Lucas
    # numbers and testing for membership
    # golden is a built-in constant containing the golden ratio
    L = n  [2; [golden^i + (-golden)^-i for i = 1:n]]

    # Select the appropriate Earthbound charater using array
    # indexing on a string split into an array on spaces
    return split("Pippi Lucas Ness Travis")[2F+L+1]
end

Исправлена ​​проблема и сохранены 7 байтов благодаря Glen O!


7

Mathematica 143 156 - 15 (бонус) = 141 байт

С 2 байтами, сохраненными благодаря LegionMammal978.

t_~g~l_:=(r=1<0;n=1;While[(z=l@n)<=t,If[z==t,r=1>0];n++];r);a=g[k=Input[],LucasL];
b=k~g~Fibonacci;Which[k==2016,Trump,a&&b,Travis,a,Lucas,b,Ness,2<3,Pippi]

1
Falseи Trueможет быть заменен на 1<0и соответственно 1>0.
LegionMammal978


5

Python 2, 107

f=lambda i,n=input():abs(5*n*n+i)**.5%1>0
print["Travis","Lucas","Ness","Pippi"][f(4)*f(-4)+2*f(20)*f(-20)]

Ключ - две чисто арифметические проверки для чисел Фибоначчи и Люка:

  • nчисло Фибоначчи, если 5*n*n+4или 5*n*n-4является идеальным квадратом
  • nчисло Лукаса точно, если 5*n*n+20или 5*n*n-20является идеальным квадратом

На этом сайте есть пробные эскизы .

Таким образом, вывод зависит от значений 5*n*n+iдля iin {4,-4,20,-20}. Функция fпроверяет значение i, проверяя , не имеет ли соответствующее значение квадратный корень из целых чисел. Это absпросто для того, чтобы избежать ошибки получения корня отрицательного значения для n=1, i=-20.

Функция fпринимает значение числа nдля проверки из STDIN. Python оценивает это только один раз, а не один раз за вызов функции.

То, не является ли число Фибоначчи, оценивается как f(4)*f(-4)использование неявного преобразования логического числа в число и аналогично для не Лукаса, и берется соответствующая строка. Если бы допускались конечные пробелы, чередование строк было бы короче.


Пробные эскизы - это мертвая ссылка.
SQB

@SQB Страница, кажется, опустилась, я не могу найти ее снова.
xnor

4

Python 2, 117 байт

F=[1]
L=[2,1]
n=input()
exec 2*n*"F,L=L+[sum(L[-2:])],F;"
print["Pippi","Lucas","Ness","Travis"][(n in F)*2+(n in L)]

Для списка строк, "Pippi Lucas Ness Travis".split()такой же длины.


3

CJam, 58 55 54 байта

ri5Zbe!f{1${_-2>:++}*&!}2b"Travis Ness Lucas Pippi"S/=

Наивный подход к генерации чисел Фибоначчи и Лукаса с последующим подсчетом совпадений в обоих, преобразованием в двоичное и выбором подходящей строки.

Попробуйте онлайн .


3

Серьезно, 69 байтов

,;;r`;F@2+F+`M2@q@#"%d="%£MΣ@f0≤2*+["Pippi","Lucas","Ness","Travis"]E

До этого у Серьезно была встроенная функция f(индекс в числах Фибоначчи, -1, если не число Фибоначчи) ... но не индекс в списке или "в списке"! (Это было добавлено как í.)

В результате, это то, что я трачу на поиск, если входные данные являются числом Фибоначчи:

,                              f0≤

Вот что я трачу на создание списка чисел Лукаса:

  ;r`;F@2+F+`M2@q

И это то, что я трачу на поиск, если вход находится в списке чисел Лукаса:

 ;                @#":%d:="%£MΣ

Это строка, которая форматируется с использованием нотации Python% во что-то вроде :610:=и преобразуется в функцию, которая затем отображается в массиве и суммируется. (Числа Лукаса уникальны, поэтому сумма всегда равна 0 или 1.)

Спасибо @Mego за последний бит с форматированием строки.


3

Perl, 133 (146-15 =) 131 (144-15 =) 129 (136-15 =) 121 байт

+1 байт за -nфлаг.

$a=$d=1;$b=$c=2;$f+=$_==$a,$l+=$_==$c,($a,$b,$c,$d)=($b,$a+$b,$d,$c+$d)while$a<$_*9;say$_-2016?(Pippi,Ness,Lucas,Travis)[$f+$l*2]:Trump

С новой строки после точки с запятой, для удобства чтения:

$a=$d=1;$b=$c=2;
$f+=$_==$a,$l+=$_==$c,($a,$b,$c,$d)=($b,$a+$b,$d,$c+$d)while$a<$_*9;
say$_-2016?(Pippi,Ness,Lucas,Travis)[$f+$l*2]:Trump

Демо-версия:

llama@llama:...code/perl/ppcg64476trump$ for x in 1 2 3 4 5 6 7 8 610 722 843 2016; do echo -n "$x => "; echo $x | perl -n trump.pl; done
1 => Travis
2 => Travis
3 => Travis
4 => Lucas
5 => Ness
6 => Pippi
7 => Lucas
8 => Ness
610 => Ness
722 => Pippi
843 => Lucas
2016 => Trump

Трюки:

  • Вы можете быть удивлены , почему мои переменные называются $a, $b, $%, и $d. Это отличный вопрос! На самом деле, это позволяет мне сохранить байт.

    (stuff) ... ,$l+=$_==$%while$a<$_

    на один байт короче

    (stuff) ... ,$l+=$_==$c while $a<$_

    Это больше не применяется, потому что я играл в свой код, переставляя вещи, заставляя изменение имени переменной больше не сохранять байты. Я изменил его обратно, чтобы имена переменных снова имели смысл.

  • $_-2?$f+$l*2:3мягко интересно. По сути, мне пришлось использовать специальный случай 2для чисел Лукаса, потому что моя программа проверяет, является ли число числом Лукаса после «обновления» чисел Фибоначчи и Лукаса. Так 2считалось не-Лукас число. $_-2?foo:barэто символ короче $_==2?bar:foo. То же самое используется для 2016теста.

    Это также больше не соответствует действительности, потому что я смог реструктурировать программу, чтобы не требовался специальный регистр 2. Но я все еще использую $_-2016?stuff:Trumpвместо $_==2016?Trump:stuff, что на один байт длиннее.

  • Говоря об этом, вы можете быть удивлены, как я сделал эту реструктуризацию. Я просто заставил программу делать в 9 раз больше итераций, чем необходимо, что стоит всего 2 байта ( *9), но позволяет мне делать предположения в других местах, которые помогают в игре в гольф.

  • Поскольку переменные по умолчанию равны нулю,

    $f+=$_==$a

    короче чем

    $f=1if$_==$a
  • Perl поддерживает голые слова, поэтому мне не нужно заключать в кавычки ни одну из моих строк (\ o /).


Разве это не на два байта короче?
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ Сама программа имеет 132 байта, и я добавил один, потому что он должен быть вызван с -nфлагом (как отмечено в ответе).
Дверная ручка

А ну понятно. Что делает -nфлаг?
Конор О'Брайен

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Это предполагает while(<>) { ... }цикл вокруг вашей программы. Смотрите: Perl docs .
Дверная ручка

1
@DomHastings Он не был, но я <s> обратился </ s> убедил его попробовать Perl.
спагетто

2

Юлия, 101 100 байт

n->split("Pippi Lucas Ness Travis")[[2;1]⋅(sum(i->[i[];trace(i)].==n,Any[[1 1;1 0]].^(0:n)).>0)+1]

Ungolfed:

function f(n)
  k=Any[[1 1;1 0]].^(0:n) # Produces characteristic matrices of Fibonacci
                          # numbers from 0 to n
  F=sum(i->i[]==n,k)      # Check if n is a Fibonacci number by checking
                          # the first value in each matrix for n
  L=sum(i->trace(i)==n,k) # Check if n is a Lucas number by checking
                          # the trace of each matrix for n
  I=[2;1]⋅[F;L]+1         # Calculate 2F+L+1, which is the index for the next step
  S=split("Pippi Lucas Ness Travis") # Creates array with four strings
                          # saves a byte compared with directly creating array
  return S[I]
      # This uses the above calculations to determine which of the four to return
end

Отличное решение! Матрица и трассировка гениальны. Очень жаль, что {}альтернативный синтаксис Any[]устарел; это сэкономило бы пару байтов.
Алекс А.

2

Октава, 93 байта

@(n){'Pippi','Lucas','Ness','Travis'}{(1:2)*any(~rem(real(sqrt(5*n^2+[-20,-4;20,4])),1)).'+1}

Этот подход аналогичен моему ответу на MATLAB, за исключением того, что Octave позволяет индексировать непосредственно в новый массив:

{'a', 'b', 'c'}{2}    %// b

2

MATL (неконкурентный), 57 55 54 (67-15) = 52 байта

20Kht_vi2^5*+X^Xj1\~a2:*sG2016=-'Lucas Ness Travis Trump Pippi'Ybw)

Попробуйте онлайн!

объяснение

Опять же, логика похожа на мои другие ответы здесь и здесь .

20      % Number literal
K       % Retrieve the number 4 from the K clipboard (the default value)
h       % Horizontal concatenation to produce [20 4]
t       % Duplicate elements
_v      % Negate and vertically append elements (yields [20, 4; -20 -4])
i2^     % Explicitly grab the input and square it
5*      % Multiply by 5
+       % Add this to the matrix ([20, 4; -20 -4])
X^      % Take the square root
Xj      % Ensure that the result is a real number
1\      % Get the decimal component
~       % Create a logical arrays where we have TRUE when no remainder
a       % For each column determine if any element is TRUE
2:      % Create the array 1:2
*       % Perform element-wise multiplication with boolean
s       % Sum the result to yield an index
G       % Explicitly grab the input (again)
2016=   % Check to see if it is 2016 (yields TRUE (1) if equal)
-       % Then subtract the boolean from the index. Since 2016 is NOT a
        % Fibonacci or Lucas number, the original index is 0. Subtracting
        % this boolean, will make this index now -1. For all other non-2016
        % numbers this will have no effect on the index.
'Lucas Ness Travis Trump Pippi' % Create the possible strings values 
        % Note: the 0 index wraps around to the end hence Pippi being at the end.
        % The next to last entry ('Trump') is ONLY accessible via a -1 index as
        % discussed above
Yb      % Split at the spaces to create a cell array
w       % Flip the top two stack elements
)       % Retrieve the desired value from the cell array

1

C ++ 11, 176 + 15 (#include) = 191

#include<mutex>
[](int n){std::function<int(int,int)>c=[&](int f,int s){return f-s>n?0:s-n?c(s,f+s):1;};int l=c(2,1),f=c(1,1);l&f?puts("Travis"):l?puts("Lucas"):f?puts("Ness"):puts("Pippi");}

Неутолимый с использованием. Я могу добавить объяснение, если запрос завтра, gtg спать!

#include <functional>
#include <cstdio>
int main()
{
    auto r = [](int n)
    {
        std::function<int(int, int)> c = [&](int f, int s)
        {
            return f - s > n ? 0 : f - n ? c(s, f + s) : 1;
        };
        int l = c(2, 1), f = c(1, 1);
        l & f ? puts("Travis") : l ? puts("Lucas") : f ? puts("Ness") : puts("Pippi");
    };

    for (int i : { 1, 2, 3, 4, 5, 6, 7, 8, 610, 722, 843 })
    {
        printf("%i - ", i); r(i);
    }
}

1
@sysreq Я не думаю, что это для бонуса, просто заявление включения.
этап

@phase Я знаю, я делю размер байта на две части (code + include), когда я публикую только функцию, а не целую программу.
Zereges

1

Javascript (ES6), 108 байт

x=>(f=(a,x,y)=>a==y||a==x?1:a<y?0:f(a,y,x+y),b=f(x,0,1),c=f(x,2,1),b&&c?'Travis':b?'Ness':c?'Lucas':'Pippi')

Та же функция для Фибоначчи и Лукаса. Это рекурсивная функция, которая принимает первые два значения как init.


1

Java, 151 байт

Можно утверждать, что Трамп никогда не будет отдавать это важное решение на аутсорсинг, поэтому нам не нужно было бы обнародовать метод, сохранив еще 7 байтов.

public String t(int n){return"Pippi,Lucas,Ness,Travis".split(",")[2*f(n,1,1)+f(n,2,1)];}int f(int a,int x,int y){return a==x||a==y?1:a<y?0:f(a,y,x+y);}

Ungolfed, включая основной тестовый вызов

public class Trump {

    //Test Invokation
    public static void main(String[] args) {
        int[] n = {1, 2, 3, 4, 5, 6, 7, 8, 610, 722, 843, 2016 };
        for(int i = 0; i < n.length; ++i) {
            System.out.println(""+ n[i] + " => " + new Trump().t(n[i]));
        }
    }


    public String t(int n) {        
        return "Pippi,Lucas,Ness,Travis".split(",")[2*f(n,1,1)+f(n,2,1)];               
    }
    int f(int a,int x,int y) {             
        return a==x||a==y?1:a<y?0:f(a,y,x+y);           
    }

}

До сих пор я не нашел способа протестировать 2016 год и вернуть код «Трамп» в коде длиной менее 15 байт.


Любите эту первую строку вашего объяснения!
Скотт

1

C (gcc) ,  128   120   116  110 байт

a;b;o;f(n){for(o=b=0,a=1;a<=n;b=a+b,a=b-a)o|=(b==n)+2*(2*a+b==n);n=o?o-1?o-2?"Travis":"Lucas":"Ness":"Pippi";}

Попробуйте онлайн!

объяснение

Давайте назовем F(n)n-ое число Фибоначчи и L(n)n-ое число Лукаса.
a, bЯвляются F(n-1), F(n)соответственно.
Затем мы можем вычислить. L(n) == F(n-1)+F(n+1) == 2*F(n-1) + F(n) == 2*a+b
Эта функция будет последовательно вычислять числа Фибоначчи и Люка, вплоть до n, и проверять, есть ли nкакое-либо из них.
Если nэто число Фибоначчи, 1-й бит oбудет установлен в 1
Если nэто число Лукаса, 2-й бит oбудет установлен на 1
oзатем будет использоваться для определения, какое имя для вывода

редактировать

  • Сэкономили 8 байтов, используя условие цикла for: начиная со второй итерации, мы имеем a<b<cи a<a+c=L(n)так ( b<=n || a+c<=n ) => a<n. Мне действительно нужно a<=nбыло правильно обращатьсяn=1
  • Сохранено 4 байта, благодаря функцииcatcat! (также исправил ошибку, мой код выводил "2 => Ness")
  • Сохранено 6 байт:
    • 2 еще раз благодаря потолку
    • 4, удалив переменную c, равную F(n+1), которая была бесполезна, так как мы уже можем рассчитать F(n+1)с aиb

Предлагаю b+=aвместоb=a+b
floorcat

0

Perl 5,10, 119 - 15 (бонус) = 104 байта

$_=<>;$j=1;($i,$j)=($j,$i+$j)while$_>$i;say$_-2016?(Pippi,Lucas,Ness,Travis)[($_==$i)*2|$_==3*$j-4*$i|$_-1>>1==0]:Trump

Ungolfed:

# Read line from stdin
$_ = <>;

# Find first Fibonacci number greater than or equal to input.
# Store this number in $i and the next Fibonacci number in $j.
$j = 1;
($i, $j) = ($j, $i + $j) while $_ > $i;

say $_ - 2016
  ? (Pippi,Lucas,Ness,Travis)[
      ($_ == $i) * 2 |          # Bitwise OR with 2 if Fibonacci number
      $_ == 3 * $j - 4 * $i |   # Bitwise OR with 1 if Lucas number >= 3
      $_ - 1 >> 1 == 0          # Bitwise OR with 1 if Lucas number <= 2
    ]
  : Trump

Это использует тот факт, что

L(n-2) = 3 * F(n+1) - 4 * F(n)

наибольшее число Лукаса меньше или равно F (n).


0

Groovy, 149 байтов

f={i->g={m,s->while(s[-2]<=m)s<<s[-2]+s[-1];s}
println(["Pippi","Ness","Lucas","Travis"][(g(i,[1,1]).contains(i)?1:0)+(g(i,[2,1]).contains(i)?2:0)])}

Тестовый код:

[1,2,3,4,5,6,7,8,610,722,843].each {
    print "$it => "
    f(it)
}

gявляется замыканием, которое генерирует список чисел на основе seed ( s) и максимального значения ( m). (g(i,[1,1]).contains(i)?1:0)+(g(i,[2,1]).contains(i)?2:0)находит индекс для использования, основываясь на числе lucas или fibonacci.


0

MATLAB, 122 119 байт

@(n)subsref({'Pippi','Lucas','Ness','Travis'},substruct('{}',{(1:2)*any(~rem(real(sqrt(5*n^2+[-20,-4;20,4])),1)).'+1}))

Краткое объяснение

Сначала мы создаем массив ячеек , содержащий значения для печати: {'Pippi', 'Lucas', 'Ness', 'Travis'}. Затем, чтобы выяснить, какое значение отображать, мы проверяем, nявляется ли число Фибоначчи или Лукаса.

Для Фибоначчи мы используем следующую формулу:

any(~rem(sqrt(5*n^2 + [-4 4]), 1))

Это проверяет, является ли 5*n^2 + 4или 5*n^2 - 4идеальным квадратом. Если anyиз них есть, то это число Фибоначчи.

Формула для числа Лукаса очень похожа, за исключением того, что мы используем +/- 20 вместо 4:

any(~rem(sqrt(5*n^2 + [-20 20]), 1))

В этом решении я объединил эти два случая в один с помощью матрицы:

M = [-20 -4
      20  4]

Применяя то же уравнение, что и выше, но заставляя anyрассматривать только первое измерение, я получаю двухэлементный логический массив, где, если первый элемент true, то это число Лукаса, а если второй элемент true, это число Фибоначчи ,

any(~rem(sqrt(5*n^2 + [-20 -4;20 4]), 1))

Затем, чтобы вычислить индекс в моем исходном массиве ячеек, я рассматриваю это как двоичную последовательность, выполняя поэлементное умножение этого логического значения с [2^0, 2^1]или просто [1,2]. И суммируйте элементы. Очевидно, я должен добавить 1 из-за индексации на основе MATLAB.

index = (1:2) * any(~rem(real(sqrt(5*n^2+[-20,-4;20,4])),1)).' + 1;

Затем я должен использовать subsrefи substructиндексировать в начальный массив ячеек, чтобы получить конечный результат.


0

JavaScript (ES6), 97 байт

x=>[['Pippi','Lucas'],['Ness','Travis'],f=(a,x,y=1)=>a>x?f(a,y,x+y):a==x||a==1][+f(x,0)][+f(x,2)]

Необходим a==1чек, иначе я не замечаю, что 1 - это число Лукаса.



0

05AB1E , 39 37 (52 - 15 бонусных) байтов

2016Qi.•ªb‚•ë>ÅG¹å_¹ÅF¹åi.•F_ïk|»9•ë.•?®B'5n•}2äsè}™

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

2016Qi                # If the input equals 2016:
      .•ªb‚•          #  Push "trump" to the stack
ë                     # Else:
 >ÅG                  #  List of Lucas numbers up to and including the input+1
    ¹å                #  Check if the input is in this list (1 if truthy; 0 if falsey)
      _               #  Invert the boolean (0→1 and 1→0)
 ¹ÅF                  #  List of Fibonacci numbers up to and including the input
    ¹åi               #  If the input is in this list:
       .•F_ïk|»9•     #   Push string "travisnessi" to the stack
    ë                 #  Else:
     .•?®B'5n•        #   Push string "pippilucas" to the stack
    }                 #  Close the inner if-else
     2ä               #  Split the string into two parts
                      #   i.e. "travisnessi" → ["travis","nessi"]
                      #   i.e. "pippilucas" → ["pippi","lucas"]
       sè             #  Index the Lucas result into the list of two strings
}                     # Close the outer if-else
 ™                    # And output the top of the stack in title-case
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.