🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
オンラインでお試しください!
「未満」の絵文字はかなり長いUTF-8エンコーディングを使用しているため、「2未満」ではなく「1以下」を使用して-3バイト。またt
、バイトカウントに影響を与えずに警告を黙らせるためにフローズンを作成しました。
🚂️という名前のメソッドで🚂(整数)クラスを拡張します。入力から数値を取得し、その数値に対して🅰️を呼び出し、次のように結果を出力する簡単なプログラムを作成できます。
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
この部分は、メッセージとエラー処理を省略することで大いに楽しむことができますが、スコアには含まれていません。そのため、読みやすさを向上させながら、代わりに絵文字コードのより多くの機能を表示することを好みます。
非ゴルフ
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
説明
注: emojicode 0.5では、多くの絵文字を選択しても意味がありません。結局、0.xです。0.6はこれを修正します。
Emojicodeは、ジェネリック、プロトコル、オプション、およびクロージャーを備えたオブジェクト指向プログラミング言語ですが、このプログラムはクロージャーを使用せず、すべてのジェネリックとプロトコルは暗黙的と見なすことができますが、オプションはI / Oスタブにのみ表示されます。
プログラムはいくつかのタイプでのみ動作します:🚂は整数型、🔡は文字列型、⏩は範囲型です。いくつかのブール値(👌)も表示されますが、これらは条件でのみ使用されます。ブール値は、それぞれtrueとfalseに対応する👍または👎の値を取ることができます。
現在、Emojicodeには演算子はないため、通常は演算子である加算、比較、およびその他の操作は関数として実装され、効果的に式にプレフィックス表記を使用させます。オペレーターも0.6で計画されています。
最初にテストプログラムに取り組みましょう。
🏁
これは🏁ブロックであり、他の言語のmainと比較できます。
🍇 ... 🍉
ブドウとスイカは、絵文字コードでコードブロックを宣言します。
🍦str🔷🔡😯🔤Please enter a number🔤
これは、「凍結」という名前str
を宣言し、その値を初期化子(コンストラクター)createdを使用して作成された新しい文字列に設定します。変数の代わりに凍結を使用するのはなぜですか?変更されないため、変数は警告を発します。
🍊🍦num🚂str 10
分解しましょう。手段で🚂str 10
🚂メソッドを呼び出します:式を評価します。オプションに何も含まれていない場合、条件は👎(偽)と評価されます。それ以外の場合は、オプションのラップされていない値を使用して凍結された名前が作成され、条件は👍(true)に評価されます。したがって、通常の使用では、条件に続くブロックが入力されます。str
引数10を frozenでます。慣例により、型の名前が付いたメソッドは、オブジェクトをその型に変換します。10は整数変換に使用するベースです。このメソッドは、オプションのを返します🍬🚂
。オプションには、基本タイプまたは空の値⚡を含めることができます。文字列に数字が含まれていない場合、⚡が返されます。値を使用するには、optionalを使用してオプションをアンラップする必要があります。値がifの場合、ランタイムエラーが発生します。したがって、オプションをアンラップする前に、無をチェックすることをお勧めします。実際、Emojicodeにはそのための略記があります。通常、🍊
「if」です。🍊🍦 variable expression
variable
🍇 ... 🍉
😀🔡🅰️num 10
🅰️は、パーティションの数を計算する🚂を使用してメインコードがtoに追加する方法です。これはnum
、条件で宣言したフローズンで🅰️を呼び出し、resultメソッドによって基数10を使用して結果を文字列に変換します。次に、😀は結果を出力します。
🍓🍇 ... 🍉
は "else"を意味するため、ユーザーが数字を正しく入力しなかったときにこのブロックが入力されます。
😀🔤Learn what a number is, you moron!🔤
文字列リテラルを出力します。
それでは、メインプログラムを見てみましょう。未使用バージョンについて説明します。ゴルフバージョンでは、空白が削除され、変数の名前が1文字の名前に変更されました。
🐋🚂🍇 ... 🍉
🚂クラスを拡張します。これは、プログラミング言語では一般的に見られない機能です。classをスーパークラスとして新しいクラスを作成する代わりに、🐋は🚂を直接変更します。
🐖🅰️➡🚂🍇 ... 🍉
🚂を返す🅰️という名前の新しいメソッドを作成します。式を使用して計算されたパーティションの数を返しますa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
は他の言語と類似this
またはself
他の言語からのもので、メソッドが呼び出されたオブジェクトを指します。この実装は再帰的であるため、これが終了条件です。メソッドが呼び出された数が1以下の場合、1を返します。
🍮sum 0
新しい変数sum
を作成し、0に設定します。暗黙的に型assumesを想定しています。
🔂k⏩0🐕
は🔂🐚⚪️プロトコルを実装するものを繰り返し処理しますが、⏩はhappensを実装する範囲リテラルです。範囲には、開始値、停止値、およびステップ値があり、の場合start < stop
は1 、そうでない場合は-1 と想定されます。⏭を使用して範囲リテラルを作成することにより、ステップ値を指定することもできます。開始値は包括的であり、停止値は排他的であるため、これは式for k in range(n)
またはと同等Sum_{k=0..n-1}
です。
🍦nmk➖🐕k
sigma(n-k)、またはn - k
言い換えれば約数の合計を計算する必要があり、引数が数回必要になるため、これn - k
は変数nmk
に格納していくつかのバイトを節約します。
🍮sig nmk
🔂i⏩1 nmk
これにより、sig
変数がsigmaの引数に設定され、1〜のすべての数値が反復処理されますnmk - 1
。変数を0に初期化し、1..nmkを反復処理することもできますが、この方法を使用する方が短時間です。
🍊😛🚮nmk i 0
remainderは剰余またはモジュラスを計算し、😛が等しいかどうかをチェックするため、条件i
はの除算であれば👍になりますnmk
。
🍮➕sig i
これは、+= -= >>=
いくつかの劣った絵文字のない言語の演算子族に似た呼び出しによる割り当てです。この行は、と書くこともできます🍮 sig ➕ sig i
。したがって、内側のループが終了sig
すると、の約数の合計が含まれますn - k
、またはsigma(n - k)
🍮➕sum✖sig🅰️k
呼び出しによる別の割り当て。これによりsigma(n - k) * A(k)
、式のように合計に追加されます。
🍎➗sum🐕
最後に、合計がnで除算され、商が返されます。この説明は、おそらくコード自体を書くのと同じくらいの時間がかかりました...