ไม่มีการเชื่อมต่อสตริง!


42

Intro

ผนังมี 3 เล็บ คุณมีสตริงที่จับจ้องไปที่กรอบรูปภาพทั้งสองด้าน ในการแขวนรูปภาพคุณต้องพันสายด้วยตะปู แต่ก่อนที่จะปล่อยภาพไป: คุณสามารถทำนายได้ไหมว่าภาพกำลังจะร่วงหล่นเพียงแค่ดูว่าสายพันรอบเล็บ?

ในตัวอย่างแรกภาพจะไม่ตก ในตัวอย่างที่สองรูปภาพกำลังจะตกลงมา

ท้าทาย

กำหนดเส้นทางของสายรอบ ๆNเล็บกำหนดว่าภาพกำลังจะตกลงหรือไม่ กลับtruthyค่าถ้าภาพจะจะลดลงและค่า falsy มิฉะนั้น

รายละเอียด

  • คุณสามารถสมมติว่าเล็บและรูปภาพถูกจัดเรียงในรูปแบบปกติN+1โดยมีรูปภาพที่ด้านล่าง
  • คุณสามารถสันนิษฐานได้ว่าไม่มีเชือกในนอตนั่นคือสามารถผูกเชือกอย่างต่อเนื่องจากปลายด้านใดด้านหนึ่ง
  • เล็บแต่ละอันมีการระบุตามเข็มนาฬิกาด้วยตัวอักษรตัวอักษร คุณสามารถสันนิษฐานได้ว่ามีเล็บไม่เกิน 26 ชิ้น (AZ)
  • การพันตามเข็มนาฬิการอบเล็บจะแสดงด้วยตัวอักษรตัวพิมพ์เล็กการห่อตามเข็มนาฬิกาเคาน์เตอร์จะแสดงด้วยตัวอักษรตัวพิมพ์ใหญ่

ตัวอย่างแรกจากข้างต้นจะได้รับการเข้ารหัสเป็นตัวอย่างที่สองจะถูกเข้ารหัสเป็นBcACAbBac

สำหรับผู้อ่านที่เอียง: ปัญหานี้เทียบเท่ากับการพิจารณาว่าองค์ประกอบของกลุ่มฟรี - สร้างขึ้นโดยชุดของเล็บ - เป็นตัวตนหรือไม่ ซึ่งหมายความว่าจะเพียงพอที่จะยกเลิกวัสดุพิมพ์ซ้ำ ๆ เช่นaAหรือAaจนกว่าคุณจะถึงจุดคงที่ หากจุดคงที่เป็นสตริงว่างนี่เป็นองค์ประกอบที่เป็นกลางมิฉะนั้นจะไม่ใช่

ตัวอย่าง

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja

3
ดูเหมือนว่าในการช่วยให้มือเขียนเส้นทางของสตริงรูปภาพจะตกลงไป จากนั้นความท้าทายนี้กลายเป็นเรื่องง่ายมาก
owacoder

@owacoder คุณต้องเร็วพอ: D
ข้อผิดพลาด

เกี่ยวข้อง: youtube.com/watch?v=x5h3yTxeCew
flawr

คำตอบ:


11

เรติน่า 21 ไบต์

+`(.)(?!\1)(?i)\1

^$

ลองออนไลน์!

เช่นเดียวกับวิธีการแก้ไขข้อบกพร่องของมันเพียงแค่ลบคู่ตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กที่อยู่ติดกันซ้ำ ๆ แล้วตรวจสอบว่าผลลัพธ์นั้นว่างเปล่าหรือไม่

สำหรับวิธีจับคู่ตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก:

(.)     # Match and capture a letter.
(?!\1)  # Ensure that the next character is not the same, to avoid matching
        # "aa" and "AA".
(?i)    # Turn on case-insensitivity.
\1      # Match the backreference. In .NET, when using case insensitivity,
        # backreferences also get case-insensitive, so this *can* still match
        # iff the cases of the two letters are different.

7

MATLAB, 76 ไบต์คู่, 82 79 77 ไบต์

นี่อาจเป็นครั้งแรกที่ฉันได้เห็นว่า MATLAB นั้นสั้นกว่าอ็อกเทฟจริงๆ(ทั้งไบต์)!

คำตอบใหม่ใน MATLAB:

c=input('');k='Aa';while k<1e5,k=k+1;c=strrep(c,65+mod(k,64),'');end;~nnz(c)

คำตอบในระดับแปดเสียง:

c=input('');k='Aa';while k++<1e5,c=strrep(c,['',65+mod(k,64)],'');end;~nnz(c)

บันทึกสามห้าไบต์ขอบคุณข้อบกพร่อง ~nnz(c)จะสั้นกว่าisempty(c)และเป็นสองไบต์สั้นกว่า'Aa'[0,32]

ลองใช้เวอร์ชั่นคู่แบบออนไลน์!


คำอธิบาย:

c=input('')ขอให้ผู้ใช้ป้อนข้อมูล เรากำหนดk='Aa'เป็นอาร์เรย์อักขระ

while k++<1e5: ในขณะที่วงที่องค์ประกอบทั้งในkจะเพิ่มขึ้นแต่ละซ้ำ, Aa, Bb, Ccและอื่น ๆ ลูปจะดำเนินต่อไปจนกว่าองค์ประกอบที่ใหญ่ที่สุดคือ1e5ซึ่งควรจะสูงพอสำหรับสตริงส่วนใหญ่ สามารถเพิ่มเป็น9e9โดยไม่เพิ่มจำนวนไบต์

เราจะทำstrrepหน้าที่เป็นขั้นตอนโดยเริ่มจากตรงกลาง

โดยการใช้งานmod(k,64)เราจะได้ข้อมูลต่อไปนี้เมื่อเราถึงจุดสิ้นสุดของตัวอักษร (ถ้าเราแปลงkกลับเป็นตัวอักษร):

ans = Yy
ans = Zz
ans = [{
ans = \|
ans = ]}
ans = ^~
ans = _
ans = `�
ans = aA
ans = bB

อย่างที่คุณเห็นมีสัญลักษณ์บางอย่างอยู่ระหว่างนั้น แต่มันจะล้อมรอบและเริ่มต้นด้วยตัวอักษรอีกครั้ง แต่ตอนนี้ใช้ตัวอักษรพิมพ์เล็กก่อน นี้เป็นวิธีที่สั้นมากในการตรวจสอบทั้งในและAaaA

['',65+mod(k,64)]เชื่อมต่อค่าตัวเลขจากmod-call ด้วยสตริงว่างแปลงตัวเลขเป็นอักขระ

strrepใช้เพื่อลบองค์ประกอบออกจากสตริงcและส่งคืน มันจะค้นหาสิ่งที่เกิดขึ้นทั้งหมดkในสตริงและแทนที่ด้วยสตริงว่าง

หลังจาก1e5การทำซ้ำเราจะมีสตริงว่างหรือสตริงไม่ว่าง เราตรวจสอบว่ามีองค์ประกอบใด ๆ ในการใช้c nnz(c)เรากลับมาnot(nnz(c))ดังนั้น1ถ้ามันว่างเปล่าและ0ถ้ามีตัวอักษรเหลืออยู่c


6

Minkolang 0.15 , 30 ไบต์

od4&x,N.I1=$6&d3~c-$~48*=,2&xx

ลองที่นี่!

คำอธิบาย

od                            Take character from input and duplicate it
  4&                          If top of stack is truthy, jump 4 spaces
    x                         Dump top of stack
     ,                        NOT top of stack
      N.                      Output as number and stop

    I1=                       1 if stack has 1 element, 0 otherwise
       $6&                    If top of stack is truthy, jump 16 spaces (to the beginning)
          d3~c                Duplicate top two items of stack, in reversed order
              -               Subtract
               $~             Absolute value
                 48*          Push 32
                    =,        0 if top two items are equal, 1 otherwise
                      2&xx    If top of stack is truthy, dump two elements from top

ธรรมชาติของ toroidal ของ Minkolang ถูกยกระดับที่นี่เพื่อกำจัดความจำเป็นในการวนรอบนอก แนวคิดทั่วไปที่นี่คือการตรวจสอบว่าองค์ประกอบสองอันดับแรกของสแต็กนั้นแยกออกเป็น 32 หน่วยหรือไม่ ตั้งแต่นี้เสร็จ "ในเรียลไทม์" ดังนั้นพูดซ้อนคู่ได้รับการจัดการอย่างถูกต้อง


5

Haskell, 62 ไบต์

a%l|b:t<-l,abs(a-b)==32=t|1>0=a:l
f=null.foldr((%).fromEnum)[]

ลองออนไลน์

เครดิตflawr สำหรับabsและLaikoni สำหรับfromEnumแผนที่

ฟังก์ชั่นตัวช่วย%ใช้สายอักขระที่ทำให้เข้าใจง่ายlแล้วและเสริมสัญลักษณ์aก่อนที่จะทำให้ผลลัพธ์ง่ายขึ้น หากlเริ่มต้นด้วยอักขระผกผันถึงaพวกเขายกเลิก มิฉะนั้นaจะมีการเสริมเพียง โปรดทราบว่าไม่จำเป็นต้องมีการทำให้เรียบง่ายเพิ่มเติมในขั้นตอนนี้

ฟังก์ชั่นหลักfprepends foldrและลดความซับซ้อนตัวละครแต่ละตัวในการเปิดผ่าน จากนั้นจะตรวจสอบว่าผลลัพธ์ว่างเปล่าหรือไม่

เพื่อตรวจสอบว่าตัวละครทั้งสองกรณีตรงข้ามและดังนั้นจึงไม่ควรยกเลิกดูว่าค่า ASCII ของพวกเขาแตกต่างกันโดยแต่ละองค์ประกอบ 32. การประมวลผลโดยก่อนที่จะถูกส่งผ่านไปยังfromEnum%


ดี! และขอบคุณสำหรับคำอธิบายฉันกำลังเรียนรู้สิ่งใหม่ทุกครั้ง!
ข้อบกพร่อง

4

05AB1E , 17 ไบต์

DvADu‚øDíìvyK}}õQ

ลองออนไลน์!

คำอธิบาย

Dv                 # input number of times do:
  A                # push lowercase alphabet
   Du              # push uppercase alphabet
     ‚ø            # zip the alphabets together (['aA', ..., 'zZ'])
       Díì         # prepend a copy with each element reversed ('Aa' ...)
          v        # for each pair in the resulting list
           yK      # remove it from the accumulated string (starts as input)
             }}    # end loops
               õQ  # check result for equality to empty string

4

Haskell , 98 97 85 81 ไบต์

นี่เป็นเพียงการนำไปปฏิบัติที่ไร้เดียงสาที่พยายามยกเลิกตัวอักษร adjecent ซ้ำ ๆ จนกว่าจะไม่มีการเปลี่ยนแปลงอีกแล้วจึงกำหนดผลลัพธ์จากสิ่งนั้น

ขอบคุณ @nimi สำหรับ -12 ไบต์และ @xnor อีก -4 ไบต์!

o=fromEnum
r(a:b:l)|abs(o a-o b)==32=l|1>0=a:r(b:l)
r x=x
f=null.until((==)=<<r)r

ลองออนไลน์! หรือตรวจสอบตัวอย่างทั้งหมด!


f=null.until(\a->r a==a)r.map fromEnumควรบันทึกสองไบต์
Laikoni

ผมคิดว่าอาจจะเป็น(\a->r a==a) ((==)=<<r)
xnor

1
ในบรรทัดที่สองผมคิดว่าคุณสามารถเปลี่ยน=r lไปl, คิดถูกก็พอเพียงที่จะทำให้หนึ่งเท่านั้นทดแทนต่อการทำงาน
xnor

ขอขอบคุณ! ฉันเข้าใจคำใบ้ที่สอง แต่ฉันไม่รู้ว่าเกิดอะไรขึ้นกับ=<<ดูเหมือนว่า Magic XD
ข้อบกพร่อง

1
@flawr ดูเคล็ดลับนี้ =<<เป็นเหมือน>>=แต่มีข้อโต้แย้งสลับ การแสดงออกมักจะเกิดขึ้นในรูปแบบ((==)=<<r)ที่หมายถึง "ไม่เปลี่ยนแปลงภายใต้r"
xnor

3

Mathematica, 102 ไบต์

""==StringDelete[""|##&@@#<>#2&~MapThread~{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}]~FixedPoint~#&

ฟังก์ชั่นที่ไม่มีชื่อการสตริงตัวอักษรเป็น input และกลับมาหรือTrueFalse

หัวใจของการปรับใช้คือการสร้างฟังก์ชั่นที่จะลบคู่ของการยกเลิกใด ๆ เช่น"Pp"หรือ"gG"จากสตริง การแสดงออก{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}ผลิตคู่ลำดับของรายการของตัวละครที่เป็นรายการแรกและเป็นครั้งที่สอง{"a","b",...,"Z"} {"A","B",...,"z"}แล้ว#<>#2&~MapThread~ผลิตรายการที่องค์ประกอบที่สอดคล้องกันของทั้งสองรายการได้รับการตัดแบ่ง, {"aA","bB",...,"Zz"}ที่อยู่, การแสดงออกสนุก""|##&@@แล้ว (ผ่านความมหัศจรรย์ของลำดับการโต้แย้ง##) ผลิตรายการทางเลือก"" | "aA" | "bB" | ... | "Zz"; ในที่สุดStringDelete[...]เป็นฟังก์ชั่นที่จะลบสิ่งที่เกิดขึ้นใด ๆ ของทางเลือกเหล่านั้นออกจากสตริง

ตอนนี้พอเพียงที่จะใช้ฟังก์ชันนั้นซ้ำกับสตริงอินพุตจนกว่าผลลัพธ์จะไม่เปลี่ยนซึ่งทำได้โดย~FixedPoint~#แล้วทดสอบว่าผลลัพธ์นั้นเป็นสตริงว่างด้วย""==หรือไม่


3

JavaScript (ES6), 73 ไบต์

f=(s,t=s.replace(/(.)\1+/gi,s=>s.replace(/(.)(?!\1)./,'')))=>s==t?!s:f(t)

แตกต่างจาก. NET, JavaScript ไม่มีวิธีการปิดขนาดตัวพิมพ์เล็กกลางการจับคู่ดังนั้นเราจึงต้องค้นหา substrings ทั้งหมดของตัวอักษรที่ซ้ำ ๆ คู่บน / ตัวพิมพ์เล็ก


3

Perl, 28 ไบต์

1 while s/.(??{$&^' '})//;$_

คำอธิบาย:

Perl อนุญาตให้หนึ่งรวมนิพจน์ปกติที่สร้างแบบไดนามิกภายในของนิพจน์ปกติมาตรฐาน

การ.แข่งขันอะไรก็ตาม

นี่(??{คือจุดเริ่มต้นของ regex ที่สร้างขึ้น

$&ตัวแปรจะมีสตริงจับคู่ทั้งหมดเพื่อให้ห่างไกลซึ่งในกรณีนี้เป็นเพียงสิ่งที่.จับคู่

^ผู้ประกอบการไม่ได้ทั้งที่เป็นตัวเลข xor หรือสตริง xor ขึ้นอยู่กับค่านิยมของตัวถูกดำเนินการที่ ในกรณีนี้มันจะเป็นสตริง xor

The ' 'เป็นเพียงสายอักขระที่มีช่องว่างซึ่งมีค่า ascii (หรือ unicode!) เป็น 32 อย่างสะดวกสบายเมื่อช่องว่างเป็น xor-ed ด้วยอักขระในช่วง az หรือ AZ จะเปลี่ยนจากตัวอักษรใหญ่เป็นตัวเล็กหรือตัวย่อ ในทางกลับกัน

นี่})คือจุดสิ้นสุดของ regex ที่สร้างขึ้น

1 while s/whatever// จะค้นหารูปแบบซ้ำ ๆ และแทนที่ด้วยสตริงว่าง

$_เป็นตัวแปรเริ่มต้น ตัวแปรนี้เป็นสิ่งที่ Perl ทำสิ่งที่สนุกและน่าตื่นเต้นเมื่อคุณไม่ได้ระบุตัวแปรอื่น ที่นี่ฉันใช้มันเพื่อส่งกลับค่าความจริงหรือเท็จเนื่องจากสตริงความยาวเป็นศูนย์เป็นเท็จและสตริงความยาวไม่เป็นศูนย์ซึ่งไม่เท่ากับ"0"เป็นจริง ฉันยังสมมติว่าสายป้อนถูกวางไว้ในนั้น

ลองที่นี่


ในทางเทคนิคแล้วสิ่งนี้จะส่งกลับสิ่งที่ท้าทายตรงข้ามกับสิ่งที่คุณร้องขอ ที่จะแก้ไขได้เพียงแค่เพิ่มก่อนสุดท้าย! $_หากการรักษาด้วยวิธีนี้ไม่เป็นไรกับคุณคุณสามารถบันทึก 4 ไบต์โดยเปลี่ยนเป็นs/.(??{$&^' '})//&&redo+1 ไบต์สำหรับการ-pตั้งค่าสถานะ มันจะไม่ทำงานในย่อยวิธีการที่คุณมีมันในขณะนี้เพราะ{ code }ไม่จริงห่วง (ดังนั้น&&redoจะไม่ทำงาน) แต่-pทำให้มันอยู่ภายในwhileวง
Gabriel Benamy

นอกจากนี้คุณยังสามารถบันทึกไบต์อื่นโดยการแทนที่ด้วย ' ' ลองดูที่นี่เพื่อดูว่าโค้ดมีลักษณะเป็นอย่างไร $"
Gabriel Benamy

2

Prolog (SWI) , 151 ไบต์

f(S):-S="";string_code(I,S,X),string_code(J,S,Y),J is I+1,32is abs(X-Y),B is J+1,sub_string(S,0,I,_,T),sub_string(S,B,_,0,U),string_concat(T,U,V),f(V).

ใช้เวลานานในการรันในกรณีที่ผิดพลาดนานกว่าเนื่องจากมีการย้อนรอย

ลองออนไลน์!

Ungolfed

f(S):-                       The string S corresponds to a falling picture if:
  S="";                      S is the empty string, or...
  string_code(I,S,X),        X is the character code at some index I
  string_code(J,S,Y),        Y is the character code at some index J
  J is I+1,                  J is I+1
  32 is abs(X-Y),            X and Y differ by 32 (difference between lower/upper case)
  B is J+1,                  ...
  sub_string(S,0,I,_,T),     ...
  sub_string(S,B,_,0,U),     ...
  string_concat(T,U,V),      ...
  f(V).                      The concatenation of the substrings before and after 
                             the letters X and Y corresponds to a falling picture.

1

MATL , 20 ไบต์

t"[]yd|32=fX<tQh(]n~

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด (ใช้เวลาสักครู่)

คำอธิบาย

t       % Input string implicitly. Duplicate
"       % Do as many times as input size
  []    %   Push empty array
  y     %   Duplicate current string onto the top
  d|    %   Absolute consecutive differences
  32=   %   Convert to true if 32, false otherwise
  fX<   %   Index of first occurrence of true, or empty of all false
  tQ    %   Duplicate, add 1. This gives the next index, or empty
  h     %   Concatenate. Gives the two consecutive indices of letters
        %   to be removed, or empty
  (     %   Assign an empty array to those positions, i.e. delete them
]       % End
n~      % Number of elements, negate



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.