Đầu tiên họ đến


29

"Đầu tiên họ đến ..." là một bài thơ của Martin Niemöller :

First they came for the Socialists, and I did not speak out-
Because I was not a Socialist.

Then they came for the Trade Unionists, and I did not speak out-
Because I was not a Trade Unionist.

Then they came for the Jews, and I did not speak out-
Because I was not a Jew.

Then they came for me-and there was no one left to speak for me.

Nhiệm vụ của bạn là đầu ra ở trên. Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Quy tắc

  • Bạn có thể bao gồm thêm khoảng trắng không ảnh hưởng đến ngoại hình. Một dòng mới duy nhất được cho phép.
  • Mặt khác, đầu ra phải khớp chính xác, bao gồm cả vị trí của dòng mới.
  • Theo tiêu chuẩn meta, bạn có thể xuất ra một danh sách các chuỗi. Tuy nhiên, bạn phải bao gồm các dòng trống.

Lưu ý rằng cá nhân tôi tin rằng đây không phải là một bản dupe vì cách bài thơ được trình bày - nó cần một số sáng tạo để chơi gôn. Thảo luận về việc đây có phải là một bản dupe hay không có thể được tìm thấy ở đây .


7
Tôi không chắc điều này bổ sung cho trang web ở trên và ngoài thử thách RickRoll.
admBorkBork

7
Tôi không thích cái búa của ricroll dupes ở đây.
lập trình


11
Lần đầu tiên, tôi không nghĩ đây là bản dupe của Rickroll. Có cấu trúc có ý nghĩa ở đây. Sự song song cho phép từ các chiến lược khác nhau. Mở lại.
xnor

3
Cấu trúc này là một đối số có lợi cho việc là một bản sao của rickroll, không chống lại.
Peter Taylor

Câu trả lời:


8

SOGL V0.12 , 103 102 101 byte

 →∑‘¾ο╤Ε9‘}ψ⁴‘¹"4¡‘Q°‘:¹¹I{ū_:¹"Eā/}l6⁸SÆ□⁴↔b⅜╬I℮;YΥηκ*█⅞F^Κ⅜⁸{x⅔⁵⅟╚?Z‘O}"Ι╚╬√⅔δηvΧχ⁷⁾Η<υL┼!Ο'μΠ⁵╝⁷‘⁾

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

Giải thích (ở đây tôi đã thay thế các chuỗi nén bằng ..để tiết kiệm không gian):

..‘.‘..‘                              push "socialist", "trade unionist" and "jew"
        ¹                             wrap in an array: ["socialist", "trade unionist", "jew"]
         "..‘..‘                      push "first" and "then"
                :                     duplicate the then
                 ¹                    wrap in an array: ["first","then","then"]
                  ¹                   wrap those two in an array: [["socialist", "trade unionist", "jew"], ["first","then","then"]]
                   I                  rotate clockwise: [[first,socialist], [then,trade unionist], [then,jew]]
                    {         }       for each do, pushing the array
                     ū                  uppercase the 1st letter of each word in the array - ["First", "Socialist"]
                      _                 splat the contents on the stack   "First", "Socialist"
                       :                duplicate the 2nd one             "First", "Socialist", "Socialist"
                        ¹               wrap in an array                  ["First", "Socialist", "Socialist"]
                         "..‘           push "ŗ they came for the ŗs, and I did not speak out-\nBecause I was not a ŗ." with ŗ replaced with its appropriate item in the array
                             O          output that
                               "..‘   push "then they came for me-and there was no one left to speak for me."
                                   ⁾  uppercase the 1st letter of it
                                      implicitly output it in a new line

Bạn có thể thêm một lời giải thích xin vui lòng?
Nzall

@Nzall Quên, viết lên
dzaima

@Nzall Đã thêm một lời giải thích
dzaima

7

Mã máy 6502 (C64), 229 byte

Loại nhàm chán, vẫn doable trên C64 với một phần nào số tiền khá byte :)

00 C0 A9 17 8D 18 D0 A2 2C 86 FE A6 FE A0 C0 BD B6 C0 20 1E AB C6 FE 10 F2 60
C6 49 52 53 54 20 00 D4 48 45 4E 20 00 54 48 45 20 00 54 48 45 59 20 43 41 4D
45 20 00 46 4F 52 20 00 53 50 45 41 4B 20 00 41 4E 44 20 C9 20 44 49 44 20 4E
4F 54 20 00 4F 55 54 2D 0D 00 C2 45 43 41 55 53 45 20 C9 20 57 41 53 20 4E 4F
54 20 41 20 00 4D 45 2D 41 4E 44 20 54 48 45 52 45 20 57 41 53 20 4E 4F 20 4F
4E 45 20 4C 45 46 54 20 54 4F 20 00 4D 45 2E 00 2E 0D 00 53 2C 20 00 D3 4F 43
49 41 4C 49 53 54 00 D4 52 41 44 45 20 D5 4E 49 4F 4E 49 53 54 00 CA 45 57 00
0D 00 8C 35 3A 6B 2A 1F B4 90 B0 56 50 3A 41 93 B0 25 35 2A 1F B4 90 A1 56 50
3A 41 93 A1 25 35 2A 1F B4 90 97 56 50 3A 41 93 97 25 35 2A 18

Bản demo trực tuyến

Sử dụng: SYS49152

Giải trình:

Vì phần này chứa phần lớn dữ liệu, thay vì danh sách tháo gỡ vô nghĩa, đây là ca65nguồn lắp ráp kiểu tạo mã máy này:

.segment "LDADDR"
                .word   $c000           ; load address
.code
                lda     #$17            ; upper/lower mode
                sta     $d018           ; store in VIC register
                ldx     #revpoemsize    ; initialize ...
                stx     $fe             ; ... counter
loop:           ldx     $fe             ; load current position
                ldy     #$c0            ; highbyte of strings always same
                lda     revpoem,x       ; load lowbyte from table
                jsr     $ab1e           ; output 0-terminated string
                dec     $fe             ; decrement position
                bpl     loop            ; >=0 ? -> repeat
                rts                     ; done

first:          .byte   "First ", 0
then:           .byte   "Then ", 0
the:            .byte   "the ", 0
came:           .byte   "they came ", 0
for:            .byte   "for ", 0
speak:          .byte   "speak ", 0
didnot:         .byte   "and I did not ", 0
out:            .byte   "out-", $d, 0
wasnot:         .byte   "Because I was not a ", 0
noone:          .byte   "me-and there was no one left to ", 0
me:             .byte   "me.", 0
period:         .byte   ".", $d, 0
comma:          .byte   "s, ", 0
socialist:      .byte   "Socialist", 0
unionist:       .byte   "Trade Unionist", 0
jew:            .byte   "Jew", 0
p:              .byte   $d, 0

revpoem:        .byte   <me, <for, <speak, <noone, <came, <then, <p
                .byte   <period, <jew, <wasnot, <out, <speak, <didnot
                .byte   <comma, <jew, <the, <for, <came, <then, <p, <period
                .byte   <unionist, <wasnot, <out, <speak, <didnot, <comma
                .byte   <unionist, <the, <for, <came, <then, <p, <period
                .byte   <socialist, <wasnot, <out, <speak, <didnot, <comma
                .byte   <socialist, <the, <for, <came, <first
revpoemsize     = * - revpoem - 1


4

Perl 6 , 193 byte

say join ' they came for ','First'Socialist "Trade Unionist" Jew».map({"the {$_}s, but I did not speak out-
because I was not a $_.

Then"}),'me- and there was no one left to speak for me.'

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


4

Perl 5 , 185 byte

print join" they came for ",First,(map"the ${_}s, and I did not speak out-
Because I was not a $_.

Then",Socialist,"Trade Unionist",Jew),"me-and there was no one left to speak for me."

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

Cảm ơn @ Massa cho -3 byte!


Sử dụng Tham gia và bạn có thể cắt thêm năm ghế khác
Massa

@Mass không chắc là tôi đang thấy thế nào! Còn manh mối nào nữa không?
Dom Hastings

Tôi đang sử dụng điện thoại di động của mình ngay bây giờ, nhưng hãy xem câu trả lời perl6 của tôi dưới đây!
Massa

@Mass Ahhh, tốt đẹp! Cảm ơn! -3 cuối cùng :)
Dom Hastings

3

C, 248 byte

Cảm ơn @ Zacharý đã lưu 9 byte.

p(x,y){printf("%s they came for the %ss, and I did not speak out-\nBecause I was not a %s.\n\n",x,y,y);}f(){p("First","Socialist");p("Then","Trade Unionist");p("Then","Jew");puts("Then they came for me-and there was no one left to speak for me.");}

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


Bạn có thể di chuyển strực tiếp vào printftuyên bố?
Zacharý

@ Zacharý Vâng, tất nhiên.
Steadybox

3

C # (.NET Core) , 248 246 242 byte

a=>{string b=@", and I did not speak out-
Because I was not a ",c=" they came for ",d="Socialist",e="Trade Unionist";return$@"First{c+d}s{b+d}.

Then{c+e}s{b+e}.

Then{c}the Jews{b}Jew.

Then{c}me-and there was no one left to speak for me.";}

Dòng mới thực tế đã tiết kiệm cho tôi một vài byte.

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

Đã lưu 2 byte nhờ Business Cat


3

Python 3 , 203 byte

print('First',*[f'the {s}s, and I did not speak out-\nBecause I was not a {s}.\n\nThen'for s in['Socialist','Trade Unionist','Jew']],'me-and there was no one left to speak for me.',sep=' they came for ')

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


sep = là một động thái thiên tài! :-)
Massa

3

Befunge-93 , 348 byte

".em rof kaeps ot tfel eno on saw ereht dna-em rof emac yeht nehT"52*:v
v"d not speak out-"*25"Because I was not a "<   p5-2*89p1-2*89"vvJew."<
> "id I dna ">",sweJ>v"67+2p66+5p     v     ^p2-2*89"vTrade Unionist."<
>"tsriF">:#,v>",stsinoinU edarTv"67+3pv     ^   p3+66p40"^_Socialist."<
>"nehT"52*: v>",stsilaicoS@"67+3p     >" eht rof emac yeht "

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


3

Befunge, 293 274 270 byte

62574732594932584832001v_@#:\0\!<
0-*84g+3/"P"\%"P"::+p00<_|#:-1g0
84!-"*":g+3/"P"\%"P"::+1\<+1_$#:^#-2\,-**
&First0 they came for %the Qs, and I did not speak out-*Because I was not a (.**
ThenOme-and there was no one left to speak for me.*$Jew*Socialist/Trade Unionist

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

Đây là một cách tiếp cận khác với giải pháp Befunge hiện có. Nó sử dụng một loại danh sách được liên kết để lưu trữ một từ điển các cụm từ phổ biến và sau đó chỉ có một danh sách đơn giản các giá trị trên ngăn xếp biểu thị thứ tự các cụm từ sẽ được xuất ra.


2

Võng mạc , 176 byte


 Socialists, Trade Unionists, Jews,1me-and there was no one left to2for me.
( .+?)s,
1the$& and I did not2out-¶Because I was not a$1.¶¶Then
^
First
1
 they came for 
2
 speak 

Hãy thử trực tuyến! Giải thích: Chuỗi 12chỉ là các chuỗi lặp lại đủ dài để có giá trị lặp lại. Phần Firstbổ sung được thêm vào sau để giúp chọn chỗ giữ chỗ cho phần lặp đi lặp lại dễ dàng hơn, "họ đến với [nhóm] và tôi không nói ra - Bởi vì tôi không phải là [nhóm]. Sau đó", được mở rộng bởi giai đoạn thứ hai.


2

JavaScript (ES6), 231 227 223 221 byte

_=>`First${t=" they came for "}the Socialist${a=`s, and I did not speak out-
Because I was not a `}Socialist${t=`.

Then`+t}the ${(u="Trade Unionist")+a+u+t}the Jew${a}Jew${t}me-and there was no one left to speak for me.`

Thử nó

o.innerText=(
_=>`First${t=" they came for "}the Socialist${a=`s, and I did not speak out-
Because I was not a `}Socialist${t=`.

Then`+t}the ${(u="Trade Unionist")+a+u+t}the Jew${a}Jew${t}me-and there was no one left to speak for me.`
)()
<pre id=o>


2

Java 8, 250 236 byte

o->{String t=" they came for ",r="First";for(String s:"Socialist,Trade Unionist,Jew".split(","))r+=t+"the "+s+"s, and I did not speak out-\nBecause I was not a "+s+".\n\nThen";return r+t+"me-and there was no one left to speak for me.";}

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


2

JavaScript (ES6), 210 207 206 203 byte

Một cách tiếp cận khác với giải pháp khác của tôi để tìm ra nó đáng để chỉnh sửa nó thành câu trả lời của riêng nó bây giờ rằng thách thức đã được mở lại.

_=>`First${["Socialist","Trade Unionist","Jew"].map(x=>t+`the ${x}s, and I did not speak out-
Because I was not a ${x}.

Then`,t=` they came for `).join``+t}me-and there was no one left to speak for me.`

Thử nó

o.innerText=(
_=>`First${["Socialist","Trade Unionist","Jew"].map(x=>t+`the ${x}s, and I did not speak out-
Because I was not a ${x}.

Then`,t=` they came for `).join``+t}me-and there was no one left to speak for me.`
)()
<pre id=o>


2

Gaia , 179 175 byte

⇓“the ”3ṁ“s, and I did not speak out-¶Because I was not a ”2ṃ“.¶¶Then
“ they came for 
First”“Socialist“Trade Unionist“Jew”↓¦⇑“me-and there was no one left to speak for me.”]$

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

Giải trình

3 chức năng được xác định ở đây (1 trên mỗi dòng). Cái dưới cùng được gọi là đầu tiên. được thay thế bởi dòng mới.

⇓“the ”3ṁ“...”2ṃ“.¶¶Then  First helper function. Argument: s
⇓                         Push "Then they came for "
 “the ”                   Push "the "
       3ṁ                 Bring s to the top
         “...”            Push "s, and I did not speak out-¶Because I was not a "
              2ṃ          Push a copy of s
                “.¶¶Then  Push ".¶¶Then"


“ they came for   Helper function. No arguments.
“ they came for   Push " they came for "


First”“..“..“..”↓¦⇑“...”]$  Main function.
First”                      Push "First"
      “..“..“..”            Push the list ["Socialist" "Trade Unionist" "Jew"]
                ↓¦          Call the first helper function on each.
                  ⇑         Push "Then they came for "
                   “...”    Push "me-and there was no one left to speak for me."
                        ]$  Wrap the stack in a list and join with no separator.

2

Bong bóng , 149 132 129 byte

00000000: 9d4d b515 0241 14cc af8a c991 1e70 0991  .M...A.......p..
00000010: 02fe bbfd e7b7 cb1a 523d ee0e d9f8 7453  ........R=....tS
00000020: 631d 5cc2 2b84 5432 2265 760c 6315 a654  c.\.+.T2"ev.c..T
00000030: a4d6 d92a 480a 0c20 5201 a91c ec8c 2987  ...*H.. R.....).
00000040: f2ae 1634 3924 6f79 6b2e c8ee 4dba 14eb  ...49$oyk...M...
00000050: 4130 4958 3ed9 9e18 128c a94c 95fc e3e0  A0IX>......L....
00000060: b6fd fa65 c88b 1fa7 7795 e77b 25d7 488a  ...e....w..{%.H.
00000070: 9d68 f898 8792 8c82 2307 a78e bb87 647d  .h......#.....d}
00000080: 03                                       .

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

Nhàm chán trả lời Bubblegum. Đã bị SOGL đánh bại, vậy là tốt rồi.

Tín dụng cho -17 byte được chuyển đến Dom Hastings

-3 byte bởi các lò nướng


132 byte . Vẫn không thể đánh bại SOGL!
Dom Hastings

@DomHastings Tôi không nghĩ bạn sẽ đánh bại SOGL với Bubblegum ...
Erik the Outgolfer 22/08/17

@EriktheOutgolfer I'm very glad of that fact too! I'd like to invest some time to play with it, incredibly expressive!
Dom Hastings


2

SQL 269 bytes

declare @ char(18)='They came for the ',@a char(49)='s, and I did not speak out-
Because I was not a '
print'First '+@+'Socialist'+@a+'Socialist.

'+@+'Trade Unionist'+@a+'Trade Unionist.

'+@+'Jew'+@a+'Jew.

'+@+' me-and there was no one left to speak for me.'

1
Hi, welcome to PPCG! I've edited your post to add some formatting. As for the actual code, I think the leading words "Then " are missing in the last three sentences, and the last sentence now states "They came for the me-..." instead of "Then they came for me-...".
Kevin Cruijssen


1

Proton, 219 bytes

t='they came for'for i:'Socialist','Trade Unionist','Jew'print(i[0]=='S'? 'First':'Then',t,'the',i+'s, and I did not speak out-
Because I was not a',i+'.
')print('Then',t,'me-and there was no one left to speak for me.')

Try it online!


1

Python 2, 246 bytes

First time I tried compressing the string an returning it. Aparently it takes more bytes than other approaches. Is there anything left to golf?

import zlib,base64
print zlib.decompress(base64.b64decode('eJyd0DEOwjAMBdA9p/gHoD0EAxJdgQNYiatGtDaKU1XcvikUdSkDjLb/f4NPMVlG7vgJTwOj1bRMuKiP1EfLdgBJwBkhBohm2IPpDh1z5Y7saTQux4nsdaStWDt37Vh27JtElT/oT++73PD0K1oq+97A1QKVZeI1DxVGz215mK7uO1nPf1Zu5g=='))

Try it online!


1

Röda, 204 bytes

{t="Then"c=" they came for";["First","Socialist",t,"Trade Unionist",t,"Jew"]|[`$_$c the ${_}s, and I did not speak out-
Because I was not a $_2.

`];[`$t$c me-and there was no one left to speak for me.`]}

Try it online!


1

PHP, 194 bytes

First<?=$t=" they came for ";foreach([Socialist,"Trade Unionist",Jew]as$s)echo"the ${s}s, and I did not speak out-
Because I was not a $s.

Then$t"?>me-and there was no one left to speak for me.

Try it online.


1

C (gcc), 244 bytes

f(c){for(c=0;c<3;printf("%s they came for the %ss, and I did not speak out-\nBecause I was not a %2$s.\n\n",c++?"Then":"First",c^2?c?"Trade Unionist":"Socialist":"Jew"));puts("Then they came for me-and there was no one left to speak for me.");}

Try it online!


1

Python 3, 208 bytes

print(' they came for '.join(["First"]+[f"the {i}s, and I did not speak out-\nBecause I was not a {i}.\n\nThen"for i in['Socialist','Trade Unionist','Jew']]+['me-and there was no one left to speak for me.']))

Try it online!

-1 thanks to @Step Hen


1
Then "for -> Then"for and you're beating the other Python answers :)
Stephen

@StepHen Thanks for noticing the extra space! :-)
Massa

1

Clojure, 285 bytes

(fn[](doseq[i(range 4):let[c["Socialist""Trade Unionist""Jew"""]f #(if(< i 3)% %2)]](println(if(= i 0)"First""Then")"they came for"(str(f(str"the "(c i)"s, ")"me-")(f"and I did not speak out-\n""and there was no one left to speak for me.")(f(str"Because I was not a "(c i)".\n")"")))))

This was a fun little challenge. I ended up almost entirely rewriting most of it a couple of times because I realized I was doing something overly roundabout. There are still a couple areas that could probably be touched up, but I'm pretty happy with how it turned out, even if I'm only "compressing" the original by 54 bytes.

repl.io

See the pre-golfed code for an explanation:

(defn ftc []
  ; Loop over the lines numbers for reference
  (doseq [i (range 4)
          :let [; Added a dummy last "class" since "me-" wasn't necessary,
                ;  and only having 3 elements was causing OOB errors.
                classes ["Socialist" "Trade Unionist" "Jew" ""]

                ; A helper function that executes either its first or second argument
                ;  depending on if the current line is one of the first 3 lines.
                if-first-three-lines #(if (< i 3) % %2)]]

    ; An implicit space is inserted between each of the args to println
    (println
      ; Decide on the opener
      (if (= i 0) "First" "Then")

      "they came for"

      ; Start string concatenation because the implicit space
      ;  begins complicating things.
      (str
        ; Decide which "class" the line belongs to
        (if-first-three-lines
          (str "the " (classes i) "s, ")
          "me-")

        ; Decide on the line ending
        (if-first-three-lines
          "and I did not speak out-\n"
          "and there was no one left to speak for me.")

        ; Then pick the trailer
        (if-first-three-lines
          (str "Because I was not a " (classes i) ".\n")
          "")))))

1

Japt, 153 150 149 147 bytes

`{=` ey ¯´ f `}´-d tre °s no e ¤ft  speak f ´.`i`Sáû\E
TÎè UÍát
Jew`·rÈ+U+`e {Y}s, d I ¹d not speak t-
Be¯«e I °s not a {Y}.

Tn`}`Fir¡

Test it

1 byte saved thanks to Oliver


1

05AB1E, 124 119 bytes

.•RYÁ Wö∍®Ø’áÅÚ)’Òü•'x¡™vy„€Û‚½#NĀ虓ÿ€»‹é€‡€€ ÿs,€ƒ Iƒ§€–¡´€Ä-“©¶y“ƒ« I€¥€–€… ÿ.“.ª¶¶}®19£“€á-and€Ç€¥€¸€µ…¸€„¡´€‡€á.“J

Try it online.

Explanation:

.•RYÁ Wö∍®Ø’áÅÚ)’Òü•
                  # Push compressed string "socialistxtrade unionistxjew"
 'x¡             '# Split it on "x": ["socialist","trade unionist","jew"]
                 # Convert each word to Titlecase: ["Socialist","Trade Unionist","Jew"]
v                 # Loop `y` over each of these strings:
 y                #  Push string `y`
 „€Û‚½            #  Push dictionary string "first then"
      #           #  Split on spaces: ["first","then"]
       N          #  Push the index of the loop
        Ā         #  Truthify it (0 remains 0; every other number becomes 1)
         è        #  Use it to index into the list
                 #  Titlecase it
 “ÿ€»‹é€‡€€ ÿs,€ƒ Iƒ§€–¡´€Ä-“
                  #  Push dictionary string "ÿ they came for the ÿs, and I did not speak out-"
                  #  where the "ÿ" are automatically filled with the strings at the top of the stack
  ©               #  Save it in the register (without popping)
                 #  Push a newline "\n"
 y                #  Push string `y` again
 “ƒ« I€¥€–€… ÿ.“  #  Push dictionary string "because I was not a ÿ."
                  #  where the "ÿ" is automatically filled again with the string
                #  Sentence case it: "because" becomes "Because"
 ¶¶               #  Push two newline characters "\n\n"
}                 # After the loop:
®                 # Push the string from the register:
                  #  "Then they came for the Jews, and I did not speak out-"
 19£              # Only leave the first 19 characters: "Then they came for "
“€á-and€Ç€¥€¸€µ…¸€„¡´€‡€á.“
                  # Push dictionary string "me-and there was no one left to speak for me."
J                 # Then join everything on the stack together (and output implicitly)

See this 05AB1E tip of mine (sections How to use the dictionary? and How to compress strings not part of the dictionary?) to understand why:

  • .•RYÁ Wö∍®Ø’áÅÚ)’Òü• is "socialistxtrade unionistxjew"
  • „€Û‚½ is "first then"
  • “ÿ€»‹é€‡€€ ÿs,€ƒ Iƒ§€–¡´€Ä-“ is "ÿ they came for the ÿs, and I did not speak out-"
  • “ƒ« I€¥€–€… ÿ.“ is "because I was not a ÿ."
  • “€á-and€Ç€¥€¸€µ…¸€„¡´€‡€á.“ is "me-and there was no one left to speak for me."

-4

Text, 348 bytes

First they came for the Socialists, and I did not speak out-
Because I was not a Socialist.

Then they came for the Trade Unionists, and I did not speak out-
Because I was not a Trade Unionist.

Then they came for the Jews, and I did not speak out-
Because I was not a Jew.

Then they came for me-and there was no one left to speak for me.

This is the shortest possible version in its language, and is on par with the Befunge-93 answer at time of writing.


2
As with pretty much all "Text" answers, this is boring and lazy
Jo King

@Jo King The notable bit is that it's the same length as the Befunge-93 answer.
IFcoltransG
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.