タグ付けされた質問 「sorting」

この課題は、並べ替え、順序付け、またはその他の方法でデータセットを整理することによって解決することを目的としています。

22
整数の回転位置
チャレンジ: 入力: 正の整数のソートされたリスト。 出力: 各整数の数字を左に向かってインデックスの回数だけ回転し、変更されたリストを再度並べ替えた後、まだまったく同じインデックスにある整数の量。 例: 入力:[8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788] 出力(0ベースのインデックス付け):6 出力(1ベースのインデックス付け):5 どうして? 0ベースのインデックス付け: After rotating each: [8,94,73,102,592,276,8227,3338,9217,63784,89487,7887471] Sorted again: [8,73,94,102,276,592,3338,8227,9217,63784,89487,7887471] Input indices: 0 1 2 3 4 5 6 7 8 9 10 11 Original input-list: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788] Modified list: [8,73,94,102,276,592,3338,8227,9217,63784,89487,7887471] Modified indices: 0 2 1 3 5 4 7 6 8 9 …

14
これは切り捨てられた三角形の数ですか?
関連するOEISシーケンス:A008867 切り捨てられた三角数 三角形の数の一般的なプロパティは、三角形に配置できることです。たとえば、21を取り、osの三角形に配置します。 o ああ おー おおおお ああ おっと 各角から同じサイズの三角形を切り取る「切り捨て」を定義しましょう。21を切り捨てる1つの方法は次のとおりです。 。 。。 おー おおおお 。おー。 。。oo。。 (の三角形は.オリジナルからカットされます)。 o残りは12 秒なので、12は切り捨てられた三角形の番号です。 仕事 あなたの仕事は、整数を取り、数値が切り捨てられた三角形の数であるかどうかを返す(または標準出力メソッドのいずれかを使用する)プログラムまたは関数(または同等のもの)を書くことです。 ルール 標準的な抜け穴はありません。 入力は負でない整数です。 カットの辺の長さは元の三角形の半分を超えることはできません(つまり、カットは重なり合うことができません) カットの辺の長さはゼロにすることができます。 テストケース 真実: 0 1 3 6 7 10 12 15 18 19 偽物: 2 4 5 8 9 11 13 14 16 17 20 …
20 code-golf  math  decision-problem  number-theory  integer  code-golf  number  decision-problem  functional-programming  code-golf  array-manipulation  matrix  code-golf  string  classification  string  code-challenge  binary  compression  decode  code-golf  string  string  code-challenge  balanced-string  encode  code-golf  number-theory  integer  base-conversion  code-golf  math  number-theory  geometry  abstract-algebra  code-golf  array-manipulation  sorting  optimization  code-golf  math  geometry  image-processing  generation  code-golf  string  cops-and-robbers  repeated-transformation  grammars  cops-and-robbers  repeated-transformation  grammars  code-challenge  restricted-source  tips  source-layout  javascript  code-challenge  kolmogorov-complexity  restricted-source  code-golf  combinatorics  counting  math  fastest-code  linear-algebra  code-golf  math  permutations  matrix  linear-algebra  code-golf  string  decision-problem  restricted-source  code-golf  number  array-manipulation  subsequence  code-golf  number  array-manipulation  matrix  code-golf  brainfuck  code-golf  color  code-golf  quine  source-layout  code-golf  subsequence  code-golf  string  ascii-art  code-golf  string  ascii-art  alphabet  code-golf  decision-problem  interpreter  hexagonal-grid  halting-problem  code-golf  string  polynomials  calculus  code-golf  math  decision-problem  matrix  complex-numbers  code-golf  random  code-golf  number  arithmetic 

8
並べ替えを視覚化する
のようなリストがあり、[3, 0, 4, 2, 1]選択ソートを使用してソートすると、次のように視覚化できます。 3,0,4,2,1 |-| 0,3,4,2,1 |-----| 0,1,4,2,3 |-| 0,1,2,4,3 |-| 0,1,2,3,4 この課題は、このようなソートを視覚化することです。 入力 入力は、任意の形式の正の整数のリストになります。 仕事 提出物は、一度に2つの要素のみを交換することで入力リストをソートする必要があり、スワップごとに、提出物はリストと、交換される各要素の下の文字を表示する必要があります。交換された数字に複数の数字がある場合、文字は数字の下にある可能性があります。最後に、提出にはソートされたリストが表示されます。 その他の規則 ソートは、n 4よりも少ないスワップを使用する必要があります。nはリストの長さです。 ソートは確定的である必要はありません。 スワップの下の文字は、スペース以外の任意の文字にすることができます。

6
ASCIIポーカーチップスタックアレンジメントを作成する
ポーカーには、多くの場合トーナメントで強制される、チップの配置方法に関するエチケットがあります-チップは、主にいくつかの大きな金種のチップを隠さないために、他者の後ろにいることによって対戦相手から「隠されない」ことがあります。 チャレンジ ASCIIでポーカーをプレイするので、合計値を考慮してASCIIチップスタック配置を描画する関数またはプログラムを作成する必要があります。 n。 入力 -正の整数n(最大2**32-1処理必要があります) 出力 -以下に定義されているスタック配置のASCII表現。 これには、各行の右側に空白が含まれている可能性があるため、最長(下)行の印刷可能文字が使用する長さよりも1文字長い行はありません。 これには、単一の末尾の改行が含まれる場合があります。そして あなたが好む場合はチップを表す文字は小文字であってもよいです。 スタックの配置は次のとおりです。 宗派を考慮して、可能な限り少ないチップを含む(以下を参照)。 「スタック」(列)に等しい価値のあるチップがあります。 短いスタックが高いスタックの右側になるように注文してください。そして より大きな金種チップを持つスタックが、より小さな金種の同じサイズのスタックの右側になるように注文します(右側の敵に見えることを表します) チップ自体は、色を識別する個々の文字として表されます。 White : 1 = W Red : 5 = R Green : 25 = G Black : 100 = B Yellow : 500 = Y Pink : 1K = P Orange : 5K …

18
複数キーの並べ替え
インデックスのリストと0個以上の整数のリストが与えられた場合、最初の入力からのキー優先度で昇順でソートされた整数のリストを出力します。 例 キー入力をとし[1, 0, 2]、リスト入力をとします[[5, 3, 4], [6, 2, 1], [5, 2, 1]]。これらのリストは、2番目の要素、1番目の要素、3番目の要素の順に昇順で並べ替える必要があります。 最初に、indexの値でソートします1。[[6, 2, 1], [5, 2, 1], [5, 3, 4]] 次に、indexの値を使用して、最初の並べ替えの関係を解除します0。[[5, 2, 1], [6, 2, 1], [5, 3, 4]] 最後に、indexのvluesとの残りの関係を解除します2(これは実際には何も変更しません。関係が残っていないためです)。 詳細 ソートは安定しています。2つの要素が指定されたソートキーに関して同等に比較される場合、それらは出力内で同じ相対的な順序のままである必要があります。たとえば、指定されたソートキーの下でAとBが等しく、入力がであった[..., A, ..., B, ...]場合、出力のA前Bに配置する必要があります。 ソートキーは、入力リストのいずれかに存在しない要素を参照することはありません。 ソートキーは繰り返されません。したがって、[1, 2, 1]ソートキーの有効なリストではありません。 ソートキーによって参照されない要素は、ソート順を考慮しません。出力の順序は、初期相対順序とソートキーによって参照される要素の値のみが決定します。 ソートキーをゼロインデックスにするか1インデックスにするかを選択できます。 ソートキーには負の値はありません。1インデックスを使用することを選択した場合、ソートキーにもゼロはありません。 整数値は、言語のネイティブ表現可能な範囲を超えません。選択した言語がネイティブに任意の精度の整数(Pythonなど)に対応している場合、メモリの制約を条件として、任意の整数値を入力に含めることができます。 リファレンス実装(Python 2) #!/usr/bin/env python …

27
*の通訳を書く
タスクは簡単です。言語*のインタープリターを作成します。 wikiへのより大きなリンクがあります。 有効なプログラムは3つだけです: * 「Hello World」を印刷します * 0〜2,147,483,647の乱数を出力します *+* 永遠に実行します。 3番目のケースは、この質問の仕様に従った無限ループでなければなりません 入力: 入力は、標準のI / Oルールで受け入れ可能な任意の入力方法で取得できます。 上記のプログラムのいずれかになります 出力: 最初のケースではHello World、末尾の改行の有無にかかわらず、正確に印刷する必要があります。 2番目の場合、言語の整数の最大値が2,147,483,647より小さい場合は、言語の整数の最大値を使用します 最初と2番目のケースは、標準のI / Oルールで受け入れ可能な出力に出力できます。 3番目のケースでは、出力は行われません。 得点: これはcode-golfであるため、バイト単位の最短回答が勝ちです。
20 code-golf  interpreter  code-golf  array-manipulation  sorting  code-golf  halting-problem  code-golf  javascript  code-golf  algorithm  code-golf  arithmetic  code-golf  math  counting  code-golf  math  code-golf  decision-problem  radiation-hardening  code-golf  conversion  bitwise  code-golf  number  decision-problem  code-golf  string  decision-problem  code-golf  random  game  code-golf  ascii-art  graphical-output  code-golf  decision-problem  binary-tree  tree-traversal  code-challenge  array-manipulation  code-challenge  graphical-output  path-finding  test-battery  algorithm  code-golf  integer  factorial  code-golf  binary-tree  code-golf  grid  graph-theory  code-golf  regular-expression  quine  code-golf  encoding  code-golf  king-of-the-hill  javascript 

30
最初に奇数を並べ替えます
すべての奇数がすべての偶数の前に表示されるように、指定されたリストを再配置します。この要件に加えて、出力リストの順序は任意です。 入力には整数のみが含まれますが、それらは負であり、重複がある場合があり、任意の順序で表示される場合があります。 最短のソリューションが勝ちます。 テストケース [1,2] → [1,2] [2,1] → [1,2] [1,0,0] → [1,0,0] [0,0,-1] → [-1,0,0] [3,4,3] → [3,3,4] [-4,3,3] → [3,3,-4] [2,2,2,3] → [3,2,2,2] [3,2,2,2,1,2]→ [1,3,2,2,2,2]または[3,1,2,2,2,2] [-2,-2,-2,-1,-2,-3]→ [-1,-3,-2,-2,-2,-2,]または[-3,-1,-2,-2,-2,-2,] [] → []

19
三角法プログラムを有効にする
Triangularityは、Xcoder氏によって開発された新しいエソランであり、コード構造は非常に具体的なパターンに従う必要があります。 nコードのth行について2n-1は、プログラムの正確な文字がその上になければなりません。これにより、最初の行は1文字のみで、残りは2ずつ増加する三角形/ピラミッドの形状になります。 各行の.左右にsを埋め込み、文字が行の中央に配置され、すべての行が同じ長さで埋め込まれるようにする必要があります。lがプログラムの行数として定義されている場合、プログラムの各行の長さは2 * l - 1 たとえば、左側のプログラムは有効ですが、右側のプログラムは無効です。 Valid | Invalid | ...A... | ABCDE ..BCD.. | FGH .EFGHI. | IJKLMN JKLMNOP | OPQRS 有効な構造にレイアウトすると、名前が明らかになります。 仕事 あなたの仕事は、三角コードを表す単一行の文字列を入力として受け取り、それを上記のように有効なコードに変換して出力することです。 I / Oの仕様: 入力には、範囲内の文字のみが含まれます 0x20 - 0x7e 入力の長さは常に二乗数であるため、うまくパディング可能です。 出力パディングには、他のものではなくドットを使用する必要があります。 受け入れ可能な任意の方法で入力および出力できます。これはコードゴルフなので、バイト単位の最短コードが勝ちです! テストケース input ---- output g ---- g PcSa ---- .P. cSa DfJ0vCq7G ---- …
19 code-golf  string  code-golf  combinatorics  code-golf  math  number  code-golf  matrix  code-golf  string  decision-problem  code-golf  internet  code-golf  number  number-theory  integer  expression-building  code-challenge  primes  cops-and-robbers  obfuscation  code-challenge  primes  cops-and-robbers  obfuscation  code-golf  string  balanced-string  code-golf  quine  code-generation  code-golf  matrix  code-golf  tips  c#  code-golf  ascii-art  code-golf  ascii-art  source-layout  code-golf  quine  source-layout  popularity-contest  language-design  code-golf  array-manipulation  subsequence  code-golf  matrix  math  code-challenge  game  graph-theory  atomic-code-golf  code-golf  number  integer  polynomials  equation  code-golf  array-manipulation  sorting 

7
整数のアルファベット化
整数のアルファベット化 与えられた数字のセットについて、それらが綴られるときにアルファベット順に並べます(すなわち、1:1、2:2、90:90、19:19)。コードは範囲で機能するはずです[-999999, 999999]。出力には、数字の間に区切り文字が必要です。以下の例に示すように、スペースとカンマが機能するように、スペースが機能します。入力は、整数の配列、区切られた数字の文字列、または適切と思われる文字列です。すべての整数は一意であると見なされます。 このチャレンジのために数字はハイフネーションされず、スペースは他の文字の前にアルファベット順になります。負の数は、単語を使用して表現されると想定されますminus。たとえば、four前に、文字列を使用してfour thousand番号-40がソートされますminus forty。すべての数字は数字の単語のみで構成され、接続詞は含まれないと仮定します(例:のtwo thousand forty two代わりに使用two thousand and forty two) テストケース 1桁の整数: 入力: 1, 2, 3, 4, 5 出力: 5, 4, 1, 3, 2 複数桁の整数: 入力: -1002, 5, 435012, 4, 23, 81, 82 出力: 81, 82, 5, 4, 435012, -1002, 23 単語間のスペース、ハイフンなし、コンマまたは「and」: 入力: 6, 16, 60, 64, …

7
セスティナの青写真
セスティーナは、我々が生成できることは興味深いパターンを次の詩の形式です。それぞれ6行の6つのスタンザがあり、最初のスタンザの各行の最後の単語が、連続した各スタンザの行末を設定パターンで回転させます。(3行のスタンザは終わりでもありますが、我々はその心配はありません。)エリザベス・ビショップ創造という名前の最初の3つのスタンザをご覧くださいセスティーナを: 9月の雨が家に降ります。 失敗した光の中で、おばあさん は台所で リトルマーベルストーブのそばに座って 、年鑑の冗談を読んで、 笑って話をして涙を隠します。 彼女は、彼の彼岸の涙 と家の屋根に降りかかる雨の 両方が年鑑によって予告されて いたが、祖母にしか知られていないと考えている。 ストーブの上で鉄瓶が歌います。 彼女はパンを切って子供に言います 今はお茶の時間です。しかし、子供 は湯沸かし器の小さな激しい涙 が熱い黒いストーブの上で狂ったように踊るのを見て 、雨が家で踊らなければならない方法です。 片付けて、おばあさん は賢い年鑑を切る ... 各行が「家」、「祖母」、「子供」、「ストーブ」、「年鑑」、または「涙」の6つの単語のいずれかで終わることに注意してください。それだけでなく、単語は前のスタンザと比較してパターン6–1–5–2–4–3で順序付けられます。最終的にはスパイラルのように見えます。 プログラムで完全なsestinaを生成するのにはまだ数年かかりますが、各スタンザの終了ワードを適切な順序でフィーチャーしたテンプレートを作成できます。これらのルールに従って、6行で終わる単語が与えられた場合に、sestinaの設計図を出力するプログラムまたは関数を作成します。入力の期待される結果は次のhouse grandmother child stove almanac tearsとおりです。 house grandmother child stove almanac tears tears house almanac grandmother stove child child tears stove house grandmother almanac almanac child grandmother tears house …

13
進行中のバブルソート
2つの入力を受け取る関数またはプログラムを作成します。 ソートされる整数のリスト(20要素未満) 正の整数、Nあなたがとるべき比較の数を言う 関数は停止し、N比較後に結果の整数のリストを出力します。N比較が行われる前にリストが完全にソートされている場合、ソートされたリストが出力されます。 バブルソートのアルゴリズムはよく知られている、と私はほとんどの人がそれを知っていると思います。次の擬似コードとアニメーション(リンクされているWikipediaの記事の両方)が必要な詳細を提供する必要があります。 procedure bubbleSort( A : list of sortable items ) n = length(A) repeat swapped = false for i = 1 to n-1 inclusive do /* if this pair is out of order */ if A[i-1] > A[i] then /* swap them and remember something changed …

18
年の月を並べ替える
関数や文字列の入力を受け取り、プログラムを書く、タイトルケースには、英語の月名を完全に綴ら:January、February、March、など(ヌル/ CR / LFは、あなたがそう選択した場合は[OK]を、いくつかの非英字で区切ら終了)のいずれか 2つの入力を比較し、2番目の入力が最初の入力よりも大きい場合(月順)にTruthy値を返します。値が等しいとFalsey値になります または、それらの任意のシーケンス(リスト、区切り文字列など)を時系列に並べ替えます (課題の核心は、正しい辞書式ソートを提供するメソッド/式を定義することです。一部の言語では、どちらか一方の回答が短くなる場合があります) 内部時間解析メソッド(などstrptime)を使用して、月名を数字に変換したり、月名の事前にマッピングされたマッピングに変換することはできません。文字列自体のプロパティ、定義した控えめなルックアップテーブル、または巧妙なものを使用します。 例 機能する例、最初のものは規則で禁止されていますが... import datetime def is_later_month(a, b): ''' Example of prohibited code because it relies on language features about how to parse month names ''' return datetime.strptime(a, '%B') < datetime.strptime(b, '%B') ただし、以下のバージョンは問題ありません。 months = { 'January': 1, 'February': 2, 'March': 3, 'April': …

5
ハードオブジェクトまたはソフトオブジェクトはもっとありますか
What-Ifブックのオープニングに触発されました。 入力は、文字列、文字列のリストなどとしてのスペースの長方形で、#内部にで作成されたオブジェクトがあります。 ######## # # ######## ### #### ### #### ### オブジェクトは常に交差せず、触れない長方形になります。ソフトオブジェクトは#、中央がで埋められておらず、境界のみであるオブジェクトとして定義されます。ハードオブジェクトは、塗りつぶされたオブジェクトです。幅または高さのあるオブジェクト<=2はハードと見なされます。すべてのオブジェクトはハードまたはソフトです。 入力にさらに硬いオブジェクトがある"Hard"場合、output 、より柔らかい場合、output "Soft"、それらが等しい場合、output "Equal"。 これはcode-golfなので、バイト単位の最短コードが勝ちです! テストケース これらのケースは完全な入力ではなく、各オブジェクトを特徴付けるべきものです。実際の入力は、質問の上部にあるascii-artのようになります。 ハード # #### ## ## ########## ########## ########## 柔らかい ### # # ### ################### # # # # # # ################### #### # # # # # # # # # …
19 code-golf  ascii-art  counting  code-golf  number  grid  decision-problem  chess  code-golf  grid  graph-theory  chess  code-golf  math  geometry  code-golf  arithmetic  roman-numerals  fastest-code  code-golf  math  geometry  code-golf  string  cryptography  code-golf  number  sequence  decision-problem  code-golf  string  parsing  c  code-golf  sorting  integer  code-golf  number  sequence  rational-numbers  graphical-output  atomic-code-golf  assembly  box-256  code-golf  geometry  tips  python  code-golf  number  sequence  arithmetic  number-theory  code-golf  ascii-art  kolmogorov-complexity  geometry  code-golf  graphical-output  code-golf  math  code-golf  grid  cellular-automata  game-of-life  code-golf  string  subsequence  code-golf  arithmetic  rational-numbers  code-golf  tips  dc  code-golf  ascii-art  kolmogorov-complexity  date  code-golf  string  primes  code-golf  string  natural-language  conversion  code-golf  sequence  code-golf  number-theory  primes  base-conversion  code-golf  math  primes  base-conversion  code-golf  ascii-art  fractal  code-golf  matrix  code-golf  math  tips  geometry  python  string  code-challenge  keyboard  code-golf  graphical-output  code-golf  string  code-golf  number  sequence  cops-and-robbers  number  sequence  cops-and-robbers 

3
ハンガリー語のアルファベット順
古いスペイン語のアルファベット順よりもさらに挑戦したい人のために、ハンガリー語のアルファベット順を見てみましょう。 a、á、b、c、cs、d、dz、dzs、e、é、f、g、gy、h、i、í、j、k、l、ly、m、n、ny、o、ó、 ö、ő、p、q、r、s、sz、t、ty、u、ú、ü、ű、v、w、x、y、z、zs 実際には、q、w、xおよびyハンガリー語の単語で使用されていないが、彼らは外来語と外国名に含まれています。ハンガリー語のアルファベットの一部ではない外国語のアクセント付き文字(などñ)は、アクセントなしの文字と同じ優先順位を持っていますが、この課題については無視します。 要約されたルール: ダイグラフ(cs、szなど)およびトリグラフ(dzs)は、それ自体が文字であると見なされます。 cudar cukor cuppant csalit csata :同じ有向グラフまたはトリグラフは言葉でお互いの直後に2回出現する場合、それらは簡略化された方法で書かれているssz代わりにszsz、ddzs代わりのdzsdzsが、非単純化順序が使用されているアルファベット順のため。例えばkasza、< kaszinó、< kassza、ためkasszaとして使用されるk+ a+ sz+ sz+ a発注のために。複合語の場合、単語で非契約バージョンを見つけることができます。 kasza kaszinó kassza kaszt nagy naggyá nagygyakorlat naggyal nagyít 大文字化は問題ではありませんが、大文字化しないと2つの単語がまったく同じになる場合は例外です。 jácint Jácint Zoltán zongora アクセント母音の短い及び長いバージョンが同じ優先度を有する(a - á、e -é、i - í、o - ó、ö - ő、u - ú ü - ű)、単一の例外を除いて2つの単語が他とまったく同じであるならば、短母音は長母音優先を有します。ウムラウト(öおよびü)を持つ母音は、oおよびから完全に異なる文字であることに注意してくださいu。 Eger egér író …

11
二乗差を最大化する
整数値の順列を検討1するがN。たとえば、次の例N = 4: [1, 3, 4, 2] このリストは循環的である1と見なし、そのように、および2隣接として扱われます。そのようなリストについて計算できる1つの量は、隣接する値の差の2乗の合計です。 (1-3)² + (3-4)² + (4-2)² + (2-1)² = 10 あなたの仕事は、正の整数を与えられて、この量を最大にする順列を見つけることNです。N = 4上記の例の場合、最適ではありません(実際、最小限です)。18次の順列(および他のいくつかの順列)の合計平方差を達成できます。 [1, 4, 2, 3] アルゴリズムは(のN)多項式時間で実行する必要があります。特に、すべての順列の差の合計を単純に計算することはできません。 プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。 出力は、任意の便利で明確なフラットリストまたは文字列形式にすることができます。0toのN-1代わりに1toの値を持つリストを返すことを選択できますN。 標準のコードゴルフ規則が適用されます。 テストデータ この問題に対する優れた分析ソリューションがあります。たとえば、すべての有効なソリューションN = 10は次のリストと同等です(巡回シフトおよび反転まで)。 [7, 5, 6, 4, 8, 2, 10, 1, 9, 3] 私は(それがパターンを把握する、おそらく十分ですが)それを超えてあまりにも明らかにし、その代わりに任意のより多くの例を与える、あなたは結果が与えられたため、次の総乗違いがあることを確認することができますしたくありませんN。 N Total squared difference 1 0 2 …
19 code-golf  array-manipulation  permutations  restricted-complexity  code-golf  geometry  grid  code-golf  string  sorting  code-golf  simulation  code-golf  string  code-golf  arithmetic  code-golf  sorting  code-golf  string  code-golf  sorting  code-golf  interpreter  code-golf  number  kolmogorov-complexity  natural-language  conversion  code-golf  random  internet  code-golf  board-game  code-golf  number  sequence  code-golf  math  number  code-challenge  image-processing  classification  test-battery  code-golf  ascii-art  code-golf  tips  code-golf  arithmetic  code-golf  tips  code-golf  tips  javascript  code-golf  array-manipulation  code-golf  ascii-art  code-golf  string  binary  code-golf  arithmetic  linear-algebra  matrix  code-golf  sequence  code-golf  math  number  arithmetic  code-golf  primes  code-golf  math  code-golf  array-manipulation  counting  code-golf  arithmetic  code-golf  quine  code-generation  polyglot  code-golf  math  kolmogorov-complexity  trigonometry  code-golf  string  encryption 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.