Narysuj ikonę benzenowego hegaksonu HyperNeutrino w ASCII


31

W ramach obchodów HyperNeutrino odzyskuje swoje konto i przedstawiciela, podążając za panem Xcoderem .

Styl HyperNeutrino

Przepraszamy za obracanie obrazu za możliwość rysowania.


Wydrukuj lub wydrukuj dokładnie tę grafikę ASCII. Możesz mieć końcowe spacje i / lub końcowy znak nowej linii.

      _______________
     /               \
    /  /           \  \
   /  /             \  \
  /  /               \  \
 /  /                 \  \
/  /                   \  \
\                         /
 \                       /
  \                     /
   \                   /
    \  _____________  /
     \_______________/

Przedstawia to jedną z dwóch struktur rezonansowych cząsteczki benzenu wprowadź opis zdjęcia tutaj

Powiązane: Koncentryczne sześciokąty , gwiazdka wypełnione sześciokąty

Tabela liderów:


8
Widzę, że @HyperNeutrino od tego czasu obrócił swoją ikonę, aby dopasować to pytanie!
Neil

5
@Neil Tak: P Tak bardzo mnie to zaniepokoiło, że zmieniłem go tak, aby był spójny. Teraz musisz zaktualizować struktury rezonansowe, xnor: P
HyperNeutrino

1
Cholera, talent nie zostanie zaktualizowany, mimo że na końcu dodałem losowe nieużywane parametry, zmieniłem go na StackOverflow, zmieniłem z powrotem i edytowałem 10 razy: I
HyperNeutrino

4
Ale moim zdaniem wersja pozioma wygląda brzydko, gdy jest renderowana na moim profilu; może być tak, że nie jestem do tego przyzwyczajony. Więc zmieniłem to z powrotem. : P
HyperNeutrino

:( Chciałem zobaczyć!
CalculatorFeline

Odpowiedzi:


24

Węgiel , 23 bajty

×_⁷↙←×_⁸↖⁶→↗⁶P×_⁸↘↓↙⁵‖B

Wypróbuj online! Objaśnienie: Drukuje linie w następującej kolejności, a następnie odzwierciedla wszystko poziomo:

      5_______
     /        
    /  6      
   /  ↙       
  /  /        
 ↗  /         
4  /          
\             
 \            
  \           
   \          
    ↖  1→_____
     3______←2

5
‖Boznacza „Reflect Butterfly”
CalculatorFeline

8

JavaScript (ES6),  144  143 140 138 134 bajtów

Funkcja rekurencyjna rysująca wynik po znaku za pomocą wyrażenia czysto warunkowego.

f=(p=363)=>(m=p%28-14,x=m<0?-m:m,y=p/28|0,p--)?`\\/ _
`[m+14?x<8-y&y<2|x<8&y>11?3:x==y+8|x==19-y|x==16-y&y>5&x>5?m<0^y>5:2:4]+f(p):''

W jaki sposób?

Dla każdej pozycji 0 <p ≤ 363 definiujemy:

  • m = (p MOD 28) - 14
  • x = | m |
  • y = ⌊ p / 28 ⌋

Poniżej znajduje się podział formuły, z której wybiera odpowiednią postać [ '\', '/', ' ', '_', '\n' ].

m + 14 ?                            // if this is not an end of line:
  x < 8 - y & y < 2 |               //   if this is either part D
  x < 8 & y > 11 ?                  //   or part E:
    3                               //     output '_'
  :                                 //   else:
    x == y + 8 |                    //     if this is either part A
    x == 19 - y |                   //     or part B
    x == 16 - y & y > 5 & x > 5 ?   //     or part C:
      m < 0 ^ y > 5                 //       output '/' or '\' depending on the quadrant
    :                               //     else:
      2                             //       output a space
:                                   // else:
  4                                 //   output a Line-Feed

Poniżej znajdują się różne części zdefiniowanego powyżej układu współrzędnych:

   | 13 12 11 10 09 08 07 06 05 04 03 02 01 00 01 02 03 04 05 06 07 08 09 10 11 12 13
---+---------------------------------------------------------------------------------
12 | .  .  .  .  .  .  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E  .  .  .  .  .  .
11 | .  .  .  .  .  B  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  B  .  .  .  .  .
10 | .  .  .  .  B  .  .  C  .  .  .  .  .  .  .  .  .  .  .  C  .  .  B  .  .  .  .
09 | .  .  .  B  .  .  C  .  .  .  .  .  .  .  .  .  .  .  .  .  C  .  .  B  .  .  .
08 | .  .  B  .  .  C  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  C  .  .  B  .  .
07 | .  B  .  .  C  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  C  .  .  B  .
06 | B  .  .  C  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  C  .  .  B
05 | A  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  A
04 | .  A  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  A  .
03 | .  .  A  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  A  .  .
02 | .  .  .  A  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  A  .  .  .
01 | .  .  .  .  A  .  .  D  D  D  D  D  D  D  D  D  D  D  D  D  .  .  A  .  .  .  .
00 | .  .  .  .  .  A  D  D  D  D  D  D  D  D  D  D  D  D  D  D  D  A  .  .  .  .  .

Próbny


7

05AB1E , 50 bajtów

•ι¡≠ït]4uƵŽΣ”9g½ùöèri|)á,ćè’∍é•5B3ÝJ"/ _\"‡4¡.B».∞

Wypróbuj online!


Kompresja:

Strategia polegała na zbudowaniu połowy obiektu, a następnie odbiciu obrazu w półmetku. Aby to zrobić, najpierw zbudowałem lewą połowę z wyściółką z przodu:

11111122222222
111110
11110110
1110110
110110
10110
0110
3
13
113
1113
1111311222222
11111322222222

Ale brak odpowiedniego dopełnienia, ponieważ .Bfunkcja w 05AB1E może być użyta do wyrównania długości każdego elementu za pomocą spacji. Pozwala mi to pominąć niepotrzebne spacje po prawej stronie i po prostu ograniczyć znakami nowej linii. Następnie wziąłem ten wzór i usunąłem wszystkie znaki nowej linii, zastępując je, 4aby uzyskać:

1111112222222241111104111101104111011041101104101104011043413411341113411113112222222411111322222222

Kompresowanie tego z base-255 powoduje:

•ι¡≠ït]4uƵŽΣ”9g½ùöèri|)á,ćè’∍é•5B

Gdzie dwa oznaczają skompresowany ciąg base-255, a 5B przekształca go w base-5.


Druga część po kompresji:

3ÝJ                # Push '0123'.
   "/ _\"          # Push '/ _\'.
         ‡         # Replace each in b with a on c.
          4¡       # Split on 4's (the newlines I replaced).
            .B     # Boxify for the mirror (adds padding to longest element).
              »    # Join by newlines. 
               .∞  # Mirror image.

Możesz zapisać 3 bajty w ten sposób
Emigna

@emigna è, oczywiście!
Magic Octopus Urn

5

V , 61 bajtów

i/  /±¹ \  \
\²µ /6ñGÙlxxhPHÄãxx>ñv$r_jwr w.Gkkl13r_jviwr_jd

Wypróbuj online!

Hexdump:

00000000: 692f 2020 2fb1 b920 5c20 205c 0a5c b2b5  i/  /.. \  \.\..
00000010: 202f 1b36 f147 d96c 7878 6850 48c4 e378   /.6.G.lxxhPH..x
00000020: 783e f176 2472 5f6a 7772 2077 2e47 6b6b  x>.v$r_jwr w.Gkk
00000030: 6c31 3372 5f6a 7669 7772 5f6a 64         l13r_jviwr_jd

5

Python 2 , 226 213 bajtów 179 bajtów

Mój pierwszy golf!

b,f,s,u='\/ _'
print'\n'.join([s*6+u*15,s*5+f+s*15+b]+[s*(4-n)+'/ /'+s*(13+2*n)+'\ \\'for n in range(5)]+[s*n+b+s*(25-2*n)+f for n in 0,1,2,3]+[s*4+b+s*2+u*13+s*2+f,s*5+b+u*15+f])

Wypróbuj online!

Próbowałem zapętlić bity, na których mogłem znaleźć wzór, a resztę zakodowałem na stałe. Ustawienie różnych znaków na zmienną pomogło zaoszczędzić sporo bajtów.

Edycja: postanowiono dołączyć do tej samej tablicy zamiast łączyć wiele razy. Zapisano 13 bajtów.

Edycja 2: Dzięki @ValueInk, @jacoblaw, @WheatWizard, @CalculatorFeline i @ Challenger5, zapisano 34 bajty


1
b,f,s,u='\/ _';o,a='/ /','\ \\'oszczędza 11 bajtów w stosunku do bieżącej inicjalizacji zmiennej! Zobacz tutaj
Value Ink

1
używając końcówki @ ValueInk i nie tworząc listy w 4 liniach, masz 195 bajtów w ten sposób
Jacoblaw

1
@Jacoblaw Nie potrzebujesz w tym miejscu wszystkich spacji. Tutaj jest bez nich.
Wheat Wizard

1
oi asą używane tylko raz w kodzie. Tutaj jest z nimi wbudowane.
CalculatorFeline

1
Możesz użyć 0,1,2,3zamiast, range(4)aby zapisać bajt.
Esolanging Fruit

4

J , 155 bajtów

('_ /\',LF){~5#.inv 95x#.32-~3 u:'0_C5NcBe''e2kA/jhk>5y~l<Z:AN<QG)V7m>l"x!@A-jp8E%XEh&"$''j(sP8Z!b#e7})]_,L"LCUu)kqsBQ5_5bt}`bq ":1cv(gU;|{I~n5q@(ISCK `'[<

Wypróbuj online!

Jest to funkcja, która nie oczekuje żadnych danych wejściowych. Na przykład f =: <code>wtedy f ''.

Wyjaśnienie

Zakodowałem to, wykonując następujące kroki. Załóżmy, że żądany ciąg kompresji jest zawarty w zmiennej h.

   k=:'_ /\',LF                    NB. the dictionary used to encode the string
   k i. h                          NB. numbers corresponding to indices in `k`
1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 4 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 4 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 4 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 4 1 2 1 1 2 1 1 1 ...
   5x#.k i. h                      NB. base 5 to decimal
4571656960356964266407389291886526966074643634545109498506871241033015964671946641835339522170115810676380078148856766959449166714046433431522704650346045752930168245684048485736756807881102718244115576453623363843561553955078139
   95#.inv 5x#.k i. h              NB. decimal to base 95
16 63 35 21 46 67 34 69 7 69 18 75 33 15 74 72 75 30 21 89 94 76 28 58 26 33 46 28 49 39 9 54 23 77 30 76 2 88 1 32 33 13 74 80 24 37 5 56 37 72 6 2 4 7 74 8 83 48 24 58 1 66 3 69 23 93 9 61 63 12 44 2 44 35 53 85 9 75 81 83 34 49 21 63 21 66 84 93 64 66 8...
   quote u:32+95#.inv 5x#.k i. h   NB. base 95 to ASCII repr of string
'0_C5NcBe''e2kA/jhk>5y~ll"x!@A-jp8E%XEh&"$''j(sP8Z!b#e7})]_,L"LCUu)kqsBQ5_5bt}`bq ":1cv(gU;|{I~n5q@(ISCK `'

Następnie musimy to tylko zdekodować. 5#.inv 95x#.32-~3 u:wykonuje odwrotność tego, co właśnie opisałem, dając nam listę wskaźników. Następnie ('_ /\',LF){~stosuje odpowiednie znaki do każdego indeksu.


4

Mathematica, 227 bajtów

t=Table;T[x_,y_,z_,v_]:=""<>{x,y~t~v,z};Column[Join[b={""<>"_"~t~15},{T["/"," ","\\",15]},t[T["/  /"," ","\\  \\",i],{i,11,19,2}],t[T["\\"," ","/",i],{i,25,19,-2}],{T["\\  ","_","  /",13]},{""<>{"\\",b,"/"}}],Alignment->Center]

4

Węgiel drzewny , 47 43 41 bajtów

↗⁶F¹⁵_↓↘⁶←↙⁶↷⁴↑F¹⁵_↖⁶M⁴→↗⁵M¹¹→↓↘⁵M⁵↙↑F¹³_

Wypróbuj online!

Do tej pory nie wiedziałem nic o węglu drzewnym. Czułem, że „nie mam pojęcia, co robię”, próbując znaleźć odpowiedź… Jestem pewien, że można w nią dużo grać.

Aktualizacje:

  • Udało mi się zaoszczędzić 4 bajty, ucząc się korzystać z kierunków i ruchów kursora!
  • Kolejne 2 bajty zapisane po wykonaniu rysunku nie były dokładnie takie, jak poproszono. ^ __ ^ U

2
Lmao, zaufaj mi, nie tylko ty jesteś w tym ostatnim stanie, kiedy używasz węgla drzewnego. Za pierwszym razem próbowałem zrobić sześcian. Użyłem wbudowanego „kwadratu”, a następnie ręcznie narysowałem tylną część prostopadłościanu, okazuje się, że można to zrobić w 20 bajtach w porównaniu do mojego 57.
Magic Octopus Urn

@carusocomputing Nie mogę uwierzyć, że O5AB1E lub Jelly nadal mają dłuższe odpowiedzi ... :-D
Charlie

2
Węgiel drzewny jest niezwykle konkurencyjnym językiem zorientowanym na ASCII, zoptymalizowana odpowiedź to prawdopodobnie około 40 bajtów, które mogą nawet zniszczyć gumę do żucia.
Magic Octopus Urn

5
@ carusocomputing kaszel powiedziałeś 40?
Neil

@Neil Próbowałem użyć, ‖Bale nie mogłem zrozumieć, jak ... ładna odpowiedź!
Charlie

4

Rubin, 117 bajtów

13.times{|i|s=[?_*(15--i%12*1.3),"/%#{i*2+8}s"%?\\,''][(i%12%11+3)/5].center(27)
i>0&&(s[i-=7]=?\\)&&s[~i]=?/
puts s}


3

05AB1E , 92 86 80 bajtów

'_15×6ú'/5úð8׫.∞5F'/4N-ú'/2ú«ð6N+׫.∞}4F'\Núð13N-׫.∞}'\4ú'_7×2ú«.∞'\5ú'_8׫.∞»

Wypróbuj online!


Objaśnienie w częściach

Pasek u góry

'_      # underscore
  15×   # repeated 15 times
     6ú # with 6 spaces in front

Linia bezpośrednio pod paskiem

'/         # forward slash
  5ú       # with 5 spaces in front
    ð      # space
     8×    # repeated 8 times
       «   # concatenated with the earlier string
        .∞ # intersected mirror (i.e middle space not affected)
           # mirroring: "  /  " => "  /    \  "

Pozostała część górnej części sześciokąta

5F                     # for N in 0..4
  '/                   # forward slash
    4N-                # 4 - N
       ú               # spaces in front of the slash
        '/             # another forward slash
          2ú           # with 2 spaces in front
            «          # concatenated with the other string
             ð         # a space character
              6N+      # N + 6
                 ×     # times
                  «    # concatenated with the other string
                   .∞  # intersected mirror
                     } # end for

Reszta z wyjątkiem ostatnich 2 wierszy

4F               # for N in 0 .. 3
  '\             # backslash
    Nú           # with N spaces in front 
      ð          # a space
       13N-      # 13 - N
           ×     # repeated
            «    # concatenated with other string
             .∞  # intersected mirror
               } # end for

Przedostatnia linia

'\ # backslash
  4ú # with 4 spaces in front
    '_ # underscore
      7× # repeated 7 times
        2ú # with 2 spaces in front
          « # concatenated with earlier string
           .∞ # intersected mirror

Ostatnia linia

'\ # backslash
  5ú # with 5 spaces in front
    '_ # underscore
      8× # repeated 8 times
        « # concatenated with other string
         .∞ # intersected mirror

Na »końcu dołącza wszystko na nowych liniach.


@carusocomputing: hmm, nie myślałem o „dublowaniu” tego.
Neil A.

Lustro jest jak palindromize, z wyjątkiem tego, że {_staje się palindromize {_{, a lustro staje się {_}. Palendromize jest û, a lustro jest . Jest też przecięte lustro, które jest .∞.
Magic Octopus Urn

@downvoter stoppit. Powiedział, że wciąż gra w golfa.
Magic Octopus Urn

3

DO#, 210 199 bajtów

Koduje długość przebiegów w przestrzeni i przebiegów podkreślenia:

var h=@"5KL4/>\L3/1/:\1\L2/1/<\1\L1/1/>\1\L0/1/@\1\L/1/B\1\L\H/L0\F/L1\D/L2\B/L3\1I1/L4\K/L";for(var i='M';--i>'/';)h=h.Replace(""+i,i>75?"\n":"".PadLeft(i>72?i-60:i-47," _"[i/73]));Console.Write(h);

Nie golfowany:

var h = @"5KL4/>\L3/1/:\1\L2/1/<\1\L1/1/>\1\L0/1/@\1\L/1/B\1\L\H/L0\F/L1\D/L2\B/L3\1I1/L4\K/L";
for (var i = 'M'; --i > '/'; )
    h = h.Replace("" + i, i > 75 ? "\n" : "".PadLeft(i > 72 ? i - 60 : i - 47, " _"[i / 73]));
Console.Write(h);

Wypróbuj online!


2

Siatkówka , 129 bajtów


5$* ¶    
\G (?=( *))
¶$1/  /$`11$* $`\  \
r`(?<=( *)) \G
$1\$'19$* $'/¶
^
6$* 15$*_¶5$* /15$* \
¶$
¶    \  13$*_  /¶5$* \15$*_/

Wypróbuj online! Zupełnie inne podejście, ale przypadkowo ta sama długość!




1

Pyth , 111 bajtów

J\/K\\+*6d*15\_+++*5dJ*15dKV5+++*-5hNd"/  /"*+yN11d+++KddK)V4+++*NdK*-25yNdJ)+++++*4dK*2d*13\_*2dJ+++*5dK*15\_J

Ten kod zasadniczo drukuje wiersze jeden po drugim (w naiwny sposób). Tak, to do bani, ale w tej chwili nie jestem w stanie się lepiej, a ja nadal chciałem złożyć hołd HyperNeutrino .

Wypróbuj online!


1

PHP , 122 bajty

<?=gzinflate(base64_decode("ddDBDQAgCEPRO1N0AxYicf8tFK2JIPT4HycA34iTHRVxJqwvGLvme8LXrxRAKoVmBZypoMNFjbmUtMEl/OV2WHqYTg"));

Wypróbuj online!

PHP , 158 bajtów

for(;~$c='f000
e/o1d/b/k\b1c/b/m\b1b/b/o\b1a/b/q\b1/b/s\b1\y/
a\w/
b\u/
c\s/
d\b00___b/
e\000/'[$i++];)echo$c>_?str_pad("",ord($c)^96):strtr($c,[_____,"\
"]);

Wypróbuj online!

PHP , 165 bajtów

<?=strtr("5566666
57/3334
5 13552513352713332 13355 213335 2433335 0 433355 0743333054333505 476666_ 057466666/",[" /
","/  /","\  \
","     ","\\","   ",___,"  "]);

Wypróbuj online!



1

Python 2 , 187 bajtów

a=`int("7YSUQZDJS0I3J2QJ40G9WNPIRBTBC1KF0F3X5WDMBW8CG5BVDHBJQ71V3UHCSY3TR8LC4IIEE5SZ",36)`[:-1]
for i in"0666666_!6__!5/!3\\!9\n!844!422!211!1 ".split("!"):a=a.replace(i[0],i[1:])
print a

Wypróbuj online!


1

C # (.NET Core) , 169 bajtów

var d=new char[364];for(int i=10;i-->0;)for(int j="ppnggffggn"[i]-97;j-->0;)d[28*"amlhbccbha"[i]+"ggh{fguva|"[i]-2813+j*("b|~}"[i/3]-97)]="_/\\\n"[i/3];Console.Write(d);

Nie golfowany:

var d = new char[364];
for (int i = 10; i-- > 0; )
    for (int j = "ppnggffggn"[i] - 97; j-- > 0; )
        d[28 * "amlhbccbha"[i] + "ggh{fguva|"[i] - 2813 + j * ("b|~}"[i / 3] - 97)] = "_/\\\n"[i / 3];
Console.Write(d);

Dla każdego pociągnięcia kodowałem pozycję początkową, długość, użyty znak i kierunek w różnych ciągach. Zaoszczędziłem kilka bajtów, grupując podobne pociągnięcia.

Niestety, to wydruki są trochę dziwne w tio. To dlatego, że nie drukuję prawdziwych przestrzeni. Wygląda dobrze w mojej konsoli. Prawdopodobnie to zgłoszenie się nie liczy. Oto i tak link.

Wypróbuj online! (fałszywe spacje 169 bajtów)

Wypróbuj online! (rzeczywiste spacje 191 bajtów)



1

Pędzel , 43 bajty, niekonkurujący

13→'_8×←↓s/5{↙s/3→s/3←}↓'\6×↘↑'_8×→↖'_7×←▕┣

Wyjaśnienie

13→'_8×←↓s/5{↙s/3→s/3←}↓'\6×↘↑'_8×→↖'_7×←▕┣  Program
13→                                          Move the pointer 13 spaces right
   '_                                        Push '_' onto the stack
     8×                                      Multiply it 8 times
       ←                                     Draw out '________' moving to the left
        ↓                                    Move down
         s/                                  Set that cell to a slash
           5{         }                      Execute function 5 times
             ↙                               Move the pointer one spot down and one spot to the left
              s/                             Set that cell to a slash
                3→                           Move 3 spaces right
                  s/                         Set that cell to a slash
                    3←                       Move 3 spaces left
                      ↓                      Move down
                       '\                    Push r'\'
                         6×                  Multiply it 6 times
                           ↘                 Draw out r'\\\\\\' moving down-right
                            ↑                Move up
                             '_              Push '_'
                               8×            Multiply it 8 times
                                 →           Draw out '________' moving to the right
                                   ↖         Move the pointer one spot up and one spot to the right
                                    '_       Push '_'
                                      7×     Multiply it 7 times
                                        ←▕┣  Draw out '_______' moving to the left
                                         ▕   Remove the rightmost column
                                          ┣  Mirror the entire grid to the right, overlapping the inner column, flipping some characters that have backwards variants

Testy beta w realnym świecie:

Charcoal: 1
Paintbrush: 0

Muszę wprowadzić wiele ulepszeń, huh. : P


I sam użytkownik zamieszcza rozwiązanie!
Wartość tuszu

@ValueInk Najwyższy czas, co? : P
HyperNeutrino

1

Bubblegum , 67 54 bajtów

00000000: 55c9 310d 0040 0804 c1fe 55e0 0043 24f8  U.1..@....U..C$.
00000010: 77f1 c955 cc96 3b95 d65e 6697 4d76 0b93  w..U..;..^f.Mv..
00000020: cf06 f847 0448 d1e6 0ceb 5722 8421 1010  ...G.H....W".!..
00000030: d95b 7e60 ad3f                           .[~`.?

Wypróbuj online!


0

C (gcc) , 200 bajtów

char o[28];i,j,k,p;f(){for(k=0;k<39;puts(o))for(memset(o,k&&k<32?32:95,27),i=3;i--;k++)for(j=3;j--;o[24-i*3+j]=" _\\/"[p])o[i*3+2-j]=" _/\\"[p="U@@@B@HH@``@@BB@HH@``@@p@@L@@C@p@EL@UC@"[k]-64>>j*2&3];}

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.