คำถามติดแท็ก code-golf

Code-golf เป็นการแข่งขันเพื่อแก้ไขปัญหาเฉพาะในส่วนที่น้อยที่สุดของซอร์สโค้ด

6
พิมพ์คลื่นสามเหลี่ยมของตัวเลข
กำหนดขนาดและระยะเวลาของคลื่นให้พิมพ์คลื่น ดูตัวอย่างผลลัพธ์สำหรับรายละเอียดเพิ่มเติม จำนวนรูปแบบคลื่นทั้งหมดเท่ากับระยะเวลาและความสูงของแต่ละคลื่นเท่ากับความกว้าง ความกว้างและระยะเวลาน้อยกว่า 10 คุณสามารถละเว้นช่องว่างต่อท้าย แต่ไม่ใช่ช่องว่างนำหน้า Sample Input 3 2 Sample Output 3 3 232 232 12321 12321 12321 12321 232 232 3 3

12
วันของสัปดาห์ถัดไป 29 กุมภาพันธ์
เขียนฟังก์ชั่นที่ใช้วันที่และส่งคืนวันในสัปดาห์ของวันที่ 29 กุมภาพันธ์ถัดไปหลังจากวันที่นั้น อินพุตเป็นสตริงในรูปแบบ ISO Extended: YYYY-MM-DD (เช่น 27 พฤษภาคม 2010 จะเป็น "2010-05-27") ผลลัพธ์คือสตริงที่เป็นชื่อของวันในสัปดาห์ (เช่น "วันจันทร์") การใช้อักษรตัวพิมพ์ใหญ่ไม่สำคัญ แต่ให้ชื่อเต็มเป็นภาษาอังกฤษ หากวันที่ที่กำหนดคือ 29 กุมภาพันธ์ให้ส่งคืนวันในสัปดาห์ของวันที่ 29 กุมภาพันธ์ถัดไป ใช้การคำนวณสำหรับปฏิทินเกรกอเรียน Proleptic (ดังนั้นจะใช้การคำนวณแบบกระโดดปีเกรโกเรียนสำหรับความยาวทั้งหมด) ไม่ต้องกังวลกับปฏิทินจูเลียนหรือเมื่อมีการเปลี่ยนจากจูเลียนเป็นเกรโกเรียน เพียงแค่ถือว่า Gregorian สำหรับทุกสิ่ง ฟังก์ชันควรใช้งานได้อย่างน้อยช่วง "0001-01-01" - "2100-01-01" อย่าลังเลที่จะใช้ไลบรารี่มาตรฐานที่คุณเลือกภาษา แต่อย่าใช้ไลบรารี่ของบุคคลที่สามจนกว่าคุณจะต้องการรวมรหัสนั้นเป็นส่วนหนึ่งของโซลูชันของคุณ รหัสที่สั้นที่สุด (ตัวอักษรน้อยที่สุด) ชนะ ตัวอย่าง: func("0001-01-01") -> "Sunday" func("1899-12-03") -> "Monday" func("1970-01-01") -> "Tuesday" func("1999-07-06") …
14 code-golf  date 

4
หนังสือที่ใช้ได้สำหรับการเล่นกอล์ฟรหัสฟรีหรือไม่ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา คุณสามารถแนะนำหนังสือเกี่ยวกับการเล่นกอล์ฟทั่วไปโดยเฉพาะอย่างยิ่งใน Java และ C ++ ได้ไหม
14 code-golf  tips 

20
การทอยลูกเต๋าแบบสุ่ม
ในลูกเต๋ามาตรฐาน (ตาย) ตัวเลขจะถูกจัดเรียงเพื่อให้ใบหน้าตรงข้ามเพิ่มเป็นเจ็ด เขียนโปรแกรมสั้นที่สุดเท่าที่จะเป็นไปได้ในภาษาที่คุณต้องการซึ่งจะให้ผลแบบสุ่มตามด้วยการสุ่ม 9 ครั้ง การให้ทิปคือการหมุนหนึ่งในสี่ของลูกเต๋าเช่นหากลูกเต๋าหันหน้าไปทาง 5 การเอียงที่เป็นไปได้ทั้งหมดคือ 1,3,4 และ 6 ตัวอย่างผลลัพธ์ที่ต้องการ: 1532131356

2
ทดสอบว่าตัวเลขที่ระบุเป็น Vampire Number หรือไม่
แก้ไข:เพื่อเพิ่มความซับซ้อนฉันได้เพิ่มความท้าทายมากขึ้น ในคณิตศาสตร์หมายเลขแวมไพร์ (หรือหมายเลขแวมไพร์จริง) เป็นจำนวนธรรมชาติประกอบ v, ด้วยจำนวนเลข n, ที่สามารถแยกออกเป็นสองจำนวนเต็ม x และ y แต่ละตัวมี n / 2 หลักและไม่ใช่ทั้งสองต่อท้ายศูนย์ โดยที่ v ประกอบด้วยตัวเลขทั้งหมดอย่างแม่นยำจาก x และ y ในลำดับใด ๆ การนับหลายหลาก x และ y เรียกว่าเขี้ยว เพิ่มเติมเกี่ยวกับหมายเลขแวมไพร์ หมายเลข Pseudovampire หมายเลข Pseudovampire นั้นคล้ายกับหมายเลข vampire ยกเว้นว่าเขี้ยวของหมายเลข pseudovampire n หลักนั้นไม่จำเป็นต้องมีความยาว n / 2 หลัก หมายเลข Pseudovampire สามารถมีตัวเลขเป็นเลขคี่ได้เช่น 126 = 6 …
14 code-golf  math 

23
ผลรวมของจำนวนเต็มในสตริงคั่นด้วยไม่ใช่ตัวเลขเช่น 'a' และ 'Y'
สร้างโปรแกรมที่รวมจำนวนเต็มทั้งหมดที่พบในสตริงซึ่งตั้งเป็นตัวแปรในโปรแกรม (ดังนั้นโปรแกรมไม่ต้องจัดการอินพุตใด ๆ ) ตัวเลขจำนวนเต็มถูกคั่นด้วยไม่ใช่ตัวเลข (อะไรก็ได้ยกเว้น 0, 1, 2, 3 ... 9) ตัวอย่าง: e7rde f ,fe 43 jfj 54f4sD = 7 + 43 + 54 + 4 = 108 5 = 5 64 545,5445-32JIFk0ddk = 64 + 545 + 5445 + 32 + 0 = 6086 0ab0 = 0 + …
14 code-golf  string 

11
เอาท์พุต Cuboids ปัจจัยที่แตกต่าง
เอาท์พุต Cuboids ปัจจัยที่แตกต่าง งานในวันนี้นั้นง่ายมาก: เนื่องจากเป็นจำนวนเต็มบวกเอาท์พุทตัวแทนของแต่ละคิวบ์ที่สามารถจัดรูปแบบโดยปัจจัย คำอธิบาย ปริมาตรทรงลูกบาศก์เป็นผลคูณของความยาวสามด้าน ยกตัวอย่างเช่นลูกบาศก์ 4 ของปริมาณที่มีความยาวด้านเป็นจำนวนเต็มสามารถมีด้าน[1, 1, 4], [1, 2, 2], [1, 4, 1], [2, 1, 2], หรือ[2, 2, 1] [4, 1, 1]อย่างไรก็ตามบางส่วนของสิ่งเหล่านี้เป็นตัวแทนของลูกบาศก์เดียวกัน: เช่น[1, 1, 4]และ[4, 1, 1]จะหมุนลูกบาศก์เดียวกัน มีเพียงสองรูปทรงสี่เหลี่ยมที่แตกต่างกันมีปริมาณที่ 4 และจำนวนเต็มด้าน: และ[1, 1, 4] [1, 2, 2]เอาต์พุตสามารถเป็นตัวแทนของคิวบอยแรกและการแสดงใด ๆ ของคิวบอยที่สอง อินพุต โปรแกรมของคุณจะต้องใช้เวลาบวกเดียวจำนวนเต็ม21 ≤ n ≤ 2วันที่ 31- …

3
มันรุกฆาตไหม?
ทั้งหมดนี้ประหลาดใจที่ยังไม่ได้โพสต์ให้เนื่องจากจำนวนมากของปริศนาหมากรุกบนเว็บไซต์ ในขณะที่ฉันคิดว่าตัวเองนี้เครดิตกับ Anush สำหรับการโพสต์ไปยังด้านหลัง Sandbox มีนาคม แต่ฉันคิดว่ามันนานพอที่ฉันจะไปข้างหน้าและทำด้วยตัวเอง รุกฆาตในเกมหมากรุกเป็นตำแหน่งที่กษัตริย์ถูกโจมตีและไม่มีการย้ายที่สามารถปกป้องมัน หากคุณไม่คุ้นเคยกับการเคลื่อนไหวของหมากกระดานคุณสามารถทำความคุ้นเคยกับ Wikipediaได้ ความท้าทาย สำหรับความท้าทายนี้ข้อมูลของคุณจะอยู่ในตำแหน่งกระดานหมากรุกในสิ่งที่คุณต้องการ ชี้แจงการป้อนข้อมูลของคุณจะอธิบายชิ้นบนกระดานหมากรุกที่มีสีและตำแหน่งของพวกเขาพร้อมกับที่เป็นไปได้การกินตารางจับถ้ามี (ความสามารถในการปราสาทไม่เกี่ยวข้องเนื่องจากคุณไม่สามารถออกจากปราสาทได้) คุณอาจพบว่าสัญลักษณ์ FEN มีประโยชน์แต่รูปแบบใดก็ได้ที่สะดวก สำหรับความเรียบง่ายคุณสามารถสันนิษฐานได้ว่ามันเป็นสีดำสำหรับเล่น - นั่นหมายความว่าสีดำจะเป็นเครื่องเล่นที่ผ่านการตรวจสอบเสมอ ตำแหน่งที่สีขาวอยู่ในการตรวจสอบรุกฆาตหรือจนมุมจะถือว่าไม่ถูกต้องสำหรับความท้าทายนี้ คุณต้องส่งออกค่าความจริงหากตำแหน่งเป็นรุกฆาตและค่าความเท็จหากไม่ได้ โปรดทราบว่าทางตันไม่ใช่การรุกฆาต - ราชาจะต้องถูกโจมตี! กรณีทดสอบความจริง 1k5R / 6R1 / 8/8/8/8/8 / 6K1 b - - rn2r1k1 / pp1p1pQp / 3p4 / 1b1n4 / 1P2P3 / 2B5 / P5PP / …

28
การฉีดจากสองสายไปยังหนึ่งสาย
ท้าทาย เขียนโปรแกรมที่ใช้ฟังก์ชั่นการฉีดซึ่งใช้คู่ของสตริงที่สั่งซื้อเป็นอินพุตและหนึ่งสตริงเป็นเอาต์พุต กล่าวอีกนัยหนึ่งอินพุตแต่ละรายการจะต้องจับคู่กับเอาต์พุตเฉพาะ ข้อมูลจำเพาะ การป้อนข้อมูลที่อาจจะเป็นใด ๆสองสายมีความยาวโดยพลการ แต่จะมีเพียงของตัวอักขระ ASCII (รหัส )[ 32 , 126 ][32,126][32, 126] สตริงเอาต์พุตไม่มีข้อจำกัดความยาว แต่ต้องประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้น หากภาษาของคุณไม่สามารถจัดการกับสายอักขระที่มีความยาวตามอำเภอใจโปรแกรมอาจทำงานตามหลักเหตุผลสำหรับสตริงที่มีขนาดใด การแม็พจากอินพุตไปยังเอาต์พุตควรสอดคล้องกันระหว่างการเรียกใช้งานโปรแกรม มิฉะนั้นการทำแผนที่ที่คุณใช้นั้นขึ้นอยู่กับคุณอย่างสมบูรณ์ตราบใดที่มันเป็นการฉีด อินพุตถูกสั่ง หากทั้งสองสายอินพุตแตกต่างกันพวกเขาควรผลิตผลลัพธ์ที่แตกต่างกว่าถ้าพวกเขาสลับ s ≠ t⟹ฉ(s,t)≠f( t , s )s≠t⟹f(s,t)≠f(t,s)s \neq t \implies f(s, t) \neq f(t, s) ไม่ใช่ว่าทุกสายจะต้องเป็นผลลัพธ์ที่เป็นไปได้ คำตอบที่สั้นที่สุดในแต่ละภาษาชนะ! กรณีทดสอบ อินพุตต่อไปนี้ควรเป็นผลลัพธ์ที่ต่างกัน เพื่อหลีกเลี่ยงความสับสนสตริงถูกล้อมรอบด้วย guillemets («») และคั่นด้วยช่องว่างเดียว "สวัสดีชาวโลก" « lelho …
14 code-golf  string 

14
Irish Snap: กฎตัวแปร
บทนำ เมื่อเร็ว ๆ นี้ฉันและเพื่อนของฉันสองคนตัดสินใจที่จะเล่นไพ่บางใบและหนึ่งในนั้นแนะนำเกม 'Irish Snap' ซึ่งเป็นแรงบันดาลใจสำหรับความท้าทายนี้ แต่ผมมารู้ทีหลังว่าเป็นเกมที่มีจำนวนมากของกฎระเบียบที่แตกต่างกันที่คุณสามารถเล่นกับบางส่วนที่มีการระบุไว้ ที่นี่ กฎที่อยู่ในการท้าทายนี้ไม่ได้อยู่ในรายการในหน้านั้นดังนั้นชื่อ 'กฎที่แตกต่าง' ความท้าทาย เมื่อได้รับไพ่ 3 ใบให้ส่งออกค่าจริงหรือปลอมแปลงขึ้นอยู่กับว่าพวกเขาทำสแนปที่ถูกต้องในเกมสแน็ปไอริช อินพุต การป้อนข้อมูลจะเป็นอาร์เรย์ของตัวเลข 3 จำนวนตั้งแต่ 1-13 รวมกับ 1 ตัวแทนเอซ 11 คนเป็นแจ็ค 12 คนเป็นตัวแทนของราชินีและ 13 คนเป็นราชา อินพุตสามารถเรียงลำดับจากบนสุด, กลาง, ล่าง กฎระเบียบ เกณฑ์ที่แตกต่างกัน 4 ข้อสำหรับหากการ์ดสร้างสแน็ปไอริชคือ: ไพ่ใบบนและใบกลางเหมือนกัน ไพ่บนและไพ่กลางมีความแตกต่างกัน ไพ่บนและล่างเหมือนกัน ไพ่บนและล่างมีความแตกต่างกัน หากตรงตามเกณฑ์ใด ๆ เหล่านี้คุณต้องส่งออกค่าจริง เช่นนี้สำหรับทั้งสองเกณฑ์ที่จำเป็นต้องใช้การ์ดที่จะมีความแตกต่างของหนึ่งมัน 'ล้อมรอบ' ซึ่งหมายความว่าเอซและกษัตริย์จะถือว่ามีความแตกต่างของหนึ่งและในทางกลับกัน กรณีทดสอบ Input (Bottom, Middle, …

2
เล่นโอเอกซ์และไม่แพ้
(มีบางความท้าทายที่จำเป็นต้องใช้กลยุทธ์ที่ดีที่สุด แต่ที่นี่เราทำไม่ได้แม้ว่าคุณจะสามารถชนะคุณจะได้รับอนุญาตให้ผูก) ท้าทาย เขียนโปรแกรมที่เล่นเกมโอเอกซ์ ต้องไม่แพ้ (ดังนั้นควรจบเกมด้วยการเสมอหรือโดยการชนะ) อนุญาตให้ใช้วิธี I / O อินพุตอาจเป็นบอร์ดปัจจุบัน คุณสามารถสันนิษฐานได้ว่าการเคลื่อนไหวก่อนหน้าของผู้เล่นคนที่ 2 ทั้งหมดถูกเล่นโดยเครื่องยนต์ของคุณ อินพุตอาจเป็นการเคลื่อนไหวของผู้เล่นคนแรกและฟังก์ชั่นของคุณจะเก็บการเคลื่อนไหวที่เกิดขึ้นในอดีต ในกรณีนี้ฟังก์ชั่นนี้เรียกว่าหลายครั้งหนึ่งครั้งต่อการเคลื่อนไหวแต่ละครั้ง หรืออินพุต / พรอมต์ของฟังก์ชัน / โปรแกรมหลายครั้ง คุณได้รับอนุญาตให้ป้อนข้อมูลเพิ่มเติมโดยบอกว่าคุณเป็นผู้เล่นคนแรกหรือเขียนสองฟังก์ชั่น (อาจเกี่ยวข้องกัน) เพื่อแก้ปัญหาผู้เล่นคนแรกและผู้เล่นคนที่สอง หากโปรแกรมของคุณต้องการใช้วิธีการป้อนข้อมูล 2 (การโทรหลายสาย) คุณสามารถตัดสินใจได้ว่าจะส่งสิ่งใดในการโทรครั้งแรก เอาท์พุทอาจเป็นคณะกรรมการหลังจากที่คุณเปิด เอาท์พุทอาจจะย้ายของคุณ การย้ายอาจแสดงเป็นคู่ของตัวเลข (สามารถเป็นดัชนี 0 หรือดัชนี 1 ดัชนี) ตัวเลขในช่วง 0 ~ 8 หรือตัวเลขในช่วง 1 ~ 9 บอร์ดอาจแสดงเป็นอาร์เรย์ 3 × 3 หรืออาร์เรย์ที่มีความยาว 9 …

5
โป๊กเกอร์คำใครชนะใคร
อินพุตจะเป็นคำสองห้าตัวอักษร จริง ๆ แล้วพวกเขาไม่จำเป็นต้องเป็นคำในพจนานุกรมเพียงห้าตัวอักษรแต่ละตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ทั้งหมดที่คุณเลือก AZ เท่านั้นที่จะปรากฏในคำที่ป้อนและจะมีความยาว 5 ตัวอักษร โปรแกรมของคุณคือให้คะแนนพวกเขาทั้งคู่ราวกับว่าพวกเขาเป็นมือโป๊กเกอร์และให้คะแนนที่สูงกว่า แน่นอนว่าไม่เหมาะกับการใช้งานที่นี่การจัดอันดับเท่านั้นจึงไม่มีการฟลัช ระบบการจัดอันดับโป๊กเกอร์โดยทั่วไปจะ: '1 คู่', '2 คู่', '3 ของชนิด', 'ตรง', 'บ้านเต็ม', '4 ของชนิด', '5 ของชนิด' และแน่นอน มีความเป็นไปได้ที่มือ (หรือคำในกรณีนี้) จะไม่มีค่าอะไรเลย ในกรณีของความสัมพันธ์จดหมายที่ใกล้ชิดกับ A ถือว่าสูงกว่าดังนั้นคู่ของ As เต้นคู่หนึ่ง Bs ในบางกรณีมือทั้งสองอาจเหมือนกัน แต่ในลำดับที่แตกต่างกัน (หรือไม่) ในกรณีนั้นเอาท์พุทมือหรือรุ่น resorted ของมัน หน้าภายนอกนี้มีข้อมูลเกี่ยวกับวิธีการระบุผู้ชนะและโดยเฉพาะอย่างยิ่งความสัมพันธ์ภายในการจัดอันดับเฉพาะในกรณีที่คุณไม่คุ้นเคยกับวิธีการทำคะแนนโป๊กเกอร์ ในกรณีของ straights : ตัวอักษรจะต้องอยู่ติดกันในตัวอักษรและไม่ได้รับอนุญาตให้ล้อมรอบ ดังนั้น 'defgh' ในลำดับใด ๆ ก็คือ 'xyzab' …
14 code-golf  string 

8
แหล่งที่มาของฉันอยู่ในลำดับเป็นของคุณหรือไม่
ความท้าทายของคุณคือการเขียนโปรแกรมฟังก์ชั่น ฯลฯ ที่คำนวณว่าสตริงที่ส่งผ่านคือ "ตามลำดับ" นั่นหมายความว่าอักขระของสตริงมีรหัสอักขระที่เรียงตามลำดับจากน้อยไปหามากที่สุด รหัสถ่านที่เล็กที่สุดจะต้องเป็นรหัสแรก โดยที่ฉันหมายถึง unicode codepoints ต่ำสุดถึงสูงสุด ไม่สำคัญว่าคุณใช้หน้ารหัสภาษาใด คุณต้องส่งคืนหนึ่งค่าหากอินพุตคือ "ตามลำดับ" และอีกค่าหนึ่งหากไม่ใช่ ค่าจะต้องแตกต่างกัน แต่ไม่มีข้อ จำกัด อื่น ๆ เกี่ยวกับค่าผลลัพธ์ ตัวอย่างเช่นคุณอาจพิมพ์ / ผลตอบแทน / เอาต์พุตtrueสำหรับ!1AQaq¡±(ตามลำดับ) และสำหรับfalse aq!QAค่าที่แตกต่างกันสองค่าไม่จำเป็นต้องเป็นความจริงหรือเป็นเท็จหรืออะไรทำนองนั้นเพียงสองค่าที่แตกต่าง สายซ้ำ (เช่น. aa) อยู่ในลำดับ คุณต้องรองรับ unicode U+007E( ~) (ascii 126) เท่านั้น อย่างไรก็ตามตัวอักษรของโปรแกรมของคุณจะต้องเป็นไปตามลำดับ ขอให้โชคดีและมีความสุขในการเขียนโค้ดกอล์ฟ !

3
แนะนำสิ่งที่ท้าทายให้ฉัน!
ฉันเบื่อเกินไปและต้องการความท้าทายในการแก้ไข แต่ฉันไม่เห็นความท้าทายที่น่าสนใจใด ๆ และฉันขี้เกียจเกินไปที่จะค้นหา คุณ (ขอรหัสเทคนิค) แนะนำฉันได้ไหม I / O อินพุต:ไม่มี ผลลัพธ์:ลิงก์ไปยังการท้าทายแบบเปิด (เช่นไม่ปิด) แบบสุ่ม ("ความท้าทาย" ไม่รวมเคล็ดลับ !) ใน PPCG คุณไม่สามารถเชื่อมโยงคำตอบในสิ่งที่ท้าทายได้ แต่เป็นสิ่งที่ท้าทาย (ฉันไม่ได้ขอคำตอบที่น่าสนใจ!) ตัวอย่าง ถูกต้อง: http://codegolf.stackexchange.com/questions/93288/make-me-a-mooncake http://codegolf.stackexchange.com/questions/113796/raise-a-single-number http://codegolf.stackexchange.com/questions/113898 ไม่ถูกต้อง: http://codegolf.stackexchange.com/questions/78152/tips-for-golfing-in-matl (tips question) http://codegolf.stackexchange.com/questions/113896/josephus-problem (closed) http://codegolf.stackexchange.com/questions/84260/add-two-numbers/84365#84365 (linked to answer)

21
ทำการคูณเมทริกซ์!
ในวิชาคณิตศาสตร์การคูณเมทริกซ์หรือผลิตภัณฑ์เมทริกซ์เป็นการดำเนินการแบบไบนารีที่สร้างเมทริกซ์จากสองเมทริกซ์ คำจำกัดความถูกกระตุ้นด้วยสมการเชิงเส้นและการแปลงเชิงเส้นบนเวกเตอร์ซึ่งมีการใช้งานมากมายในคณิตศาสตร์ประยุกต์ฟิสิกส์และวิศวกรรม รายละเอียดเพิ่มเติมหาก A คือเมทริกซ์ n × m และ B เป็นเมทริกซ์ m × p ผลิตภัณฑ์เมทริกซ์ AB ของพวกเขาคือเมทริกซ์× n ซึ่ง m รายการข้ามแถว A ถูกคูณด้วยรายการ m ลง a คอลัมน์ของ B และสรุปเพื่อสร้างรายการของ AB เมื่อการแปลงเชิงเส้นสองครั้งแสดงด้วยเมทริกซ์ดังนั้นผลิตภัณฑ์เมทริกซ์จะแสดงองค์ประกอบของการแปลงสองครั้ง ที่มา: Wikipedia กล่าวอีกนัยหนึ่งคือการคูณเมทริกซ์สองตัวอย่างเช่น: 1 2 3 1 4 2 3 4 × 3 1 = 3 4 5 4 …
14 code-golf  math  matrix 

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