연속 홀수의 합


24

관련 문제제기 되었지만 이 질문은 자체 질문을 보증하기 위해 다릅니다.


도전

양의 정수가 주어지면 그 합이 주어진 정수인 연속 양의 홀수 정수의 가장 긴 시퀀스를 리턴하십시오. 그러한 순서가 존재하지 않으면 잘못된 값을 반환하거나 예외를 던지는 등 언어에 어떤 방식 으로든 오류를보고 할 수 있습니다.

테스트 사례

  1-> [1]
  2-> []
  3-> [3]
  4-> [1, 3]
  5-> [5]
  6-> []
  9-> [1, 3, 5] ([9]는 정답이 아닙니다.)
 15-> [3, 5, 7]
104-> [23, 25, 27, 29] ([51, 53]은 유효한 답변이 아닙니다.)

채점

이것은 이므로 각 언어에서 가장 짧은 답변이 이깁니다.


2
해결책이 없다면 내 프로그램을 영원히 실행할 수 있습니까?
Dennis

매우 관련이 있습니다. 이 숫자로 일부 짝수를 나타낼 수 없다는 사실은 그것을 속이는 것을 막을 수 있습니다.
ETHproductions

6
15는 [-1, 1, 3, 5, 7]을 줄 수 없습니까? 양수 값만 허용되면 그렇게 말해야합니다.
xnor

2
@ ЕвгенийНовиков 당신은 17 건너 뛰었다
kalsowerus

1
@kalsowerus 예. 내가 오해 단어 "연속"
Евгений Новиков

답변:


11

하스켈, 67 65 63 62 58 바이트

Julian Wolf 덕분에 4 바이트 절약

f x=[[2*n+1,2*n+3..2*m]|n<-[0..x],m<-[n..x],m^2-n^2==x]!!0

온라인으로 사용해보십시오!

숫자가 두 제곱의 차이로 표현 될 수 있는지 확인합니다 m^2-n^2. 그런 다음 연속 홀수 목록을 구성 할 수 있습니다 [2n+1,2n+3...2m-1]. 최소값 n이 선택되므로 가장 긴 목록이 출력됩니다.


7
다운 투표자 : 특히 새로운 사용자를 다운 투표 할 때 이유를 제공하는 주석을 추가하는 것이 더 친숙하고 건설적인 방법입니다.
Jonathan Allan

1
내가 뭔가를 누락하지 않는 한, 당신은 단지까지 이동하여 4 바이트를 저장할 수 있습니다 x모두 nm
줄리안 늑대

알다시피, downvote는 커뮤니티 사용자가 답변을 편집 할 때 자동으로 전송되었습니다. 나는 이것이 버그라고 생각한다 . (CC @JonathanAllan)
데니스

아, 그중 하나였습니다.
Jonathan Allan

9

파이썬 2 , 66 62 바이트

f=lambda n,k=0,*r:n-sum(r)and f(n,k+1,*range(k%n|1,k/n,2))or r

솔루션이없는 경우 RuntimeError (최대 재귀 깊이 초과)로 종료 합니다.

온라인으로 사용해보십시오!


1
입력 값이 충분히 높지만 해결책이 있으면 RuntimeError가 발생 합니까?
Okx

재귀 한계가 충분히 높지 않거나 스택이 충분히 크지 않은 경우 예. 그러나 물리적 제한을 무시하는 것이 일반적입니다 (예 : C 응답은 32 비트 정수로만 작동해야 함). OP는 솔루션이 없으면 영원히 실행하는 것이 허용된다고 명시 적으로 말했습니다.
Dennis

9

젤리 ,  11  10 바이트

Dennis 덕분에 -1 바이트 (암시 적 범위 빌드 -replace Rm2Ẇwith ẆḤ’)

ẆḤ’S_¥Ðḟ⁸Ṫ

가능한 경우 또는 0그렇지 않은 경우 소환 목록을 반환하는 모나드 링크 .

온라인으로 사용해보십시오!

방법?

ẆḤ’S_¥Ðḟ⁸Ṫ - Link: number, n
Ẇ          - all sublists (implicit range of input) note: ordered by increasing length
           -                i.e. [[1], [2], [3], ..., [1,2], [2,3], ..., [1,2,3], ...]]
 Ḥ         - double              [[2], [4], [6], ..., [2,4], [4,6], ..., [2,4,6], ...]]
  ’        - decrement           [[1], [3], [5], ..., [1,3], [3,5], ..., [1,2,5], ...]]
        ⁸  - link's left argument, n
      Ðḟ   - filter out items for which the following yields a truthy value:
     ¥     -   last two links as a dyad:
   S       -     sum
    _      -     subtract the right from the left = sum - n
         Ṫ - tail (last and hence longest such run)

1
ẆḤ’바이트를 저장합니다.
Dennis

8

자바 스크립트 (ES7), 87 86 85 81 바이트

쉼표로 구분 된 정수 목록을 반환하거나 0솔루션이없는 경우를 반환 합니다.

n=>(g=(s,k,x=n+s)=>(x**.5|0)**2-x?k>n?0:g(s+k,k+2):(n-=k)?k+','+g(-n,k+2):k)(0,1)

방법?

우리에 대한 첫번째보기 작은 정사각형 그 같은 X = N + S는 다른 완벽한 광장입니다.

경우 존재 N 의 차이입니다 X -의 연속 홀수 숫자의 두 시퀀스의 차이로 쓸 수 2 개 완벽한 사각형의. 그런 다음 결과 목록을 작성합니다.

예:

들면 N = 104 :

x = n + s = 225 = 15² 를 만족하는 s = 11² = 121 을 찾습니다.

그때:

15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 +
21104 = 15²-11² = 23 + 25 + 27 + 29


3
n^2항상 첫 번째 n홀수 의 합과 같다고 말하고 있습니까? 허, 흥미
Skidsdev

2
@Mayube 실제로 !
Arnauld


7

05AB1E , 9 8 바이트

Emigna 덕분에 -1 바이트

ÅÉŒʒOQ}н

설명:

ÅÉ           Generate a list of odd numbers up to, and including, the input
  Œ          Substrings
   ʒ         Only keep values
    O          where the sum
     Q         equals the input
       }     End
             For 9, the result would look like this:
             [[1, 3, 5], [9]]
        н    Get the first value

유효하지 않은 입력에서는 아무것도 출력하지 않습니다.

온라인으로 사용해보십시오!


ʒOQ}대신 DO¹QÏ바이트 를 저장합니다.
Emigna

@JonathanAllan 문서는이 ... 혼란 봤는데 수 있도록 "고르지"라고
Outgolfer 에릭

1
@JonathanAllan 작은 실수. 결정된.
Okx

6

하스켈 , 61 60 바이트

1 바이트를 깎아 준 @maple_shaft 덕분에

f n=[k|r<-[1,3..],s<-[r,r+2..n],k<-[[r,r+2..s]],sum k==n]!!0

온라인으로 사용해보십시오!

가장 긴 실행은 항상 가장 낮은 숫자로 시작하는 실행이라는 사실을 사용합니다.

나는 짐승 - 강제 대신에 연산 뭔가를하고 싶어 k하지만, fromInteger그것을 죽일 것 같다.


다음과 같이 변경 [1,3..n]하면 1 바이트를 절약 할 수 있습니다.[1,3..]
maple_shaft

1
도우미 기능으로 7 바이트를 저장할 수 있습니다 r?n=[r,r+2..n]. 온라인으로 사용해보십시오!
Ørjan Johansen

4

파이썬 , 67 바이트

f=lambda n,R=[1]:n-sum(R)and f(n,[R+[R[-1]+2],R[1:]][sum(R)>n])or R

온라인으로 사용해보십시오!

이전의 연속 합계 챌린지에서 내 답변을 복사 하고로 변경 +1했습니다 +2. 골프 코드가 그렇게 모듈화 될 수 있다는 것을 누가 알았습니까?

이상하게 간단한 전략 : R원하는 합계로 구간 을 검색하십시오 .

  • 합이 너무 작 으면 그 다음 숫자 2를 추가하여 구간의 오른쪽 끝점을 2 위로 이동하십시오.
  • 합이 너무 큰 경우 가장 작은 요소를 제거하여 왼쪽 끝점을 위로 이동하십시오.
  • 합이 정확하면을 출력하십시오 R.

간격의 하단이 증가하기 때문에 짧은 간격보다 긴 간격이 발견됩니다. 가능한 간격을 찾을 수 없으면 IndexError로 종료됩니다.


4

자바 스크립트 (ES6), 65 64 바이트

f=(a,i=1)=>a>i?(c=f(a-i,i+=2))[0]==i?[i-2,...c]:f(a,i):a<i?0:[i]

솔루션이 있으면 배열을 반환하고, 솔루션이 없으면 0을 반환합니다.

이것은 문제에 대한 비효율적이지만 골치 아픈 해결책입니다.

재귀 스택을 작동시키지 않더라도 a-iand를 사용하여 첫 번째 솔루션을 검색합니다 i=1. 해당 솔루션이로 시작하지 않으면 and를 i+2사용하여 첫 번째 솔루션을 재귀 적으로 검색합니다 .ai+2

언 골프

f=(a,i=1)=>
  a > i ? 
    (c = f(a - i, i += 2))[0] == i ? 
      [i-2, ...c] : 
      f(a, i) :
  a < i ? 
    0 :
    [i]

테스트 사례 :

이것이 얼마나 비효율적인지에 대한 아이디어를 f(104)얻으려면 69,535 재귀 호출 이 필요한 솔루션 입니다. 스택의 깊이는 51 레벨을 넘지 않으므로 스택 오버플로에 문제가 없습니다.

스택 수준이 99 레벨 인 f(200)630 회귀 호출 이 필요한 솔루션 입니다. (그 해결책은 [11,13,15,17,19,21,23,25,27,29]입니다.)

실행중인 프로그램의 시각적 표현은 다음과 같습니다.


3

파이썬 2.7 109 108 97 바이트

11 바이트 감소, Outgolfer Erik에게 감사합니다.

이것은 나의 첫 번째 코드 골프입니다!

def f(N):
 for n in range(N):
    x=(n*n+N)**.5-n
    if x%1==0:return[2*(k+n)+1for k in range(int(x))]

작동 원리

나는 잘 알려진 정체성을 1 + 3 + 5 + ... + (2n - 1) = n²

의 경우를 15

15 = 3 + 5 + 7 = (1 + 2) + (3 + 2) + (5 + 2) = (1 + 3 + 5) + 3×2 = 3² + 3×2

일반적으로,이 경우 X의 용어부터 2n + 1같은,

(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))


같다 2nx + x²

경우 N입력 정수, 문제는 최대 찾는 감소 x하도록을

x² + 2nx - N = 0

해가있는 이차 방정식

x = sqrt(n² + N) - n

가장 긴 시퀀스는 가장 큰 시퀀스입니다 x. 이 프로그램은 반복 처리 n에서 0N하고 그 찾을 때 x정수, 그것은 목록 생성 (2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))및 반환을.



@EriktheOutgolfer, 감사합니다. 탭 사용에 대해 잊었습니다 (=
dark32

3

파이썬 3, 190 81 바이트

def c(q,l,i):
    if sum(l)0:
        l.append(i)
        return c(q,l,i+2)
    elif sum(l)>q:
        l.pop(0)
        return c(q,l,i)
    else:
        print(l)
c(q,[1],1)

c=lambda q,l=[1]:c(q,l+[l[-1]+2])if(sum(l)<q)*l else c(q,l[1:])if sum(l)>q else l

@ovs와 @ musicman523 덕분에


4
들여 쓰기를 제거 하면이 값을 122 바이트로 줄일 수 있습니다 . 코드를 더 줄이려면 Python 골프 팁을 살펴보십시오 .
ovs

3
에 대한 호출에 print괄호가 없기 때문에 이것은 파이썬 3에서 실행되지 않습니다
musicman523

2
재귀 호출을 l.append(i)사용하여 간단히 제거 할 수 있습니다 l+[i]. 재귀 호출 l.pop(0)을 사용하여 제거 할 수 있습니다 l[1:]. c대신 키워드 인수를 사용하여 맨 아래에 대한 호출을 제거 할 수 있습니다 . >02 행에서 제거 할 수 있습니다 . 마지막으로, 3 진 형식을 사용하여 ifelse명령문을 표현식으로 변경하여 람다 표현식으로 92 바이트까지 줄일 수 있습니다. 온라인으로 사용해보십시오!
musicman523

1
@ musicman523 제안을 기반으로 우리는 여전히 조건을 줄이고 i81 바이트에이를 수 있습니다.
ovs

난 당신이 바꿀 수 있다고 생각 sum(l)>q else하는 q<sum(l)else1 바이트를 저장합니다.
Zacharý

2

QBIC , 47 바이트

{_Cg=q┘q=q+2~g>:|_Xp\?g,[q,a,2|?b,┘g=g+b~g=a|_X

이것은 모든 홀수를 1에서 그 합이가 될 때까지 계산 n합니다. 통과 n하면 루프를 재설정하고 1에서 3으로 증가한 후 다시 시도하십시오. 루프의 시작 부분에 number가 있으면 0을 인쇄하고 종료하십시오 > n.

설명

{       Do infinitely
_C      Clear the screen (we basically print every run of odd numbers, but clear out everything that doesn't sum up to n)
g=q     Set g to the first num of this cycle (q starts as 1 in QBIC)    
┘       (Syntatcic linebreak)
q=q+2   Raise q to the next odd number, this sets up both the next outer loop as well as a coming FOR loop
~g>:|   If we start out with a number > n (read as 'a' from the cmd line)
_Xp     THEN quit, printing 0 (the value of the number var 'p')
\       ELSE
[q,a,2| FOR b = q, b <= n, b+=2
?b,┘    PRINT b followed by a tab
g=g+b   Add 'b' to running total 'g'
~g=a|   and if that lands us on 'n'
_X      QUIT (printing nothing: everything is already printed)

1

R , 90 바이트

f=function(x,y=1)'if'(length(w<-which(cumsum(r<-y:x*2-1)==x)),r[1:w],'if'(y>x,0,f(x,y+1)))

온라인으로 사용해보십시오!

y : x의 시퀀스 누적 합계를 홀수 시퀀스로 변환 한 테스트를 재귀 함수를 사용합니다. x가 초과 될 때까지 각 재귀에서 y가 증가합니다. 대상에 합산 된 첫 번째 시퀀스가 ​​반환됩니다.


1

파이썬 2 , 89 바이트

lambda n,r=range:[v for v in[r(1,n+1,2)[i:j]for i in r(n)for j in r(n+1)]if sum(v)==n][0]

명명되지 않은 함수는 양의 정수를 취하고 n존재하는 경우 결과를 반환하고 IndexError그렇지 않으면 결과를 반환합니다 .

온라인으로 사용해보십시오!

모든 관련 홀수 번호의 목록 작성 r(1,n+1,2)인을 range(start=1, stop=n+1, step=2); 것과 슬라이싱하여 모든 해당 서브 슬라이스 (더하기 일부 비어있는) 생성 i을 포함 j하여 배타적 [i:j]전역 i에서 ) 0 [N 사용 r(n)하고 j에서 0 [n]을 이용하여 r(n+1)(빈 것 i>=j또는 i) 경계를 벗어난 단계; 올바른 합계를 가진 사람들을위한 필터 if sum(v)==n; 반환 사용하여 첫 번째 (따라서 긴) 등의 조각 [0].




1

PHP , 73 바이트

무한 루프는 해결책이 없습니다

for($e=-1;$s-$i=$argn;)$s+=$s<$i?$n[]=$e+=2:-array_shift($n);print_r($n);

온라인으로 사용해보십시오!

PHP , 83 바이트

해결책없이 아무것도 인쇄하지 않습니다

모든 입력 모드 4 == 2에는 해가 없습니다

for($e=-1;($i=$argn)%4-2&&$s-$i;)$s+=$s<$i?$n[]=$e+=2:-array_shift($n);print_r($n);

온라인으로 사용해보십시오!


해결할 수없는 입력을 감지하지 못함
Titus

@Titus fixed ...
Jörg Hülsermann

0

파이썬 (2) , 122 (121) 119 115 바이트

musicman523 덕분에 -1 바이트. Step Hen 덕분에 -4 바이트. 하하

def f(n,R=range):r=R(1,n,2);print[i for w in R(1,len(r)+1)for i in[r[j:j+w]for j in R(len(r)-w+1)]if sum(i)==n][-1]

온라인으로 사용해보십시오!


1
이것은 함수로서 1 바이트 짧습니다. 온라인으로 사용해보십시오!
musicman523

당신이 다시 정의하면 저장 바이트 range, 온라인으로보십시오!
Stephen

1에 실패합니다 .
Dennis

0

파이썬 3 , 93 바이트

lambda n,r=range:[[*r(s,e+1,2)]for s in r(1,n+1,2)for e in r(s,n+1,2)if(s+e)*(2+e-s)==4*n][0]

온라인으로 사용해보십시오!

내가 한 특별한 점 (s+e)*(2+e-s)==4*n은에 해당 sum(range(s,e+1,2))==n하는 것과 같으며, 같은 크기 일지라도 r=range전자는 if진술 에 더 가깝게 배치 할 수 있습니다 .


0

파이썬 3 , 185 바이트

def f(s):
  d={k:v for k,v in{a:(1-a+((a-1)**2+4*s)**(.5))/2 for a in range(1,s,2)}.items()if int(v)==v};m=max(d.keys(), key=(lambda k: d[k]));return list(range(int(m),int(m+2*d[m]),2))

온라인으로 사용해보십시오!


이것이 어떻게 작동하는지에 관해서는 간단한 무차별 대입 검색보다 조금 더 우아한 해결책을 찾으려고 노력했습니다. 나는 산술 시퀀스합에 대한 공식을 재정렬하고 2 차 공식을 적용하여 expression을 얻었습니다 (1-a+((a-1)**2+4*s)**(.5))/2.이 코드는 코드에 나타납니다. 식이 계산하는 것은 원하는 합 s과 산술 시퀀스의 첫 번째 항이 주어지면 시퀀스 a의 길이입니다. 이 길이는 사전에 키로 첫 번째 용어의 값으로 저장됩니다.

다음으로, 정수가 아닌 모든 값은 유효하지 않은 시퀀스를 나타내므로 사전에서 제거됩니다. 여기에서 가장 큰 값이 식별 max(d.keys(), key=(lambda k: d[k]))되고 해당 위치 및 해당 길이의 홀수 시퀀스가로 결정됩니다 list(range(int(m),int(m+2*d[m]),2)).


나는 당신이 아무것도 볼 경우 골프를 도와 도움을 찾고 있습니다. 나는 사소한 알고리즘으로 내가 얼마나 잘 할 수 있는지 보는 데 더 관심이 있었다. 내 대답은 최고의 Python 솔루션보다 거의 두 배입니다.


이게 효과가 있을까요? repl.it/JTt7 (177 바이트)
Zacharý

0

매스 매 티카, 56 바이트

Last@Cases[Subsequences@Table[n,{n,1,#,2}],x_/;Tr@x==#]&

Function첫 번째 인수로 #. Table[n,{n,1,#,2}]보다 작거나 같은 양의 홀수 목록을 계산합니다 #. Subsequences길이가 증가함에 따라 순서대로 해당 목록의 모든 하위 시퀀스를 반환합니다. 그런 다음 Cases어떤 일치 x_/;Tr@x==#, x즉 그 합 Tr@x이 입력과 같도록 시퀀스 를 취합니다 #. 그런 다음 Last그러한 순서 를 취합니다 .


0

자바 스크립트 (ES6), 72 바이트

n=>(g=s=>s?s>0?g(s-(u+=2)):g(s+l,l+=2):u-l?l+' '+g(s,l+=2):u)(n-1,l=u=1)

공백으로 구분 된 홀수의 문자열을 반환하거나 유효하지 않은 입력을 던집니다. (적절한 경우 비어 있음) 배열을 반환하는 84 바이트 버전 :

n=>n%4-2?(g=s=>s?s>0?g(s-(u+=2)):g(s+l,l+=2):u-l?[l,...g(s,l+=2)]:[u])(n-1,l=u=1):[]

설명 : 재귀를 사용하여 일부 바이트를 절약 할 수 있다는 점을 제외하고는 @ Cabbie407의 awk 솔루션을 Sum of Consecutive Integer 에 느슨하게 기반으로했습니다 .


0

PHP, 78 바이트

for($b=-1;$s-$argn;)for($n=[$s=$x=$b+=2];$s<$argn;)$s+=$n[]=$x+=2;print_r($n);

솔루션이 없으면 무한 루프. 삽입 ?$b>$argn+2?$n=[]:1:0$s-$argn대신 빈 배열을 인쇄 할 수 있습니다.

온라인으로 실행 -nR하거나 사용해보십시오 .


0

C # (. NET 코어) 129 바이트

(i)=>{int s,j,b=1,e=3;for(;;){var o="";s=0;for(j=b;j<e;j+=2){s+=j;o+=j+" ";}if(s==i)return o;s=s<i?e+=2:b+=2;if(b==e)return"";}};

공백으로 구분 된 문자열로 숫자를 출력합니다 (다른 문자는을 변경하면됩니다 " "). 솔루션이없는 입력은 빈 문자열을 반환합니다 (오류없이 영원히 실행하는 것이 솔루션이 없음을 나타내는 올바른 방법 인 경우을 제거하여 17 바이트를 절약 할 수 있음 if(b==e)return"";).

알고리즘은 다음과 같습니다

  1. [1]로 시작
  2. 합이 목표와 같으면리스트를 리턴하십시오.
  3. 합이 목표보다 작 으면 다음 홀수를 추가하십시오.
  4. 합계가 목표보다 큰 경우 첫 번째 항목을 제거하십시오.
  5. 목록이 비어 있으면 반환하십시오.
  6. 2에서 반복

당신은 쓸 수 (i)=>i=>
aloisdg는 분석 재개 모니카 말한다

0

C ++, 157-> 147 바이트


DJMcMayhem 덕분에 -10 바이트

응답이 없으면 0을, 그렇지 않으면 1을 반환합니다.

마지막 줄이 답입니다

int f(int n){for(int i=1;;i+=2){int v=0;for(int k=i;;k+=2){v+=k;std::cout<<k<<" ";if(v==n)return 1;if(v>n)break;}if(i>n)return 0;std::cout<<"\n";}}

언 골프 :

int f(int n)
{
    for (int i = 1;; i += 2)
    {
        int v = 0;
        for (int k = i;; k += 2)
        {
            v += k;
            std::cout << k << " ";
            if (v == n)
                return 1;
            if (v > n)
                break;

        }
        if (i > n)
            return 0;
        std::cout << "\n";
    }
}

이것은 내 첫 번째 코드 골프입니다 ^^


당신이 그것을 int로 기능했고 또한 0 또는 1을 반환하는 경우 당신은 당신이 할 수있는, 몇 바이트를 저장할 수있는 int v=0;대신에 int v;....v=0;당신이 줄 바꿈이 구분하여 출력 한 경우, 당신은 할 수있는 std::cout<<k<<"\n";한 후 모두 두 번째 줄 바꿈을 제거
DJMcMayhem

내가 마지막 추천을 한 경우 모든 단일 숫자에 새 줄을 인쇄하지만 숫자 그룹을 분리하고 싶지만 -10 바이트에 대한 감사합니다
-8

0

코 틀린, 152 바이트

fun f(a:Double){var n=Math.sqrt(a).toInt()+1;var x=0;while(n-->0){if(((a/n)-n)%2==0.0){x=((a/n)-n).toInt()+1;while(n-->0){println(x.toString());x+=2}}}}

온라인으로 시도하십시오 (4-5 초 동안 기다립니다.

언 골프

fun f(a: Double){
    var n=Math.sqrt(a).toInt()+1;
    var x=0;

    while(n-->0){
        if(((a/n)-n)%2==0.0){
            x=((a/n)-n).toInt()+1;

            while(n-->0){
                println(x.toString());
                x+=2;
            }

        }
    }
}

0

Excel VBA, 139 바이트

Subn예상되는 유형의 정수를 입력 하여 연속 홀수의 가장 긴 시퀀스를 셀에보고하는 루틴[A1]

Sub a(n)
For i=1To n Step 2
s=0
For j=i To n Step 2
s=s+j
If s=n Then:For k=i To j-1 Step 2:r=r &k &"+":Next:[A1]=r &j:End
Next j,i
End Sub
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.