タグ付けされた質問 「regular-expression」

正規表現の使用を含むコードの課題。

1
自分自身にのみ一致する正規表現
正規表現に関連するかなりクールな課題がいくつかあります(自己一致正規表現、正規表現検証正規表現) これはおそらく不可能かもしれませんが、それ自体にのみ一致する正規表現はありますか? 注:区切り文字を含める必要があります。 例えば/thing/一致しなければならない/thing/とありませんthing。式で可能な唯一の一致は、式自体でなければなりません。多くの言語では、正規表現の代わりに文字列を実装できます。たとえば、Go package main import "fmt" import "regexp" func main() { var foo = regexp.MustCompile("bar") fmt.Println(foo.MatchString("foobar")) } しかし、チャレンジのために、引用符を区切り文字として議論したい場合は、表現を区切り記号(開始記号、表現、終了記号ex:/fancypantpattern/または@[^2048]@)にしてください。この問題の明らかな難しさを考えると、それほど大きな違いは生じないと思います。 あなたを助けるために: rubular.com(ruby regex編集用のWebページ)にまとめたクイックハック: var test = document.getElementById("test") ,regex = document.getElementById("regex") ,delimiter="/" ,options = document.getElementById("options") ,delay = function(){test.value = delimiter + regex.value + delimiter + options.value} ,update = function(e){ // without …

30
Stroustrupの神話「C ++は大規模で複雑なプログラム専用」を暴く
Stroustrupは最近、C ++に関する人気の神話を暴く一連の投稿を投稿しました。5番目の神話は、「C ++は大規模で複雑なプログラム専用です」です。それを暴くために、彼はWebページをダウンロードし、そこからリンクを抽出する簡単なC ++プログラムを書きました。ここにあります: #include <string> #include <set> #include <iostream> #include <sstream> #include <regex> #include <boost/asio.hpp> using namespace std; set<string> get_strings(istream& is, regex pat) { set<string> res; smatch m; for (string s; getline(is, s);) // read a line if (regex_search(s, m, pat)) res.insert(m[0]); // save match in set return res; …

11
正規表現、紙、はさみ、トカゲ、スポック
ウォームアップ:正規表現、紙、はさみ これは、非常に短いソリューションが存在することに気付く前に、私が最初に投稿したかった課題です。それでも、以下の実際の課題に備えて考えることは興味深い問題になる可能性があります。 3つの正規表現R、P、およびSを、それらが周期的なロック、ペーパー、はさみの方式で互いに一致するように記述します。特に、Rは、一致Sを、Sは一致PとPが一致Rが、しかしRは ない一致Pを、Sは ない一致RをとPが一致していないSを。便利な表を次に示します。 Regex Matches Doesn't match R S P P R S S P R R、P、およびSがそれ自体を含む他の入力に対して何をするかは問題ではありません。 ここで、一致とは、入力の一部の(おそらく空の)サブストリングが一致することを意味します。一致は入力全体をカバーする必要はありません。 課題:正規表現、紙、はさみ、トカゲ、スポック この課題では、RPSの変種であるRock、Paper、Scissors、Lizard、Spock(The Big Bang Theoryで普及)に基づいて、上記の問題のより厳しいバージョンを解決します。RPSLVには、2つのサイクルで互いに勝つ5つの異なるシンボルがあります。 ロック→はさみ→トカゲ→紙→スポック→ロック ロック→トカゲ→スポック→はさみ→紙→ロック 入力として互いに与えられたときにこの構造を模倣する5つの正規表現R、P、S、L、およびVを記述する必要があります。対応する表は次のとおりです。 Regex Matches Doesn't match R L, S V, P L V, P S, R V S, R P, L S P, L …

30
警官と強盗:逆正規表現ゴルフ
注:このチャレンジは終了しました。今後の警察の提出は、受け入れられた回答とはみなされません。これは、誰もチャレンジに興味がないため、クラックされていない非常に単純な正規表現を将来誰も投稿できないようにするためです。 警官の挑戦 次の仕様を満たす短い難読化された正規表現を作成する必要があります。 オンラインで自由にテストできるフレーバーを選択できます。StackOverflowには、オンラインテスターの良いリストがあります。特に、Regex101はPCRE、ECMAScript、およびPythonのフレーバーをサポートしているため、使い始めるのに適しています。必要に応じて、右上隅のレンチをクリックして、タイムアウト制限を増やすことができます。選択したテスターを回答に含めてください。 好みのフレーバーに適したテスターがない場合は、ideoneなどのオンラインインタープリターを使用して、ホスト言語で小さなスクリプトを作成し、それを使用して提出物をテストできます。 ホスト言語を直接呼び出すことのない、そのフレーバーの任意の機能を使用できます(Perlのコード評価機能など)。 同様に、コード評価に結びつかない限り、任意の修飾子を使用できます(フレーバーにそれらがある場合)。 正規表現は、少なくとも1つの文字列Sを受け入れ、少なくとも1つの文字列Tを、それぞれ16文字以上で256文字以内の長さで、妥当な時間(1分以内に大幅に)拒否する必要があります。SとTには、オンラインテスターに​​入力する方法がある限り、ASCII以外のUnicode文字を含めることができます。このような文字列のペアは、送信のキーになります。 正規表現は、他の入力に勝手に時間がかかる場合があります。 課題の中核は、キーを見つけるのが難しい正規表現を作成することです。つまり、一致しない文字列と一致する文字列(または、キーの文字列を除くすべての正規表現が終了するまでに数日かかる場合もある)を区別するのは難しいはずです。 強盗の挑戦 独自の正規表現を送信したユーザーを含むすべてのユーザーは、他の送信を「クラック」することをお勧めします。キーの 1つが関連するコメントセクションに投稿されると、提出物がクラックされます。 重要:ほぼすべての文字列をキーの一部に使用できる場合でも、投稿する文字列が両方とも16〜256文字であることを確認してください。 提出物が変更またはクラックされることなく72時間持続する場合、著者は回答でネタバレタグに編集することにより有効なキーを明らかにすることができます。これにより、彼の答えは「安全」になります。つまり、クラッキングされなくなります。 ユーザーごとの送信ごとに1回のクラッキングのみが許可されます。たとえば、ユーザーXに送信する場合: "あなたのキーは0123456789abcdef/ fedcba9876543210です。" 私は間違っています、ユーザーXは私の推測を間違っているとして放棄し、その提出物について追加の推測を提出することはできなくなりますが、他の提出物を解読することはできます(そして、他の人はまだその提出物を解読することができます)。 クラックされたサブミッションは競合から排除されます(「安全」でない場合)。編集または削除しないでください。著者が新しい正規表現を提出したい場合は、別の回答で提出する必要があります。 自分の提出物をクラックしないでください! 注:コメント内のスペースなしの長い文字列の場合、SEは2つのUnicode文字の形式で手動の改行を挿入します。そのため、スペース以外の文字の間で改行するほど長いバックティックでキーを投稿すると、キーを正規表現テスターに​​直接コピーすることはできません。この場合、警官の正規表現とキーを使用して、関連する正規表現テスターへのパーマリンクを提供してください-ほとんどのテスターに​​はこの機能が含まれています。 得点 警官のスコアは、クラックされていない限り、バイト単位の正規表現のサイズになります(パターンと修飾子、潜在的な区切り文字はカウントされません)。「安全な」提出の最低スコアが勝ちます。 強盗のスコアは、彼らがクラックした提出の数になります。同点の場合、それらがクラックしたサブミッションの合計バイトサイズは、タイブレーカーとして使用されます。ここでは、最高のバイト数が優先されます。 上記のように、どの警官も強盗として参加でき、その逆も可能です。 チャレンジの2つの部分で別々のリーダーボードを維持します。 リーダーボード 最終更新日:2014年10月19日、20:33 UTC 警官: イタリック体での提出はまだ安全ではありません。 nneonneo、841バイト Wumpus Q. Wumbley、10,602バイト Sp3000、52,506バイト user23013、53,884バイト nneonneo、656,813バイト 強盗: user23013、クラック:11、合計サイズ: 733 + 30 + 2,447 + 71 + 109 …

6
ハードコードゴルフ:7で割り切れる正規表現
Matthias Goergensには、7で割り切れる数字に一致する25,604文字(元の63,993文字から)の正規表現がありますが、多くの綿毛が含まれています:冗長な括弧、分布(xx|xy|yx|yyではなく[xy]{2})、およびその他の問題。フレッシュスタートは、スペースを節約するのに役立ちます。これはどれくらい小さくできますか? 妥当なさまざまな正規表現は許可されますが、正規表現には実行可能コードはありません。 正規表現は、7で割り切れる数の10進表現を含むすべての文字列に一致する必要があり、他の文字列には一致しません。最初の0を許可しない正規表現の追加クレジット。

7
Regex Golf:数独ソリューションの検証
有効な数独ソリューションに一致し、無効な数独ソリューションに一致しない正規表現を記述します。入力は、数独の展開バージョンです。つまり、行区切り記号はありません。たとえば、次のボード: 7 2 5 8 9 3 4 6 1 8 4 1 6 5 7 3 9 2 3 9 6 1 4 2 7 5 8 4 7 3 5 1 6 8 2 9 1 6 8 4 2 9 5 3 7 9 5 2 3 …

23
最短の一致しない正規表現
あなたの使命は、文字列が一致しない、空の文字列を含む最短の有効な正規表現を書くことです。 提出物は次の形式である必要があります(「リテラル表記」): /pattern/optional-flags 最短の正規表現が勝ちます。正規表現のサイズは文字でカウントされます。(スラッシュとフラグを含む) 正規表現の仕組みを説明してください(簡単でない場合) ありがとう、そして楽しんでください!

16
Regex Golfのヒント
言語固有のゴルフのヒントのスレッドと同様に、正規表現を短縮する一般的なトリックは何ですか? ゴルフに関しては、正規表現の3つの使用法を見ることができます。古典的な正規表現ゴルフ(「一致するリストと失敗するリスト」)、正規表現を使用して計算問題と正規表現を解決するより大きなゴルフコード。これらのいずれかまたはすべてに対処するためのヒントを投稿してください。ヒントが1つ以上のフレーバーに限定されている場合は、これらのフレーバーを上部に記載してください。 いつものように、回答ごとに1つのヒント(または非常に密接に関連するヒントのファミリー)に固執してください。そうすることで、最も有用なヒントが投票でトップに上がります。

30
異なる種類のメタ正規表現ゴルフ
通知: 一般的な需要に続いて、規則を少し緩和しました。 最大正規表現サイズは、5回の回答ごとに 1バイト増加します。回答Nは、最大29 +⌈N/5⌉バイトを使用できます。 各回答のスコアは(M /(30 + N / 5))Nになります 正規表現ゴルフでは、2セットの文字列が与えられ、最初のセットのすべての文字列に一致するが、2番目のセットのすべての文字列で失敗する最短の正規表現を作成するように求められます。 それが私たちがやろうとしていることですが、誰かが答えるたびに、正規表現自体が2つの文字列のセットの1つに追加されます(独自の選択)。したがって、この課題に答える厳密な順序があります。 例を見てみましょう: 私はこれから始めますabc(私はそうしません)、そしてマッチセットに入れます。 次に、有効な2番目の答えはになりますa。これは上記に一致するためです(失敗する必要のある文字列はまだありません)。この回答がフェールセットに含まれているとします。 ここで、3番目の答えは一致する必要abcがありますが失敗しaます。したがって、考えられる3番目の答えはですb。これをマッチセットに入れましょう。 第四答えは今一致しているabcとb、しかしに失敗しますa。重複する回答は許可しないため、有効な正規表現はですc|b。 重要なのは、回答をできるだけ短くすることです。これは最初の数回の回答では些細なことかもしれませんが、少数の回答を取得すると、できるだけ少ない文字数で目的の一致を取得することがますます難しくなります。 実際のチャレンジでは、最初は一致セットにが含まれPPCG、失敗セットにはが含まれ[PPCG]ます。最初の回答は既に提供されています。 返事 この課題について理解する重要なことは、一度に答えることができるのは1人だけであり、それぞれの答えはその前のものに依存するということです。 同じもので2つの答えがあってはならないN。2人がN偶然に同時に答えた場合、後で答えた人は(たとえ数秒の差があっても)丁寧に答えを削除する必要があります。 これを少しスムーズに実行するには、回答を投稿する際に次の手順に従うようにしてください。 誰かが前の回答の正しさを独立して検証したことを確認してください(そして対応するコメントを残しました)。 前の回答で見つかった2つのテストセットを取得し、1つのセットのすべての文字列に一致し、もう1つのセットの文字列には一致しない正規表現を記述します。 次の形式で回答を投稿してください。 # N. [regex flavour] - [regex size in bytes] [regex] [link to online regex tester] [notes, explanation, observations, whatever] ### The next answer …

30
警官:正規表現を作る-ヘビを作る
これは警官のスレッドです。強盗のスレッドはここにあります。 入力を受け取り、nn行n列の「スネークマトリックス」を作成するコードを記述します。 スネークマトリックスは、次のパターンに従うマトリックスです。 3行3列: 1 2 3 6 5 4 7 8 9 および4行4列: 1 2 3 4 8 7 6 5 9 10 11 12 16 15 14 13 正確な出力形式はオプションです。たとえば、output [[1 2 3],[6 5 4],[7 8 9]]、または同様のものがあります。 言語名と、コードに完全に一致する正規表現を指定する必要があります。正規表現の詳細度を選択できます。極端な場合、考えられるすべての文字列に一致する正規表現を作成できます。この場合、コードを解読するのは非常に簡単です。またn=4、強盗があなたが選択した正確な形式を知るように、の出力も提供する必要があります。 regex101.comで利用可能なregexフレーバーの1つ、またはRubyフレーバーを使用できます。 PCRE(PHP) Javascript Python ゴラン ルビー 使用しているものを指定する必要があります。 ノート: 合理的に大きいすべてをサポートする必要がありnます。データ型またはメモリがオーバーフローしないと仮定できます。デフォルトのデータ型が8ビットn<=11の符号付き整数である場合、を仮定できますn<=15。それが符号なしの8ビット整数である場合、を仮定できます。 強盗は、先行/末尾のスペースと改行を除き、提出物の出力形式と一致する必要があります。これは、SEの形式によって削除される可能性があるためです。 受賞基準: …

22
Natural Pi#0-ロック
ゴール 入力を受け取るプログラム/関数を作成し、整数のランダムなペアが比較的素数であるNかどうかを確認しN、を返しますsqrt(6 * N / #coprime)。 TL; DR これらの課題は、Piを概算するために自然と脳(およびおそらく再利用可能なリソース)のみを必要とするアルゴリズムのシミュレーションです。ゾンビの黙示録中に本当にPiが必要な場合、これらの方法は弾薬を無駄にしません!さらに8つの課題があります。推奨事項を作成するには、サンドボックスの投稿をチェックしてください。 シミュレーション 何をシミュレートしていますか?さて、2つのランダムな整数が比較的素数(すなわち、コプライムまたはgcd == 1)である確率は6/Pi/Piです。それらを数える; gcdが1 かどうかを確認します。繰り返す。これを数回繰り返した後、sqrt(6.0 * total / num_coprimes)に向かう傾向がありPiます。黙示録的な世界で平方根を計算するのが不安になっても心配しないでください!そのためのニュートン法があります。 これをどのようにシミュレートしますか? 入力してください N 次のN時間を実行します。 ランダムな正の整数を均一に生成しi、j と 1 <= i , j <= 10^6 もしgcd(i , j) == 1:result = 1 その他: result = 0 N結果の合計を取り、S 戻る sqrt(6 * N / S) …
39 code-golf  math  random  pi  approximation  popularity-contest  code-golf  sequence  number-theory  binary  coding-theory  code-golf  math  3d  code-golf  code-golf  math  number  code-golf  kolmogorov-complexity  code-golf  ascii-art  graphical-output  binary-tree  code-golf  ascii-art  code-golf  ascii-art  kolmogorov-complexity  code-golf  array-manipulation  hexadecimal  code-golf  math  number  set-theory  code-golf  math  arithmetic  number-theory  integer  code-golf  string  kolmogorov-complexity  code-golf  math  sequence  arithmetic  decision-problem  code-golf  code-golf  ascii-art  code-golf  array-manipulation  parsing  code-golf  string  ascii-art  kolmogorov-complexity  code-challenge  code-golf  sequence  code-golf  number  array-manipulation  sorting  code-golf  string  function  code-golf  arithmetic  code-golf  math  sequence  number-theory  primes  restricted-source  javascript  code-challenge  polyglot  rosetta-stone  code-golf  code-golf  regular-expression  code-golf  math  code-golf  math  primes  code-golf  ascii-art  kolmogorov-complexity  binary  code-golf  math  sequence  code-golf  sequence  subsequence  code-golf  string  code-golf  parsing  music  code-golf  grid  game  path-finding  board-game  code-golf  string  binary  code-golf  array-manipulation  balanced-string  code-golf  code-golf  algorithm  code-golf  string  number  arithmetic  array-manipulation  code-golf  array-manipulation  binary-tree  tree-traversal  code-golf  code-golf  tips  code-golf  string  base-conversion  code-golf  tips  s.i.l.o.s  code-golf  string  ascii-art  code-golf  code-challenge  code-golf  game 

5
正規表現で番号を追加する
新しいタイプの正規表現ゴルフチャレンジを試してみたいと思います。これは、正規表現の置換だけで、自明ではない計算タスクを解決するように求めます。これを可能にし、面倒な作業を少なくするために、次々にいくつかの置換を適用できます。 チャレンジ 簡単に始めましょう。2つの正の整数を含む文字列を、a ,で区切られた10進数として指定すると、合計も10進数としても含む文字列が生成されます。だから、非常に簡単に 47,987 になるはずです 1034 あなたの答えは、任意の正の整数に対して機能するはずです。 フォーマット すべての答えは置換ステップのシーケンスである必要があり、各ステップは正規表現と置換文字列で構成されます。オプションで、シーケンス内のこれらの各ステップについて、ストリングの変更が停止するまで置換を繰り返すことを選択できます。以下に送信例を示します(上記の問題は解決しません)。 Regex Modifiers Replacement Repeat? \b(\d) g |$1 No |\d <none> 1| Yes \D g <empty> No inputが与えられると123,456、このサブミッションは入力を次のように処理します。最初の置換が1回適用され、次のようになります。 |123,|456 これで、ストリングの変更が停止するまで、2番目の置換がループで適用されます。 1|23,|456 11|3,|456 111|,|456 111|,1|56 111|,11|6 111|,111| 最後に、3番目の置換が1回適用されます。 111111 ループの終了基準は、正規表現が一致を検出したかどうかではなく、文字列が変更されたかどうかであることに注意してください。(つまり、一致するものが見つかっても置換が一致する場合にも終了する可能性があります。) 得点 プライマリスコアは、提出の代替ステップの数になります。置換が繰り返されるたびに、10ステップがカウントされます。したがって、上記の例ではスコアが付けられ1 + 10 + 1 = 12ます。 タイの(あまりありそうにない)ケースでは、2次スコアはすべてのステップのサイズの合計です。各ステップで、正規表現(区切り文字なし)、修飾子、置換文字列を追加します。上記の例では、これはになります(6 + 1 + …

3
HexaRegex:マーティン・エンダーへのオマージュ
マーティン・エンダーは最近100Kに達し、いくつかの非常に素晴らしい言語を思いついた。私たちは、そのうちの一つ、と楽しみのビットを持っているつもりだHexagony(やのための正規表現のビット網膜) 簡単な概要として、六角形のグリッドを入力し、そのグリッド上にテキストの文字列に一致するパスがあるかどうかを判断するプログラムを作成する必要があります 生成中 Hexagonyは、次の手順を使用してテキスト文字列から六角形を生成します。 最小六角サイズを計算します(文字列の長さを取り、最も近い16進数に切り上げます) 上記のサイズの六角形にテキストをラップ 残りの場所をで埋め.ます。 たとえば、テキストの文字列にabcdefghijklmは辺の長さが3の六角形が必要なので、次のようになります。 a b c d e f g h i j k l m . . . . . . ここで、六角形を移動できる方向は6つあることに注意してください。たとえば、上の六角形でeは、に隣接していabfjidます。 ラッピング さらに、六角形では、六角形が次を包みます。 . . . . . a . . . . f . . a . . a b c d …

24
この番号はレーシアンですか?
正の整数kは、次の場合、レーシアン数です。 ki*i + j*j + i*jfor i、j整数として表現できます。 たとえば、最初の正のロジアン数は次のとおりです。1(i=1、j=0); 3(i=j=1); 4(i=2、j=0); 7(i=2、j=1); 9(i=-3、j=3); ... は、特定のに対して一意ではないことiに注意してください。例えば、も用いて生成することができます、。jk9i=3j=0 これらの数値の他の同等の特性は次のとおりです。 k表すことができるi*i + j*j + i*jためi、j負でない整数。(整数の各ペアについてi、j同じを与える非負整数のペアがありますk) k六角形のグリッド上でテッセレーションを形成する一連の連続した六角形があります(k = 4およびの図を参照k = 7)。(この特性のため、これらの数値はモバイルセルラー通信ネットワークに適用されます。) シーケンスのOEISページでその他の特性を参照してください。 チャレンジ 正の整数が与えられた場合、それがレーシアン数であれば真の結果を出力し、そうでなければ偽の結果を出力します。 プログラムまたは関数は1000、データ型の制限まで、または1分未満で入力を処理する必要があります。 コードゴルフ。最短勝。 テストケース 次の数値は、真の結果を出力するはずです。 1, 4, 7, 12, 13, 108, 109, 192, 516, 999 次の数値は偽の結果を出力するはずです。 2, 5, 10, 42, 101, 102, 128, …
33 code-golf  math  number  number-theory  decision-problem  code-golf  kolmogorov-complexity  code-golf  sequence  code-golf  path-finding  chess  code-golf  string  ascii-art  kolmogorov-complexity  code-golf  math  arithmetic  code-golf  code-golf  number  code-golf  geometry  code-golf  math  code-golf  code-golf  kolmogorov-complexity  alphabet  code-golf  regular-expression  hexagonal-grid  king-of-the-hill  path-finding  java  code-golf  string  sorting  code-golf  string  grid  code-challenge  compression  code-golf  random  code-golf  sequence  arithmetic  code-golf  number  grid  tiling  code-golf  tips  code-golf  sequence  number-theory  recursion  code-golf  string  grid  code-golf  math  number  combinatorics  permutations  string  code-challenge  code-golf  sequence  number-theory  subsequence 

30
ASCIIの三角形
あなたの仕事は、ASCII三角形を印刷するプログラムまたは関数を書くことです。次のようになります。 |\ | \ | \ ---- プログラムはn、制約付きの単一の数値入力を受け取ります0 <= n <= 1000。上記の三角形の値はでしたn=3。 ASCIIの三角形にはnバックスラッシュ(\)と垂直バー(|)、n+1行とダッシュ(-)があり、各行には最終的な行のほかに行番号(0から始まる、つまり最初の行は行0)と等しいスペースがあります。 。 例: 入力: 4 出力: |\ | \ | \ | \ ----- 入力: 0 出力: このテストケースでは、出力は空でなければなりません。空白なし。 入力: 1 出力: |\ -- 入力と出力は、私が指定したとおりでなければなりません。 これはcode-golfなので、できるだけ短いコードを目指してください!
30 code-golf  ascii-art  code-golf  rubiks-cube  code-golf  path-finding  maze  regular-expression  code-golf  math  rational-numbers  code-golf  kolmogorov-complexity  graphical-output  code-golf  tips  code-golf  string  permutations  code-golf  sorting  base-conversion  binary  code-golf  tips  basic  code-golf  number  number-theory  fibonacci  code-golf  date  code-golf  restricted-source  quine  file-system  code-golf  code-golf  math  code-golf  ascii-art  code-golf  math  primes  code-golf  code-golf  math  matrix  code-golf  string  math  logic  factorial  code-golf  palindrome  code-golf  quine  stateful  code-golf  interactive  code-golf  board-game  code-golf  math  arithmetic  code-golf  string  code-golf  math  matrix  code-golf  math  abstract-algebra  polynomials  code-golf  date  code-golf  string  array-manipulation  sorting  code-golf  game  code-golf  string  code-golf  ascii-art  decision-problem  code-golf  number  sequence  code-golf  code-golf  code-golf  sequence  fibonacci  code-golf  math  geometry  random  code-golf  code-golf  math  decision-problem  fractal  rational-numbers  code-golf  number  number-theory  code-golf  combinatorics  permutations  card-games  code-golf  math  sequence  array-manipulation  fibonacci  code-golf  sequence  decision-problem  graph-theory  code-golf  ascii-art  parsing  lisp  code-golf  string  math  natural-language  logic  code-golf  math  logic  code-golf  string  alphabet  code-golf  string  code-golf  string 

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