이 숫자가 삼각형입니까?


33

도전

양의 정수가 주어지면 삼각 숫자인지 확인하고 그에 따라 두 개의 상수로 구분되는 값 중 하나를 출력합니다.

정의

삼각형 개수 이들은 또한 화학식으로 표현 될 수있다 (1)에서 시작하여 연속적인 양의 정수의 합으로 표현 될 수있는 수이고 n(n + 1) / 2, n어떤 양의 정수이다.

테스트 사례

진실한 :

1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991

거짓 :

2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999

규칙

  • 출품작은 기능 또는 프로그램 일 수 있습니다.
  • 입력 값이 10 6 미만의 양의 정수라고 가정 할 수 있습니다 .
  • 두 범주를 구별하려면 두 개의 일정하고 고유 한 출력을 선택해야합니다.

이것은 이므로 각 언어에서 가장 짧은 바이트 단위의 코드가 이깁니다.





왜 0을 포함하지 않았습니까?
Neil

1
@Neil 가능한 엣지 케이스 수를 최소화하고 싶었고 제로 처리는 그다지 중요하지 않다고 느꼈습니다. 0을 처리해야한다면 더 좋을 것이라고 생각합니까? (예를 들어 젤리 답변은 현재 0에 실패합니다)
ETHproductions

답변:


21

하스켈 , 23 바이트

편집하다:

  • -1 바이트 : @xnor은로 괄호를 제거했습니다 $.

익명 함수를 가져 와서 a Int를 반환합니다 Char.

출력은 '1'삼각 숫자 및 '0'기타를위한 것입니다.

(!!)$show.(10^)=<<[0..]

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

  • 로 사용하십시오 ((!!)$show.(10^)=<<[0..]) 998991.
  • 1, 10, 100, 1000, ...의 숫자를 생성하고 문자열로 변환하여 연결합니다. 그런 다음 결과로 나오는 무한 문자열로 색인합니다

    "1101001000100001000001000000...

6
상상력있는 방법! 로 바이트를 저장할 수 있습니다 (!!)$show.(10^)=<<[0..].
xnor

20

파이썬 , 24 바이트

lambda n:(8*n+1)**.5%1>0

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

나머지 False는 삼각형 숫자로 출력 합니다 True. 8*n+1완벽한 사각형 인지 확인합니다 . 파이썬은 크기에 상관없이 정수 부동 소수점을 정확히 제곱해야하므로 부동 소수점 문제가 없습니다.


3
(1<<10000)**.5: OverflowError : int가 float로 변환하기에 너무 큼
isaacg

@isaacg 도전은 큰 입력을 요구하지 않습니다 : "입력이 10 ^ 6 미만의 양의 정수라고 가정 할 수 있습니다"
trichoplax

1
@trichoplax 나는 텍스트에서 xnor의 주장을 반박하고 있다고 생각합니다. 제출은 괜찮습니다. 동의합니다.
isaacg

13

젤리 , 4 바이트

R+\ċ

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

방법?

R+\ċ - Main link: n
R    - range(n)   -> [1,2,3,...,N]
  \  - cumulative reduce by:
 +   -   addition -> [1,3,6,...,T(N)]
   ċ - count occurrences of right (n) in left -> 1 if triangular, 0 otherwise

누적 감소가 자동으로 범위를 만들지 않는다는 것에 놀랐습니다. 이 뒤에 디자인 선택이 있습니까?
ETHproductions

나는 100 % 확신 할 수는 없지만, (적어도 현재) 가변적 인 조작이 축소되어 범위가 만들어 질 필요가 있다고 생각합니다.
Jonathan Allan

... 실제로는 적용되지 않는 것 같습니다 (예 : this vs this . 빠른 링크 구현은 가변적 인 연산이 인수에 대해 그렇게하도록 정의하더라도 반복 가능 범위가 범위를 만들지 않도록 무시합니다) Pinged Dennis to field this one :)
Jonathan Allan

@ETHproductions /\아마는 범위 캐스트 정수의 인수에 대한 아이디어를 낳은 구현 된 최초의 다섯 quicks 중이었다.
데니스

13

레티 나 , 10 바이트

(^1|1\1)+$

입력이 단항입니다. 출력은 0또는 1입니다.

온라인으로 사용해보십시오! 편의상 10 진수를 1 진수로 변환하는 테스트 스위트입니다.

설명

이것은 순방향 참조에서 가장 기본적인 연습입니다. 대부분의 사람들은 정규 표현식에서 역 참조에 익숙합니다 (예 : (.)\1반복되는 문자와 일치). 그러나 고급 기능 중 일부는 참조하는 그룹 앞이나 안쪽에서 역 참조를 사용할 수 있습니다. 이 경우 일반적으로 순방향 참조라고합니다. 참조가 반복되면 이치에 맞습니다. 첫 번째 반복에서는 잘 정의되지 않았지만 후속 반복에서는 후반 또는 주변 그룹이 무언가를 캡처하여 재사용 할 수 있습니다.

이것은 단항 문자열에서 반복 패턴을 구현하는 데 가장 일반적으로 사용됩니다. 이 경우 입력을 연속 정수의 합으로 일치 시키려고 시도합니다.

(        # This is group 1, which we'll repeat 1 or more times.
  ^1     #   Group 1 either matches a single 1 at the beginning of the string.
|        # or
  1\1    #   It matches whatever the previous iteration matched, plus another
         #   1, thereby incrementing our counter.
         # Note that the first alternative only works on the first iteration
         # due to the anchor, and the second alternative only works *after*
         # the first iteration, because only then the reference is valid.
)+
$        # Finally, we make sure that we can exactly hit the end of the
         # string with this process.

1
왜 작동하지 (^|1\1)+$않습니까?
Leaky Nun

3
@LeakyNun 정규식 엔진은 n 이 비어있는 경우 그룹 반복을 중지하는 최적화 기능을 가지고 있습니다. 여기서 n 은 사용중인 수량 자의 최소값입니다 (1의 경우; 최소값이 0이면 어쨌든 한 번 시도됩니다) . 당신이를 변경하는 경우 +{2,}, 그것을 작동합니다. 이 최적화는 무한 루프를 방지하지만 .NET 정규식이 자체적으로 Turing-complete되지 않도록하는 유일한 방법이기도합니다.
마틴 엔더

이것은 단지 70 바이트를 절약했습니다 : codegolf.stackexchange.com/a/118387
Neil

덕분에 74 바이트를 만드십시오 \G!
Neil


8

매스 매 티카, 16 바이트

OddQ@Sqrt[1+8#]&

기본적으로 xnor의 Python 솔루션 포트입니다 . 그렇지 않으면 True삼각형 숫자를 출력 합니다 False.


7

자바 스크립트 (ES6), 30 27 바이트

kamoroso94 덕분에 2 바이트 절약

f=(n,k)=>n>0?f(n+~k,-~k):!n

테스트 사례

비 재귀 버전 (ES7), 19 바이트

아드 난 항구 의 답변 .

x=>(8*x+1)**.5%1==0

오직 당신 만이 내가 게시 몇 분 전에 대답에 19 바이트 솔루션 편집 것을 지금보고 . 내 것을 삭제해야합니까? 그것에 대해 일반적으로 인정되는 에티켓은 무엇입니까?
Shaggy

1
@Shaggy 나는 그것이 진짜 문제라고 생각하지 않습니다. 내 '주요'답은 실제로 재귀 적입니다.
Arnauld

f=(n,k=1)=>n>0?f(n-k,k+1):!n? 를 사용하여 28 바이트로 줄입니다 .
kamoroso94

1
감사합니다! 업데이트되었습니다. 그리고의 초기화를 생략하여 세 번째 바이트가 저장되었습니다 k.
Arnauld

초기 undefined값 의 증분으로 비트 NOT을 우아하게 사용 ; 귀하의 이전 솔루션에 독립적으로 도착한 후 귀하의 편집 내용을 읽는 것이 기뻤습니다.
apillers

6

CJam , 11 바이트

ri2*_mQ_)*=

그렇지 않으면 1삼각형 출력 0.

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

설명

입력을 고려하십시오 21.

ri               e# Input integer.             STACK: 21
  2*             e# Multiply by 2.             STACK: 42
    _            e# Duplicate.                 STACK: 42, 42
     mQ          e# Integer square root.       STACK: 42, 6
       _)        e# Duplicate, increment.      STACK: 42, 6, 7
         *       e# Multiply.                  STACK: 42, 42
          =      e# Equal?                     STACK: 1

6

Brain-Flak , 40 바이트

(([{}](((()))<>))<>){<>({}({}({})))}{}{}

밀 마법사 와 나는 이 질문에 대해 결투 를했습니다. 우리가 솔루션을 게시하기로 결정했을 때 우리는 42 바이트로 묶여 있었지만 그의 솔루션의 2 바이트 골프를 발견했습니다. 우리는 타이 브레이커로 계산하기로 결정했습니다 (내 솔루션은 다음과 같습니다).

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

설명:

# Set up the stacks like this:  -input
                                     1     -input
                                     1          1
(([{}](((()))<>))<>)                 ^

# Output 1 for triangular and 0 for non-triangular 
{<>({}({}({})))}{}{}

전체 설명은 밀 마법사의 답변을 참조하십시오 .


Brain-Flak , 42 바이트

(([({})])<>){(({}())<>{}({})){((<>))}{}{}}

0\n진실을위한 출력 (literal newline), 거짓을위한 빈 문자열.

아이디어는 입력에서 1, 2, 3을 빼는 것입니다. 0을 누르면이 숫자가 삼각형이라는 것을 알 수 있으므로 여기서 멈출 수 있습니다.

온라인으로 사용해보십시오! (truthy)
온라인으로보십시오! (가짜)

# Push -input on both stacks. One is a counter and the other is a running total
(([({})])<>)

# Count up from -input to 0
{
  # Push the new total which is: (counter += 1) + total (popped) + input (not popped)
  # This effectively adds 1, then 2, then 3 and so on to the running total
  (({}())<>{}({}))
  # If not 0
  {
    # Push to 0s and switch stacks to "protect" the other values
    ((<>))
  # End if
  }
  # Pop the two 0s, or empty the stack if we hit 0
  {}{}
# End loop
}

흥미로운 것을 발견 한 46 바이트 솔루션이 있습니다.

{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}

0\n진실에 대한 출력 (문자 그대로의 개행), 거짓에 대한 빈 문자열.

아이디어는 한 번에 하나씩 연속 숫자로 입력에서 카운트 다운하는 것입니다. 예 input - (1) - (1,1) - (1,1,1). 뺄 때마다 아직 0이 아닌 경우 스택에 추가 값을 남깁니다. 이런 식으로, 우리가 0에 있고 팝할 때 여전히 빼고 있다면 스택의 마지막 값을 제거합니다. 입력이 삼각 숫자 인 경우 정확히 0에서 끝나고 0을 팝하지 않습니다.

온라인으로 사용해보십시오! 진실
온라인으로 사용해보십시오! 허위

# Implicit input (call it I)

# Until we reach 0, or the stack is empty
{
  # Add 1 to the other stack and push it twice. This is our counter.
  <>(({}()))
  # While counter != 0
  {
    # counter -= 1
    ({}[()]
    # if I != 0 
    <>{
      # I -= 1, and push 0 to escape the if
      (<({}[()])>)
    # End if
    }
    # Pop from the stack with I. This is either the 0 from the if, or I
    {}
    # Get ready for next loop End while
    <>)
  # End While
  }
  # Pop the counter that we were subtracting from
  {}<>
# End Until we reach 0, or the stack is empty.
}

6

젤리 , 5 바이트

×8‘Ʋ

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

배경

n을 입력으로 하자 . 경우 n이 는 IS K 번째 삼각수는, 우리가

=케이(케이+1)2케이2+케이2=0케이=12(1±1+8),

이것은 1 + 8n 이 홀수이고 완벽한 제곱 인 경우에만 자연적인 해결책이 있음을 의미 합니다. 분명히, 1 + 8n 의 패리티를 점검 할 필요는 없습니다.

작동 원리

×8‘Ʋ  Main link. Argument: n

×8     Yield 8n.
  ‘    Increment, yielding 8n + 1.
   Ʋ  Test if the result is a perfect square.


5

Brain-Flak , 42 바이트

(([{}](<((())<>)>))<>){<>({}({}({})))}{}{}

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

설명

이 프로그램의 목표는 두 스택에 상태를 만들고 두 스택 중 하나가 0이 될 때까지 두 스택에서 일정한 작업을 수행하는 것입니다. 그런 다음 우리가 어떤 스택에 있는지에 따라 출력 할 수 있습니다. 이것은 숫자의 부호를 결정하는 프로그램과 유사합니다. 이러한 프로그램은 n하나의 스택과 -n다른 스택에 놓고 스택 중 하나가 0이 될 때까지 하나를 추가하고 스택을 전환합니다. 처음에 숫자가 음수이면 첫 번째 스택은 0이되고, 숫자가 양수이면 다른 스택은 0이됩니다.

여기에서 입력에서 연속적인 숫자를 빼고 하나를 빼는 두 개의 스택을 만듭니다. 연속적인 숫자를 빼는 것은 숫자가 삼각형 인 경우에만 종료됩니다 (그렇지 않으면 0을 통과하고 계속 음수로 진행됩니다). 다른 하나는 항상 양수에 대해 종료되지만 항상 첫 번째보다 느리게 수행되므로 삼각형이 아닌 숫자는 해당 스택에서 종료됩니다.

그렇다면 동일한 연산이 연속 된 숫자를 빼고 다른 숫자를 빼도록 스택을 어떻게 설정합니까? 각 스택에서 입력을 확인할 수 있으므로 입력을 확인할 수 있습니다. 아래에서 차이가 있고 아래에서 차이가 있습니다. 실행할 때마다 "차이"를 일반 "차이"에 더하고 입력에서 차를 뺍니다. 삼각 관계를 검사하는 스택의 경우 1우리는 실행할 때마다 연속 정수를 얻도록 이중 차이를 설정하고 다른 스택의 0경우 차이를 변경하지 않도록 설정합니다. 즉, 항상 1입니다. 스택이 처음에 어떻게 설정되는지, n입력은 어디에 있습니까 ?

-n  -n
 0   1
 1   0

마지막으로 종료하면 이러한 차이를 사용하여 스택을 확인하여 최상위 두 값을 팝하고 1삼각형 숫자와 0비 삼각형 숫자를 얻을 수 있습니다.


주석이 달린 코드

(([{}](<((())<>)>))<>) Set up the stack
{                      While
 <>                    Switch stacks
 ({}({}({})))          Add bottom to second to bottom, add second to bottom to top
}                      End while
{}{}                   Pop the top two values

여기 내가 좋아하는 50 바이트 솔루션이 있습니다.

{(({}[()]))}(([[]])<>){({}{}())<>}({}{()<><{}>}{})

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


5

Cubix , 23 24 25 바이트

I1Wq/)s.;0..s;p-?\.+O@u

truthy 아무것도 0 0 falsey합니다. 카운터를 증가시키고 누적 합계에 추가하고 입력과 비교하여 무차별 대입. 이제 2x2x2 큐브에 맞추십시오. 그것을했다!

    I 1
    W q
/ ) s . ; 0 . .
s ; p - ? \ . +
    O @
    u .

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

  • / 얼굴을 보아라.
  • I10\ 정수 입력, 1 (카운터), 0 (sum) 및 반영
  • +s;p-루프 바디. 합계 및 카운터 추가, 이전 합계 삭제, 입력 올리기 및 빼기
  • ? 빼기 결과 테스트
    • 직진으로 수행되는 0 개의 결과 \.uO@는 바닥면, 비 작동, U 턴, 출력 및 정지에 반영됩니다.
    • 긍정적 인 결과를 얻으려면 바닥면에서 우회전하여 @정지하십시오.
    • 음수 결과 왼쪽 ;qWs)/su드롭 뺄셈의 경우 입력을 맨 아래로 이동, 왼쪽으로 이동, 카운터 및 합계 교환, 카운터 증가, 반영, 합계 및 카운터 교환, 메인 루프 본체로 U 회전.

마지막 바이트는 많은 노력과 영리함이 필요합니다.
ETHproductions


1
@ETHproductions가 바이트를 찾았습니다
MickyT

코드와 펼쳐진 큐브가 다른 것처럼 보이며 오른쪽 아래 모서리는 .큐브에 있지만 1코드에는 있습니다.
밀 마법사

@WheatWizard 감사합니다. 내
편이

4

05AB1E , 7 6 바이트

편집 : @Dennis 덕분에 : 증가 연산자를 잊어 버렸으므로 바이트가 절약되었습니다.

8*>t.ï

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

nsqrt(8n + 1)정수인 경우 삼각형

작동 원리

8* # multiply implicit input by 8
  > # add one
   t # sqrt
    .ï # is integer

아마 당시 아직 사용할 수 없습니다, 그러나 t.ï할 수 있습니다 Ų숫자가 사각형 인 경우 확인하는 내장을 요즘.
Kevin Cruijssen

4

펄 6 , 17 바이트

{$_∈[\+] 1..$_}

$_함수에 대한 입력 값이 삼각 가감 소의 요소와 같은지 여부 만 확인합니다 (1, 1+2, ..., 1+2+...+$_).


4

Alice , 38 22 바이트

Martin과 Leo 덕분에 많은 바이트가 절약되었습니다.

/ 나는 \ 2 * .2RE.h * -n / o @

후행 줄 바꿈이 있습니다. 그렇지 않으면 1삼각형 출력 0.

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

설명

이것은 내 CJam 답변 과 동일한 접근 방식을 사용합니다 . 선형화 된 형태로 프로그램은

i2*.2RE.h*-no@

여기서 iand o는 실제로 서수 모드입니다.

21예를 들어 입력 을 고려하십시오 .

i         Input integer                       STACK: 21
2*        Multiply by 2                       STACK: 42
.         Duplicate                           STACK: 42, 42
2RE       Integer square root                 STACK: 42, 6
.         Duplicate                           STACK: 42, 6, 6
h         Increment                           STACK: 42, 6, 7
*         Multiply                            STACK: 42, 42
-         Subtract                            STACK: 0
n         Logical negation                    STACK: 1
o         Output integer                      STACK:
@         End program

나의 첫 번째 Alice 답변
Luis Mendo

1
나는 이것이 Martin의 멋진 제어 구조 중 하나로 인해 절반으로 줄어들 수 있다고 생각합니다.
ETHproductions

그래서 나도 ... :-)
Luis Mendo

나의 첫번째 Alice 골프 : 같은 코드, 23 바이트
Nitrodon

이런 종류의 프로그램에 대한보다 "표준적인"레이아웃은 이것 입니다. 즉, 스택에서 1을 제거하고 빼기의 논리적 부정을 간단히 출력 할 수 있습니다 (예 : ...h*-no@
Leo

4

Japt , 10 7 바이트

@Luke 및 @ETHproductions 덕분에 3 바이트 절약

*8Ä ¬v1

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

설명:

*8Ä ¬v1
    ¬    // Square root of:
*8       //   Input * 8
  Ä      //   +1
     v1  // Return 1 if divisible by 1; Else, return 0

õ å+ øU

설명:

õ å+ øU
õ           // Create a range from [1...Input]
  å+        // Cumulative reduce by addition
     øU     // Does it contain the input?

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


이 질문은 두 개의 일정한 별개의 출력을 요구합니다.
xnor

*8Ä ¬u1 c9B (입력이 삼각형이면 0을 출력하고 그렇지 않으면 1을 출력)
Luke

당신은 변경 될 수 있습니다 @Luke u1 cv1, 저는 믿습니다 (출력 스위칭)
ETHproductions

7 바이트? 좋은! 마지막으로 내 자신의 유사한 솔루션을 게시하는 동안 어떻게 든 이것을 놓쳤습니다. 삭제 하시겠습니까? 알려주세요.
Shaggy

4

R , 23 19 바이트

다른 답변과 비슷한 접근 방식. 8x+1완벽한 정사각형 인지 확인합니다 .
Giuseppe와 MickyT 덕분에 -4 바이트.

!(8*scan()+1)^.5%%1

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


2
!대신 사용할 수 있습니다==0
Giuseppe

벡터화되어 있기 때문에 매우 좋습니다!
Giuseppe

1
외부 브래킷도 제거 할 수 있다고 생각합니다.!(8*scan()+1)^.5%%1
MickyT

3

MATL , 5 바이트

t:Ysm

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

설명:

t       % Duplicate input
 :      % Range(1, input)
  Ys    % Cumulative sum. This will push the first *n* triangular numbers
    m   % ismember. Pushes true if the input is contained within the array we just pushed

나는 게시하려고했다 t:Ys=a. m:-)를 잊었다
Luis Mendo

1
@LuisMendo 나는 이 답변을m 볼 때까지 몰랐다 . 두 답변이 거의 동일한 방법이 재미있다 : D
DJMcMayhem

3

배치, 72 바이트

@set/aj=i=0
:l
@if %1% gtr %j% set/aj+=i+=1&goto l
@if %1==%j% echo 1

성공하면 1을 출력하고 실패하면 아무것도 출력하지 않습니다. 어떤 이유로 질문에 의해 요청되지 않더라도 0으로 작동합니다.


3

자바 스크립트 (ES7), 19 18 바이트

에서 내 대답 A와 관련된 질문 .

OP에서 허용 한대로 false삼각형 숫자 또는 true비 삼각형에 대한 출력 .

n=>(8*n+1)**.5%1>0

시도 해봐

f=
n=>(8*n+1)**.5%1>0
oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


나는 당신이 n=>(8*n+1)**.5%1>0(출력을 반전시킬) 바이트를 절약 할 수 있다고 생각합니다.
ETHproductions

@ETHproductions : 허용하는 한 괜찮습니다. 그래도 정상적으로 허용됩니까?
Shaggy

1
"두 개의 일정하고 별개의 출력"으로 규정되므로 그렇습니다. 다른 의사 결정 문제는 진실 / 거짓이 필요할 수 있습니다.
ETHproductions


3

수학, 28 바이트

!Accumulate@Range@#~FreeQ~#&

로 교체 7!하는 것이 좋습니다 #. 첫째, 더 짧습니다. 더 중요한 것은 현재 솔루션이 작동하는 입력의 크기를 인위적으로 제한하기 때문에 현재 솔루션이 정확하지 않다는 것입니다.
Greg Martin

1
OP는 "입력 값이 10 ^ 6 미만의 양의 정수라고 가정 할 수 있습니다."라고 생각합니다.하지만 아이디어가 마음에 들어서 5040 개의 요소 목록을 사용하여 모든 경우에 대해 올바른 결과를 제공하지만 최악의 경우가 있습니다. 999999 요소의 목록이 필요합니다. 팁을 주셔서 감사합니다!
J42161217

1
죄송합니다. OP의 의견을 보지 못했습니다! 그렇습니다. 코드 골프에는 "거의"인센티브가 있습니다. 1 바이트 절약은 전 세계의 모든 효율성보다 코드 골프 문제에서 더 중요합니다. :)
Greg Martin


3

엑셀, 31 22 바이트

Octopus 덕분에 9 바이트 절약

TRUE삼각 숫자에 대한 출력 . 그렇지 않으면 FALSE. 8*n+1완벽한 사각형 인지 확인합니다 .

=MOD(SQRT(8*B1+1),1)=0

1
=MOD(SQRT(8*A1+1),1)=0몇 바이트 절약
Octopus

2

Brachylog , 5 바이트

≥ℕ⟦+?

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

설명

≥ℕ⟦+?
≥ℕ     There is a number from 0 to {the input} inclusive
  ⟦    such that the range from 0 to that number
   +   has a sum
    ?  that equals the input


2

파이썬-52 바이트

참고 : 다른 두 가지 Python 답변이 훨씬 짧다는 것을 알고 있지만 이것은 구식 방법이며 더 많은 수동 알고리즘입니다.

n=input();i=s=0
while s<n:s=(i*i+i)/2;i+=1
print s>n


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.