부모 화 가능한 이진수


28

당신이 앞에 0이없는 이진의 일부 양의 정수를 표현하고 모든 교체하는 경우 1와 함께 (모든 0로모그래퍼 ), 모든 괄호가 일치?

대부분의 경우 그렇지 않습니다. 예를 들어, 9는 1001이진수로되어 ())(있으며 처음 두 괄호 만 일치합니다.

그러나 때때로 그들은 일치합니다. 예를 들어 44는 101100이진수로되어 ()(())있으며 모든 왼쪽 괄호에는 오른쪽 괄호가 일치합니다.

이진수 괄호 버전의 숫자가 모두 일치하는 괄호를 갖는 경우 양의 10 진 정수 를 가져 와서 값을 인쇄하거나 반환 하는 프로그램 또는 함수를 작성하십시오 . 그렇지 않으면 잘못된 값을 인쇄하거나 반환 합니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

관련 OEIS 시퀀스.

100 이하의 참신한 예 :

2, 10, 12, 42, 44, 50, 52, 56

100 이하의 잘못된 예 :

1, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99


10
모든 것에 대한 순서가 있습니다 ...
Arcturus

답변:


8

티 스크립트 , 9 바이트 16 18 20 22 24

@ETHproductions 덕분에 2 바이트 절약

!x÷W(n,¢)

우와 짧습니다. @xnor의 접근 방식을 사용합니다. 이것은 재귀 교체 기능 ( W)을 사용하여 모든 10것과 동등한 것을 대체합니다 (). 문자열이 비어 있으면 균형이 조정됩니다.


이 챌린지가 게시 된 후 만들어진 TeaScript 버전을 사용하면 7 바이트 가 될 수 있습니다 .

!x÷W(n)

언 골프

!xT(2)W(n,``)

설명

!      // NOT, returns true if empty string, else false
 xT(2)   // To binary
 W(n,``) // n is 10, reclusive replaces 10 or (), with nothing.

1
우수한! 도움이 될 수있는 두 가지 : 1) 올라갈 때 허위 인 경우 이미 내려온 허위이므로 첫 물결표가 필요하지 않습니다. 2) 나는 ~--c정확히 같은 시나리오에서 거짓 이라고 생각 c--합니다.
ETHproductions

@ETHproductions 감사합니다! 이제 16 바이트로
줄었습니다

13

Pyth, 10 바이트

!uscG`T.BQ

Pyth Compiler 에서이 테스트 스위트 를 사용해보십시오 .

작동 원리

              (implicit) Store the evaluated input in Q.
       .BQ    Return the binary string representation of Q.
 u            Reduce w/base case; set G to .BQ and begin a loop:
     `T         Return str(10) = "10".
   cG           Split G (looping variable) at occurrences of "10".
  s             Join the pieces without separators.
              Set G to the returned string.
              If the value of G changed, repeat the loop.
              This will eventually result in either an empty string or a
              non-empty string without occurrences of "10".
!             Return (and print) the logical NOT of the resulting string.

나는 동등한 것을 생각 해냈다 !u:G`Tk.BQ. 틀림없이 이해하기 쉽다.
orlp

예, 확실히 더 자연스러운 선택입니다.
Dennis

8

Python2, 87 바이트

try:exec"print 1,"+"".join(["],","["][int(c)]for c in bin(input())[2:])
except:print 0

구문 오류를 악용하는 끔찍한 구현입니다.


3
이것은 코드 골프입니다. 끔찍한 칭찬입니다.
corsiKa

8

자바 스크립트 (ES6), 55 54 51 바이트

n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2

@ Vɪʜᴀɴ@xsot 덕분에 바이트를 절약했습니다 !

설명

n=>
  ![...n.toString(    // convert the input to an array of binary digits
    d=2)]             // d = current depth (+2)
      .some(c=>       // iterate through the digits
        (d+=c*2-1)    // increment or decrement the parenthesis depth
          <2          // if the depth goes negative, return false
      )*
        d==2          // if we finished at a depth of 0, return true

1
필요없는 것을 제거하여 2 바이트를 절약 할 수 있습니다 f=. 정수 +c대신 c|0대소 문자를 구분하는 대신 use를 사용할 수도 있습니다 . (+c?d++:d--)더 짧은 것을 사용할 수도 있습니다
Downgoat

@ Vɪʜᴀɴ 좋아. 언제 사용해야하는지에 대한 안내가 f=있습니까? 사이트의 많은 다른 JavaScript 답변이 함수의 이름을 지정하기 때문에.
user81655

1
일반적으로 챌린지에서 요구하는 경우 함수 이름 만 지정하면됩니다. 그렇지 않으면 명명되지 않은 함수가 정상이라고 가정하는 것이 안전합니다.
Alex A.

Firefox 11truefalse
에서을 (

2
Javascript를 모르지만 몇 바이트를 잘라내려고 시도했지만 크롬에서 작동합니다.n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
xsot

7

파이썬 2, 45 바이트

f=lambda n,i=1:i*n>0<f(n/2,i+(-1)**n)or n<i<2

재귀 함수 Parens 의 현재 중첩 레벨 ni를 유지하면서 끝에서 2 진 숫자를 읽습니다 . 아래로 떨어지면 0거부하십시오. 우리가 시작에 도달하면 카운트가인지 확인합니다 0.

실제로 우리 i=1는에 빠졌는지 쉽게 확인할 수 있도록 카운트를 시작합니다 0. 유일한 터미널 성공 사례는 n==0i==1입니다 n<i<2. 우리는이 검사를 강제로 수행합니다.n==0 또는에 해당 하는 경우 자동으로 실패하는i 가 수행되도록 0합니다.

feersum은 재귀가 아닌 경우를 단락으로 재구성하여 2 바이트를 절약했습니다.


3
더 많은 조건부 학대가 필요합니다. f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2적어도 1을 저장합니다.
feersum

6

CJam, 11 바이트

ri2b"}{"f=~

이것은 불쾌합니다. 괄호로 묶을 수있는 숫자의 경우 하나 이상의 블록을 인쇄합니다. 보호 할 수없는 숫자의 경우 STDOUT에 아무 것도 인쇄하지 않고 충돌합니다. CJam 인터프리터 에서 온라인으로 시도하면 STDOUT과 STDERR을 구분하지 않습니다.

비어 있지 않은 / 빈 문자열은 CJam에서 진실 / 거짓이며 인쇄 된 출력은 항상 문자열이므로 규칙을 준수합니다. 총 14 바이트에 대해 3 바이트의 추가 비용이 발생 하면 실제로 스택에 진실하거나 허위 문자열 을 남길 수 있습니다.

Lri2b"}{"f=~]s

이것은 여전히 ​​괄호를 사용할 수없는 숫자에 대해 충돌하며 기본적으로 허용됩니다. .

시운전

$ cjam <(echo 'ri2b"}{"f=~') <<< 52 2>&-; echo
{{}{}}
$ cjam <(echo 'ri2b"}{"f=~') <<< 53 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 54 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 55 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 56 2>&-; echo
{{{}}}

작동 원리

ri          e# Read an integer from STDIN.
  2b        e# Push the array of its binary digits.
    "}{"f=  e# Replace 0's with }'s and 1's with {'s.
          ~ e# Evaluate the resulting string.
            e# If the brackets match, this pushes one or more blocks.
            e# If the brackets do not match, the interpreter crashes.

CJam, 15 바이트

ri2bs_,{As/s}*!

보십시오 이 바이올린 CJam 인터프리터에서 또는 한 번에 모든 테스트 케이스를 확인합니다 .

작동 원리

ri               Read an integer from STDIN.
  2b             Push the array of its binary digits.
    s            Cast to string.
     _,          Push the string's length.
       {    }*   Do that many times:
        As/        Split at occurrences of "10".
           s       Cast to string to flatten the array of strings.
              !  Push the logical NOT of the result.

1
젠장

6

파이썬, 51 바이트

lambda n:eval("'0b'==bin(n)"+".replace('10','')"*n)

익명의 기능. 다음과 같은 표현으로 평가

'0b'==bin(n).replace('10','').replace('10','').replace('10','')...

각 교체는에 10해당하는 모든을 제거합니다 (). 모든 대체가 수행 된 후, 함수는 남은 것이 단지 2 진 접 두부인지 리턴합니다 0b. 자릿수는 대부분의 단계를 거치고 그 값이 가장 많으 n므로 대체 하기에 충분합니다 .kk/22**k


4

루비, 40

->i{n='%0b'%i;1while n.slice!'10';n<?0}

간단한 문자열 조작. 남은 것이 없을 때까지 '10'을 삭제합니다.


4

진심으로 , 17 바이트

,;2@¡@`""9u$(Æ`nY

0거짓과 1참에 대한 출력 . 온라인으로 사용해보십시오 .

설명:

,      get value from stdin
;      dupe top of stack
2@¡    pop a: push a string containing the binary representation of a (swapping to get order of operands correct)
@      swap top two elements to get original input back on top
`""9u$(Æ` define a function:
  ""     push empty string
  9u$    push "10" (push 9, add 1, stringify)
  (      rotate stack right by 1
  Æ      pop a,b,c: push a.replace(b,c) (replace all occurrences of "10" in the binary string with "")
n      pop f,a: call f a times
Y      pop a: push boolean negation of a (1 if a is falsey else 0)

4

apt, 23 바이트

JaptJa vaScri pt 의 단축 버전입니다 . 통역사

Us2 a e@+X?++P:P-- &&!P

이것은 Japt이 아직 TeaScript와 비교할 때까지 얼마나 멀었는지 상기시켜줍니다. 다음 며칠 동안 통역사를 개편 한 후 Vɪʜᴀɴ와 같은 "바로 가기"문자를 추가하고 싶습니다.

작동 원리

       // Implicit: U = input number, P = empty string
Us2 a  // Convert U to base 2, then split the digits into an array.
e@     // Assert that every item X in this array returns truthily to:
 +X?   //  If X = 1,
 ++P   //   ++P. ++(empty string) returns 1.
 :P--  //  Otherwise, P--. Returns false if P is now -1.
&&!P   // Return the final result && !P (true if P is 0; false otherwise).
       // Implicit: output final expression

이 도전 직후에 @ Vɪʜᴀɴ (현재 @Downgoat) W는 TeaScript 답변 과 같이 재귀 대체 기능을 구현하는 데 도움이되었습니다 . 이것은 이제이 도전이 단지 5 바이트만으로 이루어질 수 있다는 것을 의미합니다 :

!¢eAs  // Implicit: U = input integer, A = 10
 ¢     // Convert U to binary.
  eAs  // Recursively remove instances of A.toString().
!      // Return the logical NOT of the result (true only for the empty string).

온라인으로 테스트하십시오!


3

Mathematica, 49 바이트

(#~IntegerDigits~2//.{x___,1,0,y___}:>{x,y})=={}&

Mathematica를 읽을 수 없습니다. 설명 해주세요 :)
코너 오브라이언

@ CᴏɴᴏʀO'Bʀɪᴇɴ 숫자를 기본 2 (목록)로 변환 한 다음 1,0목록에서 반복적으로 제거 하고 결과가 빈 목록인지 테스트합니다.
alephalpha


3

C ++, 104 94 바이트

#include<iostream>
int n,c;int main(){for(std::cin>>n;n&c>=0;n>>=1)c+=n&1?-1:1;std::cout<<!c;}

이 컴파일러로 실행 . 실행하기 전에 표준 입력을 지정해야합니다.

설명

  • main 외부의 선언은 0으로 초기화됩니다.
  • 십진수를 읽으면 컴퓨터이므로 이진으로 암시 적으로 변환됩니다.
  • 우리는 비트 / 괄호를 오른쪽에서 왼쪽 으로 확인 n>>=1합니다.
  • c+=n&1?-1:1열린 괄호의 수를 유지합니다 ).
  • n&c>=0 선행 0 만 남아 있거나 괄호가 열려있는 것보다 더 많이 닫히면 중지됩니다.

3

하스켈, 49 46 바이트

0#l=l==1
_#0=2<1
n#l=div n 2#(l+(-1)^n)
f=(#1)

사용 예 : f 13-> False.

l다른 답변과 마찬가지로 중첩 수준을 추적하고 있습니다. 그러나 "균형"사례는로 표시 1되므로 "- )보다- ("사례는0 입니다.

추신 : l+(-1)^nxnor 's answer 에서 중첩 수준 조정 을 찾았습니다 .


signum너무 복잡한 것 같다, 어떻게 막 _#0=1<0?
xnor

@ xnor : 예, 감사합니다.
nimi

l>0대신에 l==1?
Michael Klein

@MichaelKlein : l==1균형이 맞기 때문 입니다. 인 경우 l>1괄호는 괄호가 없습니다.
nimi

@nimi 내가 어떻게 작동하는지 잘못 해석 참조
마이클 클라인에게

3

파이썬 2, 60 57 56 55 53 52 50 49 바이트

n=input()
i=1
while i*n:i+=1|n%-2;n/=2
print i==1

2 바이트를 절약 한 xnor와 최종 바이트 수를 49로 가져 오는 feersum에 감사드립니다!

설명

입력 번호 n는 최하위 비트에서 처리됩니다. i0과 1의 수를 추적하는 카운터입니다. 1바이트를 저장하기 위해 초기화되었습니다 . n1의 수가 0의 수를 초과하면 루프는 0에 도달 하기 전에 중단됩니다 (i<=0 )를 .

괄호가 균형을 이루려면 두 가지 조건이 필요합니다.

  • 0과 1의 수는 (즉, 동일 i==1)
  • 1의 수는이 과정에서 0의 수를 절대 초과하지 않습니다 (즉, 루프가 너무 일찍 중단되지 않습니다 n==0). 편집 : 이전 조건이 충분 i하면 양수 가 아니 어야 하므로이 조건이 필요하지 않다는 것을 깨달았습니다 n!=0.

경우 in음이 있습니다 다음 i==n==0이다 i+n==0.
orlp

i루프가 조기에 중단되면 음수 일 수 있습니다.
xsot

실제로 i|n==0항상 작동해야합니다.
orlp

좋은 제안, 그 라인은 이제 더 좋아 보인다.
xsot

while i*n작동해야 함
xnor

3

자바 스크립트 ES5, 118 87 85 82 77 바이트

제 생각에는 재미있는 기술입니다. @ETHproductions와 @NotthatCharles 덕분에 많은 부분을 빼고

function p(x){x=x.toString(2);while(/10/.test(x))x=x.replace(10,"");return!x}

자바 스크립트 ES6, 77 57 56 54 바이트

ETHproduction에 -21 바이트

x=>[...x=x.toString(2)].map(_=>x=x.replace(10,""))&&!x

번역을 괄호로 묶는 것을 좋아합니다. 그러나 1과 0으로 남겨두면 약간 짧아집니다.function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
ETHproductions

@ETHproductions 좋은 지적입니다! 나는 다른 코드를 맨 아래에 남겨 둘 것이라고 생각한다. 나는 알고리즘을 정말로 좋아한다 ^ _ ^ 감사합니다.
코너 O'Brien

ES6 버전은 여전히 ​​뭉칠 수 있습니다 x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x). 트릭은 .map길이보다 입력에 '10'이 더 많지 않기 때문에 while 루프를로 이동하는 것입니다.
ETHproductions

@ETHproductions 다시 한 번 감사드립니다 ^ _ ^ 좋은 트릭 map.
코너 O'Brien

문제 없음 :) BTW, 다른 바이트는 edc65가 항상 사용하는 트릭으로 저장할 수 있습니다. x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!xIDK가 더 짧아 질 수 있다면 IDK입니다.
ETHproductions

2

D, 209170 바이트

import std.stdio;import std.format;import std.conv;void main(char[][]a){string b=format("%b",to!int(a[1]));int i;foreach(c;b){i+=c=='1'?1:-1;if(i<0)break;}writeln(i==0);}

이것은 추가나 혜택없이해야 할 일을 정확하게 수행합니다.


2

C, 67 바이트

n;main(i){for(scanf("%d",&n);n*i;n/=2)i+=1-n%2*2;putchar(48+!~-i);}

내 파이썬 제출 포트입니다.


2

프롤로그, 147 바이트

b(N,[X|L]):-N>1,X is N mod 2,Y is N//2,b(Y,L).
b(N,[N]).
q([H|T],N):-N>=0,(H=0->X is N+1;X is N-1),q(T,X).
q([],N):-N=0.
p(X):-b(X,L),!,q(L,0).

작동 원리

b(N,[X|L]):-N>1,X is N mod 2,Y is N//2,b(Y,L).
b(N,[N]).

10 진수 N을 목록으로 이진 표현으로 변환합니다 (역순). 의미:

b(42,[0,1,0,1,0,1]) is true

그때:

q([H|T],N):-N>=0,(H=0->X is N+1;X is N-1),q(T,X).
q([],N):-N=0.

헤드 요소가 0이면 N을 증가 시키면리스트 [H | T]에 대해 반복되고 그렇지 않으면 감소합니다.
어느 시점에서든 N이 음수가되거나 마지막 N이 0이 아니면 false를 반환하고, 그렇지 않으면 true를 반환합니다.

컷 인

p(X):-b(X,L),!,q(L,0).

역 추적을 방지하고 b (N, [N])

테스트에 대한 이진이 아닌 솔루션 찾기 여기
에서 온라인으로 사용해보십시오 . 다음과 같은 쿼리로 실행하십시오.

p(42).

2

PowerShell, 106 바이트

param($a)$b=[convert]::ToString($a,2);1..$b.Length|%{if($b[$_-1]%2){$c++}else{$c--}if($c-lt0){0;exit}};!$c

최단 경쟁에서 이길 수는 없습니다. 그러나 적어도 자바를 치고 있습니까?

매우 긴 .NET 호출 [convert]::ToString($a,2)을 사용하여 입력 번호를 이진수를 나타내는 문자열로 변환합니다. 그런 다음을 사용하여 해당 문자열을 for-loop합니다 1..$b.length|%{..}. 각 루프가 우리의 숫자가 1( 2 바이트를 저장 %2하지 않고 평가되는 경우 -eq1) 카운터를 증가시킵니다. 그렇지 않으면 우리는 그것을 줄입니다. 우리가 이제까지 음에 도달하면, 그 수단이 더 많은 것이 된 )이상 (, 지금까지 우리 출력 발생 0exit. 우리가 루프를 통과하면 $cis 0또는 some 숫자 >0이므로 논리를 사용하지 않고 !출력을 얻습니다.

이것은 0우리가 더 많이 가지고 있기 때문에 Parens가 일치하지 않으면 )출력하는 False문제가 있지만 우리가 더 많기 때문에 Parens가 일치하지 않으면 출력하는 문제가 있습니다 (. 본질적으로 기능적으로 동등한 허위 진술, 흥미 롭습니다. Parens가 모두 일치하면을 출력 True합니다.


그럼. 당연하지. (잘못 된 문제를 해결하고 있다는 잔소리 의심을 고칠 수 있다면 나는 할 것이다).
TessellatingHeckler

1

GNU Sed (평가판 포함), 27

s/.*/dc -e2o&p/e
:
s/10//
t

Sed는 진실과 거짓에 대해 정의 된 아이디어를 가지고 있지 않으므로 여기서 빈 줄은 진실을 의미하고 다른 모든 줄은 거짓을 의미한다고 주장합니다.

이것이 허용되지 않으면 다음을 수행 할 수 있습니다.

GNU Sed (평가판 포함), 44

s/.*/dc -e2o&p/e
:
s/10//
t
s/.\+/0/
s/^$/1/

truey이면 1을, 그렇지 않으면 0을 출력합니다.


1

𝔼𝕊𝕄𝕚𝕟 (ESMin), 21 자 / 43 바이트

ô⟦ïßḂ]Ĉ⇀+$?⧺Ḁ:Ḁ‡)⅋!Ḁ)

Try it here (Firefox only).

이것은 숫자로 미리 정의 된 변수 (특히 2와 0)를 사용합니다. 0에서 256 사이의 미리 정의 된 숫자 변수가 있습니다.

19 문자 / 40 바이트, 비경쟁

⟦ïßḂ]Ĉ⇀+$?⧺Ḁ:Ḁ‡)⅋!Ḁ

Try it here (Firefox only).

암시 적 출력을 구현하기로 결정했지만 ... 이전 출력 양식이 계속 지원되므로 여러 출력 옵션이 제공됩니다!


문자 수에 의해 모든 조치 때문에

1

자바, 129131 바이트

boolean T(int i){int j=0,k=0;for(char[]a=Integer.toString(i,2).toCharArray();j<a.length&&k>=0;j++){k+=a[j]=='1'?1:-1;}return k==0;}

아마 단축 될 수 있습니다. 올 설명. 4 바이트를 끈 Geobits에 감사합니다!


int k=0;와 결합 할 수 int j=0;있습니까?
ETHproductions

아니요, j는 for 루프의 내부 변수이므로 외부에서 참조 할 수 없습니다.
GamrCorps

그러나 다른 방법으로 결합 할 수 있어야합니다 : int k=0,j=0;for(...그런 다음 char[]선언을 루프 이니셜 라이저 안에 넣어 세미콜론을 저장할 수도 있습니다.
Geobits

더 큰 문제는 이것이 잘못된 긍정을 준다는 것입니다. 예를 들어 9, 35, 37, 38의 경우 true를 반환합니다 .
Geobits

@Geobits oops, 나는 심지어 기회가 생길 때 고칠 것이라는 것을 깨닫지 못했습니다.
GamrCorps

1

C ++, 61 바이트

현재 C ++ 답변이 잘못되었다고 생각합니다. 예를 들어 4와 같은 모든 짝수에 대해 진실한 값을 반환합니다. 면책 조항 : 언급 한 컴파일러를 사용할 수 없으므로 g ++ 4.8.4를 사용했습니다. 문제는 논리 괄호 대신 이진 AND 연산자를 사용하는 데 있으며 닫는 괄호 수가 여는 괄호 수를 초과 할 때 일찍 중단되는 데 사용됩니다. 이 방법은 true모든 실제 비트 패턴을 가진 단어로 표현 된 경우 작동 할 수 있습니다 . 내 시스템, 그리고 아마도 대부분의 다른 시스템에서 true동일하다 1; 한 비트 만 사실입니다. 또한 n/=2보다 짧습니다 n>>=1. 다음은 함수로서 개선 된 버전입니다.

int f(int n,int c=0){for(;c>=0&&n;n/=2)c+=n&1?-1:1;return c;}

0

𝔼𝕊𝕄𝕚𝕟 (매우 비경쟁), 6 문자 / 8 바이트

!ïⓑĦⅩ

Try it here (Firefox only).

나는 매우 오랜 시간이 지난 후에이 과제를 다시 해보기로 결심했습니다. 𝔼𝕊𝕄𝕚𝕟가 훨씬 좋아졌습니다.

이것이 별도의 답변 인 이유는 2 버전이 거의 완전히 다르기 때문입니다.

설명

입력을 이진으로 변환하고 10의 인스턴스를 재귀 적으로 대체 한 다음 결과가 빈 문자열인지 확인합니다.


0

C # 98 바이트

bool f(int m){int i=0;foreach(char s in Convert.ToString((m),2)){if(s=='1')i+=2;i--;}return i==0;}

어떤 제안이라도 열 수 있습니다. 나는이 challange을 좋아하지만 그것은 낡은 것입니다.

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