Tutupi angka nol dalam daftar


41

Terinspirasi oleh pertanyaan SO ini

Sebagai input, Anda akan diberikan daftar bilangan bulat yang tidak kosong, di mana nilai pertama dijamin tidak nol. Untuk membangun output, berjalanlah dari awal daftar, mengeluarkan setiap nilai yang bukan nol di sepanjang jalan. Ketika Anda menemukan nol, ulangi nilai yang baru saja Anda tambahkan ke output.

Anda dapat menulis suatu program atau fungsi, dan meminta input / output mengambil format apa pun yang nyaman yang tidak mengkodekan informasi tambahan, selama masih merupakan urutan bilangan bulat yang dipesan. Jika mengeluarkan dari suatu program, Anda dapat mencetak baris tambahan. Kecuali untuk baris baru ini, output Anda harus menjadi input yang dapat diterima untuk kiriman Anda.

Kode terpendek dalam byte menang.

Uji Kasus

[1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9] -> [1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9]
[1, 0, 0, 0, 0, 0] -> [1, 1, 1, 1, 1, 1]
[-1, 0, 5, 0, 0, -7] -> [-1, -1, 5, 5, 5, -7]
[23, 0, 0, -42, 0, 0, 0] -> [23, 23, 23, -42, -42, -42, -42]
[1, 2, 3, 4] -> [1, 2, 3, 4]
[-1234] -> [-1234]

21
Sedikit hal-hal sepele: Nama untuk operasi ini di dunia statistik adalah imputasi LOCF (pengamatan terakhir dilakukan).
Alex A.

Apa yang terjadi jika inputnya [0,0]?
Kritixi Lithos

4
@ KριτικσιΛίθος "... di mana nilai pertama dijamin tidak nol"
Sp3000

Bagaimana jika inputnya [1,01]? Menggunakan, Pyth jawaban issac, bandingkan ini dan ini .
Arcturus

@Eridan 01bukan bilangan bulat yang valid dalam input Pyth, jadi isaac tidak harus menjelaskannya. Jawaban lain dapat menerima input seperti itu jika mereka mau, selama mereka konsisten (seperti bagaimana jawaban isaac tidak akan pernah menghasilkan daftar itu sebagai output)
FryAmTheEggman

Jawaban:


19

Pyth, 6 byte

mJ|dJQ

Demonstrasi

m ... Qberarti ini memetakan fungsi atas input. Fungsi yang dipetakan adalah J|dJ. Itu berarti J = d or Jdalam Python, karena Jimplikasi ditetapkan ke nilai berikut pada penggunaan pertama. Tidak seperti Python, ekspresi penugasan mengembalikan nilai yang ditetapkan dalam Pyth, sehingga peta mengembalikan setiap nilai berturut-turut J, seperti yang diinginkan.


23

Jelly , tidak bersaing

3 byte Jawaban ini tidak bersaing, karena ia menggunakan fitur yang mengeposkan tantangan.

o@\

Cobalah online!

Bagaimana itu bekerja

o      Take the logical OR of its arguments.
 @     Reverse the argument order of the link to the left.
  \    Do a cumulative reduce, using the link to the left.

6
Otak saya tidak dapat memahami ... Dennis akhirnya menemukan cara untuk bermain golf secara permanen. Sepertinya dia belum melakukannya. ಠ_ಠ
Addison Crump

1
Penjelasan tidak lagi
selaras

18

Ruby, 25 byte

->a{a.map{|x|x==0?a:a=x}}

Ini sebenarnya sangat jahat.

Khususnya, cuplikan x==0 ? a : (a=x).

Jika saya menggunakan nama variabel lain untuk a(nilai bukan nol sebelumnya) —silakan katakanlah y— saya harus mendeklarasikannya di luar map(karena y=xhanya akan memiliki lingkup di dalam mapiterasi tunggal itu ). Itu akan menggunakan empat karakter lebih banyak ( y=0;).

Tetapi jika saya menggunakan nama variabel a... ya, Anda dapat menebaknya. Saya sebenarnya menugaskan kembali argumen yang kami dapatkan sebagai input (array asli).

maptidak peduli karena hanya peduli tentang nilai asli dari hal yang sedang dipanggil, jadi ini benar-benar berfungsi.


17

Haskell, 21 byte

a%0=a
a%b=b
scanl1(%)

Fungsi (anonim) yang kita buat ada di baris terakhir. Dua baris pertama mendefinisikan fungsi pembantu.

scanl1(%) [1,0,2,0,7,7,7,0,5,0,0,0,9]
[1,1,2,2,7,7,7,7,5,5,5,5,9]

Fungsi biner %menghasilkan argumen kedua, kecuali itu 0, dalam hal ini ia menghasilkan argumen pertama. scanl1iterates fungsi ini di atas daftar input, keluaran hasilnya pada setiap langkah.


13

J, 8 byte

{:@-.&0\

Ini adalah fungsi unary, dipanggil sebagai berikut.

   f =: {:@-.&0\
   f 2 0 0 4 0 _1 0
2 2 2 4 4 _1 _1

Penjelasan

{:@-.&0\
       \  Map over non-empty prefixes:
   -.      remove all occurrences
     &0    of the number 0 and
{:@        take the last element.

Bisakah Anda mereplikasi dengan nilai absolut alih-alih menghapus 0s?
lirtosiast

@ThomasKwa Itu adalah upaya pertama saya. Ini {:@(#~|)\, jadi satu byte lebih lama.
Zgarb

13

Sed, 8

/^0$/g
h
  • /^0$/cocok dengan nol pada garis - jika demikian gsalin ruang tunggu ke ruang pola
  • h menyalin ruang pola ke ruang penahanan

Integer dipisahkan oleh baris baru. misalnya:

$ printf -- "-1\n0\n5\n0\n0\n7\n" | sed -f zerocover.sed
-1
-1
5
5
5
7
$ 

11

Javascript ES6, 19 byte

s=>s.map(i=>p=i||p)

Solusi langsung, loop melalui input, tetapkan pke elemen saat ini iatau pjika iada 0dan output.

Contoh jalankan (menugaskan fungsi anonim ke f):

>> f([1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9])
<< Array [1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9]

Setiap kali saya menjalankan ini saya mendapatkan kesalahan mengatakan "tidak dapat menemukan variabel p"
Downgoat

@Downgoat Itu karena penerjemah adalah penerjemah Mode Khusus. Jika Anda tidak menjalankan kode itu dalam mode ketat, itu akan berfungsi.
wizzwizz4

@ wizzwizz4 ohh, r oke
Downgoat

1
@ wizzwizz4 Mode ketat itu konyol.
SuperJedi224

1
@ SuperJedi224 Itu tidak konyol. Ini sangat berguna; itu memastikan kode Anda tidak ambigu, dan akan bekerja bahkan dengan pembaruan besar, dan tidak menggunakan perilaku yang tidak ditentukan, dll. Tapi apa yang konyol mengaktifkannya secara default, karena mode Strict tidak menentukan cara untuk mematikannya sendiri , dan jika Anda tidak meletakkan string mode ketat di awal, Anda tidak menginginkannya dan / atau sedang bermain golf kode.
wizzwizz4


7

Dyalog APL, 12 10 9 byte

(⊃0~⍨,⍨)\

Terinspirasi oleh jawaban J @ Zgarb.

(⊃0~⍨,⍨)\      Monadic function:
        \      Cumulative reduce by
(⊃0~⍨,⍨)       the dyadic function:
     ,⍨           Arguments concatenated in reverse order
  0~⍨             With zeroes removed
 ⊃                Take the first element

Coba di sini .


6

Pyth, 8 byte

t.u|YNQ0

Penggunaan .u(pengurangan kumulatif) oleh |(Python or), dengan kasus dasar 0.


@isaacg Sepertinya .ulebih lama bahkan jika Jdan Kdiikat. Apakah ini pernah optimal?
lirtosiast

Itu (setidaknya afaik) di sini . Biasanya membantu ketika Anda menginginkan semua hasil karena beberapa alasan.
FryAmTheEggman

5

Python 2, 29 byte

while 1:x=input()or x;print x

Mengambil input sebagai angka yang diberikan satu per baris, dan output dalam format yang sama. Berakhir dengan kesalahan setelah selesai.

Menggunakan sifat hubungan arus pendek or, variabel xdiperbarui ke input, kecuali jika input tersebut adalah 0 (yang merupakan Falsey), dalam hal ini tetap nilai saat ini. Kemudian, xdicetak. Perhatikan bahwa karena nilai daftar pertama adalah bukan nol, xtidak dievaluasi di sisi kanan sebelum ditugaskan.


Ini adalah 6 byte dalam Pyth, dan menekan kesalahan:#\nJ|EJ
isaacg

5

Mathematica 38 byte

Pencocokan pola berulang kali diganti ...a,0,...dengan...a,a...

#//.{b___,a_/;a!=0,0,e___}:>{b,a,a,e}&

5

Matlab, 41 46 byte

Ini terinspirasi dari jawaban awal saya , dengan perbedaan-perbedaan berikut:

  1. Gunakan pengindeksan logis, bukan nonzeros.
  2. Double negasi logis daripada membandingkan dengan 0.
  3. Transpos dapat dihapus, karena format output fleksibel
  4. Menghapus variabel perantara.

Terima kasih kepada Tom Carpenter untuk item 4, dan untuk sarannya untuk menggunakan program alih-alih fungsi; bersama-sama ini memungkinkan pengurangan 5 byte.

x=input('');u=x(~~x);disp(u(cumsum(~~x)))

Contoh:

>> x=input('');u=x(~~x);disp(u(cumsum(~~x)))
[4 0 3 2 0 5 6 0]
     4     4     3     2     2     5     6     6

Anda dapat menyimpan satu byte dengan mengonversinya ke program - gunakan x=input('')alih-alih deklarasi fungsi, dan disp(u(t)bukannya y=bit. Juga, Anda dapat menyimpan empat byte lagi dengan menghilangkan tvariabel, menghasilkan x=input('');u=x(~~x);disp(u(cumsum(~~x)))41.
Tom Carpenter

@ TomCarpenter Terima kasih banyak! Diedit
Luis Mendo

Saya tidak punya Matlab, tetapi @(x)x(~~x)(cumsum(~~x))berfungsi di Octave.
alephalpha

@alephalpha Matlab tidak mengizinkan pengindeksan berulang.
AlexR

5

Gol> <> , 8 byte

IE;:Z~:N

Input dan output adalah angka yang dipisahkan oleh baris baru.

Penjelasan:

I         push next integer to stack
 E;       halt if EOF
   :Z~    remove top stack element if 0
      :N  print top stack element while also keeping it on the stack
          wrap around code implicitly

Cobalah online di sini.


5

Japt, 8 7 byte

N£U=XªU

Cukup mudah. Membawa input dipisahkan oleh koma. Cobalah online!

Tanpa penjelasan dan penjelasan

N£    U=Xª U
NmXYZ{U=X||U

        // Implicit: N = input, U = first item
NmXYZ{  // Map each item X to:
U=Z||U  //  Set U to (X || U) and return.
        //  If X is non-zero, this sets U to X.
        //  Otherwise, this leaves U as the last non-zero we've encountered.
        // Implicit: output last expression

Versi 4-byte yang tidak bersaing : ( åperintah dan !-otomatis-fungsi ditambahkan setelah tantangan)

Nå!ª

Penjelasan:

Nå!ª
Nå!||
NåXY{Y||X}

        // Implicit: N = input, U = first item
NåXY{   // Cumulatively reduce N; take each item Y and prev value X,
Y||X}   //  and return Y if it is non-zero; return X otherwise.
        // Implicit: output last expression

Cobalah online!


Tunggu, ªapakah ATAU, bukan º? Apakah ºDAN kebetulan?
caird coinheringaahing

@cairdcoinheringaahing Tidak, ºadalah ((. Mereka ditugaskan oleh nilai Unicode ketika saya menemukan kebutuhan untuk mereka: P ªnd dan ºr jenius, saya mungkin menggunakannya untuk Japt 2.0 ...
ETHproductions

5

Jawa, 78

int[]f(int[]a){for(int i=-1,b=i;++i<a.length;a[i]=b=a[i]==0?b:a[i]);return a;}

Di sini kita hanya melacak yang bukan nol terakhir dan mendorongnya jika perlu. Sepertinya cara yang jelas untuk melakukannya.


5

Prolog (SWI) , 54 byte

[X,0|T]+[X,X|Y]:-[X|T]+[X|Y].
[X|T]+[X|Y]:-T+Y.
[]+[].

Cobalah online!

Penjelasan

Saya sangat senang dengan jawaban ini.

Pertama kita mengatakan bahwa daftar kosong adalah solusi dari daftar kosong:

[]+[].

Lalu kita katakan itu [X,X|Y]adalah solusi [X,0|T], jika dengan menghapus entri kedua dari masing-masing solusi yang tersisa.

[X,0|T]+[X,X|Y]:-[X|T]+[X|Y].

Terakhir kami katakan bahwa segala sesuatu yang tersisa valid jika mereka mulai dengan nilai yang sama dan sisa dari kedua daftar tersebut cocok satu sama lain.

Jika penjelasan itu tidak berhasil untuk Anda di sini adalah kode yang diterjemahkan ke dalam Haskell:

g(a:0:x)=a:g(a:x)
g(a:x)=a:g x
g x=x

Cobalah online!


Sangat singkat! Saya suka bagaimana beberapa bahasa pemrograman fungsional dan logika memungkinkan Anda melakukan terjemahan aturan secara literal. Ini cara alami untuk menulisnya!
ThePlasmaRailgun

4

GolfScript, 10 byte

~{1$or}*]`

Program ini mengambil input dari stdin, dalam bentuk literal array GolfScript (misalnya [1 0 2 0]), dan menulis hasilnya ke stdout dalam format yang sama (misalnya [1 1 2 2]).

Cobalah online.

Fungsi (mengambil dan mengembalikan array GolfScript) akan menjadi tiga byte lebih lama, karena kebutuhan untuk membungkusnya dalam sebuah blok dan menetapkannya ke simbol:

{[{1$or}*]}:f

Tentu saja, jika hanya fungsi tubuh (yaitu [{1$or}*]) dihitung, maka saya benar-benar dapat menyimpan satu byte dibandingkan dengan program yang berdiri sendiri.


Mungkin tidak mengherankan, versi baru yang lebih pendek ternyata sangat mirip dengan entri CJam Dennis . Ia menang satu byte karena GolfScript membaca input secara otomatis, dan karenanya tidak memerlukan perintah tambahan untuk itu.
Ilmari Karonen

4

Minkolang 0,14 , 12 10 byte

$I?.nd?xdN

Coba di sini. Masukan dapat diberikan seperti pada pertanyaan, tetapi tanpa tanda kurung .

Penjelasan

$I      Push the length of the input on the stack.
  ?.    If this is 0, stop. Otherwise, continue.

nd        Take number from input and duplicate it.
  ?x      If this number is 0, dump the top of stack.
    dN    Duplicate the top of stack and output as number

Minkolang adalah toroidal, jadi ini berputar ke awal dan terus berjalan sampai menyentuh .dan berhenti.


4

𝔼𝕊𝕄𝕚𝕟, 7 karakter / 12 byte

ïⓜa=$⋎a

Try it here (Firefox only).

Penjelasan

        // implicit: ï = input array
ïⓜ     // map over input
  a=    // set a to:
    $   // (if element is truthy (not 0)) element itself
     ⋎a // else whatever a was set to before
        // implicit output

4

O , 31 byte

[[I',T%T/]{n#}d]{n.{:V}{;V}?}d]

Ini mengambil input yang dipisahkan oleh ,dan menampilkan daftar yang sama di [].

7,0,3,0,0,2,-50,0,0 => [7,7,3,3,3,2,-50,-50,-50]

Penjelasan:

[] Masukkan hasilnya ke dalam array
 [I ', T% T /] {n #} d] Memformat input ke dalam array angka
                {n. {: V} {; V}?} d Isi nol (lihat di bawah untuk cara kerjanya)


17 byte

I~]{n.{:V}{;V}?}d

Mengambil input sebagai daftar angka yang dipisahkan oleh spasi menggunakan notasi postfix dan hanya dapat menangani angka heksadesimal satu digit. Negatif adalah postfixed dengan _.

5 4 0 0 1 0 0 => 5 4 4 4 1 1 1
A 3 0 0 1 B 0 => 10 3 3 3 1 11 11
67* 0 0 78* 0 => 42 42 42 56 56
67*_ 4 3_ 0 0 => -42 4 -3 -3 -3

Penjelasan:

I ~] Menempatkan input ke dalam array integer
   {} d Untuk setiap angka dalam input
    n. {; V} {: V}? Jika angkanya 0, tekan V
                  Jika tidak, atur V ke nomor tersebut

Anda dapat menyimpan dua byte dengan I~]{n.{:V}{;V}?}d. Saya ingin tahu apakah dharus meletakkan nilai pada tumpukan alih-alih n...
kirbyfan64sos

Apakah Anda yakin O bisa menangani ini? Saya tidak dapat menemukan cara untuk melewatinya -42 memenuhi persyaratan "output Anda harus menjadi input yang dapat diterima untuk pengiriman Anda" persyaratan.
manatwork

@manatwork Saya punya versi yang lebih baik sekarang -42, tetapi menambahkan tanda kurung di sekitar output.
fase

4

R, 39 37 33 byte

function(x)zoo::na.locf(x*(x|NA))

Ini adalah fungsi yang tidak disebutkan namanya yang menerima vektor dan mengembalikan vektor. Ini membutuhkan zoopaket yang harus diinstal. Perhatikan bahwa itu tidak perlu zoodilampirkan ke namespace karena kami mereferensikannya secara langsung.

Nama untuk operasi ini dalam dunia statistik adalah imputasi LOCF, di mana LOCF adalah singkatan dari Last Observation Carried Forward. Untuk mencapai hal ini dalam R, kita dapat menggunakan na.locfdari zoopaket, yang menggantikan NAnilai-nilai dengan non- NAnilai terakhir yang diketahui . Kami hanya perlu mengganti nol di input dengan NAs pertama.

Untuk melakukan itu, kami menggunakan x|NA, yang akan TRUEkapan x != 0dan NAsebaliknya. Jika kita kalikan ini dengan x, TRUEelemen digantikan oleh elemen yang sesuai xdan NAtetap NA, dengan demikian mengganti semua nol. Ini kemudian diteruskan ke zoo::na.locfyang memberi kita apa yang kita inginkan.

Disimpan 4 byte berkat flodel!


4

Karat, 100 byte

fn f(i:&[i64])->Vec<i64>{let(mut o,mut l)=(i.to_vec(),0);
for x in&mut o{if *x==0{*x=l}else{l=*x}};o}

Tersandung di tantangan ini, pikir saya akan mencobanya dalam bahasa favorit saya. Mencoba menggunakan [T]::windows_mut()pada awalnya, sebelum mengetahui bahwa itu tidak ada . Dan mungkin sebenarnya lebih lama dari ini. Pokoknya, ternyata golf Rust sangat jelek dan sangat tidak kompetitif (terutama dengan semua esoteris goshdarned!) 1

Baris baru tidak termasuk dalam bytecount; hanya ada di sana sehingga Anda tidak perlu menggulir ke samping. Itu tidak mengubah arti kode.

Tidak Disatukan:

fn cover_zeroes(input: &[i64]) -> Vec<i64> {
    let mut output = input.to_vec();
    let mut last_nonzero = 0;
    for item in &mut output {
        if *item == 0 {
            *item = last_nonzero;
        }
        else {
            last_nonzero = *item;
        }
    }
    output
}

[1] Setidaknya itu tidak seburuk Jawa.


7
" Setidaknya itu tidak seburuk Jawa "? Ahem ... ;)
Geobits

1
@ Getobits Oh, benar. Saya berharap Anda membutuhkan public static void mainpelat itu ...
Blacklight Shining

3

Bima Sakti 1.2.1 , 33 byte

:y;=<:&{~<?{0b_^;:3≤_;}1-}^<Ω!

Ini mengasumsikan bahwa daftar bilangan bulat hanya ada di tumpukan.


Penjelasan

:    : :           :              # duplicate the TOS
 y                                # push the length of the TOS
  ;               ;    ;          # swap the TOS and STOS
   =                              # dump a list to the stack
    < <    <                 <    # rotate the stack leftward
        &{~                }      # while loop
            ?{  _     _ }         # if-else statements
              0     3    1        # push an integer
               b                  # == on the TOS and STOS
                 ^          ^     # pop the TOS without output
                     ≤            # rotate the top N stack elements leftward
                          -       # subtract the TOS from the STOS
                              Ω   # push a list made of the top N stack elements
                               !  # output the TOS

Saya cukup yakin bahwa TOS dan STOS berarti Top of Stack dan Second-to-Top of Stack, apakah ini benar?
Addison Crump

Yep @FlagAsSpam
Zach Gates

3

Julia, 33 byte

g(x,a=0)=[(i!=0&&(a=i);a)for i=x]

Ini adalah fungsi gyang menerima array dan mengembalikan array. Kami memulai variabel sementara apada 0. Untuk setiap elemen iinput, jika ibukan 0 maka kami tetapkan auntuk i. Jika i0, atidak berubah pada iterasi itu. Kami menggunakan asebagai nilai di posisi itu di array output.


3

Perl 6 , 21 byte

*.map: {$_=($^a||$_)}

pemakaian:

# store the Whatever lambda as a subroutine
# just so that we don't have to repeat it
my &code = *.map: {$_=($^a||$_)}

say code [1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9];
# (1 1 2 2 7 7 7 7 5 5 5 5 9)

say [-1, 0, 5, 0, 0, -7].&code;
# (-1 -1 5 5 5 -7)

say ([1, 0, 0, 0, 0, 0],[-1, 0, 5, 0, 0, -7]).map: &code;
# ((1 1 1 1 1 1) (-1 -1 5 5 5 -7))

3

R, 36 byte

function(x)x[cummax(seq(a=x)*(!!x))]

Mari kita lihat bagaimana ini bekerja menggunakan x=

c(1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9)

sebagai contoh. Di sini, !!xakan menjadi vektor logis (Benar / Salah):

c(T, F, T, F, T, T, T, F, T, F, F, F, T)

Juga, seq(a=x)berikan vektor indeks selama x:

c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)

Kami mengalikan keduanya, memberi:

c(1, 0, 3, 0, 5, 6, 7, 0, 9, 0, 0, 0, 13)

Kami mengambil maksimum kumulatif:

c(1, 1, 3, 3, 5, 6, 7, 7, 9, 9, 9, 9, 13)

Akhirnya, kami menggunakan vektor terakhir sebagai indeks untuk mengekstrak dari x:

c(1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9)

3

CJam, 11 byte

q~{1$e|}*]p

Cobalah online.

Bagaimana itu bekerja

q~             Read and evaluate all input.
  {    }*      Fold; for each element but the first:
   1$e|          Copy the previous element and take their logical OR.
         ]p   Wrap all results in an array and print it.

3

Powershell, 32 byte

param($x)$x|%{($t=($_,$t)[!$_])}

$x|%{...}apakah blok skrip untuk setiap elemen dalam $x. ($_,$t)adalah array elemen saat ini dan $t, dan [!$_]artinya kita gunakan !$_untuk mengindeks ke dalam array. Indeks akan menjadi 0(false) untuk elemen bukan nol dan 1(benar) ketika elemen saat ini adalah nol, sehingga $takan menjadi elemen saat ini atau $t. Tanda kurung mengelilingi ekspresi penugasan sehingga nilainya dipancarkan. Tanpa parantheses itu hanya akan menjadi tugas "tenang" untuk $t.


@TimmyD, Anda benar, tentu saja. Saya telah menambahkan param($x)yang mengubah ini menjadi sebuah program. Outputnya adalah kumpulan bilangan bulat yang dapat Anda kirimkan sebagai parameter untuk program, misalnya $a = .\program.ps1 1,2,3,4,0,0,5dan kemudian .\program.ps1 $aberfungsi seperti yang diharapkan.
Danko Durbić

$args|%{($p=($_,$p)[!$_])}- 26 byte menggunakan $ args.
TessellatingHeckler

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.