হ্যাঁ বা না নির্ধারণ?


19

একটি স্ট্রিং ইনপুট করার [দৈর্ঘ্য 1-20], শুধুমাত্র অক্ষর ধারণকারী পর Y হ্যাঁ এবং এন কোন জন্য, আপনার প্রোগ্রাম উচিত আউটপুট ফলাফলের (Y বা ঢ)। উদাহরণ ইনপুট: yynynynnyআউটপুট y হবে।

ফলাফলটি y এবং n এর নিম্নলিখিত উপায়ে সংযুক্ত করে নির্ধারিত হয়:

  • y এস এবং এন ও সমান এন

  • y এস এবং y এস সমান এস

  • n o এবং n o সমান y এসএস

যদি স্ট্রিংটিতে 2 টিরও বেশি অক্ষর থাকে (সম্ভবত ...), গণনাটি একই দেখায়। উদাহরণ:

  • y এস এবং এস এবং এন ও সমান এন ও (কারণ কোনও হ্যাঁ প্রথম হ্যাঁর সাথে একীভূত হয় then তবে সেখানে নেই এবং হ্যাঁ বাকি আছে এবং একই জিনিস আবার ঘটে)

  • এন ও ও এন ও ও এন ও সমান এন ও (প্রথম দুটি হ্যাঁর সাথে একীভূত হবে না, তবে হ্যাঁ এবং কোনও বাম নেই, যা না থেকে উদ্ভূত হয়েছে)

আউটপুট সহ ইনপুট উদাহরণ:

  • yynynynynyyn = এন

টিপ: মনে রাখবেন যে আপনার প্রোগ্রামটি যে অক্ষরের ক্রিয়াকলাপটি চালাচ্ছে সেগুলি ক্রম করে না। (উদাহরণস্বরূপ আপনি পিছন থেকে বা পিছন থেকে ইনপুটটি পড়তে পারেন, অক্ষরগুলি মিশ্রন করুন, এটি বাছাই করুন, যাই হোক না কেন What

জয়ের মানদণ্ড: এটি , তাই বাইট জিতে সংক্ষিপ্ততম কোড।


3
স্পষ্ট স্পেসিফিকেশন সহ প্রথম চ্যালেঞ্জের জন্য অভিনন্দন! (যদিও এটি দুর্ভাগ্য যে কিছু সম্প্রদায়ের সদস্য "খুব তুচ্ছ" চ্যালেঞ্জ পছন্দ করেন না ....)
ব্যবহারকারী 202729


7
আমরা কি বিকল্প যুগল আউটপুট করতে পারি? বলুন 1জন্য y, এবং 0জন্য n
অলিভার

5
আমরা কি অক্ষরের ["y", "n", "n"]
তালিকান

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

উত্তর:


9

কাঠকয়লা , 6 বাইট

§yn№Sn

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

    S   Input string
   № n  Count number of `n`s
§yn     Circularly index into string `yn`
        Implicitly print appropriate character

1
কীভাবে এটি কাজ করে তা ব্যাখ্যা করুন?
ম্যালাদি

@ মালান্দি লিংকটি
অ্যাডম

1
@ অ্যাডম আসলে আমি সাধারণত একটি যুক্ত করি, তবে আমি কেবল একটি কাজের বিরতিতে এটিকে ছুঁড়ে ফেলেছি এবং একটিতে সম্পাদনা করতে ভুলে গিয়েছি
নীল

14

অক্টাভা , 29 27 বাইট

একটি ভুল নির্দেশ করে এখনই সংশোধন করার জন্য @ রিক হিথককে ধন্যবাদ । এছাড়াও, @ স্টিভিগ্রিফিনকে ধন্যবাদ জানাতে 2 বাইট বন্ধ !

@(s)'yn'(mod(sum(s+1),2)+1)

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

ব্যাখ্যা

ASCII কোড পয়েন্টটি 'y'বিজোড় এবং এটি সমান 'n'। কোড

  1. সমান এবং বিজোড় 1তৈরি করতে ইনপুট স্ট্রিংয়ের প্রতিটি চরকে যুক্ত করে ;'y''n'
  2. সমষ্টি গণনা;
  3. 1এমনকি 2যদি বিজোড় , ফলাফল হ্রাস করে ;
  4. সূচকে (1-ভিত্তিক) স্ট্রিংয়ে 'yn'

আমি সম্ভবত স্পষ্ট কিছু মিস করছি, তবে এটি -4 বাইটের জন্য কয়েকটি সীমিত পরীক্ষার ক্ষেত্রে একইভাবে কাজ করবে বলে মনে হচ্ছে । এটা সম্ভবত বুনো ভুল কারণ আমি অকটাভে জানি না!
ডম হেস্টিংস

2
@ ডোমহাস্টিংস ওপিতে প্রদত্ত yynynynny এর জন্য ব্যর্থ হয়েছে, y ফিরে আসতে হবে, তবে ফিরে আসতে হবে
স্কিডসদেব

9

জাভাস্ক্রিপ্ট (ES6), 28 বাইট

স্ট্রিং হিসাবে ইনপুট নেয়।

s=>'ny'[s.split`n`.length&1]

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


জাভাস্ক্রিপ্ট (ES6), 30 বাইট

অক্ষরের অ্যারে হিসাবে ইনপুট নেয়।

y=>'yn'[n=1,~~eval(y.join`^`)]

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


31:: s=>'yn'[s.match(/n/g).length&1]পি
ASCII- কেবল

@ এএসসিআইআই-কেবল এটি এমন স্ট্রিংগুলিতে ব্যর্থ হবে যাতে কমপক্ষে একটি না থাকে n
আর্নল্ড

ওহ, এটা হবে। উফ্> _>
এএসসিআইআই-কেবল

8

হাস্কেল , 33 28 বাইট

f a=cycle"yn"!!sum[1|'n'<-a]

অনন্ত তালিকার "ynynynyn…" এ n এর গণনা সূচক করে। পূর্ববর্তী পদ্ধতির (৩৩ বাইট) বিভিন্ন উপাদানকে জোড়ে ভাঁজ করে এন, অন্যথায় y:

f=foldl1(\a b->last$'y':['n'|a/=b])

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


1
আপনার পূর্ববর্তী পদ্ধতি 30 বাইটে করা যেতে পারে। এটি অনলাইন চেষ্টা করুন!
গম উইজার্ড

7

জেলি , 7 বাইট

ċ”nị⁾ny

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

এর ount সংখ্যা "এন , আমি স্ট্রিং মধ্যে ndex ⁾ny । (মডুলো 2 সহ)


ċḢịɗ⁾ny

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

{ C এর ount নম্বর, নিতে H EAD, তারপর আমি স্ট্রিং মধ্যে ndex} ⁾ny


OCSị⁾ny

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

উপরের অক্টাভ উত্তরের মতো। হে আরডি মান গণনা করুন , সি অম্পলমেন্টটি নিন (প্রতিটি অর্ড মান x -1 গণনা গণনা করার জন্য ), এস উম, তারপরে ndex স্ট্রিং ⁾ny এ


আমাকে বিভ্রান্ত করা আমার বোগাস সমাধান!
জোনাথন অ্যালান

7

এপিএল (ডায়ালগ ইউনিকোড) , 15 বাইট

'ny'[1+=/'y'=⍞]

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

নোট: থেকে Tio অক্ষমতা ⎕IO = 1। যদি চালানো হয় ⎕IO←0,

এপিএল (ডায়ালগ ইউনিকোড) , 13 বাইট

'ny'[=/'y'=⍞]

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

এটি এক্সএনওআর ফাংশন (কখনও কখনও EQV নামে পরিচিত, বিশেষত পুরানো বেসিকগুলিতে।

পৃথকীকরণ / বিশ্লেষণ:

               - Accept string input  
         'y'=   - Compare it to the letter `y`. This "converts" the input 
                  string into a vector of 1s and 0s where the 1s correspond 
                  to 'y' and the 0s to 'n'.  
       =/       - XNOR/EQV/equality reduction - converts the vector into a 
                  single boolean value by evaluating e.g., 1 xnor 0 xnor 0 
                  xnor 1 ...  
     1+         - adds one for subscripting in IO = 1 environment. In 
                  IO = 0, should be omitted (save 2 bytes)  
    [         ] - subscript indicator - the expression, which should be 
                  either a 1 or 2 (0 or 1 in `⎕IO = 0`), is now going to be 
                  interpreted as a subscript of...  
'ny'            - The string of possible results - a 0/1 is 'n', a 1/2 is 'y'

এক্সওআর 0s উপেক্ষা করে এবং 1 এস-এ ফ্লিপ করে, এক্সএনওআর 1 টি উপেক্ষা করে 0 সেকেন্ডে ফ্লিপ করে, "প্রাথমিকভাবে" এক্সওআরের মতো 0 এর পরিবর্তে 1 এ রয়েছে।
ফ্রাউনফ্রোগ

@ ফ্রাউনফ্রোগ - আমি মনে করি আপনি এটি সেভাবে দেখতে পারতেন ... বা এর উভয় ইনপুট মান একই কিনা তা দেখার জন্য আপনি এটি পরীক্ষা হিসাবে দেখতে পারেন could
জেফ জিটলিন 23'18


6

ডিসি , 39

?dsiZdsl[[]r1-d0<m]dsmxklixzll-2%B*C1+P

ইনপুট স্ট্রিংটি STDIN থেকে পড়ে এবং ফর্মে থাকা উচিত [yynynynynyyn]

ডিসি স্ট্রিং হ্যান্ডলিংয়ের জন্য পরিচিত নয়, তবে এটি কাজ করার জন্য আমাদের এখানে পর্যাপ্ত পরিমাণ রয়েছে। এখানে পন্থাটি nগুলি, এবং yএমনকি বা nবিজোড় হলে আউটপুট গণনা করা । এটি ম্যাক্রো হিসাবে ইনপুট স্ট্রিংকে চালিত করে। সমস্ত গুলি এর জন্য dcআউটপুট 'y' (0171) unimplementedত্রুটি ঘটবে yএবং স্ট্রিংগুলি পপ করার চেষ্টা করবে এবং সমস্ত এসগুলির জন্য এগুলি মুদ্রণ করবে n। সুতরাং প্রথমে আমরা নিশ্চিত []করে নেব যে পপ করার জন্য আমাদের কাছে প্রচুর পরিমাণে (মোট ইনপুট স্ট্রিং দৈর্ঘ্যের) ফাঁকা স্ট্রিং রয়েছে। তারপরে আমরা ইনপুট স্ট্রিংটি কার্যকর করি এবং দেখি []স্ট্যাকের মধ্যে কতগুলি অবশিষ্ট রয়েছে। মূল স্ট্রিংয়ের দৈর্ঘ্যটি এর থেকে (-তে) মোট সংখ্যার জন্য বিয়োগ করা হয় n। বাকি গেলিক ভাষার 2 এবং আউটপুট অধিকার আসা আউট হওয়া ASCII হিসেবে পেয়ে গাণিতিক হয় yবা n

?dsi                                    # Read input string, duplicate, store in register i
    Zdsl                                # Get input length, duplicate, store in register l
        [         ]                     # define macro to:
         []                             #   push empty string
           r                            #   swap empty string and remaining length 
            1-                          #   subtract 1 from length
              d0                        #   duplicate and compare with 0
                <m                      #   if >0 recursively call this macro again
                   dsmx                 # duplicate macro, store in register m and execute
                       k                # discard left-over 0
                        lix             # load input string and execute as macro
                           z            # get stack length
                            ll-         # load string length and subract
                               2%       # mod 2 (result is -ve because difference is -ve)
                                 B*     # multiply by 11 ('y' - 'n')
                                   C1+  # add 121 ('y')
                                      P # print result as ASCII char

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


6

জাপট , 8 বাইট

"yn"gUèn

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

ব্যাখ্যা:

"yn"gUèn
"yn"       String literal - "yn"
    g      Return the char at index:   
      è      Number of matches where:
       n       "n" is found in
     U         Input

জপ্ট সূচক-মোড়ক ব্যবহার করে, সুতরাং যদি Uènফেরত আসে তবে চরটি যখন পেয়ে 2আসবে yতখন তা ফিরে আসবে "yn"


আমার যা ছিল তা অনুসারে
শেগি




5

1
হ্রাস খুব চালাক ব্যবহার!
অ্যাডম

সত্যিই দুর্দান্ত সমাধান (গুলি)!
গ্যালেন ইভানভ

আপনি দয়া করে / উভয় সমাধানের পচিয়ে যাওয়ার ব্যবস্থা করবেন (যেমনটি আমি আমার এপিএল সমাধান দিয়েছিলাম)? (ঘটনাচক্রে, আপনার সত্যিই এপিএল সমাধান জে সলিউশন থেকে পৃথক সমাধান হিসাবে পোস্ট করা উচিত, এমনকি যদি অ্যালগরিদম একই থাকে
তবেও

{&'ny'@=/একটি বাইট সংরক্ষণ করে।
অ্যালগরিদমশর্ক

@ এলগোরিদিমশার্ক ওহহ ধন্যবাদ!
ফ্রাউনফ্রগ

3

আর , 46 44 বাইট

"if"(sum(1+utf8ToInt(scan(,"")))%%2,"n","y")

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

নিচে 2 বাইট জিউসেপ্প এবং এনজিএমকে ধন্যবাদ। লুইস মেন্ডো দ্বারা নির্মিত অক্টাভে উত্তর বন্দর।


অক্টাভা উত্তরে অনুপ্রাণিত হওয়া সবচেয়ে সহজ; যদিও অ্যাক্টাভের সুবিধা রয়েছে যে স্ট্রিংগুলি তাদের কোড পয়েন্টগুলিতে আরও সহজেই রূপান্তরিত হয়, আমি মনে করি আপনি সেখানে কিছুটা বাইট নিচে পোর্টটি পোর্ট করতে পারেন।
জিউসেপ

sum(utf8ToInt(scan(,""))%%2)%%2একটি বাইট সংরক্ষণ করে।
এনজিএম

@ জিএম @ জিউজ্পে দুঃখজনকভাবে হলেও এরপরে nপ্রথমে + 1 যোগ করতে হবে ..
জাইসি

3

জাপট, 9 বাইট

অলিভার আমাকে সংক্ষিপ্ত সমাধানে মারধর করেছে তাই এখানে এমন একটি দম্পতি রয়েছে যা কেবলমাত্র একটি বাইট দীর্ঘ।

B*aUèÍu¹d

চেষ্টা করে দেখুন

#ndB*UèÍv

চেষ্টা করে দেখুন


ব্যাখ্যা

              :Implicit input of string U
B             :11
 *            :Mutiplied by
  a           :  The absolute difference of 11 and
   UèÍ        :    The count of "n" in U
      u       :    Mod 2
       ¹d     :Get the character at that codepoint
              :Implicit input of string U
#n            :110
   B*         :Add 11 multiplied by
        v     :  The parity of
     UèÍ      :    The count of "n" in U
  d           :Get the character at that codepoint

3

/// , 24 বাইট

/ny/n//nn/y//yy/y//yn/n/<input>

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

আমি বিশ্বাস করি এটি সংক্ষিপ্ততম সম্ভব /// প্রোগ্রাম, কারণ একটি চরিত্রের প্রতিস্থাপন তৈরি করা হয় অকেজো (যদি আপনি তার জায়গায় কিছু সন্নিবেশ করান) বা আউটপুট হতে বাধা দেয় (যদি আপনি কিছু না sertোকান)। তবে, যেহেতু প্রোগ্রামটি অবশ্যই দুটি চরিত্রের মামলাগুলি মোকাবেলা করবে, তাই এটি ন্যূনতম হওয়া উচিত।

প্রথমে yএকটি এর সমস্ত গুলি সরান n। তারপর ডবল প্রতিস্থাপন nসঙ্গে গুলি y, এস LTR প্রতিকল্পন সুবিধার সুযোগ গ্রহণ। এই পর্যায়ে yসর্বাধিক এক অনুসরণ করা হয় n; আমরা এরগুলি প্রতিলিপি তৈরি করে থাকি yএবং যদি কোনও nশেষ ব্যবহারের চেষ্টা yকরে থাকে।


3

এমএটিএল , 8 বাইট

Qs'ny'w)

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

2 বাট সংরক্ষণ করেছেন লুইস মেন্ডোকে ধন্যবাদ! আমি আগে সূচকটি সীমার মধ্যে আনার জন্য সুস্পষ্ট মডুলাস কমান্ডটি ব্যবহার করেছি 1,2

ব্যাখ্যা

এটি এমএটিএলটির মডুলার ইনডেক্সিং রয়েছে এই সত্যটি ব্যবহার করে যার অর্থ 1 ম, তৃতীয়, 5 ম ... স্ট্রিংয়ের উপাদানটি nyএকই ( n)। স্ট্রিংয়ের (2 y) , 2 র্থ, চতুর্থ, ষষ্ঠ ... উপাদান রয়েছে ।

Q          % Grab input implicitly, and increment each ASCII-value by 1
           % This makes 'n' odd, and 'y' even
 s         % Take the sum of all elements
  'ny'     % Push the string `ny`
      w    % Swap the stack to facilitate the indexing
       )   % Take the n'th element of 'yn' and output it.

1
'yn'3)দেয় y...? এখন এটি চতুর ডিজাইন লুইস =) টিপসটির জন্য ধন্যবাদ! :)
স্টিভি গ্রিফিন






2

জাভা (ওপেনজেডিকে 8) , 143 বাইট

a->{char[] u=a.toCharArray();if(u.length==1)return u[0];else{char b=(u[0]==u[1])?'y':'n',i=2;for(;i<u.length;b=(b==u[i++])?'y':'n');return b;}}

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

এবং যদি আমরা ইনপুটটিকে একটি তালিকা হিসাবে গ্রহণ করি:

জাভা (ওপেনজেডিকে 8) , 118 বাইট

u->{if(u.length==1)return u[0];else{char b=(u[0]==u[1])?'y':'n',i=2;for(;i<u.length;b=(b==u[i++])?'y':'n');return b;}}

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

ব্যাখ্যা:

(স্ট্রিং হিসাবে ইনপুট)

char[] u=a.toCharArray();  //turn string into char array
if(u.length==1){    
    return u[0];      //if single letter, return it
}else{
    char b=(u[0]==u[1])?'y':'n';     //first two XNOR
    for(char i=2;i<u.length;b=(b==u[i++])?'y':'n');   //XNOR each remaining character
return b;    //return final result
}

আপনার টের্নারি-ইফস (-4 বাইট) এ আপনার প্রথম বন্ধনী প্রয়োজন নেই, আপনি স্থানটি char[]u(-1 বাইট) মুছে ফেলতে পারেন ; এবং (-1 বাইট) if(u.length==1)হতে পারে if(u.length<2)। গল্ফ করার জন্য সম্ভবত আরও কিছু আছে, তবে আমার কাছে এখনই সময় নেই। :)
কেভিন ক্রুইজসেন


2

কিউবিক্স , 24 20 বাইট

আমি কিউবিক্সের সাথে খেলেছি তাই কিছুক্ষণ হয়ে গেছে ...

i;iwW-?;o@..!'yv.n'|

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

মোটামুটি নিষ্পাপ বাস্তবায়ন যা স্ট্রিংটির মধ্য দিয়ে যায় এবং বর্তমান ফলাফলের সাথে চরিত্রের তুলনা করে।

ইন্টারেক্টিভ ডেমো

এটি নিম্নলিখিত হিসাবে ঘনক্ষেত্রে মোড়ক দেয়

    i ;
    i w
W - ? ; o @ . .
! ' y v . n ' |
    . .
    . .
  • W শিপ আইপি বাম
  • i প্রাথমিক চরিত্র পান
  • i? EOI (-1) এর জন্য অক্ষর এবং পরীক্ষা পান, লুপটিরও শুরু করুন
    • যদি EOI ;o@টিওএস অপসারণ করে, অক্ষর হিসাবে টিওএস আউটপুট এবং প্রস্থান করে।
  • অন্যটি -W!বিয়োগ করুন, শিপ আইপ বাম করুন, সত্যতার জন্য পরীক্ষা করুন
    • যদি সত্যবাদী অক্ষরটিকে টিওএস-এ 'nচাপ দিন
    • যদি মিথ্যা |!'yপ্রতিফলিত হয়, পরীক্ষা করুন এবং অক্ষরের y কে TOS এ চাপ দিন
  • v'.;wঘনক্ষেত্রের চারপাশে পুনঃনির্দেশ করুন এবং এটিকে মুছে ফেলুন। অক্ষর এবং ডানদিকে ফিরে লুপ


2

বেফুঞ্জ -98 , 13 বাইট

~k!aj@,+n'*b!

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

মূলত যে একটি 0 inverts nইনপুট, এবং আরো একবার ভাল পরিমাপ জন্য, তারপর আউটপুট yজন্য 1এবং nজন্য0

~     Get inputted character
 k!   Invert the current value 110 (n) or 121 (y) + 1 times
   aj Jump past the rest of the code
~     Get input again. If no more input, reverse direction
            ! Invert the value once again
       +n'*b  Convert 0/1 to n/y
     @,       Output letter

2

2
ব্যবহার করে আপনি 3 বাইট সংরক্ষণ করতে পারবেন ল্যামডা রক্ষীদের : foldr1\a b|a==b='y'='n'। (যাইহোক, দুর্ভাগ্যক্রমে সাধারণত আমদানিগুলি বাইটকোডের অংশ))

2

জাভাস্ক্রিপ্ট, 39 37 বাইট

s=>[...s].reduce((x,y)=>x==y?'y':'n')

ইনপুট স্ট্রিং বিভক্ত করার পরে সহজ হ্রাস ফাংশন।


1
পিপিসিজিতে আপনাকে স্বাগতম! আপনার কোড ধরে নেয় ইনপুটটি ভেরিয়েবলের মধ্যে রয়েছে sযা এখানে বৈধ ইনপুট পদ্ধতি নয় । আপনি তার পরিবর্তে s=>42 বাইটের জন্য আপনার উত্তরটি প্রিপেন্ড করে আপনার উত্তরটিকে ল্যাম্বডা ফাংশনটি আর্গুমেন্ট হিসাবে গ্রহণ করতে পারেন।
dzaima

গল্ফিংয়ের পরামর্শ: 37 বাইটের s.split('')সাথে প্রতিস্থাপন করুন [...s]:s=>[...s].reduce((x,y)=>x==y?'y':'n')
ডিজাইমা

2

সি (জিসিসি) , 52 50 বাইট

পরামর্শের জন্য @ নীলকে ধন্যবাদ জানাই।

আমি গণনা nএর সমাধান ধার নিয়েছি , তবে একটি গণনা রাখার পরিবর্তে, আমি কেবলমাত্র প্রাথমিক অবস্থায় এবং এর বিপরীতে একটির মধ্যে ফ্লিপ করি n

i;f(char*a){for(i=*a;*++a;i^=*a&1?0:23);return i;}

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


*a&1?0:23একটি বাইট return iসংরক্ষণ করে এবং অন্যকে সংরক্ষণ করে।
নিল

পরামর্শi;f(char*a){for(i=*a;*++a;i^=*a&1?:23);a=i;}
সিলিংক্যাট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.