Giảm một số bằng chữ số lớn nhất của nó


33

Bài tập:

Cho một số nguyên trong hệ thống số thập phân, giảm nó thành một chữ số thập phân duy nhất như sau:

  1. Chuyển đổi số thành một danh sách các chữ số thập phân.
  2. Tìm chữ số lớn nhất, D
  3. Xóa D khỏi danh sách. Nếu có nhiều hơn một lần xuất hiện của D, hãy chọn lần đầu tiên từ bên trái (ở vị trí quan trọng nhất), tất cả những lần khác sẽ vẫn còn nguyên.
  4. Chuyển đổi danh sách kết quả thành số thập phân và nhân nó với D.
  5. Nếu số lớn hơn 9 (có nhiều hơn 1 chữ số thập phân), hãy lặp lại toàn bộ quy trình, đưa kết quả vào đó. Dừng lại khi bạn nhận được một kết quả một chữ số.
  6. Hiển thị kết quả.

Thí dụ:

26364 -> 
1. 2 6 3 6 4 
2. The largest digit is 6, so D=6
3. There are two occurrences or 6: at positions 1 and 3 (0-based). We remove the left one,
    at position 1 and get the list 2 3 6 4 
4. we convert the list 2 3 6 4 to 2364 and multiply it by D:
   2364 * 6 = 14184
5. 14184 is greater than 9 so we repeat the procedure, feeding 14184 into it.

Chúng tôi tiếp tục bằng cách lặp lại quy trình cho 14184 và cứ thế và chúng tôi trải qua các kết quả trung gian sau, cuối cùng đạt 8:

11312
3336
1998
1782
1376
952
468
368
288
224
88
64
24
8

Vậy kết quả cho 26364 là 8.

Dữ liệu vào: Một số nguyên / một chuỗi đại diện cho một số nguyên

Đầu ra: Một chữ số, kết quả của việc giảm áp dụng cho số.

Các trường hợp thử nghiệm:

9 -> 9
27 -> 4
757 -> 5
1234 -> 8
26364 -> 8
432969 -> 0
1234584 -> 8
91273716 -> 6

Đây là , vì vậy câu trả lời ngắn nhất tính bằng byte trong mỗi ngôn ngữ sẽ giành chiến thắng.


3
Đó là số nào Nếu số lớn hơn 10 hoặc có nhiều hơn 1 chữ số thập phân . Số 10 có nhiều hơn 1 chữ số thập phân, nhưng nó không lớn hơn mười chữ số.
Adám

@ Adám Bằng logic mã hóa, nên sau đó 10 -> 10?
Ian H.

1
@ Adám Bạn nói đúng, tôi nên viết "lớn hơn 9". Tôi sẽ chỉnh sửa mô tả. Cảm ơn!
Galen Ivanov

Có ai đó đã kiểm tra biểu đồ của chức năng này cho các khu vực đủ lớn? Nó dường như có rất nhiều số không; Tôi cũng có nhiều số 8 trong khi soạn các trường hợp thử nghiệm.
Galen Ivanov

2
Ngoài ra, một số ngẫu nhiên chia hết cho 4 có xác suất 3/5 tích của hai chữ số cuối chia hết cho 8.
Ørjan Johansen

Câu trả lời:


18

05AB1E , 6 byte

Mã số:

[Dg#à*

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình

[Dg#     # While the length of the number is not 1
    à    # Extract the largest element from the current number
     *   # Multiply it with the leftover number

11

JavaScript (ES6), 49 byte

f=n=>n>9?f(""+n.replace(m=Math.max(...n),"")*m):n

Lấy đầu vào dưới dạng một chuỗi đại diện của một số nguyên, như f("26364").

Các trường hợp thử nghiệm



6

Bình thường , 16 byte

.WtH`*s.-ZKeSZsK

Lấy đầu vào dưới dạng Chuỗi. Hãy thử nó ở đây! (Thay thế .WtH`*s.-ZeSZseS:)

Bình thường , 18 byte

.WgHT*s.-`ZKeS`ZsK

Lấy đầu vào là một số nguyên. Hãy thử nó ở đây!

Làm thế nào nó hoạt động

16-byter

.WtH` * s.-ZKeSZsK ~ Chương trình đầy đủ.

.W ~ Chức năng trong khi. Trong khi A (giá trị) là trung thực, giá trị = B (giá trị).
                 ~ Giá trị cuối cùng được trả về.
  tH ~ A, điều kiện: Giá trị [1:] có đúng không? Là độ dài ≥ 2?
    `* s.-ZKeSZsK ~ B, setter.
       .- ~ Phép trừ Bagwise, được sử dụng để xóa chữ số cao nhất, với ...
         Z ~ Giá trị hiện tại Z và ...
          KeSZ ~ Chữ số cao nhất của Z (dưới dạng Chuỗi). Cũng gán cho một biến K.
      s ~ Đúc thành một số nguyên.
     * ~ Nhân với ...
              sK ~ Chữ số cao nhất.
    `~ Chuyển đổi thành Chuỗi.

18 -ter

.WgHT * s.-`ZKeS`ZsK ~ Chương trình đầy đủ.

.W ~ Chức năng trong khi. Trong khi A (giá trị) là trung thực, giá trị = B (giá trị).
                   ~ Giá trị cuối cùng được trả về.
  gHT ~ A, điều kiện: là giá trị (H) 10?
     * s.-`ZKeS`ZsK ~ B, setter.
       .- ~ Chất nền Bagwise (được sử dụng để loại bỏ sự xuất hiện đầu tiên).
         `Z ~ Biểu diễn chuỗi của Z.
           KeS`Z ~ Và ký tự cao nhất (từ vựng) của Z (chữ số cao nhất).
                     Nó cũng gán nó cho một biến gọi là K.
      s ~ Truyền tới số nguyên.
     * ~ Nhân với ...
                sK ~ K đúc thành int.

Gần gũi với Jelly ở loại thử thách như vậy rất tốt cho IMO của Pyth :-)


6

Husk , 14 13 12 byte

Cảm ơn Zgarb đã tiết kiệm 1 byte.

Ω≤9oṠS*od-▲d

Hãy thử trực tuyến!

Giải trình:

Ω≤9            Repeat the following function until the result is ≤ 9
           d     Convert to a list of digits
         -▲      Remove the largest one
       od        Convert back to an integer
   oṠS*          Multiply by the maximum digit

12 byte với một số sắp xếp lại.
Zgarb

@Zgarb Cảm ơn, tôi đã tìm kiếm một cái gì đó như thế.
H.PWiz

6

R , 99 95 byte

f=function(x)"if"(n<-nchar(x)-1,f(10^(n:1-1)%*%(d=x%/%10^(n:0)%%10)[-(M=which.max(d))]*d[M]),x)

Hãy thử trực tuyến!

Một hàm đệ quy. Thêm f(number)vào phần chân trang có thể được sử dụng để kiểm tra các giá trị khác của number. Thực hiện đơn giản, dlà danh sách các chữ số và 10^(n:2-2)%*%d[-M]tính toán số có chữ số lớn nhất bị xóa.


5

Python 2 , 72 byte

f=lambda n:`n`*(n<=9)or f(int(`n`.replace(max(`n`),'',1))*int(max(`n`)))

Hãy thử trực tuyến!


1
... Tôi đã gỡ lỗi một lỗi ngớ ngẩn trong việc này . Chết tiệt, tôi đã có ninja.
hoàn toàn là

Tôi đang gặp lỗi ở đầu vào 9
RoryT

Điều này dường như thất bại cho trường hợp thử nghiệm 432969. "ValueError: chữ không hợp lệ cho int () với cơ sở 10: ''"
James Webster

@JamesWebster nên được sửa ngay bây giờ.
FlipTack

1
@recursive Không, vì khi đó nlà 0 thì n*(n<=9)vẫn sẽ đánh giá thành giá trị giả, 0, làm cho đệ quy tiếp tục và gây ra lỗi, trong khi chuỗi '0'là giá trị trung thực và do đó đệ quy bị dừng lại.
FlipTack


4

Thạch , 15 byte

D×Ṁ$œṡṀ$FḌµ>9µ¿

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Làm sao?

D×Ṁ$œṡṀ$FḌµ>9µ¿ - Link: number, n
              ¿ - while:
             µ  - ...condition (monadic):
            9   -    literal 9
           >    -    loop value greater than (9)?
          µ     - ...do (monadic):               e.g. 432969
D               -    convert to a decimal list        [4,3,2,9,6,9]
   $            -    last two links as a monad:
  Ṁ             -      maximum                         9
 ×              -      multiply (vectorises)          [36,27,18,81,54,81]
       $        -    last two links as a monad:
      Ṁ         -      maximum                         81
    œṡ          -      split at first occurrence      [[36,27,18],[54,81]]
        F       -    flatten                          [36,27,18,54,81]
         Ḍ      -    convert from base 10              389421  (i.e. 360000 + 27000 + 1800 + 540 + 81)


4

C # (.NET Core) , 126 byte

int F(int n){var x=(n+"").ToList();var m=x.Max();x.RemoveAt(x.IndexOf(m));return n>9?F(int.Parse(string.Concat(x))*(m-48)):n;}

Hãy thử trực tuyến!


Chào mừng đến với PPCG! Bạn có thể loại bỏ một không gian .
Erik the Outgolfer

@EriktheOutgolfer Cảm ơn bạn, đã bỏ lỡ cái đó.
Timmeh

1
@totallyhuman Cảm ơn bạn, xuống tới 137 sau một số lần tái cấu trúc.
Timmeh

Bạn có thể thay đổi if(n<10)return n;...return F(...);thành một lần trả lại bằng ternary-if, như thế này: int F(int n){var x=(n+"").ToList();var m=x.Max(d=>d);x.RemoveAt(x.IndexOf(m));return n<10?n:F(int.Parse(string.Concat(x))*(m-48));}( 131 byte )
Kevin Cruijssen

Tôi nghĩ rằng bạn cần bao gồm using System.Linq;(18 byte) vào bytecount.
Ian H.

4

APL (Dyalog) , 36 35 33 byte

-1 do thông số kỹ thuật OP cập nhật. -2 nhờ ngn.

Chức năng tiền tố ẩn danh. Lấy số nguyên làm đối số.

{⍵>9:∇(⌈/×10⊥⊂⌷⍨¨⍳∘≢~⊢⍳⌈/)⍎¨⍕⍵⋄⍵}

Hãy thử trực tuyến!

{... }một chức năng mà là lập luận:

⍵>9: nếu đối số lớn hơn 9, thì:

  ⍕⍵ định dạng (xâu chuỗi) đối số

  ⍎¨ thực hiện (đánh giá) từng (điều này cho chúng ta các chữ số dưới dạng số)

  (... ) áp dụng các chức năng ngầm sau trên những

   ⌈/ chữ số lớn nhất

   × lần

   10⊥ giải mã cơ sở 10 của (thu thập các chữ số)

    tất cả các chữ số

   ⌷⍨¨ được lập chỉ mục bởi mỗi

   ⍳∘≢ số thứ i của số chữ số

    khác với

   ⊢⍳⌈/i ndex  của chữ số lớn nhất trong toàn bộ danh sách các chữ số

   recurse (tức là tự gọi) về điều đó

 khác

   trả về đối số không thay đổi


Không nên >10>9?
Erik the Outgolfer

@EriktheOutgolfer Có lẽ, nhưng OP thực sự không rõ ràng (tự mâu thuẫn) về điều đó.
Adám

Điều đó đúng, nhưng >9sẽ tiết kiệm được một byte.
Erik the Outgolfer

@EriktheOutgolfer Cập nhật.
Adám

@ Adám thay vì = cho -1 byte: {> 9: (⌈ / ... ⋄⍵}
ngn

3

Perl 6 ,  45  41 byte

{($_,{$/=.comb.max;S/"$/"//*$/}...10>*).tail}

Kiểm tra nó

{($_,{S/"{.comb.max}"//*$/}...10>*).tail}

Kiểm tra nó

Mở rộng:

{  # bare block lambda with implicit parameter 「$_」

  (  # generate the sequence

      $_,                      # start the sequence with the input

      {                        # generate the rest of the values in the sequence

          S/                   # find and replace (not in-place)
            "{  .comb.max  }"  # find the max digit and match against it
          //                   # replace it with nothing
          *                    # multiply the result with
          $/                   # the digit that was removed
      }

      ...                      # keep generating values until

      10 > *                   # the value is less than 10

  ).tail                       # get the last value from the sequence
}

3

Võng mạc , 67 byte

{1`(..+)?
1$&;$&
O`\G\d
.+((.);.*?)\2
$1
\d+
$*
1(?=.*;(1+))|.
$1
1

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm đủ nhanh để không làm hỏng máy chủ của Dennis. Giải trình:

{1`(..+)?
1$&;$&

Đối với các số có hai chữ số, số này nhân đôi số với ;dấu phân cách, tiền tố 1 thành số trùng lặp. Đối với các số có một chữ số, tiền tố này 1;cho số.

O`\G\d

Sắp xếp các chữ số của bản sao. (Đối với các số có một chữ số, điều này không có hiệu lực.)

.+((.);.*?)\2
$1

Tìm lần xuất hiện đầu tiên của chữ số lớn nhất và xóa nó, cũng như các chữ số khác trong bản sao và thêm 1 đã được thêm trước đó. (Đối với các số có một chữ số, trận đấu không thành công nên điều này không có gì.)

\d+
$*
1(?=.*;(1+))|.
$1
1

Nhân số với chữ số. Đối với các số có một chữ số, điều này dẫn đến số ban đầu và vòng lặp chấm dứt. Mặt khác, các vòng lặp chương trình cho đến khi đạt được một chữ số.


3

C # (Lõi .NET) , 177 164 + 18 byte

Đã lưu 13 byte nhờ @raznagul!

int f(int n){string s=n+"",m=s.Max(d=>d)+"";if(n<10)return n;var x=s.ToList();x.RemoveAt(s.IndexOf(m));int y=int.Parse(string.Join("",x))*int.Parse(m);return f(y);}

Hãy thử trực tuyến!


Bạn có thể thay đổi s.Length<2thành n<10. Ngoài ra, bạn có thể loại bỏ toán tử ternary và chỉ return f(y)ở cuối, vì trường hợp được xử lý bởi ifbước tiếp theo của đệ quy.
raznagul

3

Java 8, 126 104 byte

n->{for(;n>9;n=new Long((n+"").replaceFirst((n=(n+"").chars().max().getAsInt()-48)+"",""))*n);return n;}

-22 byte nhờ @ OlivierGrégoire .

Giải trình:

Hãy thử nó ở đây.

n->{         // Method with long as both parameter and return-type
  for(;n>9;  //  Loop as long as the number contains more than 1 digit
    n=       //   Replace the current number with:
      new Long((n+"").replaceFirst((n=(n+"").chars().max().getAsInt()-48)+"",""))
             //    Remove the first largest digit from the number,
      *n     //    and multiply this new number with the removed digit
  );         //  End of loop
  return n;  //  Return the result
}            // End of method


1
104 byte (giống như trên, nhưng lặp lại thay vì đệ quy, cũng: n>9và hoàn nguyên các điều kiện thay vì n<10).
Olivier Grégoire

2

Jq 1.5 , 86 byte

until(.<10;"\(.)"|(./""|max)as$v|index($v)as$x|.[:$x]+.[1+$x:]|tonumber*($v|tonumber))

Mở rộng

until(
    .<10                    # until number is below 10
  ; "\(.)"                  # convert to string
  | (./""|max) as $v        # find largest digit, call it $v
  | index($v) as $x         # find index of digit
  | .[:$x]+.[1+$x:]         # remove digit
  | tonumber*($v|tonumber)  # convert back to number and multiply by $v
)

Hãy thử trực tuyến!



2

Lua, 137 108 byte

function f(n)while n>9 do b="0"g=b.gsub g(n,".",function(m)b=math.max(m,b)end)n=b*g(n,b,"",1)end print(n)end

Cảm ơn Jonathan S vì đã chơi golf 29 byte.

Hãy thử trực tuyến!



Cảm ơn. Điều đó có vẻ xứng đáng với câu trả lời của riêng nó - sẽ liên kết đến bài đăng bạn thực hiện cho nó, nếu không sẽ chỉnh sửa & ghi có.
MCAdvoji10

Chỉ cần chỉnh sửa nó. Đây vẫn là mã của bạn, tôi đã không viết nó từ đầu.
Jonathan S.

2

D , 188 186 185 byte

import std.conv,std.algorithm;T f(T,U=string)(T u){if(u<10)return u;T[]r;u.text.each!(n=>r~=n.to!T-48);T m=r.maxElement;U s;r.remove(r.maxIndex).each!(n=>s~=n.to!U);return f(m*s.to!T);}

Hãy thử trực tuyến!

Tôi ghét đánh giá lười biếng, rất nhiều. Bất kỳ lời khuyên đều được chào đón!


2

Lua, 154 byte

Tôi nên có một số cách để giải quyết vấn đề này, tôi đang thử nghiệm ngay bây giờ.

n=...z=table
while n+0>9 do
t={}T={}n=n..''n:gsub(".",function(c)t[#t+1]=c T[#T+1]=c
end)z.sort(t)x=t[#t]z.remove(T,n:find(x))n=z.concat(T)*x
end
print(n)

Hãy thử trực tuyến!

Giải thích

n=...                    -- define n as a shorthand for the argument
z=table                  -- define z as a pointer to the object table
while n+0>9              -- iterate as long as n is greater than 9
do                       -- n+0 ensure that we're using a number to do the comparison
  t={}                   -- intialise two tables, one is used to find the greatest digit
  T={}                   -- the other one is used to remove it from the string
  n=n..''                -- ensure that n is a string (mandatory after the first loop)
  n:gsub(".",function(c) -- apply an anonymous function to each character in n
               t[#t+1]=c -- fill our tables with the digits
               T[#T+1]=c
             end)        
  z.sort(t)              -- sort t to put the greatest digit in the last index
  x=t[#t]                -- intialise x to the value of the greatest digit
  z.remove(T,n:find(x))  -- remove the first occurence of x from the table T 
                         -- based on its position in the input string
  n=z.concat(T)*x        -- assign the new value to n
end                      -- if it still isn't a single digit, we're looping over again
print(n)                 -- output the answer

2

PowerShell , 123 byte

[Collections.ArrayList]$a=[char[]]"$args"
while(9-lt-join$a){$a.remove(($b=($a|sort)[-1]));$a=[char[]]"$(+"$b"*-join$a)"}$a

Hãy thử trực tuyến!

Ôi. Mảng PowerShell là bất biến, vì vậy chúng ta cần sử dụng quá trình [Collections.ArrayList]truyền dài ở đây để có thể gọi .remove()sau.

Đưa đầu vào $args, chuyển đổi nó thành một chuỗi, sau đó là một char-array, sau đó là một ArrayList. Cửa hàng mà vào $a. Sau đó, chúng tôi whilelặp cho đến khi chúng tôi ở hoặc bên dưới 9. Mỗi lần lặp, chúng ta đang gọi .removephần tử lớn nhất của $a(được thực hiện bởi sortvà lấy phần tử cuối cùng[-1] ), lưu trữ phần tử lớn nhất vào$b cùng một lúc. Điều này xảy ra để làm việc vì các giá trị ASCII sắp xếp theo cùng kiểu với các chữ số.

Tiếp theo, chúng tôi tính toán lại $a, một lần nữa dưới dạng một char-array (và ArrayListngầm), bằng cách chuyển $b(hiện đang là a char) của chúng tôi thành một chuỗi, sau đó một int với +và nhân nó với$a -join thành một chuỗi (được ngầm định chuyển thành int). Điều này thỏa mãn phần "nhân với D" của thử thách.

Cuối cùng, một khi chúng tôi ra khỏi vòng lặp, chúng tôi đưa $avào đường ống và đầu ra là ẩn.


2

Pip , 22 21 byte

Wa>9a:aRAa@?YMXax*:ya

Đưa đầu vào làm đối số dòng lệnh. Xác minh tất cả các trường hợp thử nghiệm: Hãy thử trực tuyến!

Giải trình

Ungolfed, với ý kiến:

                 a is 1st cmdline arg
W a>9 {          While a > 9:
  Y MXa           Yank max(a) into y
  a RA: a@?y ""   Find index of y in a; replace the character at that position with ""
  a *: y          Multiply a by y
}
a                Autoprint a

Trong phiên bản golf, thân vòng lặp được cô đọng thành một biểu thức duy nhất:

a:aRAa@?YMXax*:y
        YMXa      Yank max(a)
     a@?          Find its index in a
  aRA       x     Replace at that index with x (preinitialized to "")
             *:y  Multiply that result by y (using : meta-operator to lower the precedence)
a:                Assign back to a


2

Java 8: 115 byte


-10 byte nhờ Jo King

Thật không may, bạn không thể gọi hàm lambda theo cách đệ quy, do đó cần thêm 11 byte cho tiêu đề phương thức. Tôi biết rằng có một câu trả lời Java ngắn hơn thay vào đó, nhưng tôi đã quyết định tự mình đưa ra câu trả lời này.

long f(long n){int m=(n+"").chars().max().getAsInt()-48;return n>9?f(new Long((n+"").replaceFirst(""+m,""))*m):n;};

Dùng thử trực tuyến


Bạn có thể di chuyển -48từ bản đồ đến cuối mđịnh nghĩa. Hãy thử trực tuyến! Bạn cũng có thêm một số khoảng trắng trong liên kết TIO của mình
Jo King

@JoKing cảm ơn.
Benjamin Urquhart

1

J, 40 byte

((]*<^:3@i.{[)>./)&.(10&#.inv)^:(9&<)^:_

Hãy thử trực tuyến!

giải trình

(      iterate                   )^:(9&<)^:_    NB. keep iterating while the number is > 9
 (     stuff         )&.(10&#.inv)              NB. convert to digits, do stuff, convert back to number
 (           )>./)                              NB. stuff is a hook, with max digit >./  on the right
 (]*<^:3@i.{[)                                  NB. so that in this phrase, ] means "max" and [ means "all digits"
  ]                                             NB. the max digit...
   *                                            NB. times...        
    <^:3@                                       NB. triple box...
         i.                                     NB. the first index of the max in the list of all digits
           {                                    NB. "from" -- which because of the triple box means "take all indexes except..."
            [                                   NB. from all the digits of the number

1
Tôi đã tìm hiểu về lựa chọn hộp ba từ bạn ngày hôm nay, cảm ơn bạn!
Galen Ivanov

1

PowerShell , 230 byte

$n="$args";do{$n=$n.ToString();$a=@();0..$n.Length|%{$a+=$n[$_]};$g=[convert]::ToInt32(($a|sort|select -last 1),10);[regex]$p=$g.ToString();[int]$s=$p.replace($n,'',1);if($n.Length-eq1){$n;exit}else{$r=$s*$g}$n=$r}until($r-lt10)$r

Hãy thử trực tuyến!

Lãng phí quá nhiều trên tất cả các loại đúc.


1

PHP, 82 77 + 1 byte

for($n=$argn;$n>9;)$n=join("",explode($d=max(str_split($n)),$n,2))*$d;echo$n;

Chạy như ống với -nRhoặc thử trực tuyến .


1

dc , 98 85 byte

?dsj[0dsosclj[soIlc^sr0]sn[I~dlo!>nrlc1+scd0<i]dsixljdlr%rlrI*/lr*+lo*dsj9<T]sT9<Tljp

Rất cám ơn câu trả lời này cho ý tưởng sử dụng ~trong việc trích xuất các chữ số từ một số, dẫn đến hai byte được lưu so với phiên bản gốc của mã.

Đây là một thay vì hoàn thành dcvới khả năng thao tác chuỗi không tồn tại của nó.

Hãy thử trực tuyến!


1

Bash, 80 byte

Sử dụng các gói Core Utility (cho sorttail) và grep.

while((n>9));do m=$(grep -o .<<<$n|sort|tail -n1);n=$((${n/$m/}*m));done;echo $n

Làm thế nào nó hoạt động?

while (( n > 9 )); do  # C-style loop conditional
    grep -o .          # Separate the string into one char per line
              <<< $n   # Use the content of variable `n` as its stdin
    | sort             # Pipe to `sort`, which sorts strings by line
    | tail -n 1        # Take the last line

m=$(                 ) # Assign the output of the command chain to `m`
n=$((          ))      # Assign the result of the evaluation to n
     ${n/$m/}          # Replace the first occurrence of $m with empty
             *m        # ... and multiply it by the value of `m`
done; echo $n          # After loop, print the value of `n`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.