言語のショーケース


507

ノート

  • このスレッドは、コミュニティが例外を作成することを決定したためのみ開かれ、ロック解除されます。ここで同様の質問をすることができる証拠として、この質問を使用しないでください。追加の質問を作成しないでください。

  • これはもはやではなく、スニペットの長さは投票集計によって制限されません。以前からこのスレッドを知っている場合は、変更に精通していることを確認してください。

このスレッドは、お気に入りのプログラミング言語が提供する興味深い、有用な、あいまいな、および/またはユニークな機能を披露することに専念しています。これは挑戦でも競争でもありませんが、可能な限り多くのプログラミング言語を紹介するための共同作業です。

仕組み

  • すべての回答には、投稿の冒頭にプログラミング言語の名前を含める必要があり#ます。

  • 回答には、1つ(および1つ)のファクトイド、つまり言語を説明するコードを含まない2、3の文を含めることができます。

  • ファクトイドとは別に、答えはコードのスニペットで構成する必要があります。これはプログラムまたは関数であることができます(そうである必要はありません)。

  • スニペットを関連付ける必要はありません。実際、関連性が高すぎるスニペットは冗長な場合があります。

  • これはコンテストではないため、作成されたすべてのプログラミング言語はいつでも歓迎です。

  • 一握り以上のコードスニペットを含む回答では、スタックスニペットを使用して、ファクトイドとスニペットの1つを除くすべてを折りたたみます。

  • 可能な場合はいつでも、プログラミング言語ごとに1つの回答のみが必要です。これはコミュニティWikiであるため、自分で作成していない場合でも、自由にスニペットを回答に追加してください。投稿を圧縮するためのStack Snippetがあり、30,000文字の制限の影響を緩和するはずです。

これらのガイドラインより前の回答は編集する必要があります。必要に応じて更新してください。

言語名のアルファベット順にソートされた現在の回答

$.ajax({type:"GET",url:"https://api.stackexchange.com/2.2/questions/44680/answers?site=codegolf&filter=withbody",success:function(data){for(var i=0;i<data.items.length;i++){var temp=document.createElement('p');temp.innerHTML = data.items[i].body.split("\n")[0];$('#list').append('<li><a href="/a/' + data.items[i].answer_id + '">' + temp.innerText || temp.textContent + '</a>');}}})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><base href="http://codegolf.stackexchange.com"><ul id="list"></ul>

回答:


414

Mathematica

これが書かれた順序であるため、この下から上を読みたいと思うかもしれません。また、いくつかの説明は前のスニペットを参照するか、さらに下から説明を引き受けるでしょう。

リストはかなり長くなっています。あまり興味のないスニペットを削除し始めたので、スニペットをスキップします。参照してください。改訂履歴をスニペットチェックアウト、いくつかの本物の宝石のために41までのスニペットの完全なリストについては、816444231912および8を

長さ143および144のスニペット

最後に...私はこれをしばらく待っていました(そしてそれと同じくらい長い間ゴルフをしていましたので、もっと長く待つ必要はありません)。先に述べたように、数値的に方程式を計算することもでき、微分方程式を解くこともできます。その重要な例を示したいと思いました。

ロッド上の二重振り子(つまり、別の振り子に取り付けられた振り子)を考えます。各ロッドには単位長があり、2つの振り子おもりにはそれぞれ単位質量があります。また、方程式を短縮するために単位重力を使用しました。次の143文字のスニペット、このようなシステムのラグランジュ運動方程式を解きます(振り子の角度と角運動量に関して)。ラグランジュ力学に精通している場合、派生はこのPDFで見つけることができますが、かなり簡単な演習です。

私はそれをたくさんゴルフしなければならなかったので、それはまったく読めません:

d@t@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]

素晴らしいのは、Mathematicaが解が大まかにどのように見えるかのミニチュアプロットをすぐに表示することです:

ここに画像の説明を入力してください

わかりましたが、それは少し不自由です。振り子の動きが実際にどのように見えるかを知りたい。下の振り子の軌跡をトレースしながら振り子をアニメーション化する144文字のスニペットを次に示します。

Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}

結果のアニメーションは次のようになります。

ここに画像の説明を入力してください

少しカンニングしなければなりませんでした:を超えてプロットt = 30するとParametricPlot、デフォルトでは使用するプロットポイントが少なすぎて、線がギザギザになります。しかし、興味深いダイナミクスのほとんどはその後に発生PlotPoints -> 200するため、アニメーションの後半がより滑らかに見えるようにするオプションを使用しました。それは実質的に違いはなく、前半はとにかく見分けがつかないように見えます。

本当に驚くべきことを考え出さない限り、これが最後のスニペットになると思います。これを楽しんだことを願っています!

長さ100のスニペット

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

私はGeo100スニペットのいくつかの素晴らしい機能を考えていましたが、最終的にはTweet-a-Programで本当に気の利いたものを見つけました。上記は、レリーフマップの上に半球形の半球形の夜半球を重ねることで、現在の日時の地球の非常に見栄えの良い太陽マップを生成します。

ここに画像の説明を入力してください

長さ81のスニペット

CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]

それが最後のセルオートマトンであることを約束します。しかし、まさに81文字のWireworldがあります。今回はルールを1つの数字にエンコードしませんでした。a)それはとてつもなく巨大だと思います(気にしませんでした)CellularAutomaton。今回は、ルールは単純に純粋な関数として指定され、セルの近傍を受け取り、セルの新しい値を返します。これは、2つ以上の色/状態を持つセルオートマトンにとってはるかに実行可能なアプローチです。

とにかく、私はウィキペディアのサンプルi(2つのクロックが信号を生成し、1つのXORゲート)をセットアップし、約50ステップ実行しました。

ここに画像の説明を入力してください

興味があれば、実際のプロットとアニメーションはスニペット77である可能性があります。

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

長さ69のスニペット

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

何か役に立つものに戻りましょう。通常の方程式系とは別に、Mathematicaは微分方程式系も解くことができます。上記は技術的には境界条件を持つ微分方程式の1つにすぎませんが、3つの方程式のシステムとして提供することもできます。積分関数に似ているのDSolveは正確な解法でありNDSolve、システムを数値的に解きます。上記は単一のソリューションを生成します

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

これは、今後の計算やプロットに簡単に使用できます。

長さ64のスニペット

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

もっとCellularAutomaton魔法を約束しました!このスニペットは、ステップの初期条件でConwaysのGame of Lifeを計算し、すべての中間タイムステップの結果を提供します。in

パラメーターに関するいくつかの言葉2は、セルの状態の数です。{{2,2,2},{2,1,2},{2,2,2}}3x3近傍の9つのセルの重みを与えます。これにより、セル自体が8つの近隣の合計と区別できるようになります。{1,1}CAルールは、いずれかの方向に1ステップ離れたセルに依存すると言います。最後224に、単一の数値にエンコードされた実際の更新ルールがあります。この数を計算するのは少し難しいかもしれませんが、ドキュメントにはかなり有用なチュートリアルがあります。より複雑なオートマトンの場合、単一の数字ではカットされません(数字が膨大になるため)。明日そこに着くかもしれません!;)

とにかく、ランダムグリッドをにi、そして200 にフィードnし、アニメーション化されたを介して結果を送信すると、ArrayPlot実際に機能していることがわかります。

ここに画像の説明を入力してください

長さ59のスニペット

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

スニペット26の極座標を覚えていますか?3Dでも同じことができます!(実際、RevolutionPlot3D円柱極と球極の2つの関数がありますSphericalPlot3D。)Graphics3DMathematicaではすべての3次元プロットが自動的に回転できるように、前もってカメラの角度を気にする必要はありません。上記は、球面調和関数のようなもの(完全ではありません)をプロットし、次のようになります。

ここに画像の説明を入力してください

長さ52のスニペット

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

これはかなり気の利いたものです。任意の式をManipulate受け取り、変数の束でそれをパラメーター化してから、ウィジェットを提供します。ここで、パラメーターを調整し、式がどのように変化するかをライブで確認できます。式として、通常、ある種のプロットがあります。これは、講義でMathematicaを使用してソリューションのファミリーがパラメーターの変更にどのように応答するかを示す場合に特に役立ちます。上記は、および係数がどのように放物線をスケーリングおよびシフトするかを示しています。ab

ここに画像の説明を入力してください

長さ48のスニペット

Import["http://www.google.com/doodles","Images"]

Import非常に強力なコマンドです。ディスクとWebの両方からファイルをロードするために使用されます。非常に多くのさまざまなファイル形式を知っており、それらの一部(HTMLページなど)では、実際にデータをすぐに抽出できます。上記は、GoogleのDoodleページからすべての画像をダウンロードします。

長さ45のスニペット

EdgeDetect@ExampleData@{"TestImage","Splash"}

画像処理の時間。Mathematicaには、画像(Lenaなど)、テクスチャ、3Dモデル、オーディオスニペットなどのサンプルデータが多数付属しています。最初に、それらの1つをロードします。

ここに画像の説明を入力してください

エッジを検出したいですか?単一の関数呼び出しです。

ここに画像の説明を入力してください

長さ44のスニペット

ArrayPlot@CellularAutomaton[110,{{1},0},100]

最後に、使用CellularAutomatonして結果をレンダリングするのに十分な文字があります。:)私が知ってCellularAutomatonいる限りでは、CAに関連するMathematicaの唯一の関数です。しかし、Stephen Wolframはセルオートマトンに関しては自分がナンバーワンだと考えているようで、この機能は非常に強力です。上記は、最も単純な使用法を示しています。これは、100ステップの1Dセルラーオートマトンをシミュレートします。実際には、これらの各ステップでオートマトンの状態を返すため、結果は2次元になります。ルールは最初のパラメーターであり、リストを介して詳細に指定することも、単一の数値にエンコードすることもできます。この例では、かなり有名なチューリング完全ルール110を選択しました{{1},0}初期条件を定義します:単一1ゼロの背景の前。CellularAutomatonより多くのキャラクターを利用できるようになったときに、将来さらに多くの機能を披露するかもしれません。高次元で、より大きな近隣を使用して、3つ以上の状態でCAをシミュレートできます。

ArrayPlotは、値を示す単色のグリッドとして2Dリストをプロットするだけのもう1つの便利なプロットユーティリティです。最も単純なケースで0は、白と1黒にマップされます。スニペットの結果は次のとおりです。

ここに画像の説明を入力してください

長さ43のスニペット

HighlightGraph[graph,FindVertexCover@graph]

グラフについて言及してからしばらく経ちました。優れた視覚化ツールとともに、多くの一般的なグラフ理論上の問題が組み込まれています。上記は、与えられたのgraph場合、グラフの最小の頂点カバーを見つけ、それらの頂点をハイライトしてグラフをレンダリングします。例えばもしgraphあるPetersenGraph[7,2]バックスニペット18から、我々が得ます:

ここに画像の説明を入力してください

長さ42のスニペット

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

Mathematicaで物事をアニメーション化するのは非常に簡単です(そしてそれらは画像である必要さえありません)。フレームごとに評価される式と、フレームごとに異なるパラメーターの束を与えるだけです。上記は、移動する正弦波のプロットを単純にアニメーション化します。アニメーションは次のGIFのようになります。

ここに画像の説明を入力してください

長さ40のスニペット

SortBy[PlanetData[#, "EscapeVelocity"]&]

SortByあなたが期待することをします:それは与えられた関数を各リスト要素にマッピングすることによって得られた値に基づいてリストをソートします。ただし、上記の呼び出しにはリストがまったく含まれていません。Mathematica 10以降、一部の関数のカリー化または部分適用がサポートされています。これは、より純粋な関数型言語のような言語機能ではありませんが、多くの場合に便利な多くの機能のために手動で実装されています。これは、上記のスニペットが新しい関数を返すことを意味します。この関数はリストのみを受け取り、指定された関数でソートします。これは、このソート順がコード全体でより頻繁に使用されるものである場合に非常に役立ちます。

そして、はい、別の素晴らしい*Data機能があります-上記は惑星のエスケープ速度で惑星名をソートします。

長さ39のスニペット

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

フィボナッチ関数をより効率的にすることを約束しました。このスニペットは、Mathematicaで些細なメモ化がどのように行われるかを示しています。変更されるのはf[n]=、3行目の追加部分のみです。そのfため、新しい値(などf[3])が呼び出された場合、f[3]=f[3-1]+f[3-2]評価されます。これはを計算しf[2]+f[1]、それをf[3](!=ではなくwithで:=)に割り当て、最終的に最初の呼び出しの値を返します。したがって、この関数を呼び出すと、この値の新しい定義が追加されます。この定義は、一般的なルールよりも明らかに具体的です。したがってf、その値を使用した将来のすべての呼び出しに使用されます。

他のフィボナッチ関数は、30の値に対して4秒かかったことを覚えていますか?これには、300,000の値に対して3秒が必要です。

長さ37のスニペット

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

最後のスニペットでパターンについて言及しました。これらはルールで最もよく使用されます。これは(特に)特定のパターンに一致する構造を変更するために使用できます。それでは、このスニペットを見てみましょう。

{a___,x_,b___,x_,c___}:>{a,x,b,c}ルールです。x_単一のアンダースコアは、単一の任意の値(それ自体がリストまたは同様のものである可能性があります)を参照するパターンです。a___シーケンスパターン(スニペット15も参照)で、0個以上の値のシーケンスを指します。x_2回使用していることに注意してください。つまり、リストのこれら2つの部分は同じ値でなければなりません。したがって、このパターンは、値の2倍を含む任意のリストに一致する要素を呼び出すxと、これら二つの要素の周りに3つのシーケンスを呼び出しabc。これは{a,x,b,c}-に置き換えられxます。つまり、2番目は削除されます。

これで//.、パターンが一致しなくなるまでルールが適用されます。したがって、上記のスニペットは、リストからすべての重複を削除しますl。ただし、それよりも少し強力です//.。すべてのレベルでルールを適用します。したがって、lそれ自体に(任意の深さまで)リストが含まれている場合、それらのサブリストからの重複も削除されます。

長さ36のスニペット

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

新しい言語機能の時間です!Mathematicaには関数の定義に関していくつかの素晴らしい点があります。最初に、異なる名前または引数のタイプに対して、同じ名前の複数の関数定義を提供できます。パターンを使用して、定義が適用される引数の種類を説明できます。さらに、単一の値の定義を追加することもできます。Mathematicaは関数呼び出しに最も具体的な適用可能な定義を選択し、未定義の呼び出しは評価されないままにします。これにより、(特に)If基本ケースのスイッチを使用するよりもはるかに自然な方法で再帰関数を記述できます。

上記のスニペットについて注意すべきもう1つの点は、との両方=を使用していることです:=。違いは=、定義時に右側が1回だけ評価されるのに対して:=、左側が参照されるたびに再評価されることです。実際:=、変数を割り当てるときにも機能し、変数は動的な値を持ちます。

したがって、上記はもちろんフィボナッチ関数です。そして、それは非常に非効率的なものです。私のマシンでは、最初の30個の数値の計算に約4秒かかります。再帰的な定義を削除することなく、パフォーマンスを改善する方法については、後ほど説明します。

長さ35のスニペット

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

2Dベクトル場の流線を出力する非常にきれいなプロット。これは、各矢印がベクトル場に接しているという点で、通常のベクトルプロットに似ています。ただし、矢印は修正グリッド上に配置されるのではなく、線(流線)に結合されます。これらの線の重要性は、ベクトル場が速度場である場合、それらが粒子の軌跡を示しているということです。上記の入力は次のようになります。

ここに画像の説明を入力してください

長さ34のスニペット

Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]

Mathematicaは方程式(または方程式系でも解くことができますが、現時点では非常に多くのキャラクターしかありません)。結果は、通常どおり、シンボリックになります。

{
  {x -> 0}, 
  {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}

解決策はルールとして与えられていることに注意してください。これについては、今後のスニペットで詳しく説明します。

長さ33のスニペット

Dynamic@EdgeDetect@CurrentImage[]

このアイデアをbenwaffleに感謝します。CurrentImage[]ウェブカメラの現在の画像を読み込みます。EdgeDetect画像を白黒の画像に変換します。エッジは白で、残りは黒です(例についてはスニペット45を参照)。本当に楽しいのはDynamic、式自体を更新することです。そのため、この結果は実際にウェブカメラから画像をストリーミングし、それらに対してライブエッジ検出を行います。

長さ32のスニペット

NumberLinePlot[x^2<2^x,{x,-2,5}]

かなり珍しいタイプのプロット。ポイントや間隔など、数直線に沿ってさまざまなものをプロットできます。条件を指定することもできます。その条件が当てはまる地域が表示されます。

ここに画像の説明を入力してください

矢印は、領域が無限に続くことを示します。白い円は、それらが開いた間隔であることを示します(終点は間隔の一部ではありません)。閉端の場合、円は塗りつぶされます。

長さ28のスニペット

Graphics3D@{Sphere[],Cone[]}

いくつかの3Dグラフィックスの時間。上記は、クリスタルボールのように見えるデフォルトのパラメーターでスーパーインポーズされた球と円錐をレンダリングします。

ここに画像の説明を入力してください

Mathematicaでは、実際にこの小さなウィジェットをクリックしてドラッグし、回転させることができます。

長さ27のスニペット

CountryData["ITA", "Shape"]

もっと*DataCountryDataかなりクレイジーです。国の形を取得することは、氷山の一角でもありません。国に関するデータは非常に多いので、おそらくこの機能に関する本全体を書くことができます。など...がありFemaleLiteracyFractionます。さまざまな時点でそのデータを照会することもできます。完全なリストについては、リファレンスを参照してください。

ここに画像の説明を入力してください

長さ26のスニペット

PolarPlot[Sin[5θ],{θ,0,π}]

より興味深いプロットの時間です。PolarPlot極座標での単純なプロットです。特定のxにyを指定する代わりに、特定の角度θに半径rを指定します。

ここに画像の説明を入力してください

長さ25のスニペット

{{1,5},{2,3},{7,4}}.{8,9}

私たちはついに、いくつかのベクトル計算に十分な文字を取得しました。上記は、2x3行列と行2ベクトルの行列乗算を計算します。

{53, 43, 92}

長さ23のスニペット

Rotate[Rectangle, Pi/2]

へえ。へへ。これが何をするのか知っていると思います。しかし、あなたはしません。Rectangleそれ自体は単なる名前付き関数です。実際に長方形を表すオブジェクトを取得するには、いくつかのパラメーターを指定してその関数を呼び出す必要があります。回転しようとするとどうなると思いますRectangleか?この:

ここに画像の説明を入力してください

長さ22のスニペット

30~ElementData~"Color"

別の組み込み*Data関数。はい、化学元素については、原子番号、融点、名前などだけでなく、実際に室温で色を取得できます。上記は、亜鉛の色を示しています。

SlateGray

長さ21のスニペット

Integrate[E^(-x^2),x]

少し前に差別化がありました。統合の時間。Mathematicaは定積分と不定積分の両方を扱うことができます。特に、Integrate正確なソリューションを提供し、標準的な積分と積分技術のトンを扱うことができます(数値結果のために、がありますNIntegrate)。あなたの計算を知っているなら、上のガウス積分は実際に閉じた形式の不定積分を持たないことに気づくでしょう... エラー関数の閉じた形式を考慮しない限り、それはそうです。Mathematicaは以下を返します:

1/2 Sqrt[π] Erf[x]

長さ20のスニペット

"Sun"~StarData~"Age"

組み込みデータに戻ります*Data考えられるすべてのものに対して、少なくとも20個の関数が必要です。それぞれが、データを取得したいものの識別子と、取得するプロパティ(またはプロパティのリスト)を受け取ります。上記はSunStarで取得できる最短の1つであり、Ageすべてが非常に短いため、この機能を表示するのを待つことができませんでした。

そうそう、そしてMathematica(9以降)が単位付きの数量をサポートしていることを言及しましたか?(これについては後で詳しく説明します。)上記の評価結果:

Quantity[4.57*10^9, "Years"]

として表示されます

ここに画像の説明を入力してください

長さ19のスニペット

MandelbrotSetPlot[]

うん...非常に便利な機能...私はいつもそれを使用しています。(時々、計算可能なものをサポートしたいという欲求は少し遠いかもしれません...)

Mathematicaグラフィックス

それらの防御では、関数はそれよりも少し便利です:プロットしたいグラフの特定のセクションを与えることができます。

長さ18のスニペット

PetersenGraph[7,2]

Mathematica 8以降、それはグラフが何であるかを理解するため、あらゆる種類のグラフ理論関連の関数が付属しています。そして、大量のビルトインが含まれていなければ、それはMathematicaではありませんでした。上記は、一般化されたピーターセングラフのグラフデータを生成します。操作可能な実際のデータ構造を生成しますが、Mathematicaは即座にグラフデータを表示します...グラフィカルに:

Mathematicaグラフィックス

長さ17のスニペット

Plot[x^x,{x,0,2}]

最後に、プロットを行うのに十分な文字。上記は、実際には1次元プロットの最も単純な例です。後でクールなプロットを披露することを約束します

Mathematicaグラフィックス

長さ15のスニペット

{##4,#,#2,#3}&

これは、2つのより強力な機能(およびゴルフに役立つ機能)を示しています。全体は、PythonのsやRubyのProcsに匹敵する、名前のない純粋な関数lambdaです。純粋な関数は単にで終了します&。この演算子の優先順位は非常に低いため、通常は残りのほとんどすべてが含まれます。純粋関数の引数はで参照され#、時には他のものが後に続きます。最初の引数は#or #1で、2番目の引数はなど#2です。

もう1つの機能はSequencesです。これらは基本的に他の言語の感嘆符のようなものです。シーケンスは、その周りにリストのないリストのようなものです-それは文字通り値のシーケンスであり、リスト、関数引数など##で使用できます。特に、すべての純関数引数のシーケンスです。##22番目から始まるすべての引数のシーケンスです。したがって、上記の関数fに名前を付けて、次のように呼び出した場合

f[1,2,3,4,5]

私たちは得るだろう

{4,5,1,2,3}

そのため、関数は入力引数を3要素左に回転させます。リストにフラット化されたを##4参照し4,5ていることに注意してください。

長さ12のスニペット

D[x^y^x,x,y]

偏微分。Dは、他の引数に関して最初の式を連続的に区別し、結果としてシンボリック式を提供します。したがって、上記はd²(x ^ y ^ x)/ dxdyd sは部分的)であり、Mathematicaは

x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + 
  x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])

長さ9のスニペット

Exp[I*Pi]

複雑な計算はまだ行っていません!ご覧のとおり、π実際にはの単なるエイリアスでしたPi。とにかく、上記は実際に整数を 正しく返し-1ます。

長さ8のスニペット

Sunset[]

うん。クレイジーなビルトインについて話します。現在の場所での次の日没の日時オブジェクトを実際に提供するパラメーターなし。また、他の日付、他の場所などのパラメーターも使用します。現在、これは次のようになっています。

ここに画像の説明を入力してください

長さ7のスニペット

9!/43!!

このスニペットはいくつかのクールなものを示しています。

Mathematicaには階乗演算子が組み込まれているだけでなく!、二重階乗もあります!!(これは他のすべての数値をからに乗算nします1)。さらに、任意精度の整数をサポートします。43!!最後の桁まで、正確に評価されます。さらに、有理数も正確に評価されます。したがって、分子と分母の両方に整数があるため、Mathematicaは可能な限り小数部を減らして、

128/198893132162463319205625

もちろん、いつでもフロートを使用できますが、一般的に、入力にフロートが含まれていない場合、結果は正確になります。

長さ4のスニペット

Here

Mathematicaの豊富なクレイジーなビルトインから始めました。上記は、スズについて言うことを行い、(私にとって)と評価しGeoPosition[{51.51, -0.09}]ます。

長さ3のスニペット

x-x

オリジナルのFactoidを紹介するだけです。上記xはまだ定義されていなくても機能し0、実際にはその場合になります。

長さ2のスニペット

3x

並置による乗算!識別子が終了して別の識別​​子が開始することが明らかな場合、*それらを一緒に乗算するために空白も必要ありません。これは、まだ値を持たない文字列や変数など、ほとんどすべてのもので機能します。ゴルフに非常に便利です。;)

長さ1のスニペット

π

推測、それはPiです。実際、近似の浮動小数点表現ではなく、正確にPiです。したがって、これが使用されるあらゆる種類の複雑な三角関数は、既知の場合に正確な結果をもたらします。

ファクトイド

Mathematicaはシンボリック操作を実行できるため、変数は値を必要とせずに動作します。


19
スニペット23は非常に興味深いものです。もしあなたTranslate[Scale[Rectangle, 80], {0, 0, 100}]がその巨大な言葉をRectangleモニターの前に浮かび上がらせたら?
カルバンの趣味

53
@ Calvin'sHobbies試してみた...残念なzオフセットを選んだ...顔を真っ直ぐに叩いた。
マーティンエンダー

45
Mathematicaの公式ウェブサイトは絶対にこれにリンクする必要があります。
Caridorc

7
@ durron597シンボルとして保持し、すべての三角関数および複雑な関数にπの処理を認識させることにより。
マーティンエンダー

16
伝説のマーティン・ブットナーがMathematicaの回答を投稿したのを見て、人気コンテストに勝つチャンスがないことを知りました。あなたは真のウィザードです。
アレックスA.

187

悪名高いシェークスピアプログラミング言語

シェークスピアプログラミング言語は、2001年に2人のスウェーデンの学生、カールハッセルストロームとジョンÅslundによって作成され、著者が宣言するように

アセンブリ言語の使いやすさを備えたBASICの表現力。

答えは上から下へ行きます。また、古いスニペットや以前のスニペットを参照することもよくあります。

自分用のリンク:編集

ファクトイド:

シェイクスピアのコードは、予想されるように、変数が劇中のキャラクターであり、その値が「or辱」または「賞賛」されると変化するシェイクスピア劇に似ています。

長さ1のスニペット:

I

シェークスピアのコードは行為に分かれており、行為自体は「ジャンプ」の因果関係のためにシーンに分けられています。Actをとして定義Act Iするということは、それが実行されるコードの最初のピースになることを意味します。

長さ2のスニペット:

as

2つの「キャラクター」の比較に使用されます。

長さ3のスニペット:

day

今では、SPLは非常に冗長であると感じているかもしれません。そして奇妙な。そして、あなたはまだ何も見ていません。day、SPLでは1です。すべての「正」名詞と「中立」名詞は、と見なされ1、すべての「負」名詞はと見なされます-1

長さ4のスニペット:

rich

なにrich?形容詞。SPLでは、形容詞は接続されている名詞の値を2倍にします。スニペット14の実装を参照してください。

長さ5のスニペット:

Act I

最初のスニペットの実装。Act I: Hamlet must die!ローマ数字の後のすべてがパーサーによって無視されるため、すべての行為にのようなタイトルを付けることができます。

長さ6のスニペット:

better

すべての言語には条件があり、SPLも例外ではありません。例外として、これは長い構文を持つ言語であるため(そして、それがおかしいと言ったのですか?)、その条件ステートメントは長くなります。OpheliaにJulietに質問さAm I better than you?せるのはif (Ophelia > Juliet)、ほとんどの「通常の」言語を使うようなものです。そして、もちろん、あなたは他の方法で尋ねることができます:Am I not better than you?はと同等ですif (Ophelia < Juliet)。そして、あなたはすでに=SPLにどのように翻訳されるかを推測できます:as good as-コードスニペット2の使用。

ただし、good/betterこのシェイクスピア言語で比較する唯一の方法ではなく、任意の形容詞を使用できます。ここでもスニペット3の同じ原則が適用され、「正」の形容詞は値を持ち、>「負」の形容詞はを意味し<ます。

長さ7のスニペット:

Juliet:

これは変数の呼び出しです。この後、彼/彼女の指示/宣言/何でも続きます。

SPLの制限は、変数の数が限られていることです。Romeo、Juliet、Hamlet、Ophelia、MacBethなどは、シェイクスピアプログラムに表示される「キャラクター」のいくつかの例です。

長さ8のスニペット:

[Exeunt]

[Exeunt]すべての「キャラクター」が「ステージ」を出るときに配置されます。キャラクター間の相互作用についてもう少し詳しく説明できればと思います。一般に、SPLプログラムの最後の命令ですが、[Exeunt]具体的には言語の最終的な「文字」ではありません。別の例については、スニペット27を参照してください。

長さ9のスニペット:

as bad as

単なる=2 つの文字を表す9文字-スニペット2を使用します。例については、スニペット30を参照してください。(そして、はい、それを出力する方法は複数あります)

長さ10のスニペット:

difference

派手な表現方法-、減算。SPLを正しく操作するには1日かかる可能性がありますが、SPLで数学演算を実行できます。

Factoid (なんとかしてコードの10個のスニペットに到達できたので、少し休憩して、SPLについて別のファクトイドを見てみましょう)

シェイクスピアのコードをすべて実行したい場合は、このサイトがあります-5 分前でも発見したので、まだテスト中です。使用してCにそれを翻訳する方法もあります翻訳者が

SPLのコードを実行するためのもう一つのサイトがあり、この1 OracleのPL / SQL:内部で別の難解な言語にSPLコードを変換することによって動作します。

長さ11のスニペット:

[Exit Romeo]

はい!最後に、キャラクター間の相互作用について話すことができます!値を変更したり、他の人とやり取りしたりするには、「キャラクター」がステージにいる必要があります-で入力し[Enter Romeo]ます。文字がアドレス指定されているが存在しない場合、ランタイムエラーが発生し、プログラムが停止します。SPLでは、変数の値は、ステージ上の他のキャラクターによって賞賛される、またはwith辱される名前の量によって設定されるためです。私の例では、足の不自由な説明がもたらす混乱を明確にするために例を挙げるべきだと思いますが、おそらく、いくつかのスニペットを遅らせるのが最善です。

長さ12のスニペット:

Remember me.

SPLはかなり「基本的な」、申し分ありません-しかし、それはスタックを持っています!インスタンスごとに、ロミオがジュリエットに「彼を覚えている」ように言うとき、彼は実際に彼の愛する人にロミオの価値を彼女のスタックにプッシュするように言っています。値のポップはRecall your happy childhood!、またはRecall your love for me、または基本的に任意の文で始まりますRecall-残りはスニペット22のように芸術的な衝動です。

長さ13のスニペット

Let us return

シェイクスピア的な方法goto。そして、これは行為と場面が役に立つ場所です。RomeoがJulietに伝えた場合we shall return to Act II(そう、また書く方法は複数あります)、プログラムはコードの特定の部分にジャンプします。条件文と並んで見られます。

長さ14のスニペット

my little pony

はい、80年代のシリーズでした。ここにあり2*1ます。どうして?a ponyは(やや)肯定的な名詞でlittleあり、形容詞であるためです。スニペット3と4を思い出して、とを持っlittle = "2 *"ていpony = "1"ます。

長さ15のスニペット

Speak thy mind!

SPLプログラムでは、これ(またはSpeak your mind!、同じ)が多く表示されます。これは基本的に、コンピュータで使用されている文字セットに応じて、各「文字」の値を数字、文字、またはその他のもので出力します。Open your mind.数値形式で出力するだけですが、ほぼ同じことを行うこともあります。

長さ16のスニペット

You are nothing!

誰かが実際の生活の中でこれを言ったとき、あなたは落ち込んでいると感じるでしょう。オフィーリアがシェイクスピアのプログラミングでハムレットにこれを伝えると、ハムレットは価値がないと感じます。これは何を意味するのでしょうか?あれHamlet = 0

長さ17のスニペット

Ophelia, a wench.

脚本では、実際の演劇が始まる前に、キャラクターを紹介する必要があります。ほとんどのプログラミング言語では、変数は使用前に宣言する必要もあります。SPLが脚本に似たプログラミング言語であることを見て、これがプログラム中に現れる変数を示すことにより、変数を宣言する方法です。

しかし、「a wench」とはどういう意味ですか?それは特定の(そしてクールな)データ型名であることを意味しますか?まあ...私はあなたを失望させたくありませんが、それは何も意味しません:コンマの後はすべてパーサーによって無視されます。

長さ18のスニペット

lying sorry coward

-4すべての地上の生き物のために。どうして?なぜなら2*2*(-1) = -4

長さ19のスニペット

Romeo:
 Remember me.

やっと!!!最終的に、完全な正しい構文命令を出力できます(短い命令ですが)。これがスニペット12の使用方法です。最初に誰が話しているかを宣言し、次の行に「ダイアログ」を書きます。通常、パーサーを悲しく混乱させないために、ステージには2つの「キャラクター」のみがいます。別の「キャラクター」が必要な場合は、ステージから1つを取り、新しいキャラクターに置き換えます。

長さ20のスニペット

cube of thy codpiece

私はこれについてもう少し詳しく説明したかったのですが、正直なところ、私が思いついたものはこのスニペットの長さにはまだ短すぎます。そして、私はあなたにこれをもたらします。-1(-1)3 = -1であるからです(そしてcodpiece、それらは不快ですべてのため「否定的な」名詞です)。SPLは、いくつかのより複雑な算術演算をいくつかのべき乗および平方根として理解します。

ファクトイド (別のマイルストーンに到達したため、別のファクトイド

Shakesperianの「Hello World Program」には、89行と2400文字以上の長さがあります

長さ21のスニペット

Listen to your heart.

スニペット15では、何かを出力しました。ここでは、プログラムに番号を入力します。文字を入力する場合は、Open your mind.代わりに使用します。そして、言うまでもなく、この値は話されている「キャラクター」に保存されます。

長さ22のスニペット

Recall your childhood!

これにより、スニペット12で説明したように、スタックから整数をポップします。インスタンスごとに、オフィーリアがハムレットに前述の文を伝えると、ハムレットはスタックから整数を取得し、その値を引き継ぎます。

もちろん、単語recallが文を開始している限り、あなたは創造的なシェイクスピアの心が望むほとんどすべてで残りを埋めることができます。

長さ23のスニペット

Are you better than me?

スニペット6の実装。「キャラクター」が別の人にこのような質問をするとき、彼/彼女がしていることはif (x > y)、より一般的なプログラミング言語と同等です。この指示のフォローアップは、使用可能なキャラクターが増えるまで遅らせる必要があります。

長さ24のスニペット

[Enter Romeo and Juliet]

はい、「文字」はペアで入力できます。1つの「キャラクター」がステージに入り、その後に別のキャラクターが続く必要はありません。

長さ25のスニペット

remainder of the quotient

を書くだけの25文字%。部門の残りを持つ25文字。そしてそれを使用するには?まあ、それはさらに大きいです-スニペット75を参照してください。

長さ26のスニペット

Let us return to scene II.

これは、gotoプログラミング言語で予想されるとおりに機能するSPLのaです。問題は、同じ行為のシーン間、および行為間でジャンプできることです。ただし、異なる行為のシーン間をジャンプすることはできません。

長さ27のスニペット

[Exeunt Ophelia and Hamlet]

の代わりに複数の「キャラクター」がステージを去り、ExitSPLの演劇的な性質と伝統を守る場合、ラテン語の「Exeunt」が使用されます。場合によっては、スニペット8で置き換えることができます。

長さ28のスニペット

Scene I: Ophelia's flattery.

シーンの宣言。あなたが私に対処してきたならすでにあなたが期待できるように、重要なビットはでScene Iあり、残りは芸術的な綿毛です。

代わりにAct / Sceneの番号付け後のテキストを参照するコンパイラがいくつか作成されています(Pythonで記述されたSPLからCにコンパイルするこのようなもの)。もっと論理的ですが(結局、プレイ中に、「第1幕に戻らせてください」などの文字が登場するのはばかげていると思われるかもしれません)、私は元の方法に固執しています。

長さ29のスニペット

You pretty little warm thing!

はい、さらに別の定数です(算術演算を行うにはもっと多くの文字が必要ので)。これは、と等しい8ため2*2*2*1 = 8です。

長さ30のスニペット

You are as cowardly as Hamlet!

これを、インスタンスごとに、ロミオと言うことは、ということRomeo = Hamletです。スニペット9と同様。

Factoid (はい、別のランドマークに到達しました!)

この言語は、構文分析コースの課題用に作成されたため、作成者によってSPLコンパイラは作成されませんでした。詳細:2001年以降、この言語では何も変更されていないように見えるため、SPLの作成者は作成との関係を断ち切ったようです...

長さ31のスニペット

Am I as horrid as a flirt-gill?

はい、私は知っています、それは幾分スニペット23を繰り返していますが、ここでは、「浮気speak」と話す「キャラクター」を比較していますif (Ophelia == -1)。事は...

長さ32のスニペット

If so, let us return to scene I.

...これでthen、SPLの紹介、条件付きジャンプ、およびShakesperianのループ実装方法を紹介できます。インスタンスごとに、Romeoに値を仮定させ、0他のタスクを実行している間に値を増やし、10に達したら停止して、その後プログラムを進めることができます。

長さ33のスニペット

If not, let us return to scene I.

テストした条件がfalseの場合、代わりに、代わりに別のシーンに進むことができることを思い出してください。

長さ34のスニペット

Open your mind! Remember yourself.

続けて2つの指示、yippie!最初の文字は文字を読み取り、2番目の文字はそれを他の文字のメモリスタックにプッシュします。

長さ35のスニペット

Act I: Death!

Scene I: Oh, shit.

ActとSceneを宣言する適切な方法。芸術的なマッシュを上品に追加します。

長さ36のスニペット

Thou art as sweet as a summer's day!

話されている「キャラクター」が価値を受け取ると言う別の方法1-夏の日は素敵で楽しいからです。

長さ37のスニペット

Art thou more cunning than the Ghost?

Opheliaがハムレットにこの質問をするということは、これを読みにくいプログラミング言語に翻訳することを意味しif (Hamlet > the Ghost)ます。繰り返しになりますが、そうです-しかし、「キャラクター」同士がお互いに優れているかどうかを尋ねる必要はないことを示します。他の質問でも機能します。

長さ38のスニペット

[Enter the Ghost, Romeo and the Ghost]

はい、「キャラクター」を2回呼び出しています-プログラムにエラーを表示させたいからです。すでにステージ上にある「キャラクター」を呼び出すか、終了しないことを伝えると、パーサー/コンパイラーに大きな悲しみが生じます。

長さ39のスニペット

the sum of a fat lazy pig and yourself!

完全な指示は、これよりも見栄えが良いので、それをお伝えしますが、...最初の算術演算です!実際、それはどういう意味ですか?まあ、pig汚い動物(おいしい)なので、に相当し-1、2つの形容詞、fat lazy pig等しいを意味し2*2*(-1) = -4ます。しかし、どうyourselfですか?それは再帰的な代名詞であり、名前でも形容詞でもありません。SPLは「キャラクター」間の対話に基づいていることを忘れないでください。したがって、yourselfステージ上の他の「キャラクター」を指します。だから、私たちは最後に到着し、「太った怠pigな豚とあなた自身の合計」が実際にあることを発見します-4 + x

長さ40のスニペット

the sum of a squirrel and a white horse.

はい、別の合計ですが、これはスニペット39よりも簡単です。これは単に1 + 2- 3で、私の数学が正しければ。

ファクトイド (これらの40個の芸術的な綿毛の断片の後も私と一緒にいますか?あなたは賞に値します。)

バージョン1.2.1のSPLは、ここからダウンロードできます

長さ41のスニペット

Juliet:
 Speak thy mind!

[Exit Romeo]

時々、「キャラクター」は、その値を変更するためにステージ上でのみ呼び出されます-実際のプレイでは、これは非常に奇妙なことです。とにかく、ここで、ジュリエットは彼女の最愛のロミオに彼の保存された価値を印刷させ、その後彼はステージを出ます。

長さ42のスニペット

Speak YOUR mind! You are as bad as Hamlet!

繰り返しますが、1行に2つの命令があります(複数指定できますが、スニペットの長さではまだ許可されていません)。ここでは、他の人にその値を出力し、ハムレットが持っている値を想定する「キャラクター」があります。紛らわしい?たぶん。

長さ43のスニペット

Am I as horrid as a half-witted flirt-gill?

これを尋ねるジュリエットは、彼女が低い評価を持っていることを意味しません(実際にはそうかもしれませんが)。ifスニペット23や37のように、単に別のものです。ああ、ほとんど忘れていました。これはに変換されif (Juliet == -2)ます。

長さ44のスニペット

You are as evil as the square root of Romeo!

はい、平方根は悪です、あなたは知りませんでしたか?とにかく、この命令はそれが何をするのかを理解するのに十分簡単です:ロミオに保存された値の平方根の値に話されている「文字」を属性付けます。

長さ45のスニペット

Hamlet:
 Art thou more cunning than the Ghost?

スニペット37は、ラインを話しているキャラクターと適切に書かれています。

長さ46のスニペット

the product of a rural town and my rich purse.

わかりました...とにかく、SPLは、町に財布を掛けることができる世界で唯一の言語かもしれません。これは(2*1)*(2*1)、私があまり間違えていなければ、に等しいことを意味し4ます。

長さ47のスニペット

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

私はあなたにそれを与えます:それは歴史の中で最も奇妙な対話の1つかもしれません。しかし、それはあなたが紹介する奇妙な言語を選択したときに得られるものです。ロミオとジュリエットは、要するに、お互いに値を出力するように言っています。

長さ48のスニペット

You lying fatherless useless half-witted coward!

直接翻訳します2*2*2*2*(-1)-16、 右?

長さ49のスニペット

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

SPLでプログラムを終了する方法の例。シーンを特別に宣言することができます(必須ではありませんが)、ハムレットは別の「キャラクター」に値を出力するように要求し、すべてステージを終了します。そして、はい、彼ら全員がステージを降りる必要があります。

長さ50のスニペット

Othello, a young squire.
Lady Macbeth, an old fart.

適切な指示の前に、より多くの「キャラクター」プレゼンテーション。いつものように、コンパイラにとって重要なのはOthelloand だけなLady Macbethので、残りの行はグラブのために用意されています...

もう1つ:SPLプログラムに登場するために「キャラクター」を互いに関連付ける必要はありません。そのため、同じプレイでロミオ、オセロ、ハムレットを使用できます。

ファクトイド (これらの半世紀?ふー!この後、私はウィリアムシェークスピアを嫌うつもりだと思う...)

SPLからCへのトランスレーターは、さきほど言及し、SPLクリエイターによって開発されましたが、FlexBisonに基づいていました。

長さ51のスニペット

Othello:
 Recall your great dreams. Speak your mind!

(ロミオ、ジュリエット、ハムレットにうんざりしています...オセロを連れて行きましょう!)

Recall推測できるように、ここが鍵です。Othelloがアドレス指定している「キャラクター」は、自分のスタックから値を取得し、その値を仮定し、その後、それを出力します。

長さ52のスニペット

Thou art as pretty as the sum of thyself and my dog!

別の合計。欠伸。これがハムレットに宛てられていると仮定すると、ということHamlet = Hamlet + 1です。またはHamlet += 1。またはHamlet++

長さ53のスニペット

Romeo:
 You are as vile as the sum of me and yourself!

ああ、はい、私が前に言及するのを忘れていました:話す「キャラクター」は自分の行で自分自身に言及することができます。

長さ54のスニペット

Juliet:
 Is the sum of Romeo and me as good as nothing?

条件に含まれる前のスニペットの別の例。ここにあるのはif (Romeo + Juliet == 0)

長さ55のスニペット

Juliet:
 You are as lovely as the sweetest reddest rose.

ですから、ここで、ジュリエットは彼女が話している「性格」を賞賛しています(シェークスピアのためにロミオだと仮定しましょう)、彼/彼女は4人であると宣言します。

長さ56のスニペット

Othello:
 You lying fatherless useless half-witted coward!

スニペット48は適切に行われ、「キャラクター」が含まれています。スクロールするのが面倒な場合(私がそうであるように)、これはin辱されている人が値-16を受け取っていることを意味します。

長さ57のスニペット

Romeo:
 If not, let us return to Act I. Recall thy riches!

一般に、SPLで条件がどのように機能するかについては既に説明しました。ただし、よりインライン分析が必要です。ここにはありませんelse。インスタンスごとに、この例では、条件が失敗した場合、プログラムはAct Iに戻ります。しかし、もしそれが本当なら、それは次の命令Recall、つまりスタックからのポップ、に続きます。

長さ58のスニペット

Romeo:
 You are as disgusting as the square root of Juliet!

スニペット44を取得し、指示の提示方法を提示します。これがロミオとオセロの間の対話であった場合、これをJavaに変換できますOthello = Math.sqrt(Juliet)

長さ59のスニペット

Othello:
 You are as vile as the sum of yourself and a toad!

オセロがロミオと話している場合、これは次と同等Romeo+(-1)です。Romeo--、略して。かなり基本的ですね。それがあなたにとってのSPLです。

長さ60のスニペット

Is the quotient between the Ghost and me as good as nothing?

簡単に言うif (The Ghost/Hamlet == 0)と、「私」がハムレットに属していると仮定します。

長さ61のスニペット

Thou art as handsome as the sum of yourself and my chihuahua!

言葉とin辱のレイヤーとレイヤーを剥がすと、クールな機能やものがないSPLが基本的なものであることに気付くでしょう。そのため、プログラムの本体には、算術関数のロードとロードがあります。したがって、これがジュリエットに宛てられた場合、それはと同等になりJuliet++ます。

長さ62のスニペット

twice the difference between a mistletoe and a oozing blister!

はい、はい、より多くの算術演算。大体、これらの62バイトのSPLはに変換できます2*(1-2*(-1))。これは非常に素晴らしいゴルフ言語ですよね?右。

長さ63のスニペット

You lying stupid fatherless rotten stinking half-witted coward!

スニペット48は-16を出力し、これは-64に等しくなります2*2*2*2*2*2*(-1)

長さ64のスニペット

your coward sorry little stuffed misused dusty oozing rotten sky

私がSPLについて理解していることから、これは完全に合法です。「ポジティブな」名詞に進むin辱的な形容詞がたくさんあります。形容詞は否定的であるかどうかにかかわらず特別な区別がないため(値は右側の数値に2を掛けるだけです)、このような完全に愚かな文を作成できます。これは256と同等2*2*2*2*2*2*2*2*1=256です。

長さ65のスニペット

You are nothing! You are as vile as the sum of thyself and a pig.

うーん、そんなに嫌いじゃないですか?したがって、ここにあるものは、y=0; y=y+(-1);おそらく「ゴルフ」された可能性がありますYou are a pig!が、そうです。

長さ66のスニペット

You are as beautiful as the difference between Juliet and thyself.

だから、ジュリエットを自分から引きますね?これはデコードするのがとても簡単です:Romeo=Juliet-Romeo;話されているのはロミオだと仮定して。

長さ67のスニペット

Juliet:
 Am I better than you?

Romeo:
 If so, let us proceed to Act V.

ほとんどの条件がSPLでどのように機能するか。式をテストし、それが真の場合(またはスニペット33を参照)、プログラムの別の部分にジャンプします。それ以外の場合は、次の文に進みます。

長さ68のスニペット

The Ghost:
 You are as small as the sum of yourself and a stone wall!

はい、はい、私は少し単調になっています。しかし、SPLはそのようなものです。少し前に述べたように、その式は算術演算の混合です。したがって、これはさらに別の増分です- stone wallは中立の「名詞」です。

長さ69のスニペット

Thou art as disgusting as the difference between Othello and thyself!

合計の代わりに、オセロと話しかけている2人のキャラクターの差を取ります。

長さ70のスニペット

You are as handsome as the sum of Romeo and his black lazy squirrel!

私たちは追加に戻ります、はい-公式と呼んでください。これをに翻訳しRomeo + 2*2*1ます。

長さ71のスニペット

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

シーンはこれほど小さくすることができます。Julietステージに入ると、オセロは保存した値を出力するように彼女に伝え、その後再びステージから降ります。

長さ72のスニペット

twice the difference between a mistletoe and an oozing infected blister!

もう1つの算術演算-SPLがそれらに満ちているため。これをに翻訳でき2*(1-2*2*(-1))ます。

長さ73のスニペット

You are nothing! Remember me. Recall your unhappy story! Speak your mind!

連続した4つの指示?!実際、私は自分自身をとても誇りに思っています。とにかく、これがロミオとジュリエットの間の対話であると仮定しましょう(そして彼は話します):これは、ジュリエットの値が0から始まることを意味します。その後、ジュリエットはロミオの値をメモリのスタックにプッシュし、ポップして、入力された形式で出力します。シンプルでしょ?

長さ74のスニペット

You are as sweet as the sum of the sum of Romeo and his horse and his cat!

ええ、ええ、退屈な例、私は知っています。しかし、これはX = (Romeo + 1) + 1です。

長さ75のスニペット

Is the remainder of the quotient between Othello and me as good as nothing?

まあ、これは非常に簡単です。デコードスキルが正常に機能しない場合は、に変換されif (Othello % X == 0)ます。

長さ76のスニペット

Thou art as rich as the sum of thyself and my dog! Let us return to scene I.

スニペット26からのジャンプとその前の式。gotoSPLのA は常に条件の近くにあるとは限りません。これは次のようになります。もちろん、このタイプのgotoコードは常にActまたはSceneの最後にあります。最初の指示は非常に簡単ですx=x+1

長さ77のスニペット

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

ジュリエットとハムレットがステージにいます。しかし、私たちはロミオからの価値を必要としています。したがって、コンパイラを非常に厄介な頭痛から解放するために、最初にステージからハムレットを削除します(移動するのはジュリエットだったかもしれませんが)、ロミオにステージに立つように指示し、ジュリエットは番号(スニペット21の説明を参照)、ロミオはステージから出てハムレットが戻ります。とても単純明快です。

長さ78のスニペット

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

そのため、The Ghost(ハムレットの亡くなった父親)は、マクベス夫人に値を出力するように伝えています。


32
この信じられないほど面白くてあなたのプロフィール写真はぴったりです。彼は私がSPLプログラマーが想像するものとまったく同じように見えます。
オーバーアクター

3
@overactor um辱されるべきか、ガンビーに例えられることを誇りに思うかはわかりません。^ _ ^
ロドルフォ・ディアス

9
奇妙なことに、これはここで例を読むのが最も曖昧ではありません...そして「最も実用的でない」と結びついているようです。
HRランブラー

6
ROFLはここであなたを助けるために+1です-違反ロドルフォにもう一度!
HRランブラー

3
@RodolfoDias始めることができます。会えるのを待っています。投票数は120です。
ghosts_in_the_code

176

ピート

ファクトイド

Pietは、ソースコードが画像で構成されるプログラミング言語です。プログラムフローは左上のピクセルから始まり、終了するまでピクセルとピクセルグループの間で画像内を移動します。

読みやすくするために、Pietプログラムは通常、拡大版で表示されます。そのような場合、この用語codelは、ソース画像の個々のピクセルに対応する同色のピクセルのグループを表すために使用されます。

この課題では、Pietは文字を使用しないため、サンプルプログラムには投票ごとに1つのcodelが使用されます。

1コーデル

1コーデル

これは有効なプログラムであり、何もせずに終了します。制御フローは左上(のみ)ピクセルから始まり、抜け道がないため、プログラムは終了します。

この場合、ピクセルはまったく同じ効果の任意の色にすることができます。

2コーデル

2コーデル

これにより、標準入力から文字が継続的に読み取られ、Unicode値の現在の合計が保持されます(ただし、この合計では何も実行されず、表示されません)。

プログラムの流れは、2つのコーデルの間を行き来します。なぜなら、それぞれから出る唯一の方法は、他のコーデルに向かうからです。pietのコマンドは、2つの領域の色相と明度の違いに応じて、1つのコーデルまたは領域から別の領域に移動することにより実行されます。input左から右への移動コマンドで、次にadd右から左です。最初のaddコマンドでは、スタックに値が1つしかないため、何も起こりません。仕様では、使用可能な値が十分にないコマンドは無視されるとされています。

このプログラムは、プログラムフローを適切に「トラップ」して終了するために少なくとも数個のコーデルを必要とするため、ほとんどのパイエットプログラムは非常に小さいサイズであるため、終了しないループです。

3コーデル

3コーデル

これは基本的なエコータイプのプログラムで、一度に標準入力から文字を読み取り、標準出力に出力します。

繰り返しますが、これは無限ループです。プログラムは、左から右走行、したことから始まりinput、その後output。プログラムは、可能な限り同じ方向に流れ続けます。薄緑色のコーデルでは、唯一の出口は逆方向に戻ることです。右から左に戻るsubtractと、addコマンドとコマンドを実行しようとしますが、スタックは空なので、これらはノーオペレーションになります。

4コーデル

4コーデル

2を標準出力に無期限に出力します。

機能的には特に興味深いプログラムではありませんが、ようやく多数のコーデルが揃ったので、左から右よりも少し高度なフローを見せることができます。プログラムフローがコーデルを終了しようとすると、まず現在の方向を試みます。それができない場合(この場合、画像の端が原因)、時計回りに90度回転し、再び終了しようとします。この場合、プログラムは一度に1コーデルずつ時計回りに回りpush、スタックに1を2回入力し、それらを1つにaddまとめてからoutput、結果を取得します。

5コーデル

5コーデル

stdinから一度に1つの文字を繰り返し読み取り、Unicode値の合計を追跡します。

これは基本的に2コードバージョンと同じ機能ですが、この課題は言語を紹介することに関するものであり、pietの素晴らしい点の1つは、同じことをする異なる外観の写真をどのように作成できるかです。

ここでは、白いコーデルが初めて表示されます。これにより、命令を実行せずにプログラムフローをスライドさせることができます。ここでは、マゼンタとブルーのコーデルがすべての作業を行います。青から赤への移動は、真ん中の白いコーデルを横切るため、何もしません。2つの赤いものpushはスタックに番号1 だけで、pop左から右、右から左に移動し、白いコーデルを横切って移動し、命令は実行されません。

6コーデル

6コーデル

繰り返しますが、以前の機能を異なる外観で繰り返します。これは、標準入力から標準出力に一度に文字を読み取る別のエコープログラムです。

ここに、最初の黒いコーデルがあります。プログラムフローは黒のコーデルを入力できないため、右上の明るいマゼンタのコーデルから、プログラムはイメージエッジのため右に終了できず、黒のコーデルのために終了せず、左に赤のコーデルに戻ります。 。青と緑のコーデルは純粋に装飾的であり、プログラムは決してそれらを入力しません。

7コーデル

7コーデル

外観が異なるさらに別のエコープログラム。

ここでは、サイズ1よりも大きい最初のコーデルブロックが表示されます。pietでは、同じ色のコーデルの連続したブロックは、単一のブロックとして扱われます。ブロックのサイズは、push命令を実行するときを除いて重要ではないため、このプログラムは、色が異なることを除いて、3-codelバージョンとまったく同じように扱われます。

8コーデル

8コーデル

stdinから数値を読み取り、正方形をstdoutに繰り返し出力します。

制御フローは、4-codelプログラムと同様に、基本的な時計回りのパターンです。左上から順に操作はinputduplicate(スタック上にスタックの先頭値の余分なコピーをプッシュ)multiplyoutput。次にpush、値1をスタックにesし、白を横切ってコマンドが実行されないようにします。次にpop、左下から左上コーデルに移動すると、スタックからその1を取り除きます。これにより、空のスタックでプログラムの先頭に戻り、繰り返されます。

9コーデル

9コーデル

1 + 2 = 3を追加してから終了します。

両方の次元に2つ以上のコーデルを持つプログラムができたので、プログラムをトラップし、永久にループする代わりに終了する領域を最終的に設定できます。赤のコーデルから濃い赤の領域に移動する最初の操作pushは1で、その後、プログラムは回転して中央の薄赤のコーデルに流れ込みpush、値2になります。淡い赤から淡い黄色へのフローが実行されますadd操作。下部の明るい黄色のバーは、すべてのコーナーがブロックされているため、プログラムが流出する方法がないため、プログラムを終了します。


1位と2位のプログラムはすぐに見苦しくて面白くないので、この点から、各方向に少なくともいくつかのコーデルを許可する数値に焦点を当てます。

12コーデル

12コーデル

最後に、有用であると主張される可能性のあることを行うプログラムです(ただし、まだ少しストレッチがあります)。stdinから2つの数値を順番に読み取り、その合計を出力し、これを繰り返します。

プログラムはinputsaddコマンド2を実行する4つの色付きバーを左から右に流れます。次に、右下のコーデルに移動してを実行しoutput、白い領域を左に移動して最初に戻ります。

これは8つのコーデルで実行できますが、余分なスペースがあるため、古い無信号テレビディスプレイに少し触発されたものを作成できます。

15コーデル

15コーデル

stdinから数値を読み取り、その正方形を出力します。

これは、いくつかのトリックを使用して、実際に何かを行うプログラムに少し対称的な外観を与えます。左端の赤いバーは、下のコーデルの色が他のバーとは異なり、(少なくとも私にとっては)これら2つの赤い色合いが非常によく似ているという事実を利用しています。プログラムは明るい赤色の領域から明るい青色のコーデルに移動し、プログラムの中央をまっすぐ横切って、右側の薄い緑色にトラップされます。それは実行しinputduplicatemultiply、およびoutput操作。

真ん中の列の上部と下部にある中程度の緑色のコーデルとともに、より暗い赤色のコーデルは装飾的であり、プログラムは決してそれらに到達しません。

20コーデル

20コーデル

0が読み取られるまでstdinから数値を読み取り、その時点で入力されたすべての数値の合計を出力して終了します。

最後に、pointer操作の形で制御フローを実行するのに十分なスペースがあります。上部の4つのコーデルは、、、および操作を実行しinput、右上のマゼンタからその下の2コーデルの黄色に移動する別の操作を実行します。この操作は、スタックから一番上の値をポップし、一番上の値が0の場合は1をプッシュし、そうでない場合は1をプッシュします。そのため、ゼロ以外の値をダブルで1に置き換えます。黄色のバーから濃い青に移動すると、スタックから一番上の値がポップされ、方向ポインターが時計回りに何度も移動する操作が実行されます。duplicatenotnotnotnotpointer

一番上の値が1の場合(つまり、ゼロを入力しなかった場合)、方向ポインターは左を指し、add操作のためにマゼンタコーデルに移動します(スタックに値が1つしかないため、最初は無視されます)。その後、プログラムの開始に戻るまで白を介して。

ポインター操作でスタックの最上位の値がゼロの場合、方向ポインターは変更されず、プログラムは下方向に継続します。明るい青色のバンドに移動するpopと、スタックから入力された0が累積された数値の合計のみを残します。一番下のシアンのバーに移動すると、outputその合計になり、プログラムフローがトラップされるため終了します。

25コーデル

25コーデル

カウントダウン!stdinから数値を読み取り、1ずつカウントダウンして1つずつstdoutします。たとえば、5を読み取ると、54321が印刷されます。

シアンから黄色への最初の操作はinputです。その後、黄色はプログラムの「ループ」が始まる場所です。イエロー>マゼンタ>ブルーはduplicateその後であるoutputため、スタックの一番上の値を印刷しますが、コピーは保持します。右側を下に移動させる、我々は、pushスタックに値1を次に実行subtraction隣に1だけ我々の入力された値を減少させる、duplicatenot、及び他のnotその横暗黄色に右下にライトマゼンタから移動します。これは、前のプログラムと同じゼロ/非ゼロチェックです。水色のコーデルにpointer左に移動すると、操作が実行されます。完了したら、プログラムを終了するために濃いシアンに左に移動するか、初期入力なしでループを再開するために黄色まで移動しますが、元の値は減少します1。

3つの赤いコーデルはすべて装飾用で、どのような色でもかまいません。

30コーデル

30コーデル

フィボナッチジェネレーター。フィボナッチ数列の項を標準出力に出力し、停止しません。

これは、roll演算子の最初の導入でありpush、特定の値をスタックに取得するために1より大きい領域サイズが演算子で使用されるのは初めてです。

いつものように、左上から右に移動します。最初の2つの操作pushはスタックに対して1を実行しoutput、フィボナッチシーケンスは2つの1で始まるため、メインプログラムループは1を1回だけ出力します。次に、pushさらに2を1スタックに積んで、右上の濃いマゼンタで終了し、メインプログラムループを開始します。

私たちは、右側を下に移動duplicateし、outputその後、シーケンスの次の言葉をオフに印刷するにはduplicate、現在のシーケンス値のコピーを取得するために、再び。下を左に移動すると、2つのpush操作が実行されます。右下の明るい赤色の領域のサイズは3コーデルであるため、最初のコーダルはpush1ではなく3をスタックにプッシュします。

水色に上がるのはroll操作です。これにより、スタックから上位2つの値がポップされ、ポップされた最初の値に等しい数のロールが、ポップされた2番目の値に等しい深さまで実行されます。この場合、深さ3まで1ロールを実行します。深さへのロールnは、スタックの最上位の値(複製された現在の値)を取得し、n深く配置します。スタックの深さは現在3つしかないため、一番上の値を一番下に埋めます。

もう一度上に移動addすると、現在のシーケンス値と前のシーケンス値を加算する操作が実行されます。スタックの次の(新しい現在の)シーケンス値が一番上になり、最後の値がその下になります。これで、プログラムは白を横切って濃いマゼンタに移動し、ループを再び開始します。

中央の黄色のパターンは使用されません。

54コーデル

54コーデル

「hi!」を印刷します 標準に

特に長いメッセージではありませんが、pietでの印刷には驚くほどのスペースが必要です。ユニコード値を使用して印刷が行われ、終了する領域のサイズを使用して整数がスタックにプッシュされます。この課題に対応するコーデルの数は非常に限られているため、必要な印刷可能範囲に到達するために数学を使用します。

プログラムはpush、左側のシアン領域から5で始まります。ここからduplicate、スタックを5秒でプライミングするために、6つの操作で最上部に沿って流れます。次はpush1でsubtract、4をスタックの一番上に置き、2つのmultiply操作で4 * 5 * 5 = 100をスタックの一番上に置きます。その後、duplicate2 100秒間。

これでプログラムは黒から跳ね返り、下部に沿って左方向に動き始めます。Push3と2の操作、次にroll2の100を5の下に埋めるための操作。次にpush1を減算し、加算して、スタックの最上部に100 + 5-1 = 104を取得します。これは、ユニコード "h"です。次の2つの操作はpush1でpointer、角を曲がって真ん中に沿って移動を開始し、output「h」を印刷します。

次はadd、スタックの一番上にある100 + 5 = 105で、output「i」を印刷します。スタックには2つの5が含まれています。Push図1は、addmultiply(1 + 5)* 5 = 30が得られます。最後にpush3とadd33の場合、およびoutput末尾の「!」の場合。その後、プログラムは残りの空白を右に進み、右側の緑で終わります。


5
そうそう、これを待っていた:)
Sp3000

2Dキャラクター言語とはどう違うのですか?セルの値を伝える方法です。
JDługosz

25
@jdlugosz多くの難解なプログラミング言語は、それを理解すると、コマンドをエンコードする独自の方法を備えたほんの数個の基本的なスタック操作コマンドです。私は個人的にそれらを画像にエンコードすることは素晴らしいアイデアだと思います。
スペンサー

13
機能的同等性について話している場合、「チューリングマシンとはどう違うのですか?」しかし、その後、あなたは...猫で同じ質問、または惑星木星、あるいは他の言語のいずれかを平準化でき
センモウヒラムシ

3
9 codelの例は、ミニポケットボールのように見えます。いいね
The_Basset_Hound

155

> <>(魚)

(注:一部のスニペットは以前のスニペットに基づいているため、ほとんどの回答とは異なり、私はそれらを最も早いものから最新のものに変更することにしました。)

ファクトイド:

Befungeと同様に、> <>はスタックベースの2D言語です。これは、命令がほとんどの従来の言語のように直線的に実行されないことを意味します。プログラムフローは上下左右になります。

長さ1のスニペット:

X

X> <>では無効なコマンドなので、エラーメッセージsomething smells fishy...が出力されます。実際、これは、原因がゼロによる除算であるか、空のスタックをポップしようとしているかに関係なく、> <>の唯一のエラーメッセージです。

長さ2のスニペット:

1n

> <>のプログラムフローは左上から始まり、最初は右方向です。11をスタックにプッシュしnてから、数値として(ASCII文字ではなく)印刷します。しかし、> <>プログラムはトロイダルです。つまり、命令ポインターは行の終わりに達すると折り返されます。したがって、n先頭に折り返した後、1を押して、印刷し、先頭に折り返し、1を押して、印刷を実行すると、最終的に1sが印刷されます。

長さ3のスニペット:

"o;

以下"は文字列の解析でo、ASCII文字として出力され;、プログラムを終了します。しかし、プログラムは実際に全体として何をしますか?

まず、文字列の解析を開始し、表示されるすべての文字を、終了を見つけるまでスタックにプッシュします"o、次に;... をプッシュし、命令ポインターを先頭にラップします。しかし、今は文字列の解析"停止し、最後にoand ;を通常どおり実行して、スタックの先頭(;)を出力して終了します。

はい、文字列の開始と終了に同じ引用文字を使用しました!

長さ4のスニペット:

42n;

これまでに見てきたことに基づいて、これは42をプッシュし、数値として出力してから終了すると予想するかもしれません。ただし、> <>内のすべての命令は単一の文字であるため、実際には4と2をプッシュ、スタックの先頭を数値(2のみ)として出力して終了します。

長さ5のスニペット:

<v
;>

> <>は2D言語です。これは、プログラムの流れの方向を変える方法がなければならないことを意味します!

Befungeのように、これを行う1つの方法は矢印を使用すること>^v<です。それらがどのように機能するかを説明するために、上記のプログラムを見てみましょう。

  • プログラムフローは最初は右向き
  • < プログラムの流れを左方向にします—左から外に向かって回ります v
  • v プログラムの流れを下向きにします。 >
  • > プログラムの流れを右方向にします。 ;
  • 最後に、終了します。

長さ6のスニペット:

";"00p

> <>のもう1つのクールな機能は、再帰的であることです。プログラムは、独自のソースコードをその場で変更できます。

ここで、を押した;後、2つのゼロを続けます。p次いで、トップ三つの要素ポップyxvyスタックの最上位である)と場所をv位置x,y。つまり、pこのプログラムでは、セミコロンをその位置に配置0,0して、コードをに変え;;"00pます。これにより、命令ポインターがラップされて新しく配置されたを実行するため、プログラムを終了できます;

長さ7のスニペット:

\7*n;
6

国連 Befunge等は、> <>また、ミラー(持つ\/|_#プログラムの流れの方向を反映します)。だからここで:

  • 右向きに開始しますが、\下向きに反映されます
  • 6を押してラップ
  • の後ろを叩き、\右に振り返る
  • 7を押す
  • スタックのトップ2を乗算します
  • 出力および終了

_ミラーを水平に移動したり、ミラーを垂直に移動したり|するのは無操作です。

長さ8のスニペット:

"r00g>o<

エラーのスローが許可されている場合、おそらく最も単純な> <>クインです。ここでの2つの新しい手順は次のとおりです。

  • r:スタックを逆にします
  • g:Get — pop yx、文字をx,yスタックにプッシュします(に対応p)。

以前のストリングラッピングトリックを使用して、プログラムは最初にプッシュしr00g>o<、最初の引用を再度ヒットします。次に、スタックが反転され、が与えられ<o>g00rます。その後、に文字をプッシュ0,0"、を与え<o>g00r"ます。最後に、o2つの矢印の間をトラップし、何もなくなるまでスタックの最上部を出力し、エラーを取得します。

長さ9のスニペット:

x0\>
\1n>

x(小文字)は命令ポインタをランダムな方向に移動し、プログラムはランダムビットを永久に出力することでこの機能を紹介します。矢印とミラーをたどって、これがどのように機能するかを理解してください (上下を含む4つの方向すべてを確認することを忘れないでください)

長さ10のスニペット:

;a comment

> <>にはコメント構文はありません—必要ありません。必要なものをどこにでも書いて、コードとして実行されないようにしてください!

長さ11のスニペット:

1!X2!X+!Xn;

!指示をスキップするトランポリンです。使用されるときに特に有用だ?条件スタックの先頭をポップし、ポップ要素が非ゼロである場合、次の命令を実行トランポリン。これについては後で説明します。

上記のコードはXsをスキップして3を出力し、のみを実行し1! 2! +! n;ます。

長さ12のスニペット:

01v
ao>:@+:n

フィボナッチ数を1、各行に1つずつ、2番目から永久に出力します。新しいコマンドは次のとおりです。

  • a:改行に必要な10を押します。a-fそれぞれ10〜15を押します。
  • ::スタックの最上部を複製
  • @:スタックの上位3つの要素を回転します[5 4 3 2 1] -> [5 4 1 3 2]

最初の数回の繰り返しのトレース:

ここに画像の説明を入力してください

長さ13のスニペット:

i:d=?v
l?!;o>

入力の行を読み取り、それを逆に出力する「tac」プログラム。スニペットの@tomsmedingに感謝します。

=上の2つの要素をポップし、等しい場合は1をプッシュし、そうでない場合は0をプッシュします。最初の行は、ASCII文字13(キャリッジリターン)が見つかるまで入力を読み取り続け、その時点で2番目の行に移動します。

l?!;oループは、スタック全体を出力> <>で重要構築物です。とは異なり>o<、エラーは発生しません。これがどのように機能するかです:

  • l スタックの長さをプッシュします
  • 以下で長さをチェックし?ます:
    • 長さがゼロ以外の場合、次の命令!が実行され、スキップされます;
    • 長さゼロの場合、実行されず!、終了しないため;

キャリッジリターンを押すまで、実際には出力は行われないことに注意してください。

長さ14のスニペット:

32.

   X67*n;

プログラムフローの方向を変更することに加えて、実際に命令ポインタを好きな場所に移動できます!

.指示ポインタをにポップしyxテレポートしてx,y、方向を維持します。ただし、行きたい場所の1つ前に移動する必要があることに注意してください。次の命令が実行される前に、命令ポインタが更新されます。そのため、ここでは命令ポインターがinvalid Xに到達しますが、ポインターは6実行を続ける前に移動するため、すべてが問題ありません。

.ほとんどのプログラムをワンライナーに変換できますが、なぜ2Dの面白さを失いたいのですか?:)

長さ15のスニペット:

01+:aa*=?;:nao!

番号099、各行に1つずつ出力します。このプログラムは、!トランポリンのきちんとした使用方法を示しています-最初の0が一度だけプッシュされるようにします。

長さ16のスニペット:

"r00g!;oooooooo|

エソランページのクインに触発された、エラーをスローしない適切なクイン。

以前のクイン(スニペット#8)を変更してエラーが発生しないように考え、「なぜ大量のo指示を追加しないのか」と考えたo場合は、追加するたびに気付くかもしれません、別のものを出力する必要がありますo!このクイン|は、最後にミラーを配置することで問題をきちんと解決oします。これにより、それぞれを2回使用できます。

単一引用符(文字列の解析にも使用)に切り替えると、使用しない代替クインg

'r3d*!;oooooooo|

長さ17のスニペット:

b2,63,.

   17,n;

加算(+)、減算(-)、乗算(*)、モジュロ(%)...がありますが、除算はどうですか?そこにありますが、/既にミラーであるため、,代わりに部門にシンボルが割り当てられています。興味深いことに、除算は整数除算ではなく浮動小数点除算です!

上記のプログラムは、にジャンプしようとすることにより、未定義の動作を調査し11/2, 6/3ます。Pythonのintepreterは、(それが間違った場所にジャンプが)座標最初が整数でない場合は大丈夫そうですが、2番目がない場合はチョーク。

長さ18のスニペット:

123456${{$}nnnnnn;

rスタックを反転さ@せ、上位3つの要素を回転させるものを見てきました。スタック上の要素を移動するいくつかのコマンドを次に示します。

  • $:上の2つの要素を入れ替えます
  • {:スタック全体を左にシフト
  • }:スタック全体を右にシフト

これがどのように機能するかを示すために、プログラムトレースを次に示します。

123456 ------> 123465 ------> 234651 ------> 346512 ------> 346521 ------> 134652
       $ Swap        { L shift      { L shift       $ Swap        } R shift

次に、を出力します256431

長さ19のスニペット:

"reward"4[roooo]oo;

今まで私は「スタック」、「スタック」と言ってきました...

ほとんどのプログラムは1つのスタックしか使用しませんが、> <>は実際には複数のスタックを持つことができます!関連する手順は次のとおりです。

  • [x上のx要素をポップして新しいスタックに移動します
  • ]:現在のスタックを削除し、その値を基になるスタックに移動します。

上記のプログラムのトレースは次のとおりです。

       [r e w a r d]       Push "reward"
4[     [r e] [w a r d]     Move four elements to a new stack
r      [r e] [d r a w]     Reverse the current stack
oooo   [r e] []            Output "ward"
]      [r e]               Remove the current stack, no values to move
oo     []                  Output "er", giving "warder" altogether

単に押すことに注意rewardし、その後で再びそれを出力するoooooo印刷しdrawer、スタックの性質を「最終、初」に起因して、。

長さ20のスニペット:

aa*5+\
7a*2+\
oo;  \

> <>のあまり知られていない機能は、Pythonと同様に、多くの場合、行の継続にバックスラッシュを使用できることです。*

上記のコードは機能的に同じです

aa*5+7a*2+oo;

*免責事項:これが機能する理由は、まったく異なる理由である場合とそうでない場合があります

長さ22のスニペット:

1&fv ;n&<
&1->:0=?^:&*

スタックに加えて、> <>には、値を格納するために使用できるレジスタ(スタックごとに1つ)もあります。&初めて呼び出すと、スタックの一番上の値がレジスタに&移動し、再度実行すると値が戻ります。これは、合計や階乗などの値を累積するときに非常に役立ちます。

上記のプログラムは、f(15)の階乗を計算し、1307674368000を出力します。次のようにf置き換えられ4ます。

ここに画像の説明を入力してください

長さ24のスニペット:

"Hello, World!"rl?!;of0.

みんなのお気に入りのプログラムに十分な数の文字があります!ここでは.、出力ループにテレポーターを使用します。

長さ25のスニペット:

0i:0(?v$a*$"0"-+!
   ;n~<

残念ながら、> <>は一度に1文字のSTDINからの読み取りのみを許可するため、数字の読み取りが少し難しくなります。0から9の数字で構成される入力の場合、このプログラムは本質的にatoiであり、数字の文字列をSTDINからスタック上の数字に変換します(その後印刷されます)。

もう1つの注意点は、EOFでは、i-1をスタックにプッシュすることです。これにより(、または「より小さい」を使用して0と比較することにより、EOFのチェックが容易になります。

このスニペット~では、スタックの最上位要素をポップして破棄するを使用しています。

長さ33のスニペット:

i>:nao:1=?;\
 ^  ,2v?%2:/
 ^+1*3<

これまで、ほとんどのスニペットは比較的線形であるか、または<>の機能を示す単純な例でした。これで、よくレイアウトされたプログラムを使用して、プログラムフローを> <>で視覚化するのがいかに簡単かを強調する例を挙げることができます。

プログラムは単一のASCII文字を読み取り、3x+1そのコードポイントでアルゴリズムを実行します(> <>では、文字は基本的に整数です)。アルゴリズムの各ステップは、1に達するまで出力されます。

以下は、入力a(コードポイント97)を使用した最初の数回の反復のトレースです。

ここに画像の説明を入力してください

長さ44のスニペット:

a&>i:0(?v"+"$\
/&^?=0l< "a*"/
\:1+&2p/\0
n
;

私はpコマンド正義をやったとは思わず、スニペット#6で一度だけ使用したので、ここに別のatoi関数があります。これについて何がいいですか?プログラム、入力を読み取るときに数値を計算するために必要な式を記述します!

のような入力の場合573、すべての文字が読み取られた後、3行目の終わりは\0a*5+a*7+a*3+573に評価されるのようになります!

繰り返しますが、入力は数字のみであることが期待されています。ここでGIFをトレースします

長さ74のスニペット:

>i:'A'(?v:'N'(?v:'['(?v\
  :'a'(?v:'n'(?v:'{'(?v\
^      o<    +d<  -d-d<o

あなたがここにたどり着くことができたなら、これが非常に読みやすいROT13プログラムであると私が言うとき、あなたは私に同意するかもしれません。チャー与えc1、我々は、最初の文字を見つけるc2AN[an{するように、c1 < c2その後、減算/加算することにより適切なオフセット適用する、d(13)。[および{はそれぞれZとの直後の文字であることに注意してくださいz

コンソールで試してみて、入力中に文字が変化するのを見てください!

(入力をパイプすることもできますが、EOFチェックが欠落しているため、:0(?;-1をcharとして出力しようとするとエラーで停止します)


13個のスニペットのアイデア:i:d=?v NEWLINE o;!?l<-入力行を逆方向に出力します
-tomsmeding

12
私は今、学習を開始するためにインスピレーションを得ています、私はこれまでより多くの票を与えることがしたい> <> ...
Robobenklein

6
一番上から始めて下に行くための+1(そしてそれは読むのが楽しいからです)。
mbomb007

5
@ mbomb007しかし、注文が左/右に移動してページの下部に
折り返す

something smells fishy...次の行に書いた場合、長さ8のスニペットは本当の馬です。
wizzwizz4

148

C – 編集

投票ありがとうございます!他の言語と限られたバイトで何ができるかと比較すると、Cは時代遅れで、うるさく、開発者に依存しすぎているように見えます。多くの点で、自動メモリ管理を備えたスクリプト言語および高レベル言語は、Cがこれまでよりもはるかに表現力があり、生産が速くなります。

では、なぜ機能Cなのでしょうか?

これらすべてのスクリプト言語の背後にある隠された秘密は、インタプリタがおそらくC(または最近ではC ++またはJava)で書かれていることです。実際にCコードにコンパイルされた最初のC ++コンパイラ。実際、直接コンパイラーの市場ができるまで、Cを生成するコンパイラーを作成し、それをコンパイルする方が通常は費用対効果が高くなります。

非常に小さなプラットフォームで作業している場合、おそらくオペレーティングシステムが利用できない場合でも、Cで作業している可能性があります。最近では、ほぼすべてのアプライアンスにマイクロコントローラが組み込まれています。小さくて速い、Cが道です。(また、FORTH、マゾヒストのために。)

Cを知っていると、アセンブラーに入らずにできる限り金属に近づくことができ、他の言語でも役立ちます。C ++仮想関数がおそらくどのように機能するかについての良いアイデアがあります。PHPで値渡しの再帰関数を作成すると、内部で多くのメモリ割り当てとコピーが行われるため、本能的に参照渡しを試してください。コールバックとリファレンスはC開発者を驚かせませんが、おそらくHaskellはそうします。

KernighanとRitchieが古典的なCプログラミング言語、第2版の序文で述べたように、Cは大きな言語ではなく、大きな本ではうまく機能しません。私はこのアドバイスに従おうとしています:可能な場合、例は2倍、3倍、またはそれ以上の義務を果たします。

すべてのスニペットは、少なくとも単独でコンパイル可能です。リンク可能で実行可能なものは、そのように示されます。これは要件ではないことはわかっていますが、コードスニペットを機能させるために必要なフレームワークを説明するよりも簡単になります。

また、各コードスニペットができる限り短くなるようにして、特定の長さだけを埋めるために余分なスペースを導入しないようにしました。コードがインデントされている場合、インデントは長さに含まれず、新しい行ごとに1文字だけです。

ファクトイド

Cロック。

長さ0のスニペット

世界最短の自己繁殖プログラムhttp://www.ioccc.org/1994/smr.hint

長さ1のスニペット

;

Cは、コンパイルとリンクを区別します。Cの多くのエンティティは、後でコンパイルおよびリンクされるだけです-例は、すべて静的および動的ライブラリです。

他のエンティティは含まれているだけで、それ自体ではコードを生成しません。

上記のセミコロンは確かにオブジェクトコードにコンパイルされ、何もしません!

長さ2のスニペット

x;

古いプログラミング言語であるCは、いくつかの反復を経てきました。最も初期に広く使用されたのは、カーニハンとリッチーによって開発され、K&Rと略されました。K&R Cは、コードを明示的に提供しない場合、コードについて多くの仮定を行うことで注目に値します。

特に、K&R Cでは、上記のコードはx0に初期化されたグローバル整数であると想定されます。K&Rモードでコンパイルすると、この変数にリンクするプログラムを提供するオブジェクトファイルが生成されます。

長さ3のスニペット

??/

Cは非常に普及しているため、使用するすべての文字を持たないシステムに互換性機能を提供する必要があります。上記はバックスラッシュの3文字表記で、Cでは行継続文字として使用されます。上記はコンパイルされますが、おそらく次の行がないという警告が表示されます。

Cの一般的な文化は、コンパイルの警告を無視することです。多くの大きなコードベースでは、ビルド中に常にいくつかの警告が表示されます。

長さ4のスニペット

f();

K&Rの場合も、上記は「グローバルリンケージfを使用して、固定ではあるが指定されていない数の引数を取り、整数を返すfunctionが存在する」というコンパイルを意味します。

これとの基本的な違いに注意してくださいf;

長さ5のスニペット

s="";

K&R Cは、本当に寛容であることで有名です。コンパイル時に、このコードはs、空の文字列の開始アドレスに初期化される整数をグローバルリンケージに提供します(私は思う)。K&Rは、整数がアドレスを保持するのに十分な大きさでない場合の切り捨てを含め、すべての強制を静かに処理します。

多くの見つけにくいバグを生成し、IOCCC大会で多くのインスピレーションを提供したのは、このような構造です。

長さ6のスニペット

o=042;

古いタイマーの落とし穴、リテラル番号の先頭の0は、後続の数字が8進数にあることを意味します。上記のコードは、コンパイル時に、o10進数34に初期化されたグローバルリンケージの整数を提供します。

Cのこの機能は、多くの開発者が彼らの番号をパディングして、それらをうまく揃えるように努力しています。

長さ7のスニペット

f(){f;}

上記のコードは、本体を持つ関数です。しかし、それは何をしますか?関数のアドレスを取得し、それに対して何もしません!通常、関数が返すものは未定義です。このような無意味なコードは、多くの場合、警告なしにコンパイルできます。

長さ8のスニペット

main(){}

これは、Cでコンパイルおよびリンク可能な最短コードを表します。Cの最新バージョンでは、通常、関数を暗黙的に定義することはできませんが、歴史的な理由により、この制限は緩和されていmainます。

この驚異的なプログラムは、0を返すだけで、無視できないサイズにコンパイルされ、さまざまなCランタイムルーチンにリンクします。冗長性をフルに設定してコンパイルおよびリンクし、内部で何が起こっているのかを確認できます。

長さ9のスニペット

#define Z

Cヘッダーファイルの主流は、#defineプリプロセッサディレクティブです。Cプログラムはさまざまな段階でコンパイルされ、これらの段階の1つでは、これらの定義が実際の値に置き換えられます。

引数が欠落している場合、Cはを意味する1ため、上記はソースコードの1どこZで使用されても置き換えられます。

上記は通常、ヘッダーファイルに入れられ、#include必要に応じてdになります。

長さ10のスニペット

enum{P,Q};

このenumキーワードは、一連の定数を定義するためのタイプセーフな方法を提供します。定義と同様に、これらはヘッダーファイルでよく使用されます。上記のコードを含めるとP、0およびQ1の整数として定義されます。

長さ11のスニペット

volatile v;

volatileキーワードは、コンパイラは変数が他のエージェントによって変更することができ、それがアクセスの間に一定のままな仮定をしないようにすることを知らせることです。

長さ12のスニペット

#pragma once

#pragma once は、非標準ですが広くサポートされているプリプロセッサディレクティブであり、現在のソースファイルが1回のコンパイルで1回だけ含まれることを示します。

従来の完全にサポートされている手法では、#includeガードを使用して、コードが追加されたり名前が衝突する可能性があるという短所があります。

長さ13のスニペット

w(){for(;;);}

Cには多数の規則があり、これらの1つは無限ループの表現方法です。この場合、for(;;)初期化なし、デフォルトのtrueを意味する1の終了チェックなし、つまり、中断せず、ループコードもありません。

いつでも内部ですべてを行うことができ()、ループ自体にボディは必要ありません。この場合、ダミーのセミコロンが最後に追加されます。

上記のコードでは、コンパイルされると、タイトなビジーループ(ソフトウェア設計でのno-noの1つ)に入り、戻ることのない関数が提供されます。

長さ14のスニペット

int a[]={1,2};

Cの配列は、指定された長さを必要としません。空の角かっこ[]は、コンパイラーに「自分で図を作成する」ように指示します。ただし、Cでは、他の言語とは異なり、これらの境界の外側の配列へのアクセスを防ぐ組み込みの方法はなく、Cで知られている「足を踏み入れて」という比phorにつながります。

上記のコードをコンパイルすると、a1と2で初期化された2つの整数のグローバルな可変配列が提供されます。

長さ15のスニペット

const long k=7;

constspeciferは、C ++から借りCに後から追加されました。一般的なインタビューの質問は、「変数を次のように定義するのは理にかなっていますvolatile constか?」です。const一緒にenuminlineへの依存軽減することが意図されている#defineタイプの安全性に問題を有しているが。

長さ16のスニペット

extern void **q;

extern変数が他の場所で宣言されていることを示すために使用されます。このvoid *型は、Cの標準のジェネリック型です。つまり、代入ステートメントで明示的にキャストまたはキャストする必要はありません。**オペレーター配列は、多くの場合、初心者の心を吹くのポインタへのポインタを意味するが、完全に有効と頻繁に使用されるCです。

長さ17のスニペット

double d=4/3-1/3;

上記を印刷すると、結果は1つになります。に変更しdouble d=4/3-2/3;、その答えは何ですか?まだ1つです!Cは整数演算を使用して4/3→1および2/3→0、および1-0→1を計算しています!

長さ18のスニペット

main(){puts("!");}

最後に、実際に何かをするコードに到達します!puts使用するヘッダーファイルを必要としないため、Cゴルファーのお気に入りです。

putsまた、出力に改行が追加されます。逆に、対応getsするものは改行を取り除きます。gets非常に制御された状況以外では使用しないでください-バッファオーバーランに対する保護がなく、多くの悪用の根本原因です。

長さ19のスニペット

#include <stdlib.h>

ヘッダーファイルを含めることは、多くの場合、開発者の個人的な署名です。多くが含まれてlibおりio、それらが必要かどうかは関係ありません。長さが増加または減少するように、ヘッダーファイルを並べる人もいます。ほとんどが<>前に置き""ます。個人的には、TAの日にこの署名を使用して、学生間の不正行為をチェックしました:同じヘッダー署名?もっとよく見なさい!

長さ20のスニペット

char*p=(char*)0x300;

Cは、非常に低レベルの初歩的なプラットフォームで使用されるように設計されています。場合によっては、特別なメモリマップポートに直接アクセスする必要があります。

上記のコードでは、ポートのアドレスは16進数の300として定義されています。すべてのビットをオンにする、または現在の値を取得するなど*p*p=0xff;を使用してポートの値にアクセスしv=*p;ます。

長さ21のスニペット

int w=sizeof(double);

sizeofオペレータは、型のサイズをバイト単位で提供します。変数名では、括弧は必要ありませんdouble d;int w=sizeof d;

長さ22のスニペット

asm("xorl %ecx,%ecx");

asm使用方法はコンパイラによって定義されます。上記は、IntelプラットフォームでのLinux gccインラインコードの例です。

元のUnixには、アセンブラに含まれるコードのごく一部が無視できませんでした。今日でも、速度が主な関心事であり、移植性が絶対に重要でない場合、使用されていることがわかります。

互換性のあるシステムでは、上記のコードがコンパイルされ、従来のアクセス方法のない文字通り分離されたアセンブリ命令になります!BTW xor R,Rは、レジスタをすばやくクリアするための一般的なアセンブリ言語のイディオムです。

長さ23のスニペット

union u{char c;int i;};

union最大の要素のために少なくとも十分なスペースを提供します。void *特定のライブラリで一般的な「不透明な」タイプを提供するために使用される場合があります。この場合、通常、ユニオンはより大きな構造の一部になり、構造にはユニオンタイプを識別するフィールドがあります。

長さ24のスニペット

/*INTS*/int i,j,k;//INTS

元のCコメントはとして区切られ/* comment */// comment to end of lineC ++から形式を借用しました。

長さ25のスニペット

int main(void){return 1;}

これは、上記の長さ8のスニペットのより準拠したバージョンです。戻り値の型と関数の型が指定されており、明示的に戻り値があります。

Cの規則では0、成功と1失敗の場合、またはに厳密に準拠EXIT_SUCCESSEXIT_FAILURE、で定義されているようにしたい場合、戻り値を使用しstdlib.hます。

長さ26のスニペット

typedef struct{int x,y;}P;

typedef特に非常に便利ですtypedef struct。現代の用語では、「オブジェクト指向ライト」と呼ぶかもしれません。

上記を含めた後、コードはP、完全な型チェックを使用して、宣言および関数で通常の型として使用できます。ただし、C ++とは異なり、+、*、または<<などの演算子は定義できないため、「object-orientation-light」です。

長さ27のスニペット

#define C(x,y)(((x)+1)*(y))

Cには便利なマクロ#define構文があります。

一般的な初心者のエラーは、内側および/または外側の括弧を省略することで、演算子の優先順位エラーを見つけるのが難しくなります。

長さ28のスニペット

struct f{int s:1,e:8,m:23;};

Cは、整数のように割り当て、読み取り、操作できるビットフィールドを明示的に定義できます。

上記は、IEEEの単一幅の浮動小数点データ構造の近似です。

長さ36のスニペット

f(unsigned x){return!!x&!(x&(x-1));}

多くの言語では、数字がどのように表現されるかを気にする必要はありません。Cでは、それらの内部表現を詳細に認識する必要があります。

これの最良の例は、整数が2のべき乗かどうかを判断することです{1、2、4、8、...}。Cに馴染みのない人は、O(log(n))実行時のループとシフト、およびあらゆる方法を実行しますが、悪くはありませんが、上記はO(1)実行時でも同じことをする関数です。読者が機能することを確認するための演習として残しておきますが、実際には...

この!!規則は、整数を0以外および0からそれぞれ1および0に強制するためによく使用されます。多くのC開発者は、これらの種類のトリックを使用することを好みます(多くの場合、コードの明快さを重視する人がいます)。

非常に熱心なC開発者は、上記が1の補数で署名されたハードウェアで動作することを確認できます。不思議に思う人のために、あなたは今、2の補数のハードウェアで作業していることはほぼ確実です。これについて心配する必要があるのは、本当に幸運な(またはあなたの見方によっては不運な)だけです!

長さ48のスニペット

#include<complex.h>
double complex c=3.0+I*4.0;

C99には、複素数のサポートが含まれています。コードからわかるように、実際の型の修飾子の形式を取ります。使用することもできますint complex c=3+I*4;が、内部的には浮動小数点型に強制されます。上記のコードは、を使用してgccでコンパイルされgcc -std=c99 -c length-48.cます。

内部をもっと見たい場合は、-Eスイッチを使用してコンパイルしてみてください。私のバージョンのgccでは、上記の宣言はになりdouble _Complex c=3.0+(__extension__ 1.0iF)*4.0;ます。複合型は、いくつかの安価なマクロだけでなく、言語への重要な追加機能であることに注意してください。

これは単なるティーザーにすぎません。125文字を超えると、複素数を使って本当に楽しいことができるようになります。

長さ51のスニペット

#include <math.h>
main(){double d=sqrt(sin(3.2));}

さまざまな理由により、Cはsin、cos、tan、sqrtなどの標準の数学関数に自動的にリンクしません。したがって、使用してもリンクしていない場合、開発者には未定義のリンカエラーが表示されます'sqrt'またはその他のエラー。

gccでは、上記のコードはを使用してコンパイルおよびリンクしgcc length-51.c -lmます。

sin(3.2)は負の数を返しますが、その平方根は実際のドメインでは有効ではありません。Cでは、NaNこのエラーを示す特別な値が返されますが、プログラムはこれを無視できます。

C99には、これらの種類の数学エラーを非常に安全かつきめ細かく制御するための、多くの新しい例外処理関数があります。

長さ63のスニペット

static int w;static int X(int x){static int s=0;s^=x;return s;}

またはより健全にフォーマットされました:

static int w;
static int X(int x)
{
    static int s=7;
    s^=x;
    return s;
}

ご想像のとおり、これはすべてstatic、Cで複数の意味を持つキーワードに関するものです。

最初の2つのケースでstaticは、整数wと関数Xはこのファイルまたはコンパイル単位の外部では見えない、つまり内部であるとコンパイラーに伝えています。

これらの関数は外部から呼び出されることを意図していないため、引数の有効性をチェックせず、他のコーナーをカットしない場合があります。彼らは内部スコープを持っているので、あなたは再定義することができますwし、X他のファイルでは、彼らは通常、別々になります。

最後のケースでstaticは、s関数呼び出し間で整数がその値を保持することを示します。最初にX呼び出され、s初期値7になり、と排他的論理和が取られるとx、新しい値が保持されます。

内部的には、実装に依存しますが、通常のメモリ編成はs、ヒープ上、特に初期化されたメモリ上にあり、引数xはスタック上にあります。たとえば、再帰アルゴリズムを実装する場合は、変数の場所が重要です。

Cの落とし穴は、グローバル変数との衝突です。までwX、実際のように定義されているstatic彼らは、その後、世界的にどこかで定義されている場合、wおよびXその代わりグローバルエンティティを参照します。

ここqwは、グローバルwが設定に使用されているため、同じ値に初期化されない場合がありますq

static int q = w;
static int w;

グローバルwが存在しない場合、コンパイルは失敗します。

ここqw、同じ値に初期化されます:

static int w;
static int q = w;

通常、設計者は、グローバル変数と関数に独自のプレフィックスまたはサフィックスを追加することにより、名前の衝突を減らします。

C99では、static別の用途が得られました。たとえば、少なくとも 10個の整数の配列を取るint Y(int a[static 10]);関数があることを意味します。Y

長さ74のスニペット

void f(register int*p,register int*q,register int l){while(l--)*p++=*q++;}

またはうまくレイアウト:

void f(register int *p, register int *q, register int l)
{
    while (l--)
        *p++ = *q++;
}

このキーワードregisterは、ハードウェアレジスタを使用するとここで有益であるというヒントをコンパイラに提供します。上記の関数は、可能であればハードウェアレジスタを使用してlからqに整数をコピーしますp

場合によっては、スピードアップが大幅に向上する可能性があります。たとえば、68Kマイクロプロセッサフ​​ァミリでは、を使用しなかった場合、6行または8 行で*p++ = *q++はなく、1行の命令に変換できMOVE.W (Ap)+,(Aq)+ますregister。68Kマイクロプロセッサには明示的なポストインクリメントモードとプレデクリメントモードがあるため、経験豊富な開発者は、プラットフォームを知っていれば、x++and --yvs. ++xおよびを使用してコードを調整しますy--

最近のコンパイラregisterは、アドレスの取得を許可しないことを除き、ほとんど無視します(たとえば、上記で&lはコンパイラエラーが発生します)。

長さ88のスニペット

#include<stdio.h>
int f(int x){return(x>1)?x*f(x-1):1;}int main(){printf("%d\n",f(12));}

または、sanerレイアウトの場合:

#include <stdio.h>

int f(int x)
{
    return (x > 1)? x * f(x - 1): 1;
}

int main()
{
    printf("%d\n", f(12));
}

ああ、再帰!このスニペットは、コンパイル、リンク、および実行する完全なプログラムです。この関数は、再帰式f(x)= x * f(x-1)を使用して、f引数の階乗を計算しxます。階乗は非常に速く大きくなるため、たとえばf(12)、符号付き32ビット整数で取得できる最大値です。

本当に再帰的なコードの例については、Ackermann関数の単純な実装を調べてください。

スマートコンパイラは、ヒントinlineを使用して関数を最適化し、定数が引数として提供されるときに関数を「展開」して、次のようにします。

f(12)

になる:

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

関数呼び出しは必要ありません!

他のコンパイラーは、関数を再編成できます。

int f(int x)
{
    return (x < 2)? 1: f(x - 1);
}

そして、末尾再帰と呼ばれるものを実装します。これは実際には、最後の関数呼び出しを単純なgotoに置き換え、その関数が戻り値を処理できるようにします。利点は、スタックスラッシングが少なくなり、コードが高速で小さくなります。

アセンブリ言語では、これらの種類の最適化の機会は本当に見つけやすく、「キーホールオプティマイザー」と呼ばれるもので実装できます。これは基本的に小さなパターンを探し、それらをより高速またはより小さなものに置き換えます。

長さ117のスニペット

#include<stdio.h>
int main(int c,char**v){int a,b;sscanf(v[1],"%d%*[\t ,]%d",&a,&b);printf("%d\t%d\n",a,b);return 0;}

または:

#include <stdio.h>

int main(int c, char **v)
{
    int a, b;

    sscanf(v[1], "%d%*[\t ,]%d", &a, &b);
    printf("%d\t%d\n", a, b);

    return 0;
}

Cは当時の現代の言語、コンソール、パンチカード、テープ、ディスク、プリンターなど、あらゆるデバイスに一貫して適用できるユニバーサルI / Oの概念を借用しましたが、実際のC形式では、開発者は非常に簡潔だが強力な声明。

上記のスニペットでは、コマンドライン入力を受け取り、スペース、タブ、またはコンマで区切られた2つの整数を解析して出力します。新しいscanf指定子%*[\t ,]を利用して、[\t ,]すべてのタブ、スペース、カンマを引き出し、*それらを無視します。

私は、開発者が「純粋な」C ++の方法ですべてをやっていたところ、いくつかのC ++のコードを見直し覚え<<などのメソッドの武器庫findsubstr。少なくとも12行ありましたが、コンマを区切り文字として処理できませんでした。私はその不格好なコードをすべてsscanf上記のような1 行で置き換えました!

長さ132のスニペット

#include<stdio.h>
int main(int c,char**v){while(--c){++v;printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n",*v,*v,*v,*v,*v);}return 0;}

または:

#include <stdio.h>

int main(int c, char **v)
{
    while (--c)
    {
        ++v;
        printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n", *v, *v, *v, *v, *v);
    }

    return 0;
}

関数printfsprintffprintfなどが出力の幅とパディングを定義する形式指定子を使用します。

コマンドライン引数を使用して上記をコンパイルおよび実行し、さまざまな出力を確認します。

> main xyz 123456
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                              
|xyz  |                                                                                                                                              
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                 
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|12345|                                                                                                                                              
|12345| 

.5指定子の出力は最大 5文字に制限されていることに注意してください。一方、先頭5は、左揃えを示す出力が少なくとも 5文字であることを保証します-。それらを組み合わせると、出力が正確に5文字に設定されます。


4
各賛成票に新しいファクトイドを追加する必要があるとは思わない:)
オプティマイザー

28
Cの一般的な文化は、コンパイルの警告を無視することです。これは真実に近いとは思いません!
シャーバズ

4
大規模なプロジェクトがあり、複数のコンパイラを検討している場合、すべての警告を排除しようとするのは非常に無駄です。
feersum

5
これは素晴らしいです
キク

4
私はCプログラマーであり、Haskellを怖がっていません。
-Shahbaz

138

x86マシンコード

ファクトイド:

x86マシンコードは、プロセッサが実際に実行するx86アセンブリのアセンブルバージョンです。メモリとストレージスペースが高価なときに開発され、Intel 8008との下位互換性を保つように設計されました。実行可能コードを小さく保つことが目標の1つであり、可変長命令とCISCアーキテクチャを利用して支援しますこれを実現します(これは、最新のプロセッサのパフォーマンスを改善するためにより複雑にするという欠点がありました)。これは、一般的なアセンブリおよびマシンコードの最低限の性質とともに、x86プログラムを非常にコンパクトにする機能を提供します。

長さ1:

最初のプログラムの場合:

0xC3

16進エディターを開き、そのバイトを入力して、test.comとして保存します。

0xC3は命令「RET」であるため、何もせずにすぐに戻る有効なMS-DOSプログラムが作成されました。ただし、これはx86でのゴルフのもう1つの興味深い側面を示しています。.comファイル形式です。この実行可能形式にはヘッダーがまったくありません。ファイルはアドレス0x100からメモリに読み込まれ、実行は0x100から開始されます。これは、メタデータに無駄なバイトがないことを意味します!

長さ2:

次のプログラム:

0x4D 0x5A

またはASCIIの「MZ」。

OK、私は少しcheしました、それは指示に対応しているので、それは本当に便利なプログラムではありません

DEC     BP
POP     DX

これは、実際に.comプログラムを開始するのに役立ちません。実際、これがこれら2つの値の重要なポイントです。妥当な.comファイルはそれらで始まるべきではありません!.comファイルのサイズは65280バイト(64KiB-0x100)に制限されていたため、より大きなプログラムが必要になったとき、新しい形式を開発する必要がありました。これは.exeファイル形式で、ヘッダーがあります。ただし、MS-DOSは下位互換性のために特定のコンポーネントで.com拡張子を保持する必要があったため、.comファイルが実際に.exeであるかどうかを検出する方法が必要でした。彼らはこのマジックナンバーとしてスティング「MZ」を選択しましたが、今日まで、16進エディターでWindows .exe(または.dll)ファイルを開くと、これらの2バイトで始まることがわかります。最近のWindowsプログラムでさえ、70年代の互換性の制約から始まっているのは、私を楽しませてくれます。

長さ3:

無限ループの場合:

41 E2 FD

に変換します

start:
inc cx
loop start 

このプログラムは、CXの値(最初は0より大きい値)をインクリメントし、ループ命令を実行します。ループは、3つの単純な操作を1つの特別な操作に結合するため、CISC命令の優れた例です。CXの値をデクリメントし、0かどうかをチェックし、そうでない場合はターゲットラベルにジャンプします。CXが0のときに終了することに加えて、他のフラグをチェックするループの形式もあります。2バイトの無限ループの「ジャンプスタート」を行うこともできますが、これはもっと面白かったです。

長さ4:

最低限有用なプログラム:

40 CD 10 C3

アセンブリに変換:

inc ax    ; 1 byte
int 10h   ; 2 bytes
ret       ; 1 byte

このプログラムはコンソールを40x25文字に設定し、画面をクリアしてからコマンドラインに戻ります。AXは必要なビデオモードに設定され(1)、BIOS割り込み10hが呼び出されて、実際にビデオモードを設定し、ウィンドウをクリアしてから戻ります。将来これらのBIOS割り込みがさらに増えることを期待してください。

長さ5:

一時停止プログラムを実装できるようになりました。

B4 01 CD 21 C3

アセンブリに変換:

mov ah,1  ; 2 bytes
int 21h   ; 2 bytes
ret       ; 1 byte

このプログラムは、キーが押されるのを待つようBIOSに指示し、戻る前に画面にエコーします。これは、x86上で、レジスタの一部を部分的に読み書きできる方法も示しています。この場合、AX(AH)の上位バイトを1に設定します。32ビットプロセッサでは、上位16ビットに影響を与えずに下位16ビットを操作することもできます。部分的なレジスタを変更するこの機能は、アセンブリプログラマにとって便利ですが、誤ったデータの依存関係が発生する可能性があるため、最新のプロセッサがアウトオブオーダー実行を試みる場合には欠点があります。

長さ9:

出力を実際に表示するには:

68 00 B7 07 AB 40 79 FC C3

アセンブリに変換:

; These two instructions set up ES, the 'extra segment'
push 0xb700 ; 3 bytes
pop  es     ; 1 byte
label:
stosw       ; 1 byte, Store Word - Copy AX to [ES:DI] then add 2 to DI
inc  ax     ; 1 byte
jns  label  ; 2 bytes, Jump Not Signed - Jump unless the sign flag is set (when inc AX yields 0x8000
ret         ; 1 byte

出力は、異なる色で繰り​​返されるデフォルトの文字セットです。AXの下位バイトは文字コードで、上位バイトは使用する色を指定します。 異なる色で繰り​​返されるデフォルトの文字セット

16ビットプログラムは、最大64KiBまでしか直接アドレス指定できませんでした。これを回避するために、x86は「セグメント」を使用しました。これは16倍され、すべてのメモリアクセスに追加されて20ビットのアドレス可能なメモリを提供する特別なレジスタです。プログラムは、より多くのメモリまたはメモリの特別な領域にアクセスするためにこれらのセグメントレジスタの値を変更できます。このプログラムは、ビデオメモリに書き込むために余分なセグメントを変更します。異なるタイプのメモリアクセスは異なるセグメントレジスタを使用し、異なるメモリチャンクで同時にコード、データ、およびスタックにアクセスできます。デフォルトのセグメントは、多くの命令でオーバーライドできます。

長さ20:

認識できるものにしましょう-「ルール90」を使用して、シェルピンスキーの三角形を描画します。

B0 13 CD 10 68 0F A0 1F AC 31 C2 88 94 3E 01 87 D3 93 EB F4

組み立て中:

mov al,13h      ; 2b
int 10h         ; 2b - Set the video mode to 13h

push    0xA00F  ; 3b
pop     ds      ; 1b - Set the data segment to video memory

start:          ; This loop runs 'Rule 90' to draw Sierpinski triangles
lodsb           ; 1b - load al with [ds:si] then increment si

xor     dx,ax   ; 2b - xor the left and right values of the previous row of pixels
mov     [si+318],dl ;4b - store result to memory

xchg    dx,bx   ; 2b - swap register values
xchg    ax,bx   ; 1b - swapping with ax is 1 byte shorter

jmp     start   ; 2b - infinite loop

サンプル出力: シェルピンスキーの三角形

このプログラムでは、やや有名な「モード13」-256色で320x200の解像度を持つグラフィックモードを使用します。Doomなど、多くの一般的なDOSゲームで使用されていました。

長さ21

実行中のCPUの製造者を見てみましょう。

0F A2 66 60 BB EE FF B9 0C 00 8A 17 43 B4 02 CD 21 E2 F7 FF E1

アセンブリに変換:

cpuid         ; 2b  CPU ID - retrieve processor information based on the value in AX. For AX=0,
              ;     the 12 bytes in EBX, ECX, and EDX are loaded with a vendor identification string
pushad        ; 2b  Push all registers on the stack (32 bit version)
mov  bx,0xffee; 3b  Start of the vendor identification string on the stack
mov  cx,12    ; 3b  12 characters to print
print:    
mov  dl,[bx]  ; 2b  Character to print
inc  bx       ; 1b  Advance string position
mov  ah,2     ; 2b  Set AH to the 'Print character to STDOUT' value
int  21h      ; 2b  Call the bios interrupt to print
loop print    ; 2b  Decrement CX and jump if it is not zero
jmp  cx       ; 2b  Instead of restoring the stack, just jump right to the exit point

サンプル出力:

c:\misc>cpuid.com
GenuineIntel

このプログラムは、CPUID命令を使用して、実行中のプロセッサ、特にベンダー識別文字列に関する情報を取得します。ほとんどの人は、「GenuineIntel」または「AuthenticAMD」と表示されますが、一般的なCPUメーカーがいないか、特定の仮想マシンで実行されている場合を除きます。

長さ26

面白いアニメーションができるようになりました

B0 13 CD 10 C4 07 BB 40 01 59 99 89 F8 F7 F3 31 D0 AA E2 F6 26 FE 05 47 EB FA

組立中

mov al,13h     ;2b
int 10h        ;2b Enter Video Mode 13h

les ax,[bx]    ;2b Set ES to (roughtly) video memory
mov     bx,320 ;3b Set up  BX asdivisor
pop     cx     ;1b Zeroize CX

start:
cwd            ;1b Sign extend AX to DX, AX will never have the sign bit set so this zeroizes DX in 1 byte
mov     ax,di  ;2b Copy video memory pointer
div     bx     ;2b Divide by width to get AX = Y pos, DX = X pos
xor     ax,dx  ;2b X pos ^ Y pos
stosb          ;1b Store and increment video pointer
loop    start  ;2b CX starts at 0, so this will loop until it wraps around

cycle:
inc     byte [es:di];3b Increment value in video memory to animate
inc     di     ;1b Increment video memory pointer
jmp     cycle  ;2b Infinite loop 

出力は次のようになります。

マーチングXOR

関数X pos ^ Y posは、特にアニメーションの場合に興味深いフラクタルを生成します

長さ27

小さなx86 .comプログラムでテキストとグラフィックを生成できるだけでなく、サウンドと音楽も生成できます。

BA 31 03 B0 3F EE BA 30 03 B0 93 EE B4 01 CD 21 3C 1B EE 3C 1B B0 7F EE 75 EC C3

組み立て中:

    mov dx,0x331            ; value for the midi control port
    mov al,0x3F             ; command value to set midi mode to UART
    out dx,al               ; output the command to the midi control port
play_loop:
    mov dx,0x330            ; value for the midi data port
    mov al,0x93             ; midi instrument value (piano)
    out dx,al               ; output to midi data port
    mov ah,1
    int 0x21                ; read character from stdin, with echo
    cmp al,27               ; test if it is escape
    out dx,al               ; output the ascii value as the midi note to play
    mov al,0x7F             ; note duration
    out dx,al               ; output note duration
    jne play_loop           ; loop if escape was not pressed
    ret  

このプログラムは、MIDIカードを使用してキーボードをピアノに変えます。これを行うには、MIDIカードをUARTモードに設定します。これは、MIDIノートを受信するとすぐに再生します。次に、プログラムは文字が押されるのを待ち、ASCII値をMIDIカードへのメモとして出力します。プログラムは、エスケープが押されるまで実行されます。

長さ29

反復関数システムを使用して、ドラゴンカーブフラクタルを生成しましょう。

B0 13 CD 10 89 D0 01 CA 29 C1 D1 FA D1 F9 73 03 83 E9 7A B4 01 CD 16 B8 02 0C 74 E6 C3

アセンブリに変換:

mov  al,13h
start:
int  0x10    ; This does double duty, setting the video mode to 13h at program start,
             ; and calling the 'draw pixel at coordinates' interrupt when looping
mov  ax,dx   ; The next couple instructions are our IFS, the algorithm is aproximately
add  dx,cx   ; f(y) = 0.5x + 0.5y
sub  cx,ax   ; f(x) = 0.5x - 0.5y OR f(x) = 0.5x - 0.5y - 1
sar  dx,1    ;
sar  cx,1    ;
jnc  skip    ; This jump handles pseudo-randomly switching between the two functions for x,
             ; based on if the previous value of x was odd or not.
sub  cx,122  ; Magic number, chosen since it provides sufficent 'randomness' for a filled in
             ; fractal and a good scale to the fractal. 102 and 130 also work.
skip:
mov  ah,1
int  0x16    ; Get keyboard state, zero flag will be set if no key has been pressed
mov  ax,0xC02; Set up AH for the draw pixel function when int 0x10 is executed,
             ; AL = color, CX = column, DX = row
jz   start   ; Loop if a key hasn't been pressed
ret  

出力:

ドラゴンカーブ

非制御キーを押すと、プログラムが終了します。これは、Pouet.netのDesireによるFire Coralに基づいています。

長さ52

このプログラムはちょっとした二重の機能で、x87浮動小数点コプロセッサーの一部と自己修正コードを示しています。

B3 07 D9 E8 B1 11 DE 0E 32 01 E2 FA BE 0A 24 56 B1 09 DF 34 AC D4 10 
86 E0 05 30 30 50 E2 F5 44 B4 2E 50 89 E2 B4 09 CD 21 FE 06 03 01 4B
75 D2 CD 20 0A 00

実行すると、プログラムはいくつかの数学定数を出力します。

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

これらは、One、Log2(10)、Log2(e)、Pi、Log10(2)、Log e(2)、およびZeroです。

組み立て中:

組織100h

mov     bl,7         ;Counter for the total number of constants to print
start:
fld1                 ;Floating point constant to load on the FP stack,
                     ;start with 1 since it's op-code is the lowest

mov     cl,17        ;Multiply the constant by 10, 17 times to get the
mult:                ;printing part as an integer
fimul   word[ten]
loop    mult

mov     si,10+'$'*256;ASCII new line (10) and the end-of-string ($)
                     ;characters. These are used both as
push    si           ;a constant memory location, and stored to the
                     ;stack to format and printing

mov     cl,9         ;print 18 digits (9 pairs)
fbstp   [si]         ;store the integer part of the floating point
                     ;number on top of the FP stack as a packed
                     ;binary-coded decimal number (1 digit/nibble),
                     ;and then pop the number off the FP stack

convert:
lodsb                ;load a pair of packed digits

db 0xd4,16 ; AAM 16  ;ASCII Adjust For Multiply instruction using
                     ;non-standard base 16. This puts AL/16 in AH,
                     ;and AL%16 in AL, unpacking the digit pair.

xchg    ah,al        ;Swap the digit order
add     ax,'00'      ;Convert the digits to ASCII values
push    ax           ;Store digits on the stack
loop    convert

inc     sp           ;AX now holds the 1st 2 digits to print,
mov     ah,'.'       ;so to insert a decimal point, the 2nd digit
push    ax           ;is replaced with a '.', the stack pointer
                     ;is adjusted to overwrite 1 byte, and then
                     ;AX is pushed on the stack

mov     dx,sp        ;Load DX with the start of the print string
mov     ah,9         ;Load AH with the 'Print String' constant
int     21h          ;Call the 'Print String' interrupt to display
                     ;the constant

inc     byte[start+1];Self-modifying code - increment the load
                     ;floating point constant op-code to iterate
                     ;through all of them

dec     bx
jnz     start        ;Exit when all 7 constants have been printed
int     20h


ten: dw  10

x86システムでの浮動小数点演算は、元々はオプションのx87コプロセッサーによって処理されていましたが、486になって初めて同じチップに移動されました。x87のアーキテクチャはかなり異なり、スタックベースであり、8つの80ビットレジスタが使用可能です。また、さまざまな丸めモード、精度、および設定可能なマスク可能な例外がありました。

このプログラムは、プロセッサにベイク処理された7つの定数の値を出力します。命令スペースが0や1などの単純な定数で無駄になることは奇妙に思えるかもしれませんが、メモリが小さいときに命令セットが作成され、これらの命令は通常同等の操作よりも2バイト小さいことに注意してください。また、このプログラムは、あいまいな命令であるFBSTP-「Store BCD Integer and Pop」も使用します。x86が開発された頃、BCD番号の操作はより一般的でした。また、x86 / x87には、プログラムで使用されるAAM「複数のASCII調整」命令など、BCD数学を単純化するいくつかの命令があります。

初期のx86プログラムで使用されている保護されていないメモリモデルでは、データとコードに区別はありません。このため、適切な値をインクリメントするだけで、連続してエンコードされた「ロード定数」命令を簡単に反復処理できます。

長さ64

Mandelbrot Challengeのエントリをクロスポストすると、320x200カラーのMandelbrotフラクタルをわずか64バイトで表示するプログラムを作成できます。

B0 13 CD 10 C4 07 99 89 F8 B9 40 01 F7 F1 83 E8 64 FE CE 31 DB 31 F6 
89 F5 0F AF F3 01 F6 0F AF DB 70 19 0F AF ED 70 14 01 EB 70 10 29 EB
29 EB C1 FB 06 01 D3 C1 FE 06 01 C6 E2 DB 91 AA EB C6

組み立て中:

mov al,13h ; set up graphics mode 13
int 10h

les ax,[bx]; trick to set video memory

FillLoop:
cwd
mov ax,di  ; di is the current position on screen
mov cx,320 ; convert di int x,y screen coordinates
div cx     ; CX is the iteration counter, exit the loop if it hits
           ; zero before the value escapes.
sub ax,100 ; center the fractal vertically
dec dh     ; center the fractal horizontally

xor bx,bx
xor si,si

MandelLoop: ; Fairly standard Mandelbrot routine,
mov bp,si   ; exits if the values overflow
imul si,bx
add si,si
imul bx,bx
jo MandelBreak
imul bp,bp
jo MandelBreak
add bx,bp
jo MandelBreak
sub bx,bp
sub bx,bp

sar bx,6   ; We use fixed point math with the lowest 6
add bx,dx  ; bits being the fractional portion, so this
sar si,6   ; rescales the values after multiplication
add si,ax

loop MandelLoop

MandelBreak:
xchg ax,cx ; Write the escape itteraction as the color
stosb
jmp FillLoop

最終結果はこの画像です:

マンデルブロフラクタル

このプログラムは固定バイト数学を使用してフラクタルを生成します。これはバイト数が少ないためです。16ビットレジスタの最下位6ビットは、数値の小数部分と見なされ、値は乗算後に再スケーリングされます。


7
PPCGで見るべきすべての言語の中で、私はこれを期待していませんでした。
アレックスA.

23
ワオ。これをコメントにするためのその他の文字。しかし、真剣に。ワオ。
krs013

2
@Michael EdenfieldそれがDOSBoxの目的です!
Sir_Lagsalot

1
20バイトのシェルピンスキーは非常に印象的です。
qwr

1
私は自分が優れたプログラマーであると考えていますが、これを見ると敗北を認めなければなりません。
ステファンBijzitter

121

ハスケル

ボトムアップで読みたいかもしれません。時々、下位のスニペットを参照しますが、上位のスニペットは参照しないため、理解に役立つ場合があります。

Haskellを知らない読者:明確ですか?いつはっきりしないのですか?わかりません。

長さ86のスニペット

ツリーデータ構造の折りたたみ可能なインスタンス(スニペット23)。Foldableは型クラスです。たとえば、型のクラス(/グループ)です。これらは、Javaのインターフェースと並行しています。それらは本質的に型を一般化し、共通の特性を持つ型を統一します。たとえば、一緒に追加することができます(Monoid)、コンテナ(Functor)、テキストとして印刷できます(Showshow関数で既に会った)、など。これは、リストに似ているデータ型を統一し、リストに対して反復またはフラット化できます。

このスニペットでは、を定義することでインスタンスを定義しますfoldr。これは、基本的にデータ型を右から左に繰り返します。これで、一般的な事前に記述されたコードの束を使用できます。まず、ヘルパー関数を定義して、シングルトンツリーを取得し、すべての混乱を回避しますs a = N E a E。今:

sum (N (s 3) 7 (N E 5 (s 8))     === 23
product (N (s 3) 7 (N E 5 (s 8)) === 840
toList (N (s 3) 7 (N E 5 (s 8))  === [3,7,5,8]

等々。

これがツリーの写真です。

7
| \
3  5
    \
     8

長さ70のスニペット

primes=sieve[2..] where
 sieve(p:xs)=p:sieve(filter(\x->x`mod`p/=0)xs)

これは最高のふるいです!

(注:/=は何ですか!=他の言語にあるです)

これsieveは、リストをフィルタリングし、以前の素数で割り切れない数値のみを保持する関数を定義することで機能します。再帰的にsieve定義されます-toは、リストを最初の要素pとテールに分割しp、テールから、で割り切れる任意の数でフィルターしsieve、残りのビット、アタッチするように定義されますpをその先頭にして戻るます。

繰り返しますが、ここでは無限リストを使用していますが、無限量の素数を計算する必要がない限り、計算は時間内に停止します。

take 4 primes === [2,3,5,7]

長さ68のスニペット

最後に、馬!

main=do putStr s;print s where s="main=do putStr s;print s where s="

これを初めて読んだとき、このクインの出力に引用符が欠けていると思うかもしれません。 putStr、一度print?同じように聞こえます。

Haskellでは、putStr取得した文字列の内容を標準出力に出力するだけの関数です。print、しかし、物事を標準出力に出力します。ですから、print 4と同等ですがputStr "4\n"putStr 4無意味です- 4文字列ではありません!そのためprint、値を取得すると、まずその値を文字列に変換してから、その文字列を出力します。一般に、物事を文字列に変換する方法は、コードに書き留める方法を見つけることです。だから、あなたは文字列を書くような方法abcHaskellコード内の文字列ではある"abc"ので、print "abc"実際に印刷し"abc"、ではありませんabc

幸運なことに、今では十分な票を得ています。これらのものをゴルフする必要はありません。

長さ33のスニペット:

main=go 0
go n=do print n;go(n+1)

重要なことは、ループを使用しなかったことです。Haskellはループしません。Haskellは再帰します。Haskellにはループがありません。それよりも深い:HaskellにはControl flowもありません。どのように、あなたは尋ねるかもしれませんか?まあ、それは必要ありません。

詳細については。このプログラムは、0から始まる無限に増加する整数のシーケンスを go出力します。入力から開始して、それをmain呼び出します0

doHaskellの特別な構文力です。このシナリオでは、同様にI / Oアクションを組み合わせ>>ます(スニペット22を参照)。

長さ26のスニペット:

map f=foldr(\x y->f x:y)[]

これはmap、おそらく誰もが使い慣れた関数を定義しますfoldrmapの型を宣言していませんが、コンピューターはその型が(a -> b) -> [a] -> [b]であると知っています。つまり、ato からの関数bと、a sの sの返しbます。

どうやって知ったの?;-)

長さ25のスニペット:

main=putStr"Hello World"

標準のHello World。タイプ注:mainの種類がありますIO ()し、putStr持ってString -> IO ()います(文字列から何も返さないI / Oアクションまでの関数)。

長さ23のスニペット:

data T a=E|N(T a)a(T a)

これは、ツリーの標準定義です。Java、C、またはその他でツリーを定義するのに必要なすべての行よりもはるかに簡単です。

(スニペット10を参照)

分解しましょう:

data-この宣言はデータ型を宣言します。 T a-タイプの要素を含むツリーa。これは私たちが定義しているタイプです。 =-のすべての値はT a、パイプで区切られた次のいずれかになります|E-可能な値の1つT s-空のツリー。 N (T a) a (T a)-ツリーの他の可能な値-ノード。各ノードは、左の子((T a))、要素(a)、および右の子((T a))で構成されます。

長さ22のスニペット:

main=putStrLn"y">>main

Haskell yes関数。 >>2つのI / Oアクションを組み合わせてシーケンスする演算子です。タイプは>> :: IO a -> IO b -> IO bです。

main最初に印刷"y"してからmainそれ自体が実行するI / Oアクションとして、再帰的に定義されます。

長さ18のスニペット:

fix f=r where r=f r

のより良い定義fix。(スニペット14を参照。)最初の定義の問題は、リコールfix f = f(fix f)を呼び出すたびに、fix f fixリコールを呼び出し、同じ計算の無限のコピーを生成することです。このバージョンでは、(結果)を結果として定義することで修正しています。以下のような、。では、を定義しましょう。今、私たちは戻りますfix ffix frf r = rr = f rrます。

長さ17のスニペット:

f n=product[1..n]

これは階乗を定義する機能的な方法です。

長さ16のスニペット:

f n=(\x->x+x+x)n

(\x -> x + x + x)はラムダです(誰か\が手紙に似ていると思った)。

(\x -> x + x + x) nに適用されるラムダですn(これはと同じですn + n + n)。

f3乗算関数です(これもf = (*3)

長さ15のスニペット:

sum=foldl (+) 0

これは、sumフォールドを使用して関数を定義します。フォールドは、基本的に、1つのアキュムレーターを持つリストの要素に対するループです。
foldl引数として、アキュムレータとリストの関数fと初期値xを取りますxs。関数fは、リストの前のアキュムレータ値と現在の値を入力として取得し、次のアキュムレータを返します。
次に、折り畳みはリストの値で繰り返し、適用しますf前のアキュムレーターにしてから、最後のアキュムレーターを返します。

折り畳みについて考える別の方法fは、リストの値の間に折り畳みを挿入し、一方の側に最初のアキュムレータを配置することです。たとえば、とfoldl (*) 1 [4,2,5]評価され1 * 4 * 2 * 5ます。

長さ14のスニペット:

fix f=f(fix f)

yコンビネータ。fix方程式の不動点を見つけるため、通常は名前が付けられf x = xます。x = infinite loop時には解決策にもfix (\x -> x^2 + 5*x + 7)なり得るので、方程式を解かないでx^2 + 4*x + 7 = 0、代わりに無限ループを返すことに注意してください。

またx = infinite loop、Haskellの怠lazのために、常に解決策とは限らないことにも注意してください。

このバージョンは時間とスペースのリークです。長いスニペットで再定義します。

長さ13のスニペット:

f=sum.map(^2)

これは、与えられたリストがその平方の合計を返す関数 fを定義します。それは関数の合成関数 sum関数map(^2)順番にある、関数 mapに適用される関数 (^2)正方形 関数ひいてはの部分である)、関数は ^スニペット3で(セクションはスニペット2で導入し、そして組成物)。

ご覧のとおり、Haskellのような関数型言語では関数は非常に重要です。実際、Haskellは、関数を入力として取得したり、関数を出力として返したりする最も標準的なライブラリ関数備えた言語であると言われています(これは一般に高階関数として知られています)

ちなみに、技術的には、2つ以上の引数関数はすべて、関数を出力として返す関数です(これはカリー化と呼ばれます)。

長さ10のスニペット:

data B=T|F

これは、異なる名前を持つHas​​kellブール値の定義です。ブール型の名前はBです。
この定義では、true(T)とfalse(F)の2つのコンストラクターを導入しています。
このコードスニペットは、基本的に、すべてのブール値(B)がtrue(T)またはfalse(F)、つまりB=T|F

実際、すべてのデータ型はHaskellで定義できます。他の言語では、数値、参照、および配列データ型がコンパイラからの特別なサポートを必要とする場合。実際にはHaskellには特別なサポートがあります。そうしないと非常に不便になりますが、たとえばBoolデータ型は完全に言語で定義されます。

長さ9のスニペット:

main=main

この無意味なプログラムはmainメインであると定義します。Haskellは遅延しているため、評価に無限ループが必要な値は、実際の値を使用しなければ自由に使用できます。のような無限ループを含むこのような値mainは、「ボトム」と呼ばれます。

おもしろい事実は、GHC Haskellコンパイラーがこの種の無限ループを検出し、実行時にキャッチ可能な(!)例外をスローできることです。

長さ8のスニペット:

f(x:_)=x

これは、f空でないリストが与えられた場合に、先頭を返す関数を定義します。

HaskellのパターンはPythonのシーケンスのアンパックに似ていますが、すべてのタイプに一般化されています。パターンは値を拒否または一致させることができ、一致する場合は変数を値にバインドできます。

このスニペットのパターンは次のとおりです。

  • _:あらゆるものに一致し、変数をバインドしないパターン。
  • x:あらゆるものをバインドし、それを変数にバインドするパターンx
  • ::このパターンは子パターンに到達します。つまり、1つは頭用で、もう1つは尾用です。リストが空でない場合、頭と尾と一致します。

パターンマッチングは非常に一般化されています。実際、新しいデータ型を定義するだけで、それらを操作するためのパターンが自動的に導入されます。

長さ5のスニペット:

x=2:x

おっと、これについては説明することがたくさんあります。

まず第一に、Haskellは怠け者です。これは、厳密に必要な場合にのみ部分式が評価されることを意味します。

注:このコードスニペットには割り当ては表示されませんが、定義は表示されます。Haskellには割り当てがありません。

このコードスニペットはx、完全にで構成される無限のリストで定義されてい2ます。通常、他の言語でxは評価する前に評価する必要2:xがありますが、Haskellではこれを行うことができます。

Haskellの無限リストは、イテレータと通常のリンクリストの組み合わせの一種です。これらは両方のように機能します(たとえば、範囲に対する反復では、一定のメモリが使用されます)。

長さ4のスニペット:

2:[]

このスニペットは、シングルトンリストをエンコードするだけ[2]です。 Haskell :Cons演算子です。実際、通常のリスト構文は、cons演算子と空のリストリテラルの単なる構文上の砂糖です。これは、Haskellがパターンマッチングとデータ型(特にコンストラクターの概念)を処理する方法と密接に関係しています。

長さ3のスニペット:

f.g

Haskellでは.、関数合成を表します。Haskellは、「ポイントフリー」スタイルで記述できます。これは、関数の引数に名前を付けず、代わりに.演算子を使用してデータフローを操作することを特徴としています。

長さ2のスニペット:

1-

このコードが(構文上の理由で)括弧で囲まれている場合、「セクション」と呼ばれます。それは、ある数を与えられ、空のスポットを「埋め」、1からその数を引いたものを返す関数です。この概念は、Haskellのような関数型言語で役立つ場合があります。そうでなければ、ラムダが必要になります。

長さ1のスニペット:

1

Haskellで、1両方であることができるIntFloatDoubleWordなど。実際、1任意のタイプのバージョンを定義して自由に使用するコードを作成できます。
これはJavaScriptやPythonなどでも行われますが、それらとは異なり、完全な型安全性で行われます。

ファクトイド:

当初、Haskell委員会は、Haskell B. Curryの名前にちなんで言語を「Curry」と呼ぶつもりでしたが、いくつかのしゃれが発生する可能性があるため、名前をHaskellに変更することにしました。後になって、彼らはHaskellが「Pascal」と「Hassle」に似ていることに気付きました!


Haskellが他の関数から関数を生成する標準ライブラリに最も多くの関数/演算子を持っているという事実でファクトイドを置き換える必要があるかどうかはわかりません(技術的には2つ以上のパラメータ関数はすべてそのようなものです)。したほうがいい?
誇りに思っているhaskeller

スニペットでそれを誇示して、説明にそれを加えてください。
マーティンエンダー

f=0:1:zipWith(+)f(tail f) -- 25 chars、遅延計算されたフィボナッチ数のリストを返す関数。
chamini2

ぐふ私は、スニペットの束を追加し、その後、私のコンピュータがシャットダウン
誇りhaskeller

@proudhaskeller Saving op これを個人的に行ったことはありませんが、一度に大規模な編集を行う場合は、保存しながら外部ドキュメントで編集を実行し、完了したら貼り付けます。
mbomb007

99

C#

C#は、Java、C、Haskell、SQL、その他多数の言語の機能を楽しくクレイジーに組み合わせたもので、多くの本当に素晴らしい機能とAPIを提供します。この辺りはかなり冗長なことでも知られていますが、何ができるのか見ていきましょう!

通常必要な定型文は無視します。

class Program { public static void Main(string[] args) { ... } }

長さ1:

;

C#では、コマンドはセミコロンで終了します!空の行は完全に有効な構文です。

長さ5:

x=5f;

C#でリテラル番号を指定すると、コンパイラーは(小数点があるかどうかに基づいて)intまたはdoubleであると想定します。リテラルフロートを使用する場合は、数値に「f」を追加するか、実行時にキャストされ、わずかなコストが発生することを指定する必要があります。

長さ7(バイト):

s=@"
";

文字列リテラルの前に@記号を付けると、「逐語的な」文字列リテラルになります。通常の文字列リテラルは '\ n'などのエスケープシーケンスを特殊文字に解析しますが、逐語的なリテラルはエスケープしないため、バックスラッシュ文字をエスケープせずに使用できます。示されているように、改行も含めることができます。これにより、ゴルフで数バイト節約したり、複数行の文字列リテラルを読みやすくしたりできます。文字列にインデントが含まれていることに注意してください。

長さ8:

()=>x=y;

この式は匿名関数です。これは、Action渡すことができ、関数のように呼び出すこともできる型のオブジェクトを返します。無名関数は、宣言されたスコープを継承し、そのスコープ内のローカル変数をどこにでも引っ張ります。

長さ9:

(a)=>a.p;

パラメーターと戻り値を使用する別の匿名関数を次に示します。この式は、型のオブジェクトを返しますFunc(Func自体はの型を返します。Linqとのインターフェースには多くをa.p使用Funcします。

長さ10:

enm.Any();

これがLinqの最初の紹介です!LINQは、(IEnumerableインターフェイスを実装する)列挙されるすべてのオブジェクトで呼び出すことができる拡張メソッドのセットである-などArrayList。IEnumerableは遅延評価を使用します。コレクション全体を認識せずに、一度に1項目ずつコレクションを処理します。無限でさえあります。

それがどこにあるのか-Enumerableに少なくとも1つの項目が含まれている場合Anyに戻りtrueます。全長を計算するよりもはるかに優れています。

長さ11:

var a=1.5f;

varキーワードは、自動的にのタイプを決定するようにコンパイラに指示しますaaこの場合、として入力されSingleます。ほとんどのタイプ名よりもはるかに短いため、コードゴルフには非常に便利ですが、多くの場合、プロダクションコードで使用することを嫌います。

長さ15:

yield return 0;

以下は、あまり知られていないかもしれないクレイジーなステートメントです。IEnumerableを継承することでオブジェクトを列挙できることを知っていますが、関数が列挙できることを知っていますか?戻り値の型を持つ関数を宣言IEnumerableし、それを持ってyield return好きなだけ時間を。関数のEnumeratorを取得すると、への各呼び出しによりGetNext、プログラムは次のコードまですべてのコードを実行し、yield returnその値を返し、再び値を進めるまで一時停止します。yield break反復を終了するために使用します。

長さ16:

[Obsolete]int a;

このスニペットは属性を示しています。属性は、コード内の宣言に固執できるタグの一種です。いくつかを呼び出すと、コンパイラに特定のことを行うように指示しますa。たとえば、を呼び出すと廃止警告が発せられます。を拡張して独自のものを作成し、AttributeReflectionを使用してクエリを実行できます(詳細については、後で説明します)。メタに移動して、AttributeUsage属性で使用できる宣言の種類を制限できます。

長さ17

c.Count(t=>t==3);

これが便利なゴルフ方法です。がFuncenumerableの要素をマップすることを考えるcbool、それが返す要素の数cFunc返しますtrue。ループを書くよりもずっといい。

長さ18:

foreach(T t in c);

これはfor-eachループです。列挙可能なもののすべてのこの話では、これは非常に必要な構造です。foreachは、列挙子c(列挙可能である必要があります)を設定し、一度に1つの要素tを反復処理する構文糖衣です。個々の要素をそれぞれ変更または検査できますが、コレクション自体を変更すると列挙子が無効になります。

長さ19

c.Select(t=>t.a/2);

これは、関数型プログラミングファン向けの「マップ」機能です。selectはFunc、enumerableの各要素に対して任意の変換(渡されたによって定義される)を実行するための便利で簡潔な方法です。IEnumerableを返します。IEnumerableは、「変換された」要素を繰り返すときに吐き出します。

長さ21

Console.Write("Hi!");

この行はテキストをstdoutに書き込みます。おそらく、C#がゴルフにあまり使用されない主な理由の1つです。

長さ23

typeof(T).GetMethods();

C#は、Reflectionと呼ばれる非常に強力な機能をサポートしています。Reflectionでは、実行時にコードの構造を調べることができます。たとえば、この呼び出しは、指定された型のすべてのメソッドの配列を返します。これらのメソッドを調べたり、呼び出したり、フィールドやプロパティの値を変更することもできます。属性(長さ16を参照)は、Reflectionで使用するコードの一部にタグを付けるための良い方法です。

長さ25

from t in c select t.a/2;

そのSQLですか?C#コードで?非常に近いです。この式は、長さ19の式と同じことを行います。

長さ27

for(var l;;l=new object());

C#はガベージコレクション言語です。つまり、(newキーワードを使用して)割り当てたメモリは、その参照が存在しない限り自動的に解放されます。作成されたメモリを明示的に解放することはありませんが、このコードは永遠に楽しく実行されます。ただし、ガベージコレクションにはコストがかかります。詳細については、Webを検索してください。

長さ29

var e=Enumerable.Range(0,99);

Enumerable.Range潜在的に便利なゴルフ機能です。列挙可能な構造を返し、指定された範囲内の各数値を順番に生成します。2番目のパラメーターは、インデックスではなくカウントです。

長さ31

public int pr{get;private set;}

ここでは、単純な「プロパティ」、OOP機能、およびC#の別の特徴を示すことができます。Javaを使用したことがある場合は、フィールドのアクセシビリティを分離したり、変更時にコードを実行したりするために、フィールドの「get」および「set」メソッドを作成した可能性があります。C#を使用すると、フィールドのすぐ上でそのコードを宣言できます。また、取得と設定のために個別のアクセス修飾子を設定できます。この特定のスニペットは、デフォルトのゲッターとセッターを自動的に作成しますが、セッターをプライベートにします。

長さ32

public static void m(this T o){}

このスニペットは、API設計に適したC#機能を示しています。this静的メソッドの最初のパラメーターに修飾子を適用すると、そのメソッドは「拡張」メソッドになります。これが宣言さT.mれると、タイプTのオブジェクトで実際にTのメソッドであるかのように呼び出せるようになりました。これを使用して、ソースコードを変更したりアクセスしたりすることなく、既存のクラスに新しい機能を追加できます。

長さ38

int f(int a,ref int b,out int c){c=0;}

このメソッドは、C#で使用できるさまざまなタイプのパラメーターの受け渡しを示します。変更されていないパラメーターはvalueで渡されます。接頭辞が付いたパラメータrefは参照渡しされます。完全に新しいオブジェクトをそれらに割り当てることができ、メソッドからそれを持ち帰ります。で始まるパラメータoutは追加の戻り値のようなものです。メソッドで値を割り当てる必要があり、refパラメータと同じように実行されます。

長さ42

Console.Write("It is \{DateTime.Now()}.");

新しいC#6標準では、文字列補間を使用して、組み立てられた文字列を出力する必要があるときに、いくつかの文字を保存できます。この機能を使用すると、文字列リテラル内の波括弧で式を記述することができ、実行時にこれらの式の値で文字列が自動的にアセンブルされます。

長さ48

IEnumerable f(){for(int a=0;;)yield return a++;}

今、実際の目的で何かをするのに十分なキャラクター!このメソッドは、上で検討したいくつかのアイデアを使用して、0から始まる整数を1つずつ返す無限Enumerableを作成します。C#はEnumerablesで遅延評価を採用しているため、無限シーケンスは完全に有効です。必要なだけシーケンスを繰り返し、いつでもブレークアウトします。

長さ56

int p{get{return mP;}set{mP=Math.Max(value,0);}};int mP;

「プロパティ」の別の例を次に示します(スニペット31を参照)。ここで、私は実際に別のコードスニペットを定義しているgetし、setむしろ以前のように自動のものを使用するよりも。この例では、プロパティを使用して変数に割り当てられた値を検証する方法を示します。ここでは、値を0未満にすることはできません。プロパティのその他の適切な使用法には、値が変更されたときのイベントの通知、またはキャッシュされた値の再構築が含まれますこれに基づいている可能性があります。

長さ65

int v;public static implicit operator int(Program o){return o.v;}

この機能は、暗黙的なキャストと呼ばれます。特定のクラスで動作する静的コードであるという点で、拡張メソッドに似ています(スニペット32を参照)。ただし、暗黙的なキャストはそれを呼び出すことによって使用されるのではなく、Programオブジェクトを整数(例:)として扱うだけで使用されますint i=new Program()。これを行うと、オブジェクトは暗黙的なキャストのコードに基づいて、使用している型に暗黙的に変換されます。ベストプラクティスでは、変換の結果として情報が失われない場合にのみこれを行うように指示されています。


1
これらのキャラクターで何ができるか見てみましょう...
;

9
私はそれがCよりもJavaに近いと言っているでしょう、実際には
誇りに思ってhaskeller

注目。Linqをやるにはもうすぐ十分だと思う-今夜来る!
BMac

public static implicit operator int(MyClass o){return o.objVal;} // 65。このコードでは、次の行が有効です。MyClass o1 = new MyClass(10); int o2 = o1; // o2は10になりました。msdn.microsoft.com/en-us/library/85w54y0a.aspx-
ズッキー

スニペットを
追加して

98

Java


長さ44のスニペット

Object a=System.out.append("Hello, World!");

印刷Hello, World!STDOUTへ。

長さ43のスニペット

float[][][][][]a=new float[5][3][7][2][10];

aそれぞれが5つの配列を含む3つの配列を含む7つの配列を含む2つの配列を含む10の配列を含みますfloat

長さ42のスニペット

interface A{static void main(String[]a){}}

完全なプログラム。のすべてinterfaceが本質的publicにであるためpublic、mainメソッドから単語を省略できます。

長さ36のスニペット

class A{class B extends A{B.B.B b;}}

A内部クラスがありBます。これは、型の変数を宣言できることを意味しますA.B

ただしB、はのサブクラスですA。つまり、のすべてのメソッド、フィールド、内部クラスを持っていますA。したがって、型も参照できB.Bます。

このコードでは、これをさらに一歩進め、Btypeのインスタンス変数を指定しますB.B.B

教訓:SOのホットな質問をフォローすると、無意味ではあるが興味深いテクニックがたくさん教えられます。

長さ35のスニペット

l.stream().map("a"::equals).count()

lが文字列のリストである場合、これはどれだけの文字列が等しいかを示し"a"ます。

長さ34のスニペット

public static void main(String[]a)

プログラムのメインメソッドのメソッドシグネチャ。あと11人のキャラクターで、完全なプログラムを作成できます!

長さ33のスニペット

enum D {NORTH, EAST, SOUTH, WEST}

NORTHEASTSOUTH、およびWESTタイプのすべての定数ですD

長さ32のスニペット

Files.readAllBytes("hello.txt");

ファイル全体を読み取り、byte[]内容のいずれかを返します。

長さ31のスニペット

new String(new char[]{'h','i'})

と同等"hi"です。"キーが壊れている場合に便利です。

長さ30のスニペット

new JFrame().setVisible(true);

他のコンポーネントを配置できる新しい可視フレームを作成します。

長さ29のスニペット

throws ClassNotFoundException

これを呼び出すすべてのメソッドにtry- catchブロックを使用するか、エラーをスタックに渡すように強制します。チェック例外は、Javaデザイナーの最も物議を醸す決定の1つです。

長さ28のスニペット

int f(int x){return f(x-1);}

この関数は永久に実行されるわけではありません。実際、典型的なコンピューターでは1秒もかかりません。ありがとう、スタックオーバーフロー。

長さ27のスニペット

Object a=new String[]{"a"};

文字列の新しい配列を作成します。

長さ26のスニペット

Object.class.newInstance()

新しいを作成しますObject

長さ25のスニペット

((Supplier)()->-~0).get()

ハードコーディング定数を避けるのが最善です。これは、1以外の定数を使用せずに値を取得するオブジェクト指向の方法です0

長さ24のスニペット

(Function<Long,?>)x->x+1

後継機能。

長さ23のスニペット

l.removeIf(x->x%10==0);

場合はl整数のリストがあり、これは10で割り切れるすべての値を削除します。

長さ22のスニペット

int i=(new int[7])[5];

7つの整数の新しい配列を作成し、5番目の要素を取得します。

長さ21のスニペット

Arrays.asList(2L,"a")

これらの要素でArrayListを作成します。

長さ20のスニペット

System.out.print(s);

印刷しsます。

長さ19のスニペット

import java.util.*;

以下のようなクラスの簡潔な使用を可能にしますListMapScannerTimer、とRandom

長さ18のスニペット

Math.addExact(x,y)

2つの整数xとを追加しますy。オーバーフローが発生した場合、メソッドは誤った答えを与えるのではなく、例外をスローします。

長さ17のスニペット

Double.MIN_NORMAL

typeの正の最小値。仮数doubleの先頭ビットは0です。

長さ16のスニペット

System.in.read()

コンソールから単一の文字を読み取ります。

長さ15のスニペット

Long.reverse(x)

のバイナリ表現のビットを反転しますx

長さ14のスニペット

int x=050+120;

xで始まる0ものは8進数として扱われるため、現在は160 です。

長さ13のスニペット

private C(){}

プライベートコンストラクターは、他のクラスがインスタンス化するのを防ぎます。このパターンは、特にクラスSystemMathクラスで使用されます。プライベートコンストラクターを使用して、シングルトンパターンを適用することもできます。

長さ12のスニペット

static class

外側のクラスを囲むことなく、内側のクラスを作成できます。これ多くのプログラマーが直面する問題の 解決策です。

長さ11のスニペット

throw null;

をスローする必要があることがよくありますがNullPointerException、かなり冗長です。これは、はるかに単純な代替手段です。

長さ10のスニペット

int[]a,b[]

2つの変数を定義しますabaのタイプint[]bあり、のタイプint[][]です。

長さ9のスニペット

switch(x)

の値に応じて、場所に移動しますx

長さ8のスニペット

break a;

というラベルのブロックから抜け出しaます。

長さ7のスニペット

goto x;

gotoキーワードはC、C ++、およびJavaで予約されています。場合はxラベルで、このコードは、適切なラベルにプログラムを送り、 - CおよびC ++で。しかし、それはJavaであり、神秘的なものを引き起こしますRuntimeException。実際、gotoJavaでキーワードを使用する方法はまったくありません。

長さ6のスニペット

\u003b

ステートメントを終了します。Javaは奇妙です。

長さ5のスニペット

a-=-a

a否定を差し引くと倍になります。

長さ4のスニペット

a&=b

値を設定aビット単位へとのaしてをb

長さ3のスニペット

...

配列に統合された任意の数の引数。

長さ2のスニペット

<>

コンパイラが、おそらく一般的なタイプを理解できるようにします。非常に非Javaに似ています。

長さ1のスニペット

@

メソッドおよびクラスに関する追加情報を表示できるようにする注釈を示します。

ファクトイド

Javaでは、無限ループによりコンパイラエラーが発生する場合があります。たとえばwhile(true);、メソッドを終了せずにループを終了することはできないため、その後のコードは「到達不能ステートメント」エラーをトリガーします。@Optimizerが指摘したように、この方法でキャッチされるのは無限ループのみです。


5
Javaでは、無限ループはコンパイラエラーを引き起こしません。それらを検出してエラーを生成するIDE。JavaにはUnreachableステートメントの概念があるだけなのでwhile(true);、コード内に何かがある場合、その行の後にあるものはすべて、Unreachableステートメントのコンパイルエラーをスローします。そのような文を検出するの背後にある論理は非常に厳格なので、任意の手段によってすべての無限ループを認識しません
オプティマイザ

4
あなたはちょうど投票されました。これは、スニペットを削除する必要があることを意味すると思います!;)(ダウン票は「Java is weird」に対するものでした)
サイモンフォースバーグ

1
スニペット#36は再帰的で、無期限に拡張できるようclass A{class B extends A{B.B.B.B.B.B.B b;}}です。それでもコンパイルします。
Natix

3
完全なプログラムの作成を支援することに
賛成

1
But it Java, [goto] triggers a mysterious RuntimeException違う。gotoコンパイルさえしません。
ドルカハン

93

Python

あなたの便宜のために最新のものから始めましょう!一番早いものから始めて長さ30を読むには、改訂履歴に移動します。

誰か提案があれば、気軽にコメントしてください。

長さ52:

i=0
while s[i-n:]:print(' '*n+s)[i:n+i];i+=1;i**7**7

Fake Marquee Textチャレンジへの私のエントリーから取られました。sそしてn、文字列と、今後の時間の整数に設定する必要があります。実際に使用していた無料のPython 2インタープリターではうまく機能しないため、括弧を追加し(' '*n+s)[i:n+i]ました。Python3インタープリターで実行できるのはこちらです。

長さ43:

#-*-coding:rot13-*-
cevag h"Una fubg svefg"

Pythonでは、特定のコーデックでソースをエンコードできます。これは、ソースをRot13で記述する方法を示しています。一般的な構文は次のとおり# -*- coding: <codec-name-goes-here> -*-です。

ここで翻訳されています:

#-*-coding:rot13-*-
print u"Han shot first"

uリテラル以下の文字列はUnicode文字列であることを指定します。これは、文字列もRot13に含める場合に必要です。そうしないと、ソース内のすべての文字列が暗号化されていても簡単に読み取ることができます。または、.encode("Rot13")すべての文字列の後に使用することもできます(これについてもRot13を使用することを忘れないでください)。この記事によると、いくつかの代替エンコーディングは「base64」、「uuencode」、「zlib」、または「bz2」です。

長さ33:

import cmath
print cmath.sqrt(-1)

これは、複素数(虚数)用のPythonのモジュールです。この印刷物は、1jPythonがエンジニアリング基準に準拠し、使用しているため、j私が好むが、虚数単位としてi、より一般的に数学で使用され、そして使用jkに加えiのための四元数が、私は脱線します。ここでバグ/変更の順序を読んでください(変更されません)。

長さ30:

f=lambda n:n*f(n-1)if n else 1

ここで、再帰と三項if-elseを使用して独自の階乗関数を定義します!私の知る限り、これはPythonで得られるのと同じくらいゴルフです。また、次のように書くこともできます。f=lambda n:n and f(n-1)*n or 1、Pythonのブール演算子をいくつか紹介します(また、30文字で行います。)lambda構文については、長さ15のスニペットを参照してください。

長さ29:

import math
math.factorial(7)

7の階乗を見つけ、を返し5040ます。

長さ25:

import math
print math.pi

Pythonの数学モジュールは、多くの便利な関数と定数を提供します。PIです。を返します3.14159265359。(上記のコードでは、改行を文字としてカウントしました。)

長さ24:

f=lambda y:lambda x:x**y

これはクロージャーの例です。呼び出しcube = f(3)print cube(24)、印刷で呼び出すことができる3次関数を作成します13824

長さ19:

print"Hello World!"

最後に、基本的な出力を印刷するのに十分なスペースがあります!引用符と括弧も区切り文字であるため、ここにスペースは必要ありません。Python 3は、print他の関数と同様に呼び出されるように関数を変更したため、Python 2でのみ機能します。Python 3では、を使用しますprint("Hello World!")。print関数の詳細 Python 2と3の違いについては、Python 3.0の新機能を参照してください。

長さ16:

[x*3 for x in l]

繰り返しになりますが、仮定lは、リスト、または文字列やジェネレーターなどのその他の反復可能なオブジェクトです。このステートメントはリスト内包表記として知られています。ループ構造の標準を使用するよりもはるかに短いです。ここでは、すべての数字に3を掛けたリストを返します。また、文字列を掛けることもできます。そのため、リスト内の文字列はその回数だけ追加されます(それ自体に連結されます)。

長さ15:

import this #:)

これは実際には長さ11のスニペットですが、Pythonの(素晴らしい)イースターエッグを紹介するのを忘れていたことに気付きました!このモジュールをインポートすると、The Zen of Python(Factoidを参照)this.pyが出力されます。興味深い事実:モジュールはrot13でエンコードされています。

長さ14:

lambda x:x**.5

これは、Pythonのlambda関数リテラルの構文を使用して平方根関数を定義します。Pythonの関数リテラルには、ステートメントではなく式のみを含めることができます。このラムダは、変数に割り当てられたり、関数に渡されたり、でインラインで実行され(lambda x:x**.5)(9)、を返します3.0。平方根に指数を使用するsqrtことは、mathモジュールに関数をインポートする代わりになります。

長さ13:

1 if x else 0

これは、Pythonの三項if演算子の例です。これはPython 2.5で追加されたもので、コーダーがブール演算を使用して手動で実装しないようにします。ここで、1x評価された場合はreturn True、そうでない場合0はが返されます。

長さ12:

s=input(">")

これにより>、プロンプトテキストが出力され、ユーザーが値を入力できるようになります。Python 2は入力された値を解釈するため、文字列には引用符が必要です。入力された入力が自動的に解釈されないように、Python 3はこれを変更しました。Python 2で解釈せずに入力を入力するには、を使用しますraw_input()。Python 2では、input()と同等eval(raw_input())です。

長さ11:

eval("2e3")

2e3float 2 x10³の科学表記法です。このeval関数は、文字列を式として解釈および評価します。この場合、リテラル2e3or を使用した場合と同じ結果になりfloat("2e3")ます。を返します2000.0

長さ10:

range(013)

この関数は、から08進値までの整数のリストを返します013。これは11(排他的)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]です。つまり、リストはになります。この関数は、slice前に確認した関数と同様に最大3つのパラメーターを取りますrange(start, stop[, step])。違いは、パラメーターが1つだけの場合、パラメーターが停止値を表すことです。

Python 3.xには同等のものがないことに注意してください。これrangeは似ていますが、実際にはPython 2と同じxrangeで、リストの代わりにジェネレーターオブジェクトを返します。

長さ9:

a,b = b,a

複数の割り当て。これはシンプルですがエレガントな機能で、複数の値を同時に割り当てることができます。提供されたスニペットでは、とを交換abます。評価の順序はどうですか?割り当て演算子の右側にあるすべての式は、割り当てが行われる前に評価されます。これは、一時変数への中間代入を必要とする多くの言語に勝ります。

長さ8:

#comment

あなたはそれが何であるか知っています...待って、そうではないのですか?ご存知のように、任意のテキストを入力してコード行を説明し、理解しやすくするものは何ですか?番号?ああ、大丈夫...

長さ7:

l[::-1]

再びlリストであると仮定すると、これはリストを逆の順序で返します。3番目の引数は、ステップサイズを示します。3つの引数はすべて負の値になる可能性があるため、負のステップサイズは逆の順序で繰り返すことを意味します。空の最初と2番目の引数は、リスト全体を繰り返し処理していることを示しています。

さらに興味深い構造を使用できるようになりました!

長さ6:

l[-6:]

これは、スライス操作と呼ばれますlがリストの場合、これはリストlとして最後の6つの要素を含む新しいリストを返します。-6は開始インデックス(末尾から6)を表し、コロンはそれ以降の終了インデックス(空白のままなので最後まで)を継続することを意味します。リストに1〜10の数字が含まれていた場合、これはを返し[5, 6, 7, 8, 9, 10]ます。

長さ5:

1<x<5

Pythonのすばらしい機能の1つは、比較演算子を連鎖できることです。他の多くの言語では、これはと入力され1 < x && x < 5ます。複数の比較を考慮するとさらに良くなります: 1 < x < y < 5完全に有効です!

長さ4:

0256

先行ゼロの整数は、8進数のリテラル値です。これは、コードの難読化にも役立ちます。これは、小数値を返します174。Python 3.xでは、8進数値はとして記述され0o256ます。

長さ3:

`3`

バックティックで式を囲むことrepr()は、オブジェクトの文字列表現を返すを使用することと同じです。関数は、eval関数に引数として渡されたときに元のオブジェクトを返すような方法で文字列を返そうとします。それはない使用した場合と同じstr()結果が時々同じですが、。この入力で'3'は、両方の場合に返されます。これはコードゴルフのお気に入りです!

Python 2でのみ動作します!

長さ2:

[]

空のリスト。

長さ1:

_

アンダースコア文字は、よく使われるスローアウェイ変数名です。ただし、Pythonシェル(インタラクティブインタープリター)を使用している場合、最後に実行されたステートメントの結果を保持します(そして、それを再び返します)。また、このスレッドによると、i18nの翻訳検索にも使用されます。

Factoid:PythonはJavaおよびCに似た言語です。特定の設計哲学(「PEP 20 – Pythonの禅」から引用)で構築されました。

  • いよりも美しい
  • 明示的は暗黙的よりも優れています
  • 単純なものは複雑なものよりも優れている
  • 複雑は複雑よりも優れている
  • 可読性カウント

これらの理由から、セミコロンは文の区切り文字として許可されていますが、通常は読みやすくするために複数行を使用するために省略されています。また、行のインデントは非常に重要です!


どんなときも!あなたはすでにすばらしい仕事をしているので、私はもうスニペットを追加するつもりはありません(長さ9のものに抵抗できませんでした!)。幸運を!
nasser-sh

1
長さ6:戻ります[5, 6, 7, 8, 9, 10](リストの最後の6つの数字)
ビンセント

長さ16:lリストである必要はなく、反復可能なオブジェクトであればどれでもかまいません。タプル、リスト、ジェネレーターなどのすべての作品
nasser-sh

@ Sp3000:[制限付きソース]チャレンジで使用しました。
ロビーWxyz

4
古き良き人への愛はないimport antigravity
暗号

87

JavaScript

これは最新のものから最も古いものになります。自分用のリンク:[ 編集 ]

長さ51のスニペット:

console.log(require('fs').readFileSync(__filename))

今回はNode.JSがクインしますが、独自のソースコードを読み取るため、「厳密なクイン」の要件はすべて満たされません。

長さ50のスニペット:

a=new XMLHttpRequest;a.open('GET','file');a.send()

最後に!AJAXリクエスト(Vanilla.JSを使用)。私たちは、オープン初期化し、要求を送信し、私はハンドラを追加し、実際にして部屋の外に走った結果で何かを。

長さ49のスニペット:

msg=new SpeechSynthesisUtterance('Hello World!');

ボーカル「Hello World!」を準備します。実際に話すにはもう少し手間がかかります。ボリューム、ピッチ、レート、アクセントも調整できます。HTML5RocksのSpeech Synthesis APIを参照してください。Firefoxではまだサポートされていません。IEではサポートされていません

長さ48のスニペット:

function repeat(){setTimeout(repeat,48)}repeat()

setInterval再帰的にsetTimeoutingしてシミュレートします。

長さ47のスニペット:

module.exports=function MyModule(a) {this.a=a};

NodeJSですが、原則はJSのどこでも同じです。これは非常に基本的なコンストラクター関数であり、1つのプロパティ(a)を持つオブジェクトを作成します。設定module.exportsすると、require()-ingで使用する関数がエクスポートされます。

長さ46のスニペット:

canvas.getContext('2d').fillRect(46,46,46,46);

これには<canvas id="canvas"></canvas>要素が必要です。IDを持つ要素はグローバル変数として設定されるため、要素はcanvasJSからアクセス可能です。次に、x = 46、y = 46で46x46の正方形で塗りつぶします。

長さ45のスニペット:

JSON.parse(require('fs').readFileSync('jsn'))

ノードに戻ります。ここではjsn、現在のディレクトリから名前が付けられたJSONファイルを解析します。

長さ44のスニペット:

(a=document.createElement('a')).href="/url";

#39の構築。次に、要素を作成して属性を割り当てます。ただし、まだDOMには含まれていません。

長さ43のスニペット:

sq=[1,2,3,4,5].map(function(n){return n*n})

を使用して、最初の5つの正方形の配列を作成しますmap()

長さ42のスニペット:

six="1+5",nine="8+1";eval(six+' * '+nine);

これは、同じ原理で動作します。この、しかしJSは欠けている#defineので、醜い終わります。もちろん、人生、宇宙、すべてに対する答えを返します。

長さ41のスニペット:

c=function(){var i;return function(){}}()

閉鎖の始まり。cこれで、内部変数にアクセスできる関数(内部関数)になりましたが、i何もしません。

長さ40のスニペット:

$('p').click(function(){$(this).hide()})

これらの段落を完全に削除し、jQueryを使用しています。

長さ39のスニペット:

script=document.createElement('script')

これは、新しい外部スクリプトの追加の始まりです。空の<script>要素を作成し、それへの参照を保持します。

長さ38のスニペット:

document.getElementsByClassName('abc')

.abcドキュメント内のすべての要素を見つけます。もちろん、jQueryでは、$('.abc')...

長さ37のスニペット:

b=JSON.parse(JSON.stringify(a={3:7}))

2つの同一の、しかし分離されたオブジェクトa、およびを作成しますb。あなたがするなら

a={a:1};
b=a;
b.a=3;

あなたは終わると思いa=={a:3}、理由ab同じオブジェクトをポイントします。JSONを使用してそれらを分離します。

長さ36のスニペット:

(function f(){return "("+f+")()"})()

QUINE。独自のソースコードを出力します。

長さ35のスニペット:

document.body.style.display="none";

#32を参照してください。これは、コンテンツを上書きせずにドキュメントを非表示にするだけです。

長さ34のスニペット:

Object.prototype.toString.call(34)

呼び出しObject.prototype.toStringは、オブジェクトのタイプを知るのに良い方法です。一方で34..toString()あり"34"、スニペットがあります[object Number]

長さ33のスニペット:(このクレジットは匿名ユーザーに送られます

+0%-0.&(v\u0061r=~void[{}<<!(0)])

これは有効なJavaScriptではないと思いますか?試してみてください...(Chromeを使用);)

長さ32のスニペット:

document.body.innerHTML="hacked"

半減!Hazxxors!eleven !! 11!

長さ31のスニペット:

a=[];for(i=0;i<31;i++)a.push(i)

冗談ではありません、私は実際にforループを使用できるようになるまでずっと待っていました!これは、0〜30の配列を作成します。

長さ30のスニペット:

new Date().getDay()==1?"S":"E"

初めて三項演算子を使用します。これ以上は30文字に収めることができなかったので、今日が日曜日かそれ以外の場合にしかわからない。:P

長さ29のスニペット:

Object.keys(window).push('i')

Object.keys(window)グローバル変数の配列(のプロパティwindow)を取得します。.push()その配列にアイテムを追加します。これは同等のものだと思うwindow.i=undefined?いや!

長さ28のスニペット:

setTimeout("a=confirm()",28)

28ミリ秒待機することは、新しいスレッドを作成することを除いて、それほど役に立ちません。

長さ27のスニペット:

document.querySelector('a')

DOM名が非常に長いのは残念です。ここでリンクを1つだけ取得できました。

長さ26のスニペット:

JSON.stringify({twenty:6})

#16を参照してください。これで実際のJSON-文字列を取得します。

長さ25のスニペット:

new Badge("Good Answer");

Badge()引数を取るコンストラクター関数であると仮定すると... グッドアンサーバッジが作成されました!

長さ24のスニペット:

do {alert(24)} while(!1)

私は実際にはまったく使用していませんdo..whileが、一部は使用しています。これが通常のwhileループである場合、常に偽であるため、何も警告しません。do..whileただし、常に少なくとも1回は実行されるため、24が表示されます。

長さ23のスニペット:

window.parent==self.top

これらはすべて、一般にとして知られている同じオブジェクトを参照しますwindow。関数を普通に呼び出すと、もありthisます。グローバルオブジェクトにアクセスする5つの方法です!

長さ22のスニペット:

for(i in self)alert(i)

すべてのグローバル変数に警告します。それはたまたまそうですself==window。(次のスニペットを参照してください。)

長さ21のスニペット:

"2"+1==21 && 2+1=="3"

ああ、JSのキャスティングルールです。この文は本当です、ところで。

長さ20のスニペット:

Math.random()<.5?0:1

0-1から乱数を選択し、三項演算子を使用して丸めます。それは使いやすいでしょうがMath.round...

長さ19のスニペット:

[1,2,3].map(i=>i*i)

これは新しいです。本当に新しい これは、使用していますES6の矢印の機能をそれだけのFirefoxでサポートされているように見える、現在1、2、および3の二乗を計算します。

長さ18のスニペット:

location.href="/";

#15と同様ですが、今回は、SEではなくPPCGホームページに移動します。

長さ17のスニペット:

(function(){})()

14のスニペットですが、もっと良いです!今ではIIFEです。

長さ16のスニペット:

obj={not:'json'}

これは私のペットのおしっこの1つを説明しています。これはオブジェクトあり、JSONはありませんJSONはJavaScriptオブジェクトに基づくデータ交換形式ですが、より厳密な形式を取ります。

長さ15のスニペット:

open('//s.tk/')

想像してみろ。http://s.tk/リダイレクトを使用して、SEホームページを開きます。

長さ14のスニペット:

function f(){}

W00t!機能!残念なことに、何もする余裕がありません

長さ13のスニペット:

Math.random()

0〜1の乱数を生成します。独自の制限を定義しますか?大変な運。(実際にはそうではありません。簡単です。)

長さ12のスニペット:

new Date<=12

このステートメントは、JSでは決して真実ではありませんでした。JSは、1970年1月1日00:00:00.012よりずっと後の95年(ファクトイドを参照)まで作成されませんでした。

長さ11のスニペット:

Math.PI*121

半径11の円の面積。

長さ10のスニペット:

if('j')9+1

気付いていない場合は、コード内のスニペット番号で何かをするのが好きです。これは10を返し、アルファベットの10番目の文字であるjを使用します。

長さ9のスニペット:

[9].pop()

1つのアイテムで配列を作成します。pop行くイタチ 9。

長さ8のスニペット:

document

すべてのDOM作業の基礎。しかし、長すぎるので何もできません。:( jQueryに行く!

長さ7のスニペット:

alert()

ああ少年!関数呼び出し!やっと物事ができるようになった!

長さ6のスニペット:

var x=6

#3に基づきます。ただし、グローバルは明示的であるため、はるかに優れています。:P

長さ5のスニペット:

[][5]

void 0取得するよりもさらに短いundefined。ところで:''.aさらに短いです。4文字のみ。

長さ4のスニペット:

+"4"

これ4により、文字列から番号が作成されます"4"。これらのまったく同じ4文字を異なる順序で再利用して、反対のことを行うことができます!

長さ3のスニペット:

x=3

おっと、暗黙のグローバル変数を作成しました...

長さ2のスニペット:

{}

これは何をしますか?あなたがオブジェクトリテラルを作成すると言ったら、あなたは間違っています。実際には空のブロックです。コンソールを開いて試してみてください!undefinedではなく、戻ります{}

2018年、{}Chromeのコンソールで実際に空のオブジェクトが返されます。

長さ1のスニペット:

1

それでおしまい。任意の数値が有効なJS式です。

Factoid: JavaScriptはもともとLiveScriptと呼ばれていました。当時(1995年)、Javaの人気を利用するためにJavaScriptに変更されました。個人的に、彼らは古い名前を保持するべきでした。それ以来、JavaScriptが混乱の原因となっています。事実は、JavaとJavaScriptは"car"と "carpet"とほぼ同じです。


1
Snippet 33はFirefoxでは機能しません。それは本当に有効なJSですか?
オリオール

オブジェクトを文字列化および再解析してコピーするのがとても汚い。ECMAScript 6が導入Object.assignするので、スニペット37はになりb = Object.assign({ }, a = {3 : 7})ます。
オリオール

@Oriolはい、まあ、Firefoxだけが今それをサポートしているので、今のところ汚い方法に固執する必要があります。少なくとも、それよりはましeval(uneval(a))ですか?;)
Scimonster

#38については、常にありdocument.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)")ます。(有効なCSSセレクターをサポートします)。
Mateon1

#40スニペット自体はそれほど興味深いものではありませんが、コメントは貴重です。
Scimonster

85

R

Factoid: Rプログラミング言語は、Sプログラミング言語のGNU実装として始まりました。主に統計および関連アプリケーションに使用されます。

注:競合の要件ではありませんが、ここのすべてのスニペットは、Rで単独で実行できます。


長さ32:

`[.data.frame`(swiss,3,2,drop=F)

これは少し不思議に見えます...実際、そうすべきです!これを書くためのはるかに良い方法があります:

swiss[3, 2, drop = FALSE]

それはもう少し馴染みがあるはずです。これらのコードのいずれかを実行すると、次のようになります。

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

swiss我々はこれまで見てきたいくつかの他のようなRのデータフレーム船。1888年頃からスイスの47のフランス語を話す州の出生率と社会経済指標が含まれています。3番目の行はフランケスMnt州に関するもので、2番目の列は各州の職業として農業に携わる男性の割合です。そのため、1888年、スイスのフランチェス-Mnt州の男性の39.7%が農業で働いていました。

より単純な表記法を使用してデータフレームから行または列を抽出すると、Rは実際[.data.frameにバックグラウンドで使用されます。スニペット24で見たように、バックティックで囲まれている限り、ほとんどすべてを関数名として定義できるため、関数名に技術的に一致しない括弧が含まれていても、ここのスニペットは正当です。

drop=引数は、可能であれば、それは低次元に結果をドロップするかどうかRに伝えます。確かに、と言うとdrop=TRUE、次のようになります。

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

以前は結果がデータフレームでしたが、Rは2倍になりました。


長さ31:

print(fortune("hadleywickham"))

このfortune()関数はfortunes、さまざまな賢明な人々からさまざまな賢明な引用を提供する、すべてを知っているパッケージからのものです。このスニペットは、コンソールに印刷することで、Hadley Wickham(23)から次のジェムを提供します。

That's a casual model, not a causal model - you can tell the difference by looking
for the word "excel".
    -- Hadley Wickham (commenting on an Excel chart showing student's SAT score
       increases with family income, without considering future covariates)
       http://twitter.com/#!/hadleywickham (February 2012)

長さ30:

pie(rep(1,12),col=rainbow(12))

良い円グラフが好きではないのは誰ですか?このpie()関数は、数値のベクトルに基づいて焼きたての円グラフを提供します。rep()最初の要素をr回繰り返してベクトルを作成します。rは2番目の引数です。このcol=パラメーターはpie()、スライスの色付け方法を示します。魔法の関数rainbow()は、虹の「等間隔」色の16進コードを含む指定された長さのベクトルを生成します。

ここにあるのは、基本的な「このチャートの各色の量」チャートです。

ここに画像の説明を入力してください


長さ29:

summary(lm(mag~depth,quakes))

ここではいくつかのことが行われているので、それらを一度に1つずつ見ていきましょう。

quakesこれは、データセット内の列の二つがある1964年以来、フィジーの近くにリヒタースケールでマグニチュード4.0以上の地震1000のイベントに関する情報が含まれていますR.に付属のデータセットでmag、地震の大きさがあるが、とdepthあります、震源の深さ(キロメートル)。

lm()スニペット28で述べたように、この関数は線形モデルに適合します。lmオブジェクト、より正確にはclassのオブジェクトを返しますlm。予測子(または独立変数)と応答(または従属変数)を指定するには2つの方法があり、式の方法を選択しました。これは次の形式を取りますresponse ~ predictor。複数の予測子はとして指定されy ~ x1 + x2ます。数式内のオブジェクトは、次の引数で提供されるコンテキストで評価されます。

そのlm(mag ~ depth, quakes)ため、通常の最小二乗回帰を使用して線形モデルを近似します。ここで、大きさは応答であり、深さは予測子です。それが何であるかmagを知っdepthていますquakes

summary()は、主に近似モデルの結果を要約するために使用される汎用関数です。引数のクラスに固有のメソッドを呼び出します。lmオブジェクトを渡したので、実際に呼び出される関数を呼び出していますsummary.lm()

まとめると、地震の深さから地震を説明しようとする線形モデルの要約が得られます。特に、これはRが吐き出すものです:

> summary(lm(mag~depth,quakes))

Call:
lm(formula = mag ~ depth, data = quakes)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72012 -0.29642 -0.03694  0.19818  1.70014 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.755e+00  2.179e-02 218.168  < 2e-16 ***
depth       -4.310e-04  5.756e-05  -7.488 1.54e-13 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3921 on 998 degrees of freedom
Multiple R-squared:  0.05319,   Adjusted R-squared:  0.05225 
F-statistic: 56.07 on 1 and 998 DF,  p-value: 1.535e-13

最初に通知されるのは関数呼び出しであることに注意してください。これは、スニペット28で行ったように、lm()関数がを使用しているためmatch.call()です!


長さ28:

f<-function(x,y)match.call()

R関数は、多くの場合、ユーザーが何を伝えたかを追跡します。実際、送信したコマンドが、返されたオブジェクトの属性として返される場合があります。(例としてlm()、線形モデルを作成します。)正確な命令の呼び出しはmatch.call()、関数内で実行されます。これは、解釈された関数呼び出しをキャプチャするか、一致します。

ここでは、f()2つの引数をとる関数を定義し、その結果を表示します。

> f(1,2)
f(x = 1, y = 2)

これは主に、パッケージ開発のように、(あなただけでなく)一般的な使用のために関数を開発するときに役立ちます。あなたは例を見たい場合はmatch.call()野生で、のソースコードを見てlm()提出することによってstats:::lm。最初に行うことの1つは、を使用して関数呼び出しをキャプチャすることmatch.call()です。


長さ27:

install.packages("ggplot2")

これはささいなことのように思えるかもしれませんが、Rが非常に人気がある理由の1つを示しています。そして、誰でもパッケージを開発して自由に共有できます!

install.packages()その名前が示すとおりのものです。デフォルトのCRAN(包括的Rアーカイブネットワーク)ミラーを使用してパッケージを探し出し、Rがそれらを見つけることができるシステムにインストールします。ローカルソースコードからパッケージをインストールすることもできます。

ggplot2パッケージを使用したスニペット23を覚えていますか?このパッケージにはRがggplot2付属していませんが、わずか27文字でインストールすることですべての夢を実現できます。


長さ26:

filled.contour(t(volcano))

volcanoR.とのデータセットに発送しますそれはニュージーランド、オークランドのMaungawhau(またはマウントエデン)火山の地形情報を含む行列です。マトリックスの行は東から西に走るグリッド線に対応し、列は南から北に走るグリッド線に対応します。

見当識障害のために、方向を入れ替えましょう。列は東西に、行は南北になります。これは、行列転置を使用して実行できますt()。そして、私たちがそこにいる間に等高線図を作成してみませんか?filled.contour()それだけです。

ここに画像の説明を入力してください


長さ25:

pmatch("s",c("n","size"))

このpmatch()関数は、これまで見てきたすべての部分一致の背後にある魔法を提供します。最初の引数は文字列で、2番目の引数の各要素、ベクトルと比較されます。一意の一致がある場合、一致する要素のインデックスが返され、そうでない場合はが取得されNAます。

ここのスニペットは、この関数の使用の「実際の」例です。sample()関数を使用したスニペット13を思い出してください。これは、引数を受け入れnsizereplace、とprob、しかし、最初の2つだけが必要です。スニペット13ではs=、の省略形として使用しましたsize=。バックグラウンドで実際に行われているのは、このスニペットのようなものです。ここでは、提供されたものと予想されるものが比較されます。「s」は「サイズ」と一意に一致するためs=、省略形として使用することは完全に合法です。


長さ24:

`(`=function(x)9;2*(3-1)

してはいけないことの完璧な例です!今まで!

関数を定義するときにバックティックで文字を囲む限り、文字を関数として割り当てることができます。ここでは(、入力に関係なく常に9を返す関数であることをRに伝えました。他の多くの言語と同様に、;1行に2つのコマンドを含めるために使用できます。したがって、Rに伝えたのは、関数を定義して(からprintすること2*(3-1)です。

さて、ほとんどの人は、3-1 = 2、2 * 2 = 4を行うので、2 *(3-1)は4になるはずだと言うでしょう。しかし、括弧内の値は9であるとRに通知しました。したがって、3-1 = 2のとき、(3-1)= 9になります。次に、2 *(3-1)= 2 * 9 = 18を取得します。

このようなひどいことが可能であるため、式に括弧を含む(つまり、関数呼び出しではない)コードを送信するたびに、Rインタープリターは、関数として(定義(したかどうかに関係なく、呼び出された関数を実際に探します。一般に、あなたが書くほど、Rインタプリタはより多くの仕事をします。


長さ23:

qplot(Na,y=RI,data=fgl)

最後に、(非常に)簡単なggplot2例に十分な票を投じます。このggplot2パッケージは、伝説のR神ハドリー・ウィッカムによって作成されたグラフィックの文法のR実装です。一般に、構文はベースRグラフィックスとは大きく異なり、慣れるまでに時間がかかります。ただし、qplot()パッケージのコア機能の一部へのよりシンプルなインターフェイスでありplot()、ベースRに似た構文を持っています。しかし、これまでに示した多くの例とは異なりqplot()、関数パラメーター名の部分一致はサポートしていません。

fglデータセットはから来ているMASSパッケージ。法医学ガラスの破片の特性の測定値が含まれています。ここでは、変数を使用していますNa。これは、重量パーセントのナトリウム(Na)RIであり、、ガラスの屈折率です。

ここに画像の説明を入力してください


長さ22:

unique(presidential$n)

このunique()関数は、入力ベクトルの一意の値を含むベクトルを、入力に現れる順序で返します。presidentialデータセットの出荷ggplot2パッケージ(27)。(それを修正してくれたJemus42に感謝!)その説明:

各大統領の名前、任期の開始日と終了日、アイゼンハワーからブッシュWまでの10人の米国大統領の党

presidentialはデータフレームであり、リストにアイテムが含まれているように、データフレームには列が含まれています。列は、を使用して名前で参照され$ます。この特定のデータセットにはname、社長の名前を含むという列があります。しかし、待って、指定しただけnです!実際、これは部分一致のさらに別の例(n13、16 )であり、完全に合法です。

これを送信すると、興味深い結果が得られます。

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

リンドン・B・ジョンソンの名前の綴り方に注意してください...おっと。

(注:これを投稿してから1年以上経って、Johnsonのタイプミスが修正されたことに気付きました。RIPユーモア。)


長さ21:

integrate(dexp,0,Inf)

Rには、有限または無限の間隔にわたる単一変数の関数の適応求積法のための組み込み関数があります。Rでは、無限大はInf+ infinityおよび-Inf-infinity として指定されます。このdexp()関数は、指数分布の確率分布関数です。指数分布のサポートは[0、+ infinity)であり、確率分布は1に統合されるため、結果は1になると予想されます。

1 with absolute error < 5.7e-05

長さ20:

deriv(~cos(x^3),"x")

Rはシンボリック導関数を行うことができます!これは返します:

expression({
    .expr1 <- x^3
    .value <- cos(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(sin(.expr1) * (3 * x^2))
    attr(.value, "gradient") <- .grad
    .value
})

これを見ると、関数がどのように解析され、チェーンルールが使用されているかがわかります。初年度の計算を行った関数でできることはすべてできるはずです!このderiv()関数の最初の引数は、変数(この場合は)に関するR式(実際のRタイプ)xです。2番目の引数は、導関数が取得される変数の名前です(ここ)"x"

本当にすてきなものを見たいですか?上記に変数、たとえばを割り当てますdx。変数xを数値ベクトルとして定義します。次に送信しeval(dx)ます。Rは、x!で導関数を評価します


長さ19:

c(matrix(1,3,3),"a")

Rではc()、「結合」または「連結」の略で、引数からベクトルを作成します。ベクトルの要素は同じ型で、長さはすべて1である必要があります。しかし、Rに夢中になる代わりに、Rは構造(この場合は行列)を持つ要素をフラット化し、すべてを同じ型にキャストします。

引数がc()単一の型のみを含む場合、型のキャストは行われません。たとえば、すべての引数が論理(TRUEおよびFALSE)である場合、ベクトルはすべて論理になります。論理と数字が含まれている場合は、すべて数字になります。文字と何かが含まれている場合は、すべて文字になります。そのため、スニペットから次のことがわかります。

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

3行3列のマトリックスは平坦化され、「a」を追加するとすべてが文字になります。


長さ18:

(1-1/3-1/3-1/3)==0

機械精度のレッスン。これはを返しますFALSE


長さ17:

example(readline)

このexample()関数は、組み込み関数の使用方法の例を示します。使用方法を調べる必要がある場合readline()、Rが独善的な回答を用意しています。

> example(readline)

readln> fun <- function() {
readln+   ANSWER <- readline("Are you a satisfied R user? ")
readln+   ## a better version would check the answer less cursorily, and
readln+   ## perhaps re-prompt
readln+   if (substr(ANSWER, 1, 1) == "n")
readln+     cat("This is impossible.  YOU LIED!\n")
readln+   else
readln+     cat("I knew it.\n")
readln+ }

readln> if(interactive()) fun()
Are you a satisfied R user?

控えめになる方法、R。


長さ16:

acf(lh,t="part")

このacf()関数は、時系列の自己相関関数を返します。lhRに付属するデータセットです。その説明:

定期的な時系列で、血液サンプル中の黄体形成ホルモンを、女性の女性から10分間隔で48サンプル採取します。

この例では、部分一致が2回使用されています。1回は関数パラメーターで、もう1回はパラメーターに渡された文字列値です。完全なパラメータ名があるtypeと認識される値は"correlation""covariance""partial"。一意に識別するのに十分な文字列のみを提供する必要がある"part"ため"partial"、for を使用して、部分自己相関関数(PACF)を取得できます。

ここに画像の説明を入力してください


長さ15:

p3d(bunny,p=99)

再び、悪名高いバニーが見えます(11)。このonionパッケージは、3Dプロット機能を使用して、これまでで最も便利なデータセットを表示するためのさらに優れた方法を提供しますp3d()。これは、persp()バックグラウンドで基本グラフィック関数を呼び出し、回転引数を取りますphi。パラメータ名の部分一致(13)を使用してp=、の代わりに指定できますphi=

ここに画像の説明を入力してください


長さ14:

stats:::rgamma

Rはオープンソースですが、ソースコードを表示するためにウィザードである必要はありません。パッケージ名と、表示したいコードの関数を3つのコロン(:::)で区切って入力するだけです。これによりrgamma()、ガンマ分布からランダムな偏差を生成する関数を定義するコードが得られます。これを提出すると、以下が得られます。

function (n, shape, rate = 1, scale = 1/rate)
{
    if (!missing(rate) && !missing(scale)) {
        if (abs(rate * scale - 1) < 1e-15)
            warning("specify 'rate' or 'scale' but not both")
        else stop("specify 'rate' or 'scale' but not both")
    }
    .External(C_rgamma, n, shape, scale)
}
<bytecode: 0x00000000098cd168>
<environment: namespace:stats>

関数を使用することに注意してください.External()。これは、Rの基礎の多くを構成する他の言語、通常はCとFortranで書かれた関数を呼び出します。そのソースコードを見つけるには、少々手間がかかります。編集: @Vloは、単なる人間はパッケージで呼び出され、パッケージ.Internal().Primitive()使用して呼び出される基礎となるCコードを実際に表示できることを指摘しましたpryr。ありがとう、@ Vlo!


長さ13:

sample(9,s=4)

これはあまり似ていないように見えますが、Rの強力な概念である関数パラメーターの部分一致を示しています。で名前付きパラメータsample()の関数でありsizereplaceおよびprob、しかし、あなただけを一意に識別するために、指定されたパラメータの十分な手紙を提供する必要があります。したがって、他のパラメータ名が文字「s」で始まっていないためsample()s=代わりにを使用できますsize=。ここのコードは、整数1〜9からサイズ4のランダムサンプルを選択します。


長さ12:

LETTERS[-pi]

LETTERSアルファベット順に並べられたすべての大文字の英語を含む組み込みのベクターがあります。他の多くの言語とは異なり、浮動小数点数を使用してベクトルにインデックスを付けることができます。エキサイティングなことは何も起こりません。Rは整数部分のみを取ります。を使用して-ベクターのインデックスの前すると、そのインデックスを持つ要素がベクターから削除されます。piは、ご想像のとおり、無理数πを含む組み込み定数です。したがって、これはベクトルから要素3を削除し、「C」を省略して「A」から「Z」を返します。


長さ11:

plot(bunny)

onion、パッケージと呼ばれるデータセットがありますbunny。プロットすると、これまでで最も有用なグラフィックが得られます。

ここに画像の説明を入力してください


長さ10:

????sample

あなたが本当に混乱しているとしましょう sample()機能、あなたは必死に助けが必要だと言います。?sampleRのマニュアルページを表示する通常の方法ではなく、4つの疑問符を打ちます。Rはあなたの苦境を聞き、助けようとします...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

ああ。


長さ9:

isTRUE(1)

最初は、これはRベースパッケージの残りの規則を無視isして、関数名の次の単語を.。ただし、これは以下のように、引数が特定のタイプであるかどうかの論理テストにのみ適用されます(8)。この場合、TRUE型ではないかどうかをテストしています。これはの厳密な定義を使用しますTRUE。つまり、通常の意味では1は「真」ではありません。isTRUE(1)返却値FALSE


長さ8:

is.na(8)

他のほとんどのプログラミング言語と.は異なり、関数名と変数名には有効な文字です。それは、いかなる種類の方法または階層をも示しません。それは名前の一部にすぎません。is.na()この関数は、引数がに評価されるかどうかをチェックするNA(行方不明)、リターンTRUEまたはFALSE


長さ7:

stop(7)

これにより、エラーメッセージとしての入力でエラーが発生します。関数内で呼び出された場合、関数の実行は停止します。ただし、関数の外部で呼び出してもスクリプトは停止しません。この場合、出力はError: 7です。


長さ6:

x < -1

これは些細なことのように思えるかもしれませんが、割り当て演算子に対する大きな批判を示しています<-。つまり、スペースの配置によって意味が変わります。前述のように、x <- 11をに割り当てxます。上記のように1つのスペースで区切る<と、-1未満-かどうかの論理テストに変わりxます。そのため、多くの人=が割り当てを好みます。


長さ5:

x<<-1

現在のスコープに関係なく常に変数をグローバルスコープに割り当てること<-を除い<<-て、同様です。


長さ4:

x<-1

Rは<-、現在のスコープで変数を割り当てるために使用します。このスニペットは、値1をに割り当てますx


長さ3:

!0i

!オペレータが「しない」のRであり、0i複素数である0+0i複素平面において、AKA 0。このステートメントを送信すると戻りますTRUE0はfalseなので、。


長さ2:

NA

これは特別なR値を返しますNA。これは、「使用不可」を意味し、欠損値を示します。


長さ1:

T

これはを返しますTRUE。Rでは、TおよびFはそれぞれブール値TRUEとの同義語ですFALSE


イェイR "!"(T)
Vlo

@Vlo:と"!"(T)評価されFALSEます。ただし、「Yay R」という文は決して偽ではありません。;)
アレックスA.

エントリーを増やすにはどうすればいいですか???? 「そのソースコードの検索する魔法のビットを取るん」の自明である.Internal.Primitive- >pryr::show_c_source(.Primitive("sum"))
VLO

@Vlo:pryrパッケージについて聞いたことがありません。とてもかっこいい!それを指摘してくれてありがとう。サポートのおかげで、これまでのエントリーが気に入ってくれてうれしいです。:)
アレックスA.

2
@ Jemus42ああ、data(bunny)最初にやる必要があるようだ。
アレックスA.

75

ブレインファック

Factoid: Brainfuck(brainf * ckとも呼ばれます)は、UrbanMüllerによって作成された、これまでで最小のチューリング完全言語インタープリターを作成するための実験的な難解な言語で、現在この種の最も有名な言語です。コマンドは8つしかなく、習得は簡単ですが、使いにくいです。

Brainf * ckには、30000個のセルと可動ポインターを備えたテープベースメモリがあり、次のように視覚化できます。

0 0 0 0 0 0
    ^

^ポインタを表す文字、および0の各セルの値を表します。

Brainfuckには8つの指示があります。

Instruction  C Equivalent              Description
+            mem[ptr]++;               Add one to the value under the cell
-            mem[ptr]--;               Subtract one from the value under the cell
>            ptr++;                    Go on cell to the right
<            ptr--;                    Go on cell to the left
,            mem[ptr] = getchar();     Read a ASCII character from input and put the result in the value under the cell
.            putchar(mem[ptr]);        Write a ASCII character to the output using the value under the cell
[            while (mem[ptr]) {        Start a while loop: Continue to matching ']' when value under the cell is 0
]            }                         End a while loop: Go back to matching '[' when value under the cell is NOT 0

CへのBrainfuck:

#include <stdlib.h>

int main(void) {
    unsigned char* mem = calloc(30000, sizeof(unsigned char));
    unsigned int ptr = 0;

    // Put your brainfuck code here, converted to the matching expressions under "C equivalent"

    return 0;
}

長さ1のスニペット

1文字を読み取り、現在のセルに配置します。

,

(入力付き:メモリabc

0 0 97 0 0 0
    ^

長さ2のスニペット

現在のセルに1を追加し、ポインターを右に移動します。

+>

記憶

0 0 1 0 0 0
      ^

長さ3のスニペット

ゼロになるまで現在のセルから1つを削除します。現在のセルをゼロに設定します

[-]

可能なメモリ:

メモリー:(前)

0 0 100 0 0 0
    ^

メモリ:(後)

0 0 0 0 0 0
    ^

長さ4のスニペット

コメント:Brainfuckでは、命令ではないものはすべて無視されます。そのため、次のプログラムは完全に有効な(ただし空の)Brainfuckプログラムです。

Hey!

長さ5のスニペット

単純なcatプログラム(入力を出力に書き込む)

,[.,]

tomsmedeのコメントに感謝

長さ6のスニペット

現在のセルの値を右側のセルに移動します(右側のセルが0の場合、右側のセルの値に現在のセルの値が追加されます)。

[>+<-]

一般に、人々はこのコードを使用して変数を移動します。

メモリー:(前)

10 0 100 0 0 0
     ^

メモリ:(後)

10 0 0 100 0 0
     ^

長さ25のスニペット

6文字の入力を反転して印刷し、その後にすべてのASCII文字(N-1).. 1(Nは最初の入力文字の値)が続きます。

,>,>,>,>,>,.<.<.<.<.<[.-]

長さ53のスニペット

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

この縮小されたCプログラムは、変装したBrainfuckプログラムでもあります。実際、彼らは(ほぼ)同じことをしています。「コメント」のないBrainfuckコード(Cコード)を次に示します。

><+-

Brainfuckコード(およびCコード)について説明します。ご覧のとおり、2つのセル(iおよびj)を使用しています。最初のセルを増分します(i1 ずつ増分します)。次に、同じセルをデクリメントします(i1 ずつデクリメントします)。

これは、2つの異なる言語としてコンパイルし、(実際に)同じように実行できるソースコードのばかげた例です。


2
,[.,]-5文字、猫プログラム
-tomsmeding

13
これは私が今まで見た中で最高の「Brainfuck 101」かもしれません。
hoosierEE

長さ6:合計を右側のセルに配置し、左側のセルをゼロにします。動かないでしょ?
フィリップハグランド

概念をわかりやすく説明するために、ダミー変数を長さ6に追加しました。プログラムは実際にセル#3をセル#4に追加し、セル#3を0にします
。– YoYoYonnY

58票-更新してもらえますか?:)
コナーオブライエン

65

C ++

C ++は、プリプロセッサ、テンプレート、ラムダ、型特性、その他の複雑な機能を完全に理解することはできませんが、標準の新しい世代ごとに再発見されています。コンパイル時に物事を行うためのさまざまな方法を利用することにより、1はコンパイル時にその健全性を確認するために数値データ型に取り付けられている物理単位を可能にするライブラリーのようなゼロオーバーヘッド抽象化を書くことができます(たとえば、あなたがの結果割り当てることができませんkg* mへのN

長さ1

#

通常、プリプロセッサステートメントを導入すると、#それ自体が1行に立つことができます。それは本質的に何も意味せず、私が見るほとんどの構文ハイライターがそれを知らないほど知られていないようです。

長さ2

%:

もちろん、誰もが#キーを持っているわけではないので、C ++は(まあ、古代のCから実際に継承されています)この代替トークン(別名digraph)でそれを書くことができます。

長さ3

??=

これは、C ++の歴史的なコースです。実装はそれらをサポートできますが、最近は必ずしも有効ではありませんが、3文字表記です。このシーケンスは#、それをサポートするシステムで変換されますが、生の文字列リテラルを妨害しないように、それらの中で許可されていません。実装は、サポートをすべて削除することを選択できます。

長さ4

auto

汎用コードの操作を簡単にする新しい(C ++ 11以降の)発明の1つです。式の型を推定するためのものであり、C ++ 14以降では、ラムダパラメータと関数の戻り値型を推定するためにも使用できます。

長さ5

 catch

C ++に存在する他の多くの言語でも知られているキーワードですが、優れた慣用的なC ++プログラマーはほとんど使用しません。そのコンストラクタとデストラクタで、慣用的なC ++はRAII(Resource Acquisition is Initialization)と呼ばれる原則を使用するか、SBRM(Scope Bound Resource Management)と呼ばれることがあります。スマートポインターのようなクラスにより、動的に割り当てられたリソース(メモリだけではありません!)の有効期間を他のオブジェクトに関連付けることができます。それらがスコープ外に出た場合(例外のスローなど)、これらのオブジェクトはリソースを自動的にクリーンアップします。これにより、例外を使用する必要のない、安全で使いやすいコードが可能になりますcatch

長さ6

[](){}

[]{}()

コメントでステファンが言及したように[]{}、最短のラムダオブジェクトとして使用できます。したがって、これはラムダを呼び出す最短の形式です。次のテキストは古いバージョンのものです。

おそらくラムダの最短形式です。C ++のラムダは、作成されたスコープの一部をキャプチャできる(実装定義型の)オブジェクトであり([]構文がこれを制御します)、呼び出し可能です(()構文がこれを制御します)。それらのコード({}部分)は、スコープ内にあるかのようにこれらの変数にアクセスできます。C ++ 14で導入されたオプションの戻り型の推論と自動パラメーターの推論により、これらは呼び出し可能オブジェクト(たとえば、3番目のstd :: sortパラメーター)を期待するすべての標準ライブラリアルゴリズムに使用するツールです。

長さ7

virtual

オブジェクト指向プログラミングの基本的なブロックの1つであるC ++のランタイムポリモーフィズムの使用を開始するキーワードです。これは「使用しないものにお金を払わない」という原則に従いますが、他の言語ではすべての機能はデフォルトで仮想的です。マルチパラダイム言語であるため、「C ++はオブジェクト指向」と考えている人々にとって、このキーワードをほとんど使用しないプログラムやライブラリを見るのは驚きかもしれません。

長さ8

override

virtualキーワードと連携overrideすることは、C ++に後から追加されたものの1つであり、コンパイラーがより多くの作業を行えるようにします。それを使用することで、基本クラスの仮想関数をオーバーライドする意図を表現し、間違いを犯し、そのクラスに指定された関数がない場合、コンパイラーはエラーを出します。一般に、コードがビットをいじるのではなく、意図を表現するのが良いスタイルと見なされます。

長さ9

constexpr

また、後でC ++に追加されるconstexprことで、プログラマは関数または変数を表現できます。これらは、コンパイル時に既知であり、コンパイル時に計算可能である必要があります。これにより、これらの関数は、コンパイル時の式を必要とするコンテキストで使用できます(たとえば、テンプレートパラメーターまたは配列サイズとして)。多くの標準ライブラリ関数(可能な場合)は既にconstexprであるため、ここで使用できます。

長さ10

for(i:c){}

コンテナ、またはイテレータ(Cスタイルの配列を含む)をサポートstd::beginおよびstd::end取得する構造のようなコンテナの完全なループです。基本的にに相当しfor(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }ます。これにより、汎用コードで簡単にループできます。

長さ11

void f()&&;

メンバー関数と、それらを呼び出すことができるオブジェクトのプロパティを宣言する新しい方法です。以前のバージョンのC ++ではvoid f() const;、constオブジェクトで関数を呼び出すことができるようにコンパイラーに指示することしかできませんでした(したがって、constがないと、constオブジェクトでは呼び出せません)。&&rvalueでこれらの関数を呼び出せるようにするために使用されているr-value参照の構文と同じ方法です。

長さ12

int main(){}

これはおそらく、リンクをコンパイルして実行できる最短の完全なプログラムです。何もせずに0を返します。この戻りは、C ++で発生する可能性のある多くの特殊なケースの1つです。通常、何も返さないことは未定義の動作ですが、エントリポイント関数mainの場合、何も返さないということは0を返すことを意味します。

長さ13

auto f()->int

関数の戻り値の型を宣言するかなり新しい方法です。通常、型を既に知っている場合はこれを行いませんが、汎用プログラミングでは、型がテンプレートパラメーターと使用する変数に依存する状況がたくさんあります。このようにそれを行うと同様に、これらのパラメータにいくらか容易にアクセスすることができますtemplate<class T> auto f( const T& t ) -> decltype(t.foo())の代わりに、template<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
これは;プリプロセッサマクロではなく、C ++で1文字のステートメントを使用できるという事実はまったく困惑しているため、代替の1文字スニペットとして使用することをお勧めします。
ジョーZ.

1
[](){}は、ラムダの最短形式ではありません。パラメータのリストは空なので、省略できます。したがって[]{}、最短のラムダです。自明、[]{}()ラムダ;-)の最短実行されideone.com/k8fAvs
ステファン・

@stefan:実際、そのように機能しないように見えるので、私はいつもそれを忘れています;)私はそれを答えに加えました。
PlasmaHH

@PlasmaHH確かに機能のように見えないので、私は絶対に嫌いです。;
ステファン

59

正規表現

長さ2のスニペット

[]

JavaScript:何にも一致しない空の文字クラス。

PCREJavaPythonreRuby(バージョン2.0でテスト済み):構文エラー。

長さ1のスニペット

.

.ドットオールと呼ばれる、私が見ていたすべてのフレーバーで利用可能です。

何と一致しますか?

I̧n͟g̨͜e҉̡͞n̵͢e͜͝r̷͝a͘l̢҉、̴.̸̴̸̡̢̡̢̛́̕̕͟m͞ąt̴̨c͞h̛e͢͡s̶͘͘a҉n̛͜͠ỳ̸͢c̵̡hár͘͝a̕͢ćt͘͠e͏̀͠r̷̀ ̴̕͢ex͝͞͞c҉ep̀t̛̕f̴҉o͟͜r̴͢͞n͏ę͟w̢̕͜͝l͝i

JavaPattern:デフォルトモードでは、dot-allはこれら5つのコードポイントを除くすべてのコードポイントに一致します\r\n\u0085\u2028\u2029UNIX_LINES(しかしなしのモードDOTALL)、ドットは全てを除き、任意のコードポイントにマッチします\n。でDOTALLモードに、ドットの全ては、任意のコードポイントと一致します。Java 5以降でPatternは、コードポイントで動作するため、アストラル文字はすべてドットで照合されます。

Pythonre(2.7.8および3.2.5でテスト済み、3.3 +では異なる場合があります):デフォルトモードでは、dot-allは、UTF-16コード単位(0000〜FFFFを含む)と一致し\nます。re.DOTALL例外を解除し、.UTF-16コード単位と一致させます。これらのバージョンでreは、UTF-16コードユニットで動作するため.、アストラルプレーンの1つのコードユニットの文字にしか一致しません。

.NET:Pythonと同じです。.NETのドットオールモードはと呼ばれSinglelineます。

JavaScript(C ++ 11 <regex>:デフォルトモードでは、これらの4つのコードポイントを除き、dot-allはすべてのUTF-16コードユニットと一致します\n\r\u2028\u2029。とsに旗、ドット全ては、任意のUTF-16コード単位に一致します。JavaScriptは、UTF-16コード単位でも動作します。

PCREは:ビルドオプションに応じて、ドットの全てを除外することができ\r\nまたは\r\n3つのCR LFシーケンス、またはデフォルト・モードで任意のUnicodeの改行シーケンスを、またはすべて。デフォルトモードでは、エンジンはコードユニット(8、16、または32ビットコードユニット)で動作するため、dot-allは改行シーケンスを除くすべてのコードユニットと一致します。UTFモードでは、エンジンはコードポイントで動作するため、dot-allは改行シーケンスを除くすべてのコードポイントと一致します。ドットオールモードはと呼ばれPCRE_DOTALLます。

PHP(ideoneでテスト済み):PCRE。UTF-8ライブラリとしてコンパイルされ\n、デフォルトで唯一の改行シーケンスです。Dot-allモードには、sフラグを介してアクセスできます。

Postgres:デフォルトモードでは、dot-allは例外なくすべてのコードポイントに一致します。

Ruby(バージョン2.0.0でテスト済み):デフォルトモードでは、.を除くすべてのコードポイントに一致します\n。ドットオールモードには、mフラグ(!)を介してアクセスできます。

s フラグは、RubyでのWindows-31Jエンコードを示すために使用されます。


ファクトイド

Ŗ͞e̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ ̛̀҉҉̢c҉̷̨a̸̛͞n҉̛͠ ̷̸̀p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ ̨̧̀H̨̧͜͜T̷​​͞M̷̛͜L͢.̴̡́ R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̸̣̻͓̠͈͕̥̜͚̝̫͚̳̦͈̥̬̺͇̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐̚̚ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡パース͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
ファクトイドの参照を取得していない人には気分が悪い。
ロボベンクライン

6
@robobenkleinあなたの痛みの秘密の薬を知っています。
flawr

24
@flawr有名な質問を知らない人のために:stackoverflow.com/questions/1732348/…での最初の答えはあなたが探しているものです。
ロボベンクライン

1
Zalgo'edのテキストを読むことはできますが、それらを両方向に真剣に受け取らないでください。盲目的にザルゴの道をたどることは明らかに間違っていますが、ザルゴのテキストは常に間違っているわけではありません。
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳、HTMLを解析する方法を示すために、これらすべての投票を使用しませんか?
mbomb007

57

J

PS:スニペットがtryJ.tkにリンクされ、JをインストールせずにブラウザーのJavaScriptで実行できるようになりました。

PPS:注文を入れ替えました。これは、参加する人々にとって、また将来の参照のためにより理にかなっています。

PPS:時間の制約のため、1日に1つのスニペットを追加すると思います

ファクトイド:

JはAPLの子孫です(家族の歴史についてはこちらをご覧ください)。

長さ1のスニペット

_

Jは_、数値リテラル(動詞とは反対)に接続されている場合、無限大と負のインジケーターの両方として使用し-ます。

長さ2のスニペット

a.

a.Alphabetと呼ばれ、すべて1バイトの文字が含まれています。そのため、J atoiにはアルファベットのような単純な検索であるため、などの関数は含まれていません。a. i. 'z' =122

長さ3のスニペット

i.9

i.単項で使用される場合の整数用です(つまり、通常yと呼ばれる、1つの引数のみ、正しい引数)。上記の例のよう、これを動的に使用すると、のインデックスとして機能します

長さ4のスニペット

!!6x

Jは、任意精度の整数と有理数をサポートしています。これは、6の階乗の階乗(1747桁の数字)を計算します。

長さ5のスニペット

^.^:_ 

緻密な...最初に、動詞(Jが関数を呼び出すとき)はテーマごとに整理されています。すべての^動詞は、べき乗に関連付けられています。^以下のためのべき乗(及びexp場合、monadically使用^.するための対数^:特別なものであり、電源機能を多数回適用組み合わせ(高階関数)、右引数が無限大(ある場合_)、それは(にその左引数を実行します例^.)収束するまでの独自の出力で、実質的に^.^:_は、x = ln(x)1以外の引数に適用されたときに解決する動詞0.318132j1.33724です。

長さ6のスニペット

^0j1p1

または同等に

^o.0j1

オイラーの等式上記で引用したようJ.では、^ですexp()。任意の精度の整数と有理数は別として、πのべき乗と複素数、およびリテラルとしてのこれらの組み合わせもサポートします。0j1p1を意味し(0 + j) * pi ^ 1ます。

長さ7のスニペット

+/&.:*:

任意のベクトルの2ノルムを取る動詞。これは2つのことを示しています。

  • 挿入副詞は動詞の追加をオンに+その引数の各要素の間に挿入することによって、合計に。したがって(0+1+2+3) = +/ i.4

  • asを使用した場合の接続詞Underv &.: u yは、と同等ですvi u v y。ここviで、表側(一般的には逆)です。

はい、Jは逆関数について知っています。これらを組み合わせると、スニペット内の動詞がに相当します。たとえば、Matlabでも%: @: (+/) @: *:同様sqrt(sum(y.^2))です。

長さ8のスニペット

$#:I.@:,

フォークは、引数への任意の参照せずに3つの動詞で構成されています。これにより、Jで暗黙(ポイントフリー)プログラミングと呼ばれるプログラミングが可能になります。f g hモナドの場合のフォーク(この例のように)は、と同等(f y) g (h y)です。フォークとして、多次元配列はJの本質的な部分です。「インデックス」はベクトル内の1のインデックスを返しますが、そのような高次元には拡張されません。この例では、ShapeAntibaseを使用し、I.@:,Iを実装するフォークの3つのタインとして、たとえば、より高次元の配列に使用します。

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

長さ9のスニペット

<"1 i.4 6 

ボックス配列はJのデータ型であり、異種のコンテンツ(型とサイズの両方)を1つの値に結合できます。モナド< ボックスそれは引数です。ランクはJの中心概念であり、動詞をより高い次元の配列に自動的に拡張できます。名詞と動詞の両方にランクがあります。

名詞ランクは、動詞$@$があなたに伝えることができる、あらゆる名詞の次元の数です。たとえばi. 2 3 4、ランク3の配列です。

動詞のランクは、動詞が適用されるランクです。すべての動詞には、基本接続詞で照会できる固有のランクがあります。v b. 0動詞vの単項、2項左、2項右ランクに3つの数値を返します。

動詞は、動詞ランクに等しいランクの名詞セルで機能し、結果を名詞rank-verb rankフレームに置き換えます。動詞のランクは、ここで行われているように、ランク_で作業する代わりにランク1のセル(行)をボクシングすることで、ランク結合を使用して制限できます。配列全体をボクシングします。ランクの詳細については、こちらをご覧ください

長さ10のスニペット

<./ .+~^:_

このスニペットは、重み付き有向グラフ上の最短パスを計算する動詞です。minimum(<./)とDot接続詞を紹介します。ドット接続詞は、行列積の一般化であり、と書くことができます+/ . *。一般的に、u . vと等価であるu@(v"(1+lv,_))LVは動詞vの左のランクです。あるいは、言葉で左引数細胞「とTOTOで右引数『』 uがのリスト上のVの結果に適用されます」。(ランクについては上記を参照)

そのため、内動詞<./ .+~はitem y(i,j)y(i,k)+y(k,j)すべてのkの最小値に置き換えます 。

^:_ 収束するまでこのステップを繰り返します。

例、元のパスの最短距離を表示する:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

長さ11のスニペット

<.@o.10x^99

このスニペットには特別なコードが導入されています。一部のJコードは、特定のユースケース用に特別に記述されたコードでサポートされ、解析時に認識され、最適化されます。以上の性能(ここで場合のように)のいずれかより高い精度のために(参照特殊組み合わせ

このフレーズは99桁のpiを与えます(小数点以下99桁シフトします)。特別なコードは正確なフレージングに依存しますが、通常同等のものはスニペットコードほど正確ではありません。拡張精度が<.o.10x^99 失われます。

長さ12のスニペット

($-.1:)($,)]

時々、データでの選択により、シングルトンディメンションが途中で実行される状況に陥ります。Matlabでsqueezeと呼ばれるこの便利なユーティリティは、すべてのシングルトンディメンションを絞り出します。フォークの左の歯は、($-.1:)1のないすべての次元を生成しますが、真ん中の($)は、解かれた配列を保持された次元に変形します。適切なタイン]は、これをフォークにするだけで、正しい引数を参照します。

長さ13のスニペット

1 :'-u%u d.1'

ニュートンの方法は、微分可能な関数の根の近似値を見つけます。この明示的な副詞は、ルートが求められている関数に適用され、反復手順の1つのステップを表します。 u関数を参照する引数であり、副詞が適用された瞬間に置き換えられます。d. はシンボリックに関数を導出する接続詞であり、ここD.では数値的に同じことを行うものに置き換えられます(ただし、より高いランクの関数に適用される場合は異なります)。結果は、引数からフォーク(その微分で除算)を引くフックです。u

例えば:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

長さ14のスニペット

(%-.-*:)t.i.10

のテイラー展開による フィボナッチ数列の最初の10個の数値x / (1 - x - x^2)。フック%-.-*:を分析すると、が得られ(y % (-.-*:) y) = (y % ( (1 - y) - *: y)ます。

長さ15のスニペット

(#{.+//.)!/~i.9

フィボナッチシリーズの別のテイク。今回は別の角度から。パスカルの三角形 '!/~i.9'から始まります。

/動的に使用される場合はTableを意味し、引数の各セル間にバインドされた動詞を適用して、引数xとyの間の操作のテーブルを生成します。この場合!は、組み合わせ(またはOut of)として使用されます。~動詞をReflexiveにします。右の引数も左の引数として使用します。

副詞/.は奇妙なもので、配列の反対角線に沿って動詞を適用します(つまり、ここで試してみて</.!/~i.5ください

したがって、このスニペットは、パスカルの三角形の最初の9対角線上の合計を取ります。これは、たまたまフィボナッチ数列です。

長さ16のスニペット

;/@~.,. <"0@#/.~:

OK、16に到達するためにスペースを追加しました:)。このスニペットは、Keyを使用したフォークを示しています。引数内のすべてのアイテムとその頻度をリストします。

x u/. y:xは一意である、またはJにおけるチャンクでyにUが適用され(=x) u@# y=あるセルフ分類彼らが表示される位置に1つのを含むブール配列を生成、nub 〜を。 ここでは再帰的に適用されているため 、yの一意の各アイテムに対してTallyが実行され、出現回数がカウントされます。

Jのほとんどの動詞は、nubの順序(たとえばunique、引数を並べ替える Matlabの反対の新しい一意のアイテムの出現順)を保持するため、ここで行われているように、頻度に合わせてアイテムをスティッチするために使用できます。;/@~.すべてのアイテムのボックス化されたリストを作成するために使用されます。

ランクの一般的な概念であるため、このコードは任意の次元で機能することに注意してください。

長さ17のスニペット

*./ @:(#&>)@C.@A.

Jは、順列に関するいくつかのプリミティブをサポートしています。

  • Anagram A.単項式でAnagramインデックスを見つけ、動的に、左引数のアナグラムインデックスで指定された順列を右引数に適用します。
  • サイクル-Permute C. は、順列の直接表現とサイクル表現を変換します。

このスニペットは、左(0〜!#y)にアナグラムインデックスを取り、並べ替える配列を右引数yにする動詞です。その後、サイクル長のLCM *./を計算し#&>ます。元の配列を取得した後の期間:

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

長さ21

<:@(#/.~)@(i.@#@[,I.)

この小さな動詞は「stats / base」アドオンに由来し、histogramと呼ばれます。ビン開始のリストが与えられると、]bn-1,bn]bnがビン番号nの開始である間隔内のデータのすべてのオカレンスを合計します。

Interval IndexI.を利用して、次の間隔を見つけます。

yがxの項目の形状を持っている場合、x I. yは、j {xが順序でyに続くような最小の負でないjです。アイテムはありません。

各間隔の合計は、スニペット16で強調表示されているキーを使用して作成されます。

tryj.tkにリンクされているスニペットは、このヒストグラムを使用した中心極限定理を示しています。

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

長さ22

=,&(+/)(~:#[)e.&~.~:#]

Fun inJ。これは首謀者エンジンを実装し、秘密の配列を左引数、推測を右引数として使用します。返される値は、白と黒のペグの数です。分解:

NB.   ExactMatch: checks where digits correspond:
ExactMatch =: =

NB.   GoodDigitWrongPlace: Copies non-matched numbers from both arguments (left and right
NB.   pairs of parentheses, and checks them for same elements(e.), after eliminating
NB.   doubles in both (&~.)
GoodDigitWrongPlace =: (~: # [) (e.&~.) (~: # ])

NB.   Piecing the conditions together, after summing the booleans:
mm =: ExactMatch ,&(+/) GoodDigitWrongPlace

のように使用される

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

どこsecretguess任意の配列です。実際にはどのデータ型でも機能します。


17
さて、奇妙なシンボルの読み取り不能なヒープを取得するか、ASCIIシンボルの読み取り不可能なヒープを取得します。あなたの毒を選んでください。
ジョンドヴォルザーク

16
@JanDvorakすべての言語は、学ぶまで読めません。;-)
ガレス

5
私は長く、わかりやすい名前がコードの理解を助けると考えていました。それから私 啓発された
hoosierEE

@Garethしかしあなたがそれらを学んだ後でもすべてが読めないわけではありません。名前を付けない
-flawr

45

RPL(Redstone Programming Language) [およびMinecraft]

これは、これを実際のプログラミング言語と見なすことができるかどうかの大きな範囲ですが、とにかく試してみます。そして、これら2つの「言語」は実質的に同じなので、それらを結合し、「Minecraft」言語(レッドストーンなど)とRPLでスニペットを投稿することもあります。また、多くのスニペットがMinecraftにあるので、スペースを節約するために、写真自体ではなく写真へのリンクを投稿します。さらに、すべてのスニペットは、一般的なレッドストーンではなく、Minecraftのプログラミング概念のものです(つまり、レッドストーンドアは表示されません)。文字は(RPLで)バイト単位で、または(Minecraftで)これに従ってカウントされます。

ファクトイド:

RPLはTossha the Inventorによるプログラミング言語で、コードをMinecraftのレッドストーンおよびコマンドブロックに変換します。入力と出力、ループ、整数操作、トリガ関数、ルートなどを実行できます。

長さ1:

ボタン(1バイト)は、Minecraftの入力の最も単純な形式です。「プログラム」を開始または停止することもできます。同様に、レバー(1バイトも)は別の入力形式であり、「オン」および「オフ」状態にあるため、プログラムの開始と停止の両方に使用できます。覚えておくべきことは、Minecraftは文字通り3Dプログラミング言語であるため、プログラムのボタン/レバーがどこにあるかが大きな違いを生む可能性があるということです。

長さ2:

レッドストーンランプに取り付けられたボタンは、非常に基本的な猫プログラムです。これは、(いずれかの、ボタンまたはレバーで入力を受け取り0、または1off又はonいずれかのようなランプからの光のような))と形式で出力する0か、1off又はon)。

ここに画像の説明を入力してください

長さ3:

以下に示すように、これは最短のソースコード変更プログラムの1つです(Minecraftで実行時にソースを変更できるためです!)。さて、この特定のものは実際には使い物になりませんが、この概念を他の概念と組み合わせていくつかの素晴らしいプログラムを作成することができます(より多くの賛成票が付属しています)。このプログラムを実行すると、入力ソースが削除され、再び実行できなくなります。 ここに画像の説明を入力してください

長さ4

この「スニペット」は、実際には、遅延とNOTゲートという2つの概念を示しています。遅延は、レッドストーンティック遅延を持つ特定のレッドストーン要素を使用して行われます。レッドストーンティックは、1/10秒に相当します。異なるレッドストーンコンポーネントには異なる遅延があります。トーチには1rtの遅延(1レッドストーン刻み)があり、コンパレータには1rtの遅延があり、リピーターには設定方法に応じて1、2、3、または4rtの遅延があります。この例では、レッドストーンリピーターは4rt遅延に設定されています。

次はNOTゲートです。NOTゲートは入力を受け取り、それを反転します。したがって、この設定では、入力がオフの場合、出力はオンになり、入力がオンの場合、出力はオフになります。

長さ5

ORゲートは、Minecraftで簡単に実現できます。2つの入力が同じ出力に接続されています。それだ。面白いトリックや何も、それは非常に簡単です。

ここに画像の説明を入力してください

長さ6

「コード」を圧縮するためのヒントを次に示します。2つの入力の信号強度が対応する出力に干渉しないほど小さいことがわかっている場合は、レッドストーンの右側のネクタイを相互に配線できます。以下の例では、単純なホッパータイマーがあります。これは、各ホッパーで約0.5秒でアイテムを前後に転送し、信号強度1を出力するコンパレーターに接続されています。これは、2つの出力が互いに干渉しないことを意味します。この例では、ランプはデモンストレーションのみを目的としており、合計ブロック数には含まれません。

ここに画像の説明を入力してください


7
あなたは13の賛成票を失います。私は10のモーアプログラムを殺すことができますか?
Rɪᴋᴇʀ

4
あなたのプログラムはどれも実際にはRPLで書かれていないので、そのように偽装しないでください。これは純粋にMinecraftの「コード」です。
mbomb007

2
14プログラムm8の赤字があります。あなたが何を考えているのか見たい;)
コナーオブライエン

4
あなたは21の賛成票を失います。
wizzwizz4

1
あなたは29の賛成票を失います。
bb010g

42

TI-BASIC

[言語は、使用する計算機によって異なりますが、特に指定のない限り、TI-84が使用されます。]

長さ31のスニペット

Menu("","1",A,"2",B
Lbl A
Lbl B

これは、メニューの使用方法を示しています。上記のものは何もしないので、まったく役に立ちませんが、プログラムのさまざまな部分をナビゲートするために使用できます。最初の引数はメニュータイトルで、その後にオプションのペアが続きます(表示される文字列の後に1文字または2文字のラベルが続きます)。より直感的な例を次に示します。

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lblでの分岐にも使用できGotoます。メニューには、使用するのが面倒な制限がいくつかあります。ただし、メニュー項目は7つしかなく、各タイトルは最大14文字であるため、1つの画面に収まります。

長さ29のスニペット

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(デフォルトではオン)は、計算機を実数モードにするため、複素数を含む計算ではNONREAL ANSエラーがスローされます。中に入れたときa+biのモード、計算機は複素数該当する場合、その第二の例が戻るなどの回答が表示されます4ire^θiモードは、直交座標ではなく極座標を使用するため、を出力します4e^(1.570796327i)

長さ23のスニペット

If A≥9
Then
1→X
7→Y
End

これは単純な条件式Elseですが、ステートメントを含めることもできます。Thenまた、Endステートメントが1つだけの場合は必要ありません。

長さ21のスニペット

(-B+√(B²-4AC))/(2A)→X

みんなのお気に入り、二次式。Xa、b、cがax 2 + bx + cのようにそれぞれの変数に格納されていると仮定して、2次方程式の最初の解をとして格納します

長さ20のスニペット

Shade(|X/2|-3,5-X²,0

これにより、xの最小値と最大値、シェーディングラインの方向と距離など、いくつかのオプションパラメーターを使用して、2つの関数の共通部分がシェーディングされます。

長さ18のスニペット

LinReg(ax+b) L1,L2

ここで、線形回帰方程式、または点のグループに最も一致する線形方程式を計算します。x値はリストとしてL1、y値はとして保存されますL2。2次、3次、指数など、他の多くの回帰オプションが利用可能です。

長さ17のスニペット

dbd(1.2711,1.2115

これは、2つの日付の間の日数を計算します。この場合、このサイトが始まった2011年1月27日と、この日が書かれた2015年1月21日です。(レイジーの場合は1455日です。)日付をエンコードする方法は少し奇妙です。DDMM.YYまたはMM.DDYYで、先行ゼロはオプションです。

長さ16のスニペット

For(A,0,5
Disp A

これは、言語のプログラミング側の2つの部分を示しています。最初は、他の言語forと同様の典型的なループfor(var A=0;a<5;a++)です。(Endループから抜け出すコマンドも使用する必要があります。)2番目は自明Aです。ループのために、この場合は5回表示されます。

長さ15のスニペット

Y1=|X³-4|
Y2=3X

グラフ電卓のよく知られている機能の2つの例を次に示します。グラフ式。同じ平面に10個の異なる方程式をグラフ化できます。また、交差、最大値、xの値などを見つけるための便利なコマンドが多数あります。これらの方程式は、標準ウィンドウでグラフ化すると次のようになります。

グラフ

長さ14のスニペット

[[1,2][34,5]]T

括弧は行列の作成に使用され、行列をT転置します。

[[1 34]
 [2 5]]

長さ13のスニペット

dayOfWk(9,1,6

これにより、西暦9年1月6日の曜日が検出されます。出力は、1が日曜日、2が月曜日などの数値です。この特定の日付は火曜日だったため、出力は3です。

長さ12のスニペット

Circle(1,3,5

最初の基本的な描画ツールであるグラフは、中心が(1,3)で半径が5の円を描画します。

長さ11のスニペット

randInt(0,8

これにより、0から8までの(擬似)ランダムな整数が生成されます。生成する整数の数を指定するオプションの3番目の引数があります。正規分布と二項分布の関数、ランダム行列の関数、繰り返しのないランダムに並べられたリストの関数など、他のランダム関数がいくつかあります。randInt次のように数を保存することで種を入れることができますrand2→rand

長さ10のスニペット

4>5 or 2≠7

ここには、TI-BASICの(不)平等演算子と論理演算子があります。不等式ステートメントは最初に評価され0 or 1orどちらかの側がtrueの場合にtrue を返すため、これが表示されます1

長さ9のスニペット

.656▶F◀▶D

これは、小数から小数へ、またはその逆に変換できます。これは非常に便利です。専用のもあります▶Fracし、▶Dec唯一の道を行く機能が。82/125この場合に印刷します。

長さ8のスニペット

lcm(14,6

これは、14と6の最小公倍数である42を出力します。

長さ7のスニペット

getDate

かなり一目瞭然{2015 1 19}です。この場合、現在のシステム日付をリストとして出力するだけです。

長さ6のスニペット

√({4,9

配列(またはリスト)は中括弧で囲まれ、コンマで区切られます。これはmap多くの言語の機能に似ており、リストの各要素を反復処理し、中括弧の外側の操作(この場合は平方根)を適用するため、結果はになり{2 3}ます。閉じ括弧はオプションなので、今後省略されることに注意してください。

長さ5のスニペット

4iii6

ここでいくつかのクールなことが行われています。最初に、実数部4と6が乗算され、次に虚数部が乗算されます:i^3、または-i。これらが乗算されます-24i。これは、ファンキーに見える並置乗算とTI-BASICの虚数の処理を示しています。

長さ4のスニペット

8°5′

これは8度、5アーク分で、次のように度に変換され8.0333ます...

長さ3のスニペット

8→T

これは、数値を変数として格納する方法を示しています。これは、数値が最初になり、次にストア矢印、変数名が続くため、やや珍しいことです。ファクトイドで述べたように、θ(シータ)は変数としても使用でき、変数は1つの大文字のみにすることができます。

長さ2のスニペット

4M

Mathematicaと同様に、並列で乗算することができますが、*必要はありません。すべての変数はデフォルトで0に初期化されるため、その変数に何か他のものを保存していない限り、これは0を出力します(スニペット3を参照)。

長さ1のスニペット

e

これは、オイラー数の定数であり、として表示され2.718281828ます。

ファクトイド

変数は特定のデータ型のみを保存できます。たとえば、AZ(およびθ)数値の保存、str0str9文字列の保存、および[A][J]行列(2次元配列)の保存。


ちなみに、小文字n(ではなくn)も変数として使用できます。
Ypnypn

面白い。その変数を使用したことはありません。
NinjaBearMonkey

3
一つは、について議論することができますstr0TI-BASICのすべての命令は1文字の長さである1つの文字であるか4です。
イスマエルミゲル

@IsmaelMiguel私はそれについて考えましたが、それらは1または2 バイトであり、文字を通常数えることにしました。
NinjaBearMonkey

1
あなたの決定を尊重します。この場合、非常に役立ちます。私は昔のTI-83でのプログラミングを本当に楽しんでいました。(ペイントプログラムも設計しました!)
イスマエルミゲル

41

GNU Sed

私はより制限的な要件を自己課しています-すべてのスニペットは完全なsedプログラムになります。

ファクトイド

sed あるチューリング完全言語。 ここに証拠があります。

長さ0のスニペット

長さ0のスニペットは厳密には必要ないと思いますが、実際にはsedで何かを行うため、ここにあります。

Sedは「ストリームEDitor」です。つまり、STDINからストリームを(行ごとに)読み取り、編集してからSTDOUTに出力します。長さゼロのsedプログラムは、単にSTDINをSTDOUTにコピーします。したがって、catユーティリティはsedによってエミュレートされます。以下は同等です:

cat a.txt b.txt > c.txt

そして

sed '' a.txt b.txt > c.txt

長さ1のスニペット

=

このsedプログラムは、各行の行番号をSTDOUTに出力します。これはほぼ次と同等です。

nl

または

cat -n

ただし、sedバージョンは行番号を独自の行に配置します。

長さ2のスニペット

5q

STDINをSTOUTにコピーし、q5行目の後にuits をコピーします。これは次と同等です。

head -n5

ここで少しパターンを見始めているかもしれません- sed多くの標準のコアユーティリティツールをエミュレートするために使用できます。

長さ3のスニペット

iHi

iすべての行の前に「Hi \ n」を挿入します。えー

長さ4のスニペット

/a/d

sedの力の多くは、正規表現機能にあります。このプログラムにより、正規表現aに一致するすべての行 dがストリームから削除されます。他のすべての行は引き続きSTDOUTに出力されます。これは次と同等です:

grep -v "a"

長さ5のスニペット

:l;bl

これは無限ループです。CPUを大量に消費する無限ループが大好きです。ラベルを定義してからl、それを実行b(ジャンプ)します。広告無限。

長さ7のスニペット

s/a/A/g

デフォルトでは、sedはs各行で最初に出現するものだけに一致するようにコマンドを適用します。行のすべての出現を一致(および置換)する必要がある場合gsコマンドの最後のフラグがこれを実行します。

長さ8のスニペット

y/01/10/

使用y頻度の低いコマンドは、trシェルユーティリティに似ています(ただし、それほど柔軟ではありません)。このプログラムは、すべて0のをに1、またはその逆に切り替えます。

長さ9のスニペット

1!G;$p;h

このスニペットは実際には8バイトですが、デフォルトの出力を抑制するためにsedに-nパラメーターが必要なので、標準のコードゴルフ規則に従って、これを9としてカウントしています。このプログラムはストリームの行を反転します。そう:

sed -n '1!G;$p;h'

以下とまったく同じです。

tac

長さ10のスニペット

s/[ <TAB>]+$//

これは、(誤った)長さ6のスニペットの再訪です。これにより、行から末尾の空白(スペースとTAB)が削除されます。


2
参照してくださいSEDに有用な1行スクリプトを私は学びましたが、基本的に、sed
アダム・カッツ

投票数が増えています。もう少しできますか?
luserのドローグ

2
あなたのファクトイドは404'ed。
ワウゼル

1
素晴らしいですが、これらの多くはGNU拡張機能を使用しており、標準ではないことに注意してください。具体的には、長さ3(標準はi\<newline>Hi<newline>)、長さ5(標準はsed -e :l -e blまたは:l<newline>bl<newline)、長さ10(動作+するにはa が必要*です)。長さ9のスニペット-n '1!G;$p;h' 標準ですが、そうでtacないことに注意してください。:)
ワイルドカード

1
@Wildcardはい-これをGNU sedに制限しました。
デジタル外傷

39

Python

mbomb007の投稿にはすでに多くのPythonスニペットが含まれていますが、いくつかの奇妙な事実でチップインすると思いました)

ファクトイド

Pythonは、読みやすさを重視した動的型付け言語です。

長さ1のスニペット

1

Python 3では、上記は(および)Trueという意味で同等です。これはPython 2では必ずしも必要ではないことに注意してください。Python2では、の値を再定義できます。1 == True0 == FalseTrue

長さ2のスニペット

<>

<>は、に相当する廃止された比較演算子です!=。Python 2でも機能しますが(使用は推奨されません)、Python 3から完全に削除されました。

長さ3のスニペット

...

Pythonには、ビルトインが使用しない多くの機能がありますが、サードパーティのライブラリのためだけにあります。このEllipsisオブジェクトはそれらの1つであり、通常はスライスに使用されます。たとえば、次の3D numpy配列がある場合:

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

次にa[..., 0](と同等a[:,:,0])はすべての最初の要素を与えます:

array([[1, 4], [7, 10]])

Python 3では、...リテラルをスライス構文の外側で使用できます。これにより、passorの代わりに "to-do"マーカーとして使用できますNotImplemented

def f(x):
    ... # TODO

長さ4のスニペット

(1,)

Pythonの1要素タプル。

Pythonはリスト(例えば持っている[1, 2, 3, 4]可変です)、およびタプル(例えば(1, 2, 3, 4)です)イム可変します。リストはハッシュ可能でないため、タプルの一般的な使用法の1つは辞書キーとして使用されます。

一般的な初心者の間違いは、上記のカンマ、つまり(1)、括弧で囲まれた数字1を省くことです。1要素のタプルは、閉じ括弧の前にコンマが必要な唯一の時間です。SyntaxError空のタプルに入れようとするとaが発生し、()長さが2以上のタプルの場合はオプションです。

長さ5のスニペット

0or x

このスニペットではいくつかのことが行われているので、見てみましょう。

or||多くの言語のようです。Pythonでは、A or B短絡し、真である場合A(評価せずにB)をA返し、そうでない場合はを返しますB。たとえば、1 or x常に真理であるように、常にを返し1、定義されていない1場合でも機能しxます。一方、定義されている場合は0 or x返すxx、定義されNameErrorていない場合はaをスローします。

ゴルフするとき、通常or1 or xとなるように数字との間の空白をドロップでき1or xます。1or数字で始まるため、これは無効なPython識別子になるため、可能です。

ただし0or、例外が1つありSyntaxErrorます。これは、不思議なことにをスローします。どうして?Pythonの8進リテラルは0o(たとえば0o20 == 16)で始まり、パーサーはr

注:Python 2では、8進リテラルは先頭のゼロで始まる場合があります(例:)020

長さ6のスニペット

*x,y=L

このスニペットはPythonでの特別なタイプの割り当てを示していLます。リスト、タプル、またはその他のあらゆる反復可能なものです。

Pythonでは、次のようにタプルとリストを「アンパック」できます。

a,b = [1,2]

これにより、1にa2が割り当てられbます。この構文は、次のような複数の割り当てにも使用されます。

a,b = b,a+b

これは、フィボナッチ数列を計算するプログラムを作成するときに役立ちます。

両側の長さが一致しない場合、a ValueErrorがスローされます。ただし、Python 3では新しい構文が導入され、反復可能なアンパック(またはより口語的には「スター付き割り当て」)が拡張され、次のようなことが可能になりました。

*x,y = [1, 2, 3, 4, 5]

これは、割り当てられy、最後の要素に5、およびxへのリストの残りの部分、すなわち[1, 2, 3, 4]。次のようなこともできます:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

1にa、2にb[3, 4, 5]c、6にd、7に割り当てeます。

長さ7のスニペット

zip(*x)

zip リストの束を取り、それらを圧縮する関数です:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

注:Python 3 zipでは代わりにオブジェクトが返されるため、上記のようなリストが必要な場合は、呼び出しをラップする必要がありますlist()

2つ以上の関連リストがあり、それぞれのエントリをリンクする場合、これは非常に便利な機能です。

ここで、リストを解凍したいとします—どのように行いますか?zip再度使用を試みることができますが、残念ながらこれは以下を提供します:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

問題は、すべてが1つのリストにあるzipが、個々のリストを個別の関数引数として使用することです。これを修正するために*、list / tuple / etcをとるsplat演算子を導入します。そしてそれらを関数の引数としてアンパックします:

f(*[1,2]) ==> f(1, 2)

結果は次のとおりです。

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

長さ8のスニペット

x='a''b'

これを初めて見たとき、私は少し引き戻されました。2つのストリングが隣り合っているとはどういう意味ですか?答えは簡単でした。

>>> x
'ab'

Pythonは単に2つの文字列を連結するだけです!このように長い文字列を分割できるため、読みやすくするために非常に役立ちます(周囲の括弧に注意してください)。

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

長さ9のスニペット

0!=2 is 2

あなたはまだ、Pythonは比較演算子の連鎖を許可することを知っている可能性が5 < x <= 7ある場合にのみ真である5 < xx <= 7。あなたがそれを知らなかったら...そして驚き!

とにかく、あまり知られていないのは、is/ is not/ in/ not inは比較演算子でもあるため、連鎖させることもできるという事実です。言い換えると、上記のコードはと同等(0 != 2) and (2 is 2)ですTrue

注:2 is 2ただし、2つのものが同じ値であるかどうかではなくis、2つのものが同じオブジェクトであるかどうかをチェックするため、半分にはいくつかの微妙な点があります。Python 1+1 is 2は小さな整数をキャッシュしますがTrue、そう999+1 is 1000ですFalse

長さ10のスニペット

x=[];x+=x,

リストをそれ自体に追加するとどうなりますか?印刷しようとするとx、次のようになります:

[[...]]

幸いなことに、Python printは再帰的なリストを印刷しようとしても爆発しないほど十分にインテリジェントです。その後、次のような楽しいことをすることができます。

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

この機能は辞書でも機能し、サイクルなどのデータ構造(グラフなど)を作成する1つの方法です。

長さ11のスニペット

help(slice)

このhelp関数は、Pythonでのデバッグに非常に役立ちます。REPLで引数なしで呼び出された場合help()、ヘルプセッションを開始します。ヘルプセッションでは、関数/データ型などのドキュメントを検索できます。特定の引数で呼び出されるとhelp、関連するアイテムに関する情報を提供します。

たとえばhelp(slice)、次の情報を提供します(非常に長いため切り捨てられます)。

Help on class slice in module __builtin__:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
 |  
 |  Methods defined here:
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 | ...

についてはslice、ご覧のとおり、sliceインデックス作成用のオブジェクトを作成できます。例えば:

>>> L = list(range(10))
>>> L[slice(2, 5)]         # L[2:5]
[2, 3, 4]
>>> L[slice(2, None)]      # L[2:]
[2, 3, 4, 5, 6, 7, 8, 9]

デバッグに役立つ別の関数はdir()、引数なしで呼び出された場合に現在のスコープ内のすべての名前を返し、引数付きで呼び出された場合に特定のオブジェクトのすべての属性を返します。

長さ12のスニペット

round(5.0/2)

これは何に評価されますか?答えはPythonのバージョンによって異なります!

Python 2では、2つの整数間の除算は整数除算(つまり5/2 == 2)になりますが、Python 3では浮動小数点除算(つまり5/2 == 2.5)になります。ただし、これはフロートと整数の除算であり、常にフロートになります。なぜ異なる結果が得られるのでしょうか?

round両方のPythonバージョンのドキュメントを見ると、答えが見つかります。

  • ではPythonの2round0から離れて丸めてtiebreaks。
  • パイソン3round向かって丸めてtiebreaks 最も近い偶数の整数

言い換えれば、5.0/2 = 2.5に丸め3Pythonの2に、しかしにラウンド2最も近い偶数の整数の方に丸めPythonの3のは奇妙に聞こえるかもしれないが、それが実際に呼ばれていますバンカーの丸め、およびバイアスを減らすためにも同様に正と負の値を扱うしようとします。

長さ13のスニペット

class C:__x=1

オブジェクト指向であるPythonにはクラスがあります。上記は、1に設定されCた単一の属性を持つクラス__xです。

ドット表記を使用してクラス属性にアクセスできます。たとえば、クラスがある場合

class MyClass(): my_attr = 42

MyClass.my_attr予想どおり、印刷結果は42になります。

ただし、同じことを行い、C.__x上記で定義したようにアクセスしようとすると、次のようになります。

AttributeError: type object 'C' has no attribute '__x'

どうしたの?C明らかに__x属性があります!

理由は、Pythonにはない__「プライベート」変数をエミュレートする属性があるからです。Pythonは、名前の再使用の競合が回避されるように、クラス名を付加するで始まる属性の名前をマングルします。上記の例では、本当にアクセスすることに決めた場合、代わりに行う必要があります__1

>>> C._C__x
1

長さ14のスニペット

NotImplemented

Pythonにはクラスがあるだけでなく、演算子のオーバーロードもあります。たとえば、クラスを持つことができます

class Tiny():
    def __lt__(self, other):
        return True

where __lt__は小なり演算子です。のインスタンスを作成するとTiny、これを行うことができます

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

__lt__常に返すように定義しているのでTrue。私たちもできることに注意してください

>>> 42 > t
True

しかし、次のブレーク:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

待って、それはどのように機能しますか?より大きいの動作を指定していないTinyので、最後のケースが壊れても驚くことではありません。しかし、int(42)は、それがTinyオブジェクトよりも大きいことをどのようにして知るのでしょうか?

Pythonには組み込みの定数がありNotImplemented、これは比較の特別なメソッドで返すことができます。試してみましょう:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

次に、新しいクラスのインスタンスを作成する場合:

>>> u = Unknown()

できるよ:

>>> t < u
True
>>> u > t
Called me first!
True

ご覧のとおりu > t、PythonがUnknown最初に大なりメソッドを呼び出そうとしましたが、実装されていないことがわかり、Tiny代わりに他のクラス()に小なりメソッドを試しました!

長さ15のスニペット

x=[],;x[0]+=[1]

これは少し楽しいものです。まず、タプル内の空のリストであるxbe に割り当てます。次に、2番目のリストによって内部の空のリストを拡張しようとします。[],([],)x[0]+=[1][1]

さて、リストは変更可能であり、タプルがあることを覚えているイム可変-あなたは不変オブジェクト内の可変オブジェクトを変更しようとすると何が起こりますか?

>>> x=[],;x[0]+=[1]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x=[],;x[0]+=[1]
TypeError: 'tuple' object does not support item assignment

ああ、それはエラーを与える、私はそれが予想されることだと思います。しかし、印刷しようとするとxどうなりますか?

>>> x
([1],)

え?リストが変更されました!

ここで何が起きているのか知りたい場合は、このブログ投稿をチェックしてください。

長さ16のスニペット

@lru_cache(None)

キャッシュを追加するだけです!これは、Python 3で使用可能なデコレータの簡単な例です。

次の単純なフィボナッチ実装があるとします。

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

プログラミングコースのほとんどの紹介からわかるように、これはフィボナッチを実装する非常に悪い方法であり、基本ケースで事実上1を追加するだけなので、指数関数的なランタイムにつながります。f(10)?一瞬で実行されます。f(32)?しばらく時間がかかりますが、そこに到達します。f(100)?いや。

しかし、結果をキャッシュすると、物事がずっと速くなるはずです。キャッシュにはいつでも辞書を使用できますが、代わりに別のものを試してみましょう。

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

ご覧のとおりlru_cachefunctoolsモジュールからインポートし@lru_cache(None)、関数の前に追加するだけです。@関数をラップするデコレータを示します。この場合はメモ用です。lru_cacheの最初の引数はmaxsize、キャッシュNoneの最大サイズです。ここでは、最大サイズがないことを示すように設定しています。

今それを使用しようとすると:

>>> f(100)
573147844013817084101

そして、1秒もかかりませんでした!

注:f(1000)再帰深度エラーにつながりますが、これは別の話です


Pythonはどの範囲の小さな整数をis演算子に「キャッチ」しますか?
mbomb007

@からmbomb007 この質問、ように見える-5 256にあなたが試すことができます-5-1 is -6し、255+2 is 257テストします。
Sp3000

37

ジョット

ファクトイド:2つのアップ投票でJotを定義し、8でチューリング完全であることを証明できます(長さ4、6、または7は使用しません)。

長さ1

1

これは、Jotの2つの関数の例です。最初は空の文字列で、恒等関数に評価されます。2つ目は1、Jotのグループ化演算子です。(ラムダ計算法)に1評価されます。ここで、前のプログラム(ここでは空の文字列)です。したがって、このプログラムはを単純化する関数です。λxy.[F](xy)[F]1λxy.(λz.z)(xy)λxy.xy

長さ2

10

現在、Jotでもう1つのシンボルを紹介しています:0。あれば再度[F]これまでのプログラムの値を表す、0と評価され[F]SK、ここで、SKからのものである結合論理。言語全体を定義しました。

長さ5

11100

組み合わせロジックからJot へのマッピングを定義することで、Jotがチューリング完全であることを証明します。このJotプログラムはKコンビネーターです。

長さ8

11111000

これはSコンビネーターです。

長さ3

1AB

ここでABはJotの一部ではなく、任意の式のプレースホルダーです。表現AB結合論理ではにマップ1ABして、Jotの中AB再帰的にこれらの3つのルールで変換します。QED

長さN

1
10
11
100
101
110
[...]

2進数で表されるすべての自然数は、有効なJotプログラムです。その結果、任意の長さのスニペットをアルゴリズム的に生成できます。十分な賛成票があれば、停止問題を解決できます


2
与えられた2つの賛成票。次に、言語を定義します。
ジョンドボラック

@JanDvorakが取り組んでいます...このことを研究してから長い間、すべてを忘れていました:)
フィルフロスト

1
私はなぜこれがさらに多くの賛成票を獲得し続けるのかわかりません。単純に、長さが増加するランダムな2進数を生成します:|
オプティマイザー

1
私たちは、「あなただけ生成された乱数」を見ているupvote数4のように、しかし、ここであなたが言った
オプティマイザ

1
どのようにして停止の問題を解決できますか?私はそれが無限(無限の数)のプログラムを使用することに関係があると推測していますか?
フィリップハグランド

37

バッシュ

ファクトイド:

非常に深刻なShellShockバグは1989年以来Bashに存在し、四半世紀にわたって発見されていませんでした。Bashを書くことの喜びの多くは、その多くの特異性と矛盾に気づき始めています。

長さ1のスニペット:

[

test形式のコードを許可する組み込みのエイリアスif [ a == b ]; then-実際に[は、構文要素で]はなくスタンドアロンコマンドであり、純粋に装飾的です(ただし、[で必要ですが、その要件は任意であり、を使用して廃止できますalias [=test)。

長さ2のスニペット:

||

orほとんどの言語で論理的ですが、プロセス用です。||前のコマンドがゼロ以外を返す場合にのみ、コマンドを実行します。

長さ3のスニペット:

x=y

割り当て。素晴らしく、予測可能ですが...他のほとんどの言語とは異なり、余分なスペースは許可されていません。これは、bashの周りだけでなく、bashの間のどこにでも余分なスペースを追加できるため、ちょっとおかしいです=

長さ4のスニペット:

$IFS

内部フィールド区切り文字-この変数は、forループの反復や文字列からの配列の入力など、多くの組み込みアクションのデータの分割方法に影響します。正しく使用すると、非常に強力になります。しかし、多くの場合、それは微妙で予測できないバグの原因です。

長さ5のスニペット:

${x^}

xの文字列を置き換えますが、最初の文字は大文字にします!頻繁に使用されるこの機能には、専用の言語構文があります。

長さ6のスニペット:

x=($y)

文字列または要素のリストyから配列xを埋め、IFSが現在設定されているもの(デフォルトでは空白)で分割します。高度なbashプログラミングに非常に便利な機能。

長さ7のスニペット:

${x[y]}

配列!しかし、待ってください、それは... yは文字列であり、数値インデックスではありませんか?確かに、Bashは連想配列をサポートしています!多くの人はこれを知りません。declare -A x最初にする必要があります。

長さ8のスニペット:

${x##*,}

x、最後の,文字(または指定したもの)までのすべてを置き換えます。csvの最後のフィールドを取得するのに便利です-これはcut、左からフィールドを数えるだけで簡単に実行できないものです。%と%%は、同じものを右からカットすることを許可します。%と#はUSキーボード上の位置に選択されたため、左と右を意味することが明確になりますが、USキーボードを使用していないすべての人にとってはあまり価値がありません:)

長さ9のスニペット:

[ a = b ]

他のほとんどの言語では、比較演算で単一の等号を使用すると、割り当ての形で意図しない動作が発生します。ただし、Bashではありません。何をするにしても、スペースを省略しないでください!

長さ10のスニペット:

if [ a=b ]

必須のスペースを忘れると、これが起こります。エラーをスローしません。 は常にtrueを返します - aおよびbが設定されていない変数である場合でも、設定されている変数が何であるかは関係ありません-常にtrueを返します。if [ "$password"="$correctpass" ]この「機能」の楽しい可能性を見るために、コードについて考えてください。

長さ11のスニペット:

x=${y//a/b}

正規表現スタイルの部分文字列置換!xをyの値に設定しますが、aのすべてのインスタンスをbに置き換えます。

長さ12のスニペット:

[[:upper:]]*

パターンマッチングは-あなただけのシェルで*ワイルドカードを使用して、これらに限定されない、次のような任意のPOSIX標準のマッチを使用することができalnumalphadigitなど

長さ13のスニペット:

function x(){

少しのC構文が不思議なことに侵入しました!中括弧の多くの完全に異なる使用法の1つ、およびBashを他の言語のように見せるためのオプションの装飾要素の別の例-どちらか()またはfunctionここでは省略できます(両方ではありません)。一貫性のないスペースでもより多くの楽しみは-の後のスペースは{必須ですが、ない閉じる前}のように、function x { y;}

長さ14のスニペット:

echo {Z..A..3}

さらに別のまったく関係のない中括弧の使用。指定されたステップで範囲を拡大します。この場合、ZからAまで3文字ごとに生成されます。seqを使用せずにシーケンスを生成するのに便利ですが、変数とともに使用できないため、機能が制限されます。

長さ15のスニペット:

echo {a,b,c,d}x

シーケンス生成における中括弧の別の類似した、しかし同一ではない使用。を出力ax bx cx dxし、単一のコマンドでシーケンスまたはリストから文字列のリストを生成するのに便利です。繰り返しますが、中括弧内の変数では使用できないため、有用性に制限があります。


実際に]は、単なる装飾ではありません。[最後の引数がでない場合、機能を拒否します]
-FUZxxl

はい。ただし、化粧品以外の目的はありません。そして、あなた[が他の形式testで置き換える場合]、呼び出しで他の何も変更せずに省略できます-私は単にそれが実際のbash構文ではなく、単なる視覚的な砂糖であることを指摘しています。
暴動

あなたはそれがbash構文ではないという点で正しいですが、末尾][構文であり、セミコロンでCのステートメントを終了する方法と同じように提供する必要があります。
-FUZxxl

必須であることは確かですが、Cセミコロンとまったく同じではありません。あなたが単純にalias [=test、そして次に書く場合に見られるように、それのための要件は完全にarbitrary意的ですif [ 1 = 1; then。しかし、私はあなたのポイントを考慮に入れるために私の言い回しを明確にします:)
Riot

1
function x(){構文に関して:あなたが言うように、括弧をドロップできますが、単にfunctionパーツをドロップすることもできます。実際、これがPOSIXシェルが関数を定義する方法であるため、より移植性が高くなります。全機能を13文字で定義できます。例:x(){ startx;}
コジロー

37

APL

ファクトイド

APL(P rogramming Lの anguageは)によって考案された式表記のためのインタプリタとしてスタートケンアイバーソン。言語が設計されたとき、人々はテレタイプライターを使用してコンピューターと通信しました。これらの文字セットは限られていましたが、それらの構造により、複数の文字を同じ位置に配置して複雑な文字を構成することができました。この機能はAPLによって頻繁に使用され、読み取り専用言語としての悪名高い評判に貢献しています。

http://www.tryapl.orgでほとんどの例を試すことができます

長さ1

ランプシェードと呼ばれるキャラクターは、その形状とその存在から得られる啓発の両方で、コメントを紹介します。歴史的に、それは(jot)と(up shoe)を重ねて作成されました。

長さ2

⍳3

モナド(1つの引数)関数(iota)は、最初のいくつかの自然数のベクトルを生成します。たとえば、前述の例では、最初の3つの自然数のベクトル⍳3が得られ1 2 3ます。APLの一部の実装では、0 1 2代わりに生成されます。これは⎕IOi ota o riginの値に依存します。

長さ3

5\3

モナディックとは対照的に、ダイアディック\(拡張)関数は、左側の引数と同じ頻度で右側の引数をコピーします。したがって、が5\3得られ3 3 3 3 3ます。ベクトル引数(のような1 2 3\4 5 6)をいじって、それが何をするかを確認したいかもしれません。

長さ4

A←⍳3

これAはの値に割り当てられます⍳3(左矢印)は割り当て演算子です。割り当ては、ステートメントの左端にある必要はありません。割り当ては関数呼び出しのように解析され、さらに使用するために割り当てられた値が生成されます。

長さ5

∘.×⍨A

3 x 3の乗算表、つまり

1 2 3
2 4 6
3 6 9

これは少し複雑なので、説明しましょう。⍺∘.f⍵(読み:オメガFアルファJOTドット)は外積オーバーf。外積は、およびfの要素の可能な各ペアに適用した結果の表です。この例では、is (multiply)で、乗算表が生成されます。オペレータ(チルダ分音符号)は通勤 、その引数つまり、に等しく、かつ左オペランド無しに等しいです。通勤オペレーターがいなければ、このスニペットはになります。外積演算子は非常に汎用性があります。あなたが代わりにどうなるかをチェックアウトのために!f×⍺f⍨⍵⍺f⍵f⍨⍵⍵f⍵a∘.×a=×

長さ6

{×/⍳⍵}

階乗関数。中括弧のペアは、dfn(動的関数)、つまり匿名関数(ラムダ式を参照)を囲みます。dfnの引数は変数にバインドされており、またはdfnがモナド(dyadic、2つの引数ではなく、単一の引数)関数として呼び出された場合にのみバインドされます。当社は、適用から整数を得、右引数に1します/(スラッシュ)演算子は、すなわち、減少f/⍵インサートfの項目間。たとえば、+/⍳5はだけ1+2+3+4+5です。この場合、で減少し×、の項目の積を生成します。⍳⍵これはの階乗です

長さ7

2×3*4+5

収量39366⍺*⍵(アルファスターオメガ)の累乗。APLには非常に単純な優先規則があります。すべてが右から左に評価され、すべての関数は右結合です。演算子は関数よりも強くバインドし、左から右に評価されます。したがって、明示的な括弧を使用した上記の式2×(3*(4+5))は、通常とは対照的に記述され(2×(3*4))+5ます。

長さ8

¯1+3 3⍴A

このスニペットは

0 1 2
3 4 5
6 7 8

そして2つの重要な概念を示しています。最初の概念である(ロー)機能、再形成するその左引数で指定された形状にその右の引数を。配列の形状は、配列内の各軸の長さのベクトルです。スカラーの形状は空のベクトルです。このように、3 3⍴A再整形A3×3行列に。2番目の概念は、ここで加算を使用する方法です。¯1(overbar one)、つまり負の値(¯負の数値を指定するための接頭辞-、演算子)を配列に追加します。2つのオペランドの形状は異なるため、形状の小さいオペランドは他のオペランドに分配され、生成されたマトリックス内のすべてのアイテムから1つが減算されます。

長さ9

+.×⍨3 3⍴A

A、3行3列の行列に再形成され、それ自体で乗算されます。.(ドット)演算子は2つの機能を取り、構築内積最初の関数を表し、また第2の機能を乗算。単純で古い行列乗算は+.×で、一般的なバリアントは≠.∧(ここで等しくなく、(上カレット)は論理的で、)ブール行列です。+およびの代わりに特定の演算子を使用した内積として、多くの興味深いものをモデル化できます×

長さ10

(.5×⊢+÷)⍣≡

(読み取り:左括弧ドット5乗算右タック+分割右括弧スターダイアレシス同じ)バビロニア法を使用して実数の平方根を計算します。左の引数は平方根を計算する数値で、右の引数は平方根の初期推定です。当初は意味のある初期推測を提供したかったのですが、文字が足りませんでした(数字自体を初期推測として使用するように追加します)。

では、これはどのように機能しますか?最初に、左側の部分から始めましょう(.5×⊢+÷)。この式は、後にDyalog APLに移植されたJで生成された暗黙の表記法を使用します。暗黙の記法は初心者には少し難しいので、このセクションを注意深く読んでください。+/÷≢「通常の」構文解析ルールがスピーチの単一の部分に解決しないなどの分離されたシーケンスは、トレインと呼ばれます。2つまたは3つの関数の列は関数を生成し、(繰り返し解像度により)任意の長さの関数列も関数を生成します。三つの機能の列はfgh同じように動作し{(⍺f⍵)g⍺h⍵}、つまり、fそしてh得られた関数の引数とこれらの結果に適用されるに適用されますg。配列の列と2つの関数Afgのように動作し{Af⍺g⍵}、これは、g結果の関数の引数に適用され、Aその結果はに適用されfます。2つの関数のトレインにはセマンティックもあります。これはドキュメントで説明されていますが、この例では使用されていません。

この特定のトレインでは、1つの新しい関数(右タック)が使用されます。のように動作{⍵}し、正しい引数を生成します。したがって、式全体はに等しく{.5×⍵+⍺÷⍵}、これはバビロニア式の反復ステップにすぎません。暗黙の記法がゴルファーにどのように役立つかは簡単にわかります。必要に応じて、かなりの数の貴重なキャラクターを剃ることができます。

パズルの最後のピースは、(星のダイレシス)、パワーオペレーターです。正しい引数が配列の場合、合計回数にf⍣A⍵適用さfれます。たとえば、はに等しい。カウントは負になる場合があります。その場合、APLはその逆関数を推測して適用しようとします。右引数が場合機能があり、あまりにも、適用になるまでどこを繰り返し適用した結果であると。特に、が(等しい)または(同じ)の場合、次の不動点を計算しますAf⍣3⍵fff⍵ff⍣g⍵f(fY)gYYfg=f⍣≡f。これはまさにバビロニア法に必要なものです!結果が収束するまで繰り返します。最後に、2つのものに適用されたものがダイアディック関数として呼び出された場合、左側の引数は左側にバインドさfれます。つまり、のように動作⍺f⍣g⍵する(⍺∘f)⍣g⍵場所に等しくなります。A∘f{Af⍵}


投票数が増えました!もう少しできますか?
luserのドローグ

@luserdroog確かに、もう少し考えさせてください。
FUZxxl

これを編集して拡張できますか?
アダム

@Adámはい、お願いします。
FUZxxl

∘.×⍨a 私は値のエラーを与えます。正しく使用していますか?
チョイス

37

Matlab

スニペット26-行列の繰り返し

これは私が最近発見したものです。通常、forループで特定のベクトルを反復処理します。ただし、ベクトルの代わりに、行列を使用することもできます(rand(10)0〜1の数が均一に分布した10x10行列を生成します)。

for k=rand(10);disp(k);end

これにより、反復ごとにランダム行列の1つの列ベクトルが表示されます。

スニペット25-簡単なプロット

私たちは、プロットは、MathWorks社のMATLABで簡単ですけど、超簡単機能がありますezplotE-Zそれを得る私は最終的にそれを得たまで、私は綴らとしてそれは、かなり時間がかかりました?Zいつものようにsed代わりにc、何でも...)誰もが楕円曲線のお気に入り:

ezplot('y^2-x^3+9*x-10.3')

楕円曲線

スニペット24-統合

統合のための昔ながらの(まだ数値計算で使用されている)単語は 'quadrature'です。次の結果はどうでしょうか。

quad(@(x)4./(1+x.^2),0,1)

スニペット23-画像

もちろん、Matlabは画像(医療画像解析など)を扱う必要のある科学者の間でも非常に人気があるため、非常に便利な機能があります。最初の引数は画像、2番目は角度、3番目のオプションの引数は関数に、元のサイズにトリミングするように指示します。

imrotate(rand(99),9,'c')

ここに

スニペット22-音楽

load handel;sound(y,Fs)

このように聞こえます(youtubeリンク)

Snippet 21-差別化と統合

polyint(polyder(p),c)

これらの2つの関数を使用すると、多項式を簡単に微分および統合できます。統合するとき、定数になる2番目の引数を渡すことができます。

スニペット20-多項式に戻る

p=poly(r);cp=poly(A)

根をもつ多項式が必要rですか?簡単:p=poly(r)。行列の特性多項式が必要Aですか?簡単:cp=poly(A)。だから、roots(p)正確であるr(または順列のr)。

スニペット19-別の手品

fminsearch(fun,x0);

この機能が大好きな人がいます。これは基本的に、の条件なしで最小fun値を初期値x0(ベクトルでも可)で検索しfunます。これは、エラー/ペナルティ/目的関数を区別することができない(または怠tooすぎる)小さなモデルの適合に最適です。Nelder-Meadシンプレックスアルゴリズムを使用します。これは、仮定を立てることができない関数に対して非常に高速です。

スニペット18-多項式の紹介

p=polyfit(x,y,deg)

Matlabには、多項式に対処するための素晴らしいソリューションがあります。を使用しpolyfitdeg、の点を近似する次数の最小二乗多項式を取得しx,yます。p多項式の係数を格納するベクトルを取得します。これは、多項式を表現するために必要なのはそれだけだからです。スニペット15に戻ると、と書くことで同じことができますc = polyfit(x,y,2)。したがって、例えば[1,-2,3]多項式を表しx^2 - 2*x+3ます。もちろん、他の基本的な、または任意の関数に適合する関数もあります。

スニペット17-角度と不連続点

unwrap(angle(c))

複素数の「連続的な」ベクトルの引数を取得したい場合、しばしば不連続を持っているように見える値を取得します。例えば、angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])あなたを取得します[-2.94,-3.04,3.14,3.04,2.94]ので、angle唯一の間の角度を返します-pipi。関数unwrapがこれを処理します!このような不連続が発生した場合、2*piそれらを削除するために倍数を追加するだけです: '[-2.94、-3.04、-3.14、-3.24、-3.34]'これは2次元行列でも機能します!負の実数部を持つ複素数の引数をプロットするだけで最初のグラフィックスが得られ、最初の画像が得られ、アンラップで2番目の画像が得られます:

展開せずに 開封あり

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

スニペット16-スカラー積

[1;2;3]'*[4;5;6]

もちろん、組み込みのメソッド(などdot)がありますが、マトリックス変換演算子を使用'すると、それと同じくらい簡単です。行ベクトルまたは列ベクトルがあるかどうかわからない場合a(:)'*b(:)a(:)常に列ベクトルを返す場所を使用できます。

スニペット15-線形最小二乗、魔法の杖でのい方法

[x.^2,x,x.^0]\y

xは、x軸、yノイズの多いy 値の値を持つ(列)ベクトルです。入力するc=[x.^2,x,x.^0]\yと、2次多項式の係数が得られます。もちろん、MATLABの10億の組み込み関数の1つを使用できます(退屈な方法)魔法の杖を使用しないのはなぜですか?=)

x = (-1:0.1:2)';
y = 3*x.^2-2*x+1+randn(size(x)); %add some gaussian (normal) noise
A = [x.^2,x,x.^0];
c = A\y              %output: c = ]3.0049; -2.3484; 1.1852]
plot(x,y,'x',x,A*c,'-')

リンレグ

スニペット14-グラフ

gplot(graph,x)

それがグラフのプロット方法です。graph正方形の隣接行列を含むx必要があり、各ノードの座標を含むnx2行列である必要があります。ランダムなグラフを作成してみましょう:graph = triu( rand(8)>.7)(0と1を含むMatrixを作成し、興味深いグラフの上の三角形のみを取得します)。x = rand(8,2)その後、いくつかの派手なスタイルでプロットgplot(graph,x,'k-.d')

グラフ (これを現代美術と宣言します。)

スニペット13-meshgrid

meshgrid(a,b)

これは最もシンプルな機能ですが、最も便利な機能の1つです。2つの変数に応じて実数値​​の関数をプロットする場合は、x軸とy軸(aおよびb)の値のベクトルを定義するだけです。次にmeshgridを使用すると、サイズがlen(a)x len(b)の2つの行列を作成できます。1つはa列としてベクトルのみを持ち、もう1つは行としてベクトルのみを持つ列のみを持ちbます。使用例:(a = -3:0.2:3;[x,y]=meshgrid(a)両方のベクトルが同じである場合、一方を渡すだけで十分です。)その後、入力するだけですz=x.^2+-y.^2、例えばmesh(x,y,z)。これは、任意の数の次元で機能します!したがって、これはプロットだけでなく、さまざまなベクトルなどのすべての可能な組み合わせを取得するのにも最適です...(したがって、新しいコードゴルフ言語を作成したい場合は、これをそこに置く必要があります、短いものを使用してください関数名...)

メッシュ

スニペット12-プロット

plot(x,x.^2)

ベクトルx=-3:0.5:3を取得plotし、残りを実行します。これをプロットするための多くの関数がありますが、これは非常に基本的なもので、いつでも使用できます。書き込むだけで十分でplot(v)あり、データvは配列インデックスに対してプロットされます。それはどのくらい簡単ですか?プロットのスタイルを設定する場合は、3番目の引数として文字列を追加するだけです。たとえば'r:o'、データポイントの周りに円で赤い点線を作成します。複数のプロットが必要な場合は、引数を追加するか、ベクトルではなく行列を使用します。誰にでもできる。プロット

スニペット11-関数ハンドル

f=@(x,y)x+y

これはに格納される関数ハンドルの例ですf。今、あなたは電話f(1,2)して取得することができます3。matlabの関数ハンドルは、数学関数(プロットなど)に非常に役立ち、1行で定義できます。ただし、1つの欠点は、条件付きまたは区分的(したがって再帰なし)にできないことです。これが必要な場合は、functionステートメントを使用して新しい関数を宣言する必要があり、それぞれを個別のファイルに保存する必要があります...(WHYYYYYY ????)

PS:whyコンソールに入力すると、別の面白いイースターエッグが表示されます:彼らは次のようなランダムなメッセージを生成する巨大な関数を作成しました:

The tall system manager obeyed some engineer.
The programmer suggested it.
It's your karma.
A tall and good and not excessively rich and bald and very smart and good tall and tall and terrified and rich and not very terrified and smart and tall and young hamster insisted on it.

...コンソールに尋ねるのに十分なほど必死であれば、それは非常に快適ですwhy...

Snippet 10-マトリックスはどのように見えますか?

spy(eye(9))

ご存じのとおりeye(9)、9x9の単位行列が作成されます。spy行列のゼロ/非ゼロエントリを示すを作成します。ただし、バイナリ2dデータの表示にも使用できます。spy引数なしで呼び出すと、素敵な小さなイースターエッグ=が得られます)

アイデンティティのスパイ スパイ・イーストレッグ

スニペット9

kron(a,b)

このkron関数は、2つの行列のクロネッカー積を評価します。これは、離散化された多次元線形演算子に非常に役立ちます。また、時々コードゴルフに使用しました。aおよびのエントリのすべての可能な製品が必要bですか?kron(a,b)、 どうぞ。

スニペット8

5*a\b.*b

ここで、3つの異なる演算子を混同しました。を使用するだけで、任意の行列にスカラーを掛けることができ*ます。(その後、行列のすべてのエントリにそのスカラーが乗算されます)。ただし*、行列乗算も実行します。ドットを先頭に追加すると、.*演算子が得られます。これは、同じサイズでエントリ単位の 2つの行列を乗算します。(これは/、やなどの除算演算子でも実行でき\ます。)

次に、バックスラッシュ演算子は左除算として使用できます(これまでの/右除算とは異なります)が、matlabの最も強力で特徴的な演算子でもあります。「行列除算」を実行します。線形方程式のシステムがあり、それA*x=bを解きたいx場合は、入力するだけですx=A\b。そして、\(あなたはまた、使用することができます/が、それは行列に対してあまり一般的である)すぐに最初の行列を分析し、この反転乗算を実行するために最速のアルゴリズムを見つけるために、結果を使用しています!(たとえばここを参照)

ただし、定義が不十分または過剰なシステム(逆行列が存在しない場合や、最小二乗法など、行列が正方でない場合)にも使用できます。これは本当にmatlab の魔法の杖です。

スニペット7

[a,b;c]

大したことではないように見えますが、非常に便利なツールです:マトリックス連結。2つの式の間のコンマは、それらが水平に連結されることを意味し(同じ高さを持たなければならないことを意味します)、セミコロンは、前の「行」が次の「行」の上にあることを意味します(行とは2つのセミコロン間のすべてを意味します)。簡単な例: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];結果は。と同じdになりd=[1,2,5; 3,5,6; 7,8,9]ます(取得しますか?)

切り取られた6

eye(7)

この関数は、完全な7x7単位行列を生成します。とても簡単です。そのような機能は他にもありnan,inf,ones,zeros,rand,randi,randn、まったく同じように機能します。(2つの引数を渡すと、結果のマトリックスの高さ/幅を設定できます。)後で示すように、マトリックス(2d配列)を簡単に作成(および非常に視覚的な方法で)できます。偏微分方程式を数値的に解く必要がある場合は簡単です。(PDEを解く場合、一般的なアプローチは微分演算子を離散化することです。基本的に、解く必要がある線形方程式の巨大なシステムが得られます。これらの行列は通常スパース(非ゼロ要素が非常に少ない)で、そのため、必要な行列を簡単に「構成」できます。

スニペット5

a(a>0.5)

配列にアクセスするすべての方法に飽きていないことを願っています。これは、ある条件を満たす配列のすべての要素を取得する簡単な方法を示しています。この場合a、0.5より大きいすべての要素のベクトルを取得します。式a>0.5は、a条件を満たす各要素の行列と満たさない各要素の行列と同じサイズの行列を返すだけ0です。

スニペット4

a(:)

この場合も、コンテンツをa列ベクトル(nx1行列)として返します。これは、データを列ベクトルまたは行ベクトルのどちらとして保存したかわからない場合、またはデータが2次元である場合(2次元差分法の場合など)に便利です。

スニペット3

1:9

セミコロン演算子を使用すると、ベクトル(この場合は1xn行列)を簡単に作成できます。この場合、ベクトルを取得します[1,2,3,4,5,6,7,8,9]。これは、ベクターa(2:4)の2番目、3番目、4番目の要素にアクセスするなど、他のベクターのスライスにアクセスする場合にも特に便利ですa。また、ステップサイズなどで使用することもでき0:0.5:10ます。

スニペット2

i;

セミコロンは、コンソールへの出力を抑制します。あなたはそれを良いことか悪いこととして見ることができますが、私はそれをデバッグするのが好きです。セミコロンで出力を抑制しない限り、計算などの行はすべて結果をコンソールに自動的に出力します。

スニペット1

i

複素数は基本的な数値型です。(あまりにも多くの人iがforループでカウント変数として使用していますが、その場合はオーバーライドされます。)

イントロ

知らない人のために、MatLabは、まず数値計算*とデータ操作を目的としたプログラミング言語(MatLabとも呼ばれる素晴らしいIDEを備えています)です。(「Octave」と呼ばれるオープンソースの対応物があります)**解釈されるだけなので、それほど高速ではありませんが、行列を簡単に操作でき、多くのアルゴリズムが非常に高速に実行されるように最適化された方法で実装されているのが強みですマトリックスに適用される場合。また、習得が非常に簡単な言語ですが、「プログラミング」の習慣がかなり悪いと思われるため、初心者言語としてはお勧めしません。

*インタープリター言語なので、高価なプロジェクトでは非常に遅くなる可能性がありますが、組み込みの並列化メソッドがあり、複数のコンピューターを一緒に使用してプログラムを実行することもできます。しかし、本当に速くなりたい場合は、CやFortran、またはそのようなクレイジーなものに依存していると思います。しかし、まだ実装されている多くのアルゴリズム(行列乗算、線形方程式の解法など)は非常に最適化されており、非常にうまく機能しています。しかし、Matlab自体で同じアルゴリズムをプログラミングする場合、待機する必要があります=) )

**プログラムをコンパイルすることもできますが、これは主にソースコードを読み取り不可能なファイル(人間用)に変換します。これは実行時にそれほど高速ではありません。


1
この問題は非常に頻繁に発生します... i何かに設定してから、複雑なユニットではないときに予期しない動作が発生します。
feersum

3
素敵なイースターエッグ!「edit spy」と入力すると、コードの難読化の例が見つかります:-)
Abulafia

1
私はこれに賛成票を投じに行ってから、すでに持っていることに気付きました。悲しいかな、もし私がもう一度賛成できれば。@flawr!
アレックスA.

2
表示するもののインスピレーションが不足している場合は、Mathworksブログをお勧めします。LorenVershureによるArt of MATLABで、文字の制限内で表示できるベストプラクティスについて説明しています。好奇心が考えるためのMATLABを放棄し、文書化されていない機能と特徴のためにあなたがに行くことができるYairアルトマンによって文書化されていないのMatlab
デニスJaheruddin

1
@flawr-事実上、MATLABは元々、ニューメキシコ大学のコンピューターサイエンスの学生向けに作成されたという事実に言及するのもいいかもしれません(当時はCleve Molerが会長だった)。LINPACKEISPACK(...は現在LAPACKに取って代わられています)FORTRANを学ぶ必要はありません...そしてその使いやすさのため、非常に迅速に他の学術機関に広がりました:)
rayryeng

35

CJam

こちらのスニペットをお試しください

長さ20のスニペット:

q~{]__~z\z<=\~*0>*}*

min-mod計算機。質問からの抜粋:

minmodの機能は、馴染みの変異体である分の偏微分方程式の傾きを制限する高解像度スキームに表示され、。多数の斜面が与えられると、斜面間の相対的な兆候に注意しながら、最も平坦な斜面を選び出します。

この関数は、任意の数のパラメーターを取ります。次に、minmod(x 1、x 2、...、x nは次のように定義されます。

  • min(x 1、x 2、...、x n、すべてのx iが厳密に正の場合
  • max(x 1、x 2、...、x n、すべてのx iが厳密に負の場合
  • それ以外の場合は0

長さ18のスニペット:

l'[,65>Dm>_el+_$er

ROT13エンコーダー。a-zA-ZSTDINを介して入力文字列から文字のみをシフトします

長さ15のスニペット:

T1{_2$+}ri2-*]p

STDINを介して入力として提供されるNフィボナッチシリーズの最初の数字を印刷する完全なプログラムN

長さ12のスニペット:

{{_@\%}h;}:G

シンプルなGCD関数。これは2706 410 G、スタック上でGCDを取得するために使用できます。

長さ11のスニペット:

123456 789#

#電力事業者です。このスニペットは、ほとんどすべての数学演算でBigIntsをサポートするCJamの優れた機能を示しています。したがって、上記のコードの出力は

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

長さ10のスニペット:

"`%W_"_W%`

私たちはすでにクインをしました、それを逆にしましょう!これは、CJamで最も短い逆クインの1つです。逆クインは、ソースコードを逆順に印刷するクインです。

長さ9のスニペット:

5,K,+_&S*

このスニペットは、CJamの多くの機能を紹介しています。

5, "create an array of numbers 0 to 4"
K, "create an array of numbers 0 to 19"
+  "List concatination"
_  "Duplicate top stack element"
&  "Set distinct operator in this case"
S* "Join array elements with space character"

長さ8のスニペット:

"`_~"`_~

CJamで可能な最小のクインの1つ。これは、ソースコードを実際にはまったく読み取らないという意味で、真のクインです。(CJamではソースコードを読むことさえできません)

長さ7のスニペット:

"AB"_m*

m*上の2つのスタック要素のデカルト積をすべて作成します。たとえば、上記のコードは["AA" "AB" "BA" "BB"]"AB"andのデカルト積であるスタックに置かれます"AB"

長さ6のスニペット:

"_~"_~

見栄えの良い繰り返しコード。これを実行しないでください:)。このコード表現は、CJamで最も単純なクインの基礎です。文字列"_~"をスタックに配置し、コピー(_)を作成して評価します。最大再帰例外に達するまで、同じことを繰り返し(そして再び..)行います。

長さ5のスニペット:

{A}:F

これがCJamでの基本機能の動作方法{A}ですF。上記の式はコードブロックをvariableに割り当てます。これで、コードのFどこにでもコードブロックを実行できます(10この場合は取得できます)

長さ4のスニペット:

"A"~

を使用して、任意のコードブロックまたは文字列、さらには単一の文字を評価できます~。上記の式の結果は10

長さ3のスニペット:

Kmr

範囲0〜20の典型的な乱数ジェネレーターK

長さ2のスニペット:

es

これは、現在のタイムスタンプ(エポックからのミリ秒)を提供します。CJamにetは、現在時刻のさまざまな部分(日、時間など)で構成される配列を返す、より使いやすい形式のローカル時刻もあります。

長さ1のスニペット:

A

CJamには、ほとんどすべての大文字アルファベットが事前定義変数としてあります。A、10でB11であるとまでKある20. Pあるpi (3.141592653589793)N新しい行とある他の多くの。これらは、変数に初期値が必要な場合、または1バイトに2桁の数字が必要な場合にも非常に便利です。

ファクトイド

CJamはGolfScriptに触発されていますが、その上にネットワークGET呼び出しのサポートを含む多くの機能を構築します:D

PS:5回のアップボートごと、または2時間ごと(以前のいずれか早い方)に回答を更新しようとします


あなたのROT13の例にはいくつかの問題があります:pしかし、私はこの馬に感銘を受けました、私はそれを借りると思います:)
aditsu

@aditsu問題は何ですか?
オプティマイザー

nz文字の大文字と小文字を変更します。また、理由もなく@があり、代わりにDを配置できます。
-aditsu

@aditsuそのa-zA-Z範囲全体でROT 13であることがかなり確実であり、それがケース変更の理由です。読めませんか?その唯一のあなたの言語:P @は私が推測する18文字のためにあります:D-
オプティマイザー

それはROT13が通常行うことではありません。私が自分の言語を読めるかどうかを尋ねる理由がわかりません。問題はプログラムが何をするのかを理解することではなく、期待したことをしないという事実です。
-aditsu

34

Common Lisp

Lisp(LISt Processingから)は、現在も使用されている最も古い言語の1つです(FORTRANのみが古い)。コードがデータであり、データがコードである最初の言語であることは注目に値します。ホモイコニシティと呼ばれます。また、ガベージコレクションを持つ最初の言語でもありました。もともと完全に理論的な言語として1958年の論文でJohn McCarthyによって設計されましたが、スティーブラッセルがeval関数をコンピューターに実装できることに気づいたときに本当の言語になりました。これは、人工知能で最も普及しており、その優勢な括弧からすぐに認識できます。Common Lispは、多くの古いLisp方言をより標準化された形式に統合するように設計されました。

すべてのスニペットを単独で実行できるようにしようとしていますが、必ずしも価値のあるものではありません。さらに、Common Lispを使用しているため、基本的な概念と多くの構文は他の方言にも適用されますが、特定の機能はSchemeなどでは機能しません。

長さ1

*

コーディングにS-Expressionsとリストを使用することに重点が置かれているため、Lispにはアトムと呼ばれる括弧を含まない有効な式はほとんどありません。REPL(read-eval-printループ)に直接入力されたものはすべて変数として扱われ、そのように評価されます。*REPLによって出力された以前の値を保持します。

長さ2

()

これは空のリストで、Lispで最も重要なシンボルの1つです。Cのすべての適切な文字列がで終わるのと同様に、Lispの適切なリストはすべて空のリストで終了し\0ます。

長さ3

(*)

これは、括弧で囲まれたシンボルで構成される基本的な関数呼び出しです。Lispには演算子が含まれていません。それらは単なる関数でもあります。実際にバイナリ関数ではないため、乗算を選択しました。Lispの乗算演算子は、不特定の数の引数を取ります。引数が与えられない場合1、乗算のための恒等演算子を返します。

長さ4

`(1)

これはコンスセルです。これは要素のペアであると言う別の方法です。Lispでは、各リストはコンスセルに接続されたコンスセルで構成されます。最初の要素(car)は値で、2番目の要素(cdr)は次のコンスセルを指します。これは、リンクされたリストに基づくLispの基礎を形成します。この特定のconsセルは1、carとして、空のリストをcdrとして持っています。

長さ7

(not t)

Lispの真理値に触れた​​い。これは戻りnilます。Common Lispでは、tはtrue whileのシンボルでありnil()false を表し、互いに等しいが、この定義はすべてのLisp方言の標準ではないことに注意してください。たとえば、Schemeは、#ffalseの場合と'()空のリストの場合を区別します。

長さ9

(cdr ())

前にも言ったように、cdrはリストの末尾の要素で、関数で取得できますcdr。同様に、関数でhead要素であるcarを取得できますcar。かなり簡単ですね。空のリストのcarとcdrは両方ともnilです。

長さ10

(cons 1 2)

最後に、リストの操作を開始するのに十分な長さ。cons最初のパラメーターがcar、2番目がcdrのコンスセルを作成します。しかし、印刷する代わりに(1 2)、それは与え(1 . 2)ます。長さ2のスニペットに戻ると、適切なリストは空のリストで終わることになっているため、最後のconsセルのcdrは空のリストを指す必要があります。この場合、最後のコンスセルはを指す2ので、Lispは不適切なリストがあることを通知しますが、を使用せずにC文字列を作成する方法のように、リストを作成できます\0

長さ11

(cons 1 ())

これで、最初の適切に形成されたリストが作成されました。これは1、のcarとのcdrを持つ単一のコンスセルです()。他のすべてのリストについては、バッククォート/チェックでリードしていることに気付くでしょう。他の適切なリストは、その最初の引数を関数として評価し、残りの要素をパラメーターとして評価しようとします。厳密に言えば、()リストではありません。これは、空のリストを表す(とで構成されるシンボル)です。Lispでは、シンボル名にほぼすべての印刷可能文字を使用でき、必要に応じてシンボルを再定義できます。

長さ12

(cdr `(1 2))

これは(2)2一部の人が推測するような出力ではありません。各cdrは、別のコンスセルまたは空のリストのいずれかを指していることに注意してください。明らかに2空のリストではないので、それは別のコンスセルである必要がありますの車2とcdrの()

長さ13

'#1=(1 . #1#)

これにより、単一の値1だけの循環リストが作成されます。印刷すると、「(1 1 1 1 ...」が永遠に出力されるため、実際には無限リストと見なすことができます(cdr無限の回数を実行できます)常に同じ結果を得るために、それ自体!)。Tグローバル変数に代入しない限り*print-circle*、その場合はとして出力され#1=(1 . #1#)ます。


その最後の編集!クイック、誰かがビートルズをテーマにしたエソランを作る:D
fede s。

1
@fedes。ジョン・マッカーシー、ポール・マッカートニー…この言語はカーシー・カートニーと呼ばれます。

33

GNU Make

これに手足で出かけます。makePPCGで紹介されたのはこれが初めてかもしれません。

ファクトイド

makeは関数型言語と見なされる場合があります。

長さ0のスニペット

長さ0のスニペットは必要ないと思いますが、とにかくここにあります。これは、すべての長さ0のプログラムの中で最も有用かもしれないと思います。空のMakefileを使用する(またはまったくMakefileを使用しない)場合でも、makeには多数の組み込みルールがあります。たとえば、現在のディレクトリに.cファイルが存在する場合、.cファイルを.oまたはバイナリにコンパイルするデフォルトの組み込みルールがあります。だから私たちがするなら:

make hello.o

makeは、.cから.oルールを見つけ、hello.cをコンパイルしてhello.oを生成します。

同様に:

make goodbye

現在のディレクトリにgoodbye.cファイルがある場合、それはgoodbyeバイナリにコンパイルされます。

長さ1のスニペット

TAB

はい、TAB文字。これはそれ自体ではあまり効果がありませんが、Makeでは大きな意味を持ちます。特に、ルール内のターゲット定義に続くすべてのレシピ行は、TABで開始する必要があります。これにより、TABとスペースが混在する場合にメイクファイルをデバッグするときに、あらゆる種類のフラストレーションが発生します。

長さ2のスニペット

$@

これは、レシピで使用する自動変数です。ルールのターゲットのファイル名に展開されます。他にも便利な自動変数があります

長さ3のスニペット

a:=

最短の単純に展開された変数の割り当て。Makefileが最初に解析されると、変数aはすぐに ""に設定されます。代わりにを行うa=と、代入は再帰的に展開されます。つまり、変数が実際に参照されるまで展開が延期されます。

長さ4のスニペット

W:;w

最小限の有用な完全なルール仕様。これは、W単にwシェルコマンドを実行するルールでターゲットを定義します。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example

make W

以下と同等です:

w

これは、レシピが新しい行で区切られた同じ行のターゲットに従うという代替ルール構文です。より一般的には、レシピ行は個別のターゲット行のすぐ後に続き、TAB各レシピ行から文字が始まります。

長さ5のスニペット

$(@D)

別の自動変数。に似て$@いますが、これはパスのディレクトリ部分に展開され、ファイル名と末尾の/が削除されます。


たぶん、$(basename )または$(patsubst )?のようないくつかの文字列関数 (
luser droog

32

マーベラス

長さ14のスニペット

}0}1
Mulx
HxHx

このスニペットは、Marbelousライブラリの一部を示し、新しいコンセプト、つまりマルチセルボードを紹介しています。Mulxボードは、入力と出力2つの大理石ように、2個のビー玉を取ります。の左端のセルに入る大理石は、そのボードMulx}0デバイスと右端のセルに対応し}1ます。同様に、出力は異なるセルからも出力されます。ボードの幅はMAX(1, highest output device + 1, highest input device + 1)、入力デバイスに対応しないセルがその上に落ちた大理石を破壊するため計算できます。

長さ13のスニペット

7E
??
>Y!!
{0

これは、ティックごとにランダムに印刷可能なアスキー文字を吐き出すボードです。Marbelousには、ランダムな値を生成する2つの方法があります。ある??0と、それは、包括受け取る入力大理石の間のランダムな値を返す、と?n?0まで?Zそれぞれ。これはに非常によく似てい??ます。また!!、すべての出力がいっぱいになっていなくても、ボードを終了します。?nMarbelousを使用してデバイスをボードとして実装する方法を理解できます??か?

長さ12のスニペット

}0}1
Fb//
Dp

ここでは、動作中のMarbelousのいくつかのライブラリ関数を確認します。 Fbn番目のフィボナッチ数を出力します。nは入力大理石です。Dp入力大理石を10進数としてSTDOUTに出力します。これらは両方ともMarbelousで実装されており、オンラインインタープリターでインクルードライブラリをチェックするときに呼び出すことができます。Python インタープリターの場合は、各ファイルを明示的にインクルードする必要があります。これらのボードの実装はgithubで見つけることができます。この特定のプログラムは2つの入力を受け取り、フィボナッチボードを2回呼び出すことに注意してください。呼び出されたボードは、呼び出したボードの1ティック以内に戻ります。

長さ11のスニペット

}0}0
{<{0{>

これには説明が必要です。}0デバイスは、彼らが同じ番号(0)を持っているので、彼らはこのボードが呼び出される同じ値が含まれます、imputsです。下段の3つのデバイスは出力です。{<ボードの左側に{0出力、ボードの最初のセルの下に{>出力、右側に出力。出力は、すべての個別の出力デバイスがいっぱいになったときにのみプッシュされます。ただし、この場合、正しい出力デバイスに到達することはありません。ボードはアクティビティがないため終了し、いずれにせよ2つの値を出力します。/\Marbelousボードとして実装する方法を想像できますか?

長さ10のスニペット

..40
FF
\\

ここでは、Marbelousで重要な役割を果たすいくつかのことがあります。まず、追加があります。ボード上の2つのビー玉の軌跡をたどると、それらが同じセルに同時に到達することに気付くでしょう。これが発生すると、それらは一緒に追加されます。(楽しい事実:ある時点で、ビー玉は一緒に追加する代わりにスタックを形成する必要があると考えられていました)しかし、マーベラスは8ビット言語なので、ビー玉をFFは1を引くと同等です。

長さ9のスニペット

00
\\/\]]

これは、Marbelousでcatの基本バージョンを実装する最短の方法です。00 \ / \は00値の大理石を置くループです]] 1ティックごとにデバイスに。これはSTDINデバイスです。このデバイスにビー玉が着地すると、STDINから最初の文字を読み取ろうとします。1つある場合は、押し下げられます(この場合は再び印刷されます)。存在しない場合、元のアンブルは右にプッシュされます。(この場合はゴミ箱に入れられます)

長さ8のスニペット

}0
~~
{0

このスニペットはいくつかの機能を示しています。まず、} 0を介して入力を受け取ります。この場合、これはメインボードであり、コマンドライン入力に置き換えられます。この関数を呼び出すこともできます。その場合、コマンドライン入力の代わりに引数が使用されます。次に、があり~~ます。これは、ビットごとのnot演算子です。その後、に進みます。}0すべての}nデバイスがいっぱいになると、関数が値を返すときにこれらの値が返されます。(Marbelousは関数ごとに複数の戻り値をサポートします)

長さ7のスニペット

00
\\/\

これは、Marbelousで作成できる最もコンパクトな無限ループです。\\デバイスは、右に任意の大理石を押して/\コピー大理石と左右に別のコピーをプッシュ。ボードの幅は2セルしかないため、右側の大理石はごみになります。

長さ6のスニペット

46MB75

再帰の例を次に示しますMB(暗黙的に名前が付けられたメインボードは、すべてのティックで呼び出されFuますが、各呼び出しでSTDOUTに出力する前ではありません。(結果は次のとおりFuFuFuFuFuFu...です。

長さ5のスニペット

2A
++

いくつかの算術演算、値のある大理石は2A最初のティックで落ち、++セル上で検出されます。これは演算子です。この特定の演算子は、その上に着いた大理石をインクリメントし、落下させます。大理石は価値が2Bあり、ボードから落ちます。これは+、STDOUTに出力されます。

長さ4のスニペット

:
24

ここでは、2人の通訳者が同意しません。この例では、ファイルの最初のボードに名前を付けました(名前は空の文字列です)。pythonインタープリターは、これがメインボードであると想定し、プログラムの実行時にこのボードを呼び出します(印刷します$)。javascriptインタープリターがメインボードを見つけられないため、エントリポイントがありません。これは、Marbelousのライブラリファイルを作成するときに役立ちます。

長さ3のスニペット

:Bo

これは名前の付いたボードであり、ボディはBoありません。任意のボードのセル(Bo自身を含む)に書き込むことでこのボードを呼び出すことができます。

長さ2のスニペット

3A

このコードは、1x1セル(各セルは2文字幅)ボードの本体であり、暗黙的に名前が付けられていますMB(メインボード)。3A大理石がボードから落ちるときの16進値のASCII値を出力します。このプログラムの出力は、たまたま以下のソースコードになります。

長さ1のスニペット

:

とともに#、これはマーベラスで唯一有効な1文字のプログラムの2つです。#コメントの指標であるため、あまり面白くない。:ボードを宣言しようとしていることをマーベラスに伝えます。2つのコンパイラのどちらも、実際にボードに名前を付けたり、定義したりすることを気にしません。プログラムは何もしません。

ファクトイド:

Marbelousはこのサイトの人々によって開発されました。この言語の実行中の名前の一部はRubeと単にMarblesでした。


2
それに私を打ちました。素敵なスニペット!
スパー

長さ12のスニペットは2つの入力を受け取り、2つの異なるフィボナッチ数を出力するようです。それは意図的でしたか?
スパー

@Sparr、はい、Marbelousで関数がどのように機能するかを少し紹介することでした。
オーバーアクター

多分それを説明に追加しますか?あなたが書いたものから、私はスニペットが1つの入力を受け取り、1つのFIB番号を出力すると予想しています。
スパー

私は本当に...私のフィボナッチ関数がフィットするので、あなたが40ポイントを取得願っています
SPARR

31

前方へ

Forthには、intとfloatの2つのタイプしかありません(そして、floatはオプションです!)。それでも、char、string、long long int、ポインター、関数ポインター、構造体などを持つことができます。それはあなたがそれを使用する方法にすべてあります!

長さ1

.

.コマンド(または、我々はそれを呼び出すよう「言葉」)は、データ・スタックの一番上に整数値を出力します。スタックが空の場合、ランタイムエラーが発生します。また、スタックから値を削除します。これを維持する方法を確認してください。

長さ2

.s

この.s単語は、現在スタックにある値を削除せずに表示します。また、値の合計数も表示されます。Gforthでは、.sデフォルトで上位9つの値のみを表示するように制限されています。多分もっと見せる方法を見つけますか?

長さ3

see

seeForthの単語を入力して、その単語のソースコードを表示します。Forthのほとんどの単語はForth自体で定義されており、アセンブリで定義されているプリミティブはわずかです。

長さ4

1 0=

Forthは、後置演算子を備えたスタックベースの言語であることは言及しましたか?入力するとスタックに1 0=プッシュ1されてから0=ワードが実行され、スタックから一番上の値がポップされ、true0のfalse場合はプッシュされ、等しくない場合はプッシュされます。 0=はの便利な言葉です0 =; 一般的な値と単語の組み合わせのように1+、やなどの略語がいくつかあり0<>ます。さらに、falseForthでは0であり、ゼロ以外の値はすべて真ですが、組み込みのテストワードtrueは真の結果を返し、trueすべてのビットを設定した値-1です。つまり、!

長さ5

-1 u.

-1スタックにプッシュし、ポップして、符号なし整数として出力します。これを使用して、Forthのバージョンの符号なしintの最大値をすばやく確認できます(ただし、ネイティブでサポートされている最大整数値ではありません!)。「intをいつ印刷.するのu.か、いつ印刷するのかをどうやって知るのか?」回答:.署名されているu.場合、署名されていない場合。「それは私が意図したことではない」とあなたは言う。「スタックの一番上の値がいつ署名され、いつ署名されないのかを知るにはどうすればいいですか?」回答:あなたはプログラマーです。それがあなたの仕事です!スタック上の各整数がint、unsigned int、an int*、aを表すかどうかを知る必要がありますchar*、関数ポインタ、またはその他、またはあなたはあなたの鼻に悪魔を取得します。Forthはあなたのためにそれを追跡しません。これは何ですか、C?

長さ6

." Hi"

印刷しHiます。 ."Forthワード(すべてのForthワードと同様に、空白またはEOFが続く必要があります)は、入力ストリームを次のストリームまで読み取り、"その間のバイトを出力します。の後に複数のスペースを入れると."、直後のスペースを除くすべてが."印刷されます。シーケンスがサポートされていないエスケープ(あなたが持つ文字列に印刷することはできません"それでとし.")が、Gforthのが追加されます.\"それらをサポートする言語に。

長さ7

: + - ;

Forthで独自の単語を定義するには、コロン、単語の名前、単語に実行させる単語、およびセミコロンを記述します。単語は、空白以外の文字の任意のシーケンスにすることができます(空白は、Forthが1つの単語が終了し、別の単語が開始する場所を判断する方法です)。上記のスニペットは+mean -に再定義されているため、追加しようとするたびに、代わりに減算します。を使用する既存の単語+は、の元の定義への参照を保存するため、影響を受けません+

注:一部の単語は、他の単語の定義の中で、外部の場合とは異なる動作をしますが、制御構造以外はすべて非常に難解です。ほとんどの単語は、定義の中で外部と同じことをしますが、時々そのことは明らかではありません- : show-see see see ;あなたが思うことをしません!

長さ8

: 42 - ;

単語が空白文字の任意のシーケンスである可能性があると言ったとき、私は任意のシーケンスを意味しました。いいえ、Forthには個々の番号ごとに単語がありません。数字は少し特別です。Forthは、空白文字以外のシーケンスを検出すると、まず既知の単語かどうかを確認します。そうでない場合は、数値として解析しようとします。それが失敗した場合にのみ、エラーが発生します。数字と同じスペルの単語を定義すると、代わりに単語を取得せずにその数字のスペルを直接入力することができなくなりますが、Gforthやその他のさまざまなForthsは、とにかく数字をスペルする複数の方法を提供します

長さ9

IF 1 THEN

最後に、何かおなじみの!明らかに、このコード1は、引数が真であるかどうかをテストし、真である場合はTHEN、の後のものを実行しますか?違う。実行がに達するIFと、スタックの最上部の値がポップオフされ、その値がtrue(つまり、ゼロ以外)の場合、実行は内部のIF ... THEN何でも、その後の何でも続行されTHENます。値がゼロの場合、単にafterにスキップしTHENます。(フォース言い換えれという点である!)により、これらの単語が内部的に実装されている方法に、なお、IFTHENだけ言葉の定義の内部、ないで使用することができる「状態を解釈します。」

長さ12

( x y -- y )

これはコメントです。直後から(次へと進み)ます。(インタープリターでは、改行で終わらせることもできます。)これはForthの構文に「組み込まれ」ていません(何かありますか?)。(は別の単語で、入力ストリームのすべてをnextまで破棄します)。(そうです— Forthはそのソースコードの読み取り方法を操作できます。Perlは、実行せずに解析できない唯一の言語ではありません!)単語なので、スペースを続ける必要があります。(x未定義です。また(、足を踏み入れるという継続的なキャンペーンの一環として再定義することもできます。

ただし、コメントの内容はより興味深いものです。このコメントは、ある単語のスタック効果を特定しています--リストの左側の部分は、単語を実行する前にスタックの一番上にあるべきもの(上部は右にあります)、そして右側--は、スタックの一番上が後でどのように見えるかを説明します、上部が右側にあります)。一般的な規則は、このようなコメントを、定義した単語のソースに: nameビットの直後に追加することです。また、標準が続くタイプを示すためにスタック要素の命名についても非常に強力な規則があります

ちなみに、示されているスタック効果はそのnip単語に対するものです。コメントからそれが何をするかを伝えることができるはずです。

長さ13

1 2 3 4 d+ d.

前に示したように、Forthの値の型はすべて使用方法です。値をポインターとして扱う場合、それはポインターであり、その値が適切なポインターでない場合、それを1として扱うのはあなたのせいです。ただし、値をどのタイプとして扱うかに関係なく、データスタックでは常に1つのセルを占有します。例外は、二重セルまたは倍精度整数です。これらは、スタック上の2つの値で表される整数であり、通常の2倍のビットで演算を実行できます。上位または上位ビットのセルは、下位または下位ビットのセルの上に配置されるため1 01なります。0 1Forthの通常のセルの大きさに応じて、2 ^ 32または2 ^ 64のいずれかです。当然、ダブルセル値をそのように扱うには、ダブルセル値を明示的に操作する単語を使用する必要があります。これらは一般に、単にd(またはud符号なしの場合)、それに対応する単一セルの単語の名前が続きます:d+追加、d<比較、d.印刷など


Forthの場合は+1。私はまだ行われていない言語を探し始めていました。すでにここでそれを見て幸せです。
mbomb007

2
また、+ 1675に到達した場合、素敵なASCIIイメージを出力できます。:D
mbomb007

31

パイス

スニペットについては、ゴルフの課題の解決策と問題へのリンクを掲載します。

長さ17:

<ussC,cG\_GUQ*zQQ

n入力文字列を永久に繰り返し、その下線をシーケンス自体で埋め、それを永久に繰り返すことによって形成される無限シーケンスの最初の文字を見つけます。

空白を埋める

長さ14:

#QX=Qhf>FT.:Q2

一意の要素のリストが与えられたら、隣接する要素のペアを交換してリストをソートし、すべての中間結果を出力します。

一連の数字を順番に並べ替える

長さ13:

?hu]+HG_UQYQY

次の構造を作成します[0, [1, [2, [3]]]]

リストの範囲のホーム

長さ12:

uxyG*HQjvz2Z

XOR乗算。

XOR乗算

長さ11:

lfqSzST.:wz

最初の単語の部分文字列が2番目の単語のアナグラムである数を数えます。

親文字列内のアナグラムの検出

長さ9:

fqJjQT_J2

入力がパリンドロームである最も低いベースを見つけます。

最下層パリンドローム

長さ5:

!%lQ1

入力が2のべき乗かどうかを確認します。対数ベース2を取得し、mod 1の結果を取得し、論理値を取得します。

+、-演算を使用せずに、整数が2のべき乗かどうかを確認します

長さ4:

sjQ2

入力のベース2表現を加算することにより、入力のハミングウェイトを計算します。

符号なし16ビット整数の1の数を数えます

長さ3:

^G2

^ シーケンスのintは、最初の引数とそれ自体をn回デカルト積します。nは2番目の引数です。

この場合、Gがアルファベット(abcdefghijklmnopqrstuvwxyz)であるため、^G2からまでの2文字の文字列すべてを提供aazzます。

長さ2:

lT

lは、通常はlen()として機能しますTが、対数ベース2としても使用できます。変数はに初期化されているため103.321928094887362610のベース2を出力します。

長さ1:

H

Hは、Pythの空の辞書(ハッシュテーブル)であり、Pythで辞書を取得する唯一の方法であり、v(eval)または$(Pythonリテラル)を使用することはありません。

ファクトイド:

Pythには、リテラル以外の複数文字構成はありません。また、Pythは基本的に1対1でPythonにコンパイルします。


で始まるコマンドを使用する前にファクトイドが追加されました.か?
リーキー修道女

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