ভ্রমণ কুইনে


12

এখানে চ্যালেঞ্জটি সহজ, বাইট-কাউন্ট সম্পর্কে মোটেও নয়। আপনার কাজটি হ'ল পূর্বের কুইনের উত্স কোডের প্রথম 50 টি অক্ষরকে আউটপুট দেওয়া, আপনার প্রথম 50 টি অক্ষর দিয়ে শুরু করা 50 টি অক্ষর দিয়ে শুরু করা যা আমি নীচে রেখেছি:

abcdefghijklmnopqrstuvwxyzACDEFGHIJKLMNOPQRSTUVWXY

সুতরাং, এখানে একটি উদাহরণ দেওয়া যাক, আপনি যদি 05AB1E এ উত্তর দেন তবে প্রথম 50 বাইট কেবল আউটপুট দেওয়ার সমাধানটি হ'ল:

ži50£

যার অর্থ আপনার আউটপুট করা দরকার:

abcdefghijklmnopqrstuvwxyzACDEFGHIJKLMNOPQRSTUVWXYži50£

আপনার প্রোগ্রামটি যদি ছোট হয়, কেবল প্রথম x < 50অক্ষরগুলি ব্যবহার করুন । যদি আপনার প্রোগ্রামটি কেবলমাত্র 50 তম অক্ষরের সমাপ্তিতে প্রথম 50 টি অক্ষরকে সম্মতি দেয়। পরবর্তী ব্যক্তিকে তারপরে আপনার কোডের প্রথম 50 টি অক্ষর তাদের নিজস্ব কোড দিয়ে আউটপুট করতে হবে।

আপনার কোডটি যে কোনও আকারের হতে পারে, তবে আপনার পূর্ববর্তী উত্তরের কোডের প্রথম 50-বাইটের শেষে আপনার কোডের প্রথম 50 টি অক্ষর আউটপুট করা উচিত।


সীমাবদ্ধতা:

এটি একটি যথাযথ কুইনের সংজ্ঞা ব্যবহার করে এবং এর পাশাপাশি নিম্নলিখিত বিষয়গুলিও ব্যবহার করে:

  • মন্তব্যগুলি সম্পূর্ণরূপে অনুমোদিত নয়।
  • এই বিভাগে মনোযোগ দিন, এটি আপত্তিজনক লোপফুলের আগমন যদি বেঁচে থাকতে পারে

শৃঙ্খলিত-উত্তর কীভাবে পোস্ট করবেন:

  1. একটি স্থানধারক পোস্ট করুন:
    • আপনার উত্তর নম্বর এবং আপনি যে ভাষাটি ব্যবহার করবেন তা উল্লেখ করুন।
  2. তারিখ অনুসারে বাছাই করুন, যদি আপনি দেখেন যে আপনার আগে কেউ অন্য কোনও স্থানধারককে 1 মিলিসেকেন্ড পোস্ট করেছে:
    • আপনার মুছুন, পরবর্তী সুযোগের জন্য অপেক্ষা করুন, দুঃখিত।
  3. আপনি যদি পরবর্তী স্থানটি সুরক্ষিত করেন তবে 6 ঘন্টা উত্তর দিয়ে উত্তর দিন :
    • যদি আপনি উত্তর দিতে না পারেন তবে আপনার সংরক্ষিত জায়গা সরিয়ে ফেলুন।
  4. যদি স্থানটি ২৪ ঘণ্টারও বেশি সময় ধরে রাখা হয়।
    • সংরক্ষিত জায়গা মুছতে ভোট দিন, আমি এটি পরিচালনা করব।

আপনার পোস্ট ফর্ম্যাট:

#[Answer #]:[Character Count] Characters, [Language Used]

{TIO MARKDOWN}

{LINE_SEPARATOR="---"}

{ADDITIONAL EXPLANATION OR INFORMATION}

কিছু নির্দিষ্ট নোট (সহজ প্রতিযোগিতার জন্য গুরুত্বপূর্ণ):

  • আপনি আগে ব্যক্তি যদি নতুন উত্স বা ASCII অক্ষরগুলি তাদের উত্সে অন্তর্ভুক্ত করে থাকেন তবে আপনি সেগুলি আটকে রাখতে পারেন। এর অর্থ এই যে x="a\nb"হয়ে ab, যেখানে x[0]=a;x[1]=b;
    • পূর্ববর্তী উত্সটিতে আপনি যে রূপান্তরটি প্রয়োগ করেছেন তা আপনাকে অবশ্যই উল্লেখ করতে হবে।
  • কোড-পৃষ্ঠা বা ভাষা এনকোডিং সত্ত্বেও সমস্ত অক্ষর একক অক্ষর হিসাবে গণনা করা হয়। অনুগ্রহ করে বাইট-কাউন্ট ব্যবহার করবেন না, চরিত্র-গণনা ব্যবহার করুন।

গৃহীত উত্তর উত্তর হবে 50th, ঠিক কারণ; মানে, এটি SEE সামগ্রিকভাবে।


মন্তব্য কেন নিষিদ্ধ? এছাড়াও, অক্ষরগুলিতে বাইটগুলি পুনরায় সংজ্ঞায়িত করার পরিবর্তে কেবল অক্ষরগুলি ব্যবহার করবেন না কেন?
ক্যালকুলেটরফলাইন

@ ক্যালকুলেটরফ্লাইন আমি মনে করি আপনি মন্তব্যগুলি ব্যবহার করে কিছু চমকপ্রদ এবং উদ্বেগজনক লুফোলগুলি করতে পারেন, তবে এটি কেবল আমারই। প্রথম স্থানটি সংরক্ষণ করুন এবং একটি মন্তব্যে আমাকে ভুল প্রমাণ করুন এবং আমি নিষেধাজ্ঞা প্রত্যাহার করব।
ম্যাজিক অক্টোপাস উরন

5
যথাযথ কুইন সংজ্ঞায়িত লিঙ্কযুক্ত মেটা পোস্টে অচল কোড না থাকার কোনও উল্লেখ নেই।
janrjan জোহানসেন

1
আপনি কীভাবে মন্তব্য সংজ্ঞায়িত করছেন? মন্তব্য একটি খুব ভাল সংজ্ঞায়িত শব্দ নয়।
অ্যাডহক গার্ফ হান্টার

1
আপনি শর্তাবলীর অক্ষর এবং বাইটকেও বিনিময় করেছেন বলে মনে হচ্ছে এটি কিছুটা বিভ্রান্তিকর। আমি এটির প্রথম 50 অক্ষর বা বাইট কিনা তা সত্যই নিশ্চিত নই।
অ্যাডহক গার্ফ হান্টার

উত্তর:


7

1: 96 অক্ষর, হাস্কেল

abcdefghijklmnopqrstuvwxyzACDEFGHIJKLMNOPQRSTUVWXY:z=['`'..'z']++'A':['C'..'Y']
main=putStr$z++z

এটি অনলাইন চেষ্টা করুন!


আমি নির্বোধ বোধ করছিলাম, এবং প্রথম স্ট্রিংয়ের সাথে ঠিক একই 50 টি অক্ষর দিয়ে শুরু হওয়া প্রথম প্রবেশ নিষেধ কিছুই দেখেনি saw

  • ['`'..'z']++'A':['C'..'Y']হ'ল একটি অভিব্যক্তি যা এই অক্ষরের স্ট্রিংকে মূল্যায়িত করে মূল্যায়ন করে `
  • ফলাফলটি প্যাটার্নটির সাথে মিলে যায়, ভেরিয়েবলটিকে abcdefghijklmnopqrstuvwxyzACDEFGHIJKLMNOPQRSTUVWXYসমান '`'এবং z50 টি অক্ষরের সমান করে।
  • main=putStr$z+z তারপরে আসল আউটপুট করে।

আমি পছন্দ করি কীভাবে এই চ্যালেঞ্জটি a-zA-Z দিয়ে শুরু হয়েছিল এবং এখন এটি মূলত আর বর্ণমালা নয়। 1 ম প্রোগ্রামে ভাল কল।
ম্যাজিক অক্টোপাস উরান

5

5:76 অক্ষর, ইমোজিকোড

🏁🍇🍦a🔤s=:'"alert(eval(c="''abcdefghijklmnopqrstuvwxyzACD🔤😀🍪a🔤🏁🍇🍦a❌🔤🔤🔪a 0 45🍪🍉

এটি অনলাইন চেষ্টা করুন!


ব্যাখ্যা:

🏁🍇		👴 start
  🍦 a 🔤...🔤	👴 define variable a as that string
  😀    	👴 print:
    🍪		👴 combine those strings:
      a		👴 a, and:
      🔤🏁🍇🍦a❌🔤🔤	👴 string literal. the ❌🔤 works like \"
      🔪a 0 45	👴 between indexes 0 and 45 of a
    🍪
🍉		👴 end

1
বর্ণমালা ধীরে ধীরে অদৃশ্য হয়ে যাচ্ছে: ও।
ম্যাজিক অক্টোপাস উরান

ফর্ম্যাটিং ইঙ্গিত: ব্যবহার করুন <pre><code>এবং </code></pre>, তারপরে আপনি &#9;ট্যাবগুলির জন্য ব্যবহার করতে পারেন যা ইমোজির মতো ভেরিয়েবল-প্রস্থের অক্ষরের সাথেও অভিযোজিত। বিটিডাব্লু, আমি কীভাবে ইমোজিকোডে একটি কুইন তৈরি করব সে সম্পর্কে ভাবছিলাম এবং তারপরে আমি স্ক্রোল করে
নামলাম

@ নিডজেজেকোব ভাল ধারণা, ধন্যবাদ।
betseg

@ বিটসেগ এটি আমার জন্য কয়েকটি জায়গায় সামান্য বন্ধ, তবে যাইহোক আরও পাঠযোগ্য। আপনি এটি পছন্দ করেছেন খুশি
NieDzejkob

@ নিডজেজেকব কয়েক? আমার ফন্টের সাহায্যে কেবল স্ট্রিং আক্ষরিক আদেশটি বন্ধ কারণ এটি দীর্ঘ, আপনার আর কোথায় আছে?
betseg

4

2: 119 অক্ষর, জাভাস্ক্রিপ্ট

alert(eval(c="'abcdefghijklmnopqrstuvwxyzACDEFGHIJKLMNOPQRSTUVWXY'+`alert(eval(c=${JSON.stringify(c).substr(0,37)}`"))

এটি অনলাইনে চেষ্টা করুন ( আউটপুট console.logপরিবর্তে ব্যবহার করে alert)

এই জেএস কুইনের উপর ভিত্তি করে

পুরানো সংস্করণ (উত্স কোড পড়ে):

f=_=>`abcdefghijklmnopqrstuvwxyzACDEFGHIJKLMNOPQRSTUVWXYf=${(f+"").substr(0,48)}`;alert(f())

এই জেএস কুইনের উপর ভিত্তি করে


এটি যথাযথ কুইন নয় কারণ ফাংশনটি নিজেই উল্লেখ করে।
শেগি

@ শেগি আমি একটি বৈধ যুক্ত করেছিলাম
সুপারস্টোরমার

1
@ শেগি স্ব-রেফারেন্টিয়াল ফাংশনগুলি আমাদের সংজ্ঞা অনুসারে বৈধ।
এটাকো


2

3:56 অক্ষর, এসওজিএল

"alert(eval(c="'abcdefghijklmnopqrstuvwxyzACDEFGHIJ”1#Οj

এখানে চেষ্টা করুন!

ব্যাখ্যা:

"...”      push the first 50 bytes of the previous answer
     1#Ο   wrap a quote around with that
        j  take the last letter off, as my answer has one more byte for the starting quote.

জাভাস্ক্রিপ্ট উত্তরে এর একটি উদ্ধৃতি ছিল, সুতরাং আমাকে একটি প্রারম্ভিক উদ্ধৃতি যোগ করতে হয়েছিল, তবে এটি কোড-গল্ফ নয়, এটি কোনও ব্যাপার নয়।



2

7: 137 অক্ষর, জাভা 8

v->{String t="⛽as=:'\"alert(eval(c=\"''abcdefghijklmnopqrstuvwxyzA";return t+("v->{String t=\""+t.replace("\"","\\\"")).substring(0,50);}

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

v->{        // Method with empty unused parameter and String return-type
  String t="⛽as=:'\"alert(eval(c=\"''abcdefghijklmnopqrstuvwxyzA";
            //  String containing the first 50 characters of the previous answer
  return t  //  Return those first 50 characters
   +"v->{String t=\""+t.replace("\"","\\\"")).substring(0,50);}
            //  Concatted with the first 50 characters of my answer
            //  with correct escape-slashes

আহা! আমি বুঝতে পারি ইমোজি এই চ্যালেঞ্জটি ভালোর জন্য হত্যা করেছে। সুন্দর.
ম্যাজিক অক্টোপাস উরান

@ ম্যাজিক অ্যাক্টোপাস ইউরান আমি কেবল এখনই আপনার নিয়মটি লক্ষ্য করি "" যদি আপনার আগে ব্যক্তি যদি নতুন উত্সগুলি বা নন-এসসিআইআই অক্ষরগুলি তাদের উত্সে অন্তর্ভুক্ত করে থাকে তবে আপনি সেগুলি কেটে ফেলতে পারেন "", সুতরাং কোনও উত্তর তারা চাইলে ইমোজিদের থেকে মুক্তি পেতে পারে। আমার উত্তরের জন্য এটি কোনওভাবেই গুরুত্বপূর্ণ নয়, যেহেতু আমরা যাইহোক বাইটের পরিবর্তে অক্ষরগুলিতে গণনা করছি।
কেভিন ক্রুইজসেন

এটি এবং এটি সত্যিকারের অক্ষরের পরিমাণ সম্পর্কে নয় এবং হ্যাঁ আমি সেই নিয়মটি ভুলে গিয়েছিলাম (আরও সাধারণভাবে চ্যালেঞ্জটি ভুলে গিয়েছিলাম)।
ম্যাজিক অক্টোপাস উরান

সত্যি বলতে কী, এটাকে ভাবতে আসুন, আসলেই কি এটুকু চ্যালেঞ্জ নয়?
ম্যাজিক অক্টোপাস উরান

পছন্দ করুন আপনি মূলত আপনার কুইনের প্রথম 50 টি অক্ষর পান। জাভা কুইনে সাধারণত স্ট্রিং-এ অরক্ষিত উত্স কোড স্থাপন করে গঠিত হয় এবং তারপরে সঠিকভাবে ফর্ম্যাট / ডাবল-কোটস এবং স্ল্যাশগুলি থেকে রক্ষা পাওয়া যায়। জাভা 8-তে কেবল বেসিক কুইন ল্যাম্বডা-ফাংশনটি ইতিমধ্যে ৮৮ বাইট (তবে এটি অনলাইনে ব্যবহার করে দেখুন ), তাই জাভাতে এই চ্যালেঞ্জটি সম্পূর্ণ কুইন ব্যবহার না করেই আরও খাটো। যদিও আমি ভাবতে পারি যে বেশিরভাগ ভাষায় কোয়েনই সেরা পন্থা।
কেভিন ক্রুইজসেন

1

6: 70 টি অক্ষর, ইমোজি

⛽as=:'"alert(eval(c="''abcdefghijklmnopqrstuvwxyzAC🚘👥💬⛽💬🔀👫💬0💬📥💬-1💬📥✂👫➡

এটি অনলাইন চেষ্টা করুন!

দেখে মনে হচ্ছে এটি নতুন লাইনে আউটপুট না দিয়ে তৈরি করা অসম্ভব। যদি তা ঠিক না থাকে তবে আমি উত্তরটি সরিয়ে ফেলব।

ব্যাখ্যা:

⛽ ... 🚘	String literal
👥		Duplicate
💬⛽💬		Push ⛽ as a string
🔀		Swap the top two strings. Stack: [long literal] "⛽" [long literal]
👫		Concatenate.
💬0💬📥💬-1💬📥✂	Remove the last character
👫		Concatenate.
➡		Print.

⛽🏁🍇🍦a🔤s=:'"alert(eval(c="''abcdefghijklmnopqrstuvwx🚘👥💬⛽💬🔀👫💬0💬📥💬-1💬📥✂👫➡পরিবর্তে এটি করা উচিত নয় ? betseg এর ইমোজিকোড উত্তরটি দিয়ে শুরু হয় না as=:'"alert(eval(c="''abcdefghijklmnopqrstuvwxyzACতবে 🏁🍇🍦a🔤s=:'"alert(eval(c="''abcdefghijklmnopqrstuvwxপরিবর্তে শুরু হয় ।
কেভিন ক্রুইজসেন

@ If the person before you has included newlines or non-ASCII characters in their source, you may STRIP them.
কেভিন

আহ, আমি সেই নিয়মটি মিস করেছি .. সেক্ষেত্রে আমি আমার উত্তর আপডেট করব।
কেভিন ক্রুইজসেন

কৌতূহলের বাইরে আপনি এগুলি কেড়ে ফেললেন কেন? ভবিষ্যতের উত্তরের জন্য এটি আরও সহজ করার জন্য? কারণ আপনার কোডটি পূর্বের উত্তরের ইমোজিগুলি না ছাপিয়ে নিখুঁতভাবে চলে: এখানে এটি চেষ্টা করে দেখুন
কেভিন ক্রুইজসেন

@ কেভিন ক্রুজসেন এটি অর্ধ বছর আগে ছিল। মনে নেই।
নিডজেজেকোব

1

12: 202 টি অক্ষর, রুবি

puts "21ipdgmtwkkke7ynvzpcnlzt7kl".to_i(36).to_s(7).gsub('0','>').gsub('1','+').gsub('2','-').gsub('3','<').gsub('4','[').gsub('5','.').gsub('6',']')+'puts "21ipdgmtwkkke7ynvzpcnlzt7kl".to_i(36).to_s(7'

এটি অনলাইন চেষ্টা করুন!


বেস সাতটিতে পূর্ববর্তী উত্তরের প্রথম পঞ্চাশটি অক্ষরকে এনকোড করে

  • 0:>
  • 1: +
  • 2: -
  • 3: <
  • 4: [
  • 5:।
  • 6:]

তারপরে "21ipdgmtwkkke7ynvzpcnlzt7kl" পেতে এটিকে 36 এ বেসে রূপান্তর করে


0

9: 55 অক্ষর, জেলি

“"v->{String t=`"as=:'\`"alert(eval(c=\`"''abcdefg”;”“;

এটি অনলাইন চেষ্টা করুন!


আমি অনুমোদিত হওয়ার পর থেকে আউটপুট থেকে নন-এসসিআইআই চরিত্রটি সরিয়েছি এবং জেলি এটি এড়িয়ে চলেছে।

ব্যাখ্যা

এটি পূর্বের উত্তরের প্রথম 50 টি অক্ষরের (বিয়োগ ) স্ট্রিংয়ের সাথে শুরু হয় তারপরে অক্ষরটি এতে যুক্ত করে ;”“তারপরে মূল স্ট্রিংকে আক্ষরিক সাথে আবার ফাইনালের সাথে যুক্ত করে ;। যেহেতু একটি অক্ষর মুছে ফেলা হয়েছে আমার উত্স কোডের প্রথম 50 টি অক্ষর পূর্বের উত্তর থেকে 49 টি সামনে রয়েছে যা এই প্রোগ্রামটিকে এত সংক্ষিপ্ত হতে দেয়। (হ্যাঁ আমি বুঝতে পারি এটি নয় তবে আপনি যদি পারেন তবে এটি কেন গল্ফ করবেন না?)


0

10: 116 অক্ষর, পাইথন 3

print('''“"v->{String t=`"as=:'\`"alert(eval(c=\`"''abcdefgprint(\'\'\'“"v->{String t=`"as=:'\`"alert(eval(c=\`"''')

কেবল উত্তর 9 এর প্রথম 50 টি অক্ষর সমন্বিত একটি স্ট্রিং মুদ্রণ করে তারপরে তার নিজস্ব উত্সের প্রথম 50 টি অক্ষর। কোন রাইনের মতো চালাকতার দরকার নেই, পালিয়ে থাকা উদ্ধৃতিগুলি (কারণ)\'\'\' ) পঞ্চাশতম চরিত্রের পরে প্রদর্শিত হবে এবং সুতরাং আউটপুটে পুনরুত্পাদন করার প্রয়োজন নেই।

এই পদ্ধতিটি কার্যত যে কোনও ভাষায় কাজ করবে - আপনাকে পূর্ববর্তী উত্তরে প্রদর্শিত যে কোনও উদ্ধৃতি অক্ষরগুলি এড়াতে হবে। তদনুসারে, আমি মনে করি না যে এই চ্যালেঞ্জের মধ্যে খুব বেশি চ্যালেঞ্জ রয়েছে।


0

11: 723 অক্ষর, মস্তিষ্ক ***

+[------->++<]>++.++.---------.+++++.++++++.+[--->+<]>+.-...-----.[----->++<]>++.--[++>---<]>-.---[-->+++<]>-.[->++<]>-.[--->++<]>+.[--->+<]>+++.--.---------.+++++.-------.-[--->+<]>--.---[->++++<]>.[-->+<]>+++.+++[-->+++<]>.[->+++<]>++.+[--->+<]>.--[--->+<]>--.+[-->+<]>+++.---.-[--->++<]>+.+[------>+<]>.++++.[->+++<]>++.+[--->+<]>.+++++++++++.-------.+++++++++++++.++.+[--->+<]>+.+[--->+<]>++.[--->+<]>-.[->+++<]>-.+++++++++++.[--->+<]>++++.+[--->+<]>.[--->++<]>-----.+[-->+++<]>-.++++.[->+++<]>++.[[-]<]++[------>+<]>.++[->++<]>+.-[-->+<]>.......---[-->+++<]>-.+[--->++<]>+..+[----->+<]>.++[-->+++<]>.[--->++<]>.+[--->++<]>+..+++.---..+++.-.........+.---.....+++.---......+++.---.++[->++<]>+.-[-->+<]>...---[-->+++<]>-.

ছাপানো ছাপানো অক্ষর অক্ষর। প্রায় সম্পূর্ণ Brainfuck টেক্সট জেনারেটর দ্বারা উত্পাদিত । পাশাপাশি অলস হতে পারে, তাই না?

Tio

Print [print('''"v->{String t=`"as=:'\`"alert(eval(c=\`"] +[------->++<]>++.++.---------.+++++.++++++.+[--->+<]>+.-...-----------.++++++.[----->++<]>++.--[++>---<]>-.---[-->+++<]>-.[->++<]>-.[--->++<]>+.[--->+<]>+++.--.---------.+++++.-------.-[--->+<]>--.---[->++++<]>.[-->+<]>+++.+++[-->+++<]>.[->+++<]>++.+[--->+<]>.--[--->+<]>--.+[-->+<]>+++.---.-[--->++<]>+.+[------>+<]>.++++.[->+++<]>++.+[--->+<]>.+++++++++++.-------.+++++++++++++.++.+[--->+<]>+.+[--->+<]>++.[--->+<]>-.[->+++<]>-.+++++++++++.[--->+<]>++++.+[--->+<]>.[--->++<]>-----.+[-->+++<]>-.++++.[->+++<]>++.
Clear all cells to left until first empty cell [[-]<]
Print [+[------->++<]>++.++.---------.+++++.++++++.+[--->] ++[------>+<]>.++[->++<]>+.-[-->+<]>.......---[-->+++<]>-.+[--->++<]>+..+[----->+<]>.++[-->+++<]>.[--->++<]>.+[--->++<]>+..+++.---..+++.-.........+.---.....+++.---......+++.---.++[->++<]>+.-[-->+<]>...---[-->+++<]>-.

আপনি প্রথম 50 এর পরিবর্তে আপনার ব্রেইনফাক উত্তরের 51 তম অক্ষর দিয়ে দ্বিতীয় মুদ্রণ করেছেন বলে মনে হচ্ছে (এটি প্রথম অনুপস্থিত >): অনলাইনে চেষ্টা করে দেখুন। এছাড়াও, আপনি চরিত্রটি ফেলে দিতে চাইতে পারেন , কারণ আপনার ব্রেইনফাক উত্তরটি বর্তমানে এটি অপ্রিনিত `as হিসাবে আউটপুট দিচ্ছে`
কেভিন ক্রুইজসেন 20'18

>শুরুতে একটি আপতিক উপরন্তু হচ্ছে বলে মনে হচ্ছে, এবং আমি বাদ অক্ষর। অন্যান্য উত্তরের উপর ভিত্তি করে, আমি মনে করি এর অর্থ হল যে আমাকে কেবল প্রথম 49 টি অক্ষর মুদ্রণ করা দরকার।
পান্ডা 01 ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.