プログラミングパズルとコードゴルフ

プログラミング愛好家やコードゴルファーのためのQ&A

14
コードゴルフの方法であるグローバル債務を解決する
世界の指導者たちは会い、ついに世界的な経済的苦難を解決する最善の(そして唯一の)方法は、彼らがお互いに借りている額を評価し、巨大な小切手でお互いに返済することであると認めました。彼らは、(皮肉なことに、可能な限り低い契約率で)あなたを雇い、そうするための最良の手段を考え出しました。 多くの検討を重ね、簡単な例を描くように頼んだ後、次の仕様を思いつきました。 それぞれの国は、ISO 3166-1 alpha-2コードで表されます。US米国、AUオーストラリア、JP日本、CN中国など... 元帳は、一連の国エントリと各国への支払い額として作成されます。 各国のエントリは、ドメインIDコロンから始まり、余剰/不足の量(10億ユーロ)、その後にセミコロン、コロンで区切られた国のコンマ区切りのリスト、および量(10億単位)ユーロ)彼らは借りている。 国が他の国に何も負わない場合、その国の言及はそのセミコロン区切りの後に入力されません。 赤字は負の数で示され、余剰は正の数で示されます。 値はフロートにすることもできます。 元帳はSTDINから取得する必要があります。元帳の終わりは、空白行の改行で示されます。集計はSTDOUTに配信する必要があります。 元帳の例: Input: AU:8;US:10,CN:15,JP:3 US:14;AU:12,CN:27,JP:14 CN:12;AU:8,US:17,JP:4 JP:10;AU:6,US:7,CN:10 次に、システムは、各国の債務額と債務額を計算し、たとえばAUの場合の黒字/赤字を決定します。 AU = 8(現在の余剰)-10(米国へ)-15(CNへ)-3(JPへ)+12(米国から)+8(CNから)+6(JPから)= 6 すべての計算が完了したら、集計を表示する必要があります。 Output: AU:6 US:-5 CN:35 JP:8 あなたの仕事は、このシステムを作成することです。このシステムは、任意の国の元帳エントリをいくつでも取得でき、すべてが支払われたときに各国の赤字/余剰額を決定できます。 究極のテストは、コードを使用して、以下のテストケースで次の国々の間に負う債務を解決することです。これらの数値は、2011年6月現在のBBCニュースから引用されています。(http://www.bbc.com/news/business-15748696) 演習の目的のために、私はそれぞれのGDPを現在の余剰として使用しています...これは厳密にコード品質保証の演習であることに留意してください... ...経済学について話したい場合、SEにそれを処理する別のサブドメインがあると確信しています... US:10800;FR:440.2,ES:170.5,JP:835.2,DE:414.5,UK:834.5 FR:1800;IT:37.6,JP:79.8,DE:123.5,UK:227,US:202.1 ES:700;PT:19.7,IT:22.3,JP:20,DE:131.7,UK:74.9,US:49.6,FR:112 PT:200;IT:2.9,DE:26.6,UK:18.9,US:3.9,FR:19.1,ES:65.7 IT:1200;JP:32.8,DE:120,UK:54.7,US:34.8,FR:309,ES:29.5 IE:200;JP:15.4,DE:82,UK:104.5,US:39.8,FR:23.8 GR:200;DE:15.9,UK:9.4,US:6.2,FR:41.4,PT:7.5,IT:2.8 JP:4100;DE:42.5,UK:101.8,US:244.8,FR:107.7 DE:2400;UK:141.1,US:174.4,FR:205.8,IT:202.7,JP:108.3 UK:1700;US:578.6,FR:209.9,ES:316.6,IE:113.5,JP:122.7,DE:379.3 さあ、世界の経済的救世主になろう! ルール: 最短のコードが勝ちます...これは結局のところコードゴルフです... 主要なテストケースの出力にコードの回答を入力してください...
32 code-golf  math 

12
vimでのゴルフのヒント
私は最近、vimがゴルフ、特にkolmogorov-complexityに最適であることを認識しました。また、meta vim によれば、少なくともこのサイトの範囲では、完全に受け入れ可能な「プログラミング言語」です。 Vimでゴルフをするための一般的なヒントは何ですか?私は、コードゴルフの問題に適用でき、少なくともある程度Vimに固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。 回答ごとに1つのヒントを投稿してください。
32 code-golf  tips  vim 

30
Adler-32チェックサムを計算する
バックグラウンド Adler-32は1995年にMark Adlerによって発明された32ビットチェックサムで、広く使用されているzlibライブラリ(Adlerによって開発された)の一部です。Adler-32は、32ビットの巡回冗長検査ほど信頼性は高くありませんが、少なくともソフトウェアでは、実装がはるかに高速で簡単です。 定義 LET B = [B 1、⋯、BのN ]バイト配列です。 BのAdler-32チェックサムは、low + 65536×highの結果として定義されます。ここで、 低:=((1 + b 1 +⋯+ b n)mod 65521) high:=(((1 + b 1)+(1 + b 1 + b 2)+⋯(1 + b 1 +⋯+ b n))mod 65521) 仕事 バイト配列を入力として指定し、Adler-32チェックサムを計算して返します。次の条件に従います。 入力は、バイトまたは整数の配列、または文字列として取得できます。 どちらの場合も、印刷可能なASCII文字に対応するバイトのみが入力に含まれます。 入力の長さは、0 <length≤4096を満たすと仮定できます。 出力を印刷する場合は、256までの任意の正のベースを使用できます。 あなたは単項選択した場合は、必ず通訳がまで対応することができ作る2 32 983056 - RAMの16ジブを持つマシン上で出力のバイト。 …

24
モールス信号変換器
標準入力をモールス信号に変換する最短のプログラムを作成します。表にない文字はそのまま印刷する必要があります。
32 code-golf  morse 

19
改良されたシーザー豚ラテン暗号
シーザー暗号の問題は、結果の単語がしばしば発音できないことです。Pig Latinの問題は、デコードが簡単なことです。組み合わせてみませんか? 入力 26個の英語の文字で構成される単語。 出力 まず、単語のすべての子音をアルファベットの次の子音に変更します。したがって、bはc、dはf、zはbになります。次に、すべての母音をアルファベットの次の母音に変更します(uはaに進みます)。最後に、単語の最初の文字が子音である場合にのみ、その文字を単語の末尾に移動し、単語の末尾に「ay」を追加します。 例: cat -> evday dog -> uhfay eel -> iim これはcode-golfなので、最短のコードが優先されます。 大文字小文字は関係ありません。 使用される母音は、A、E、I、O、およびUです。

29
あなたのやり方でそれを倍増
ソースコードの2倍化に関連するいくつかの課題がありました:こことここです。ここでのタスクは少し難しいですが、ほぼすべての言語で実行できるはずです。 このチャレンジでは、任意の正の整数を取り込みます。プログラムはその整数をdoubledで出力する必要があります。ソースコードを2倍にすると、正の整数が取り込まれ、2乗して出力されます。ます。 ソースコードはどのように2倍になりましたか?さて、あなたはそれをあなたの方法で持つことができます。つまり、ソースコードを任意の等しい長さのバイトまたは文字列(またはトークン化された言語のトークン)に分割できます。各チャンクを連続して2回繰り返す。 の初期プログラムABCDEFGHIJKL(長さ12)の場合、考えられるすべての二重化されたプログラムは次のとおりです。 Chunk length | Doubled source code -------------+------------------------- 1 | AABBCCDDEEFFGGHHIIJJKKLL 2 | ABABCDCDEFEFGHGHIJIJKLKL 3 | ABCABCDEFDEFGHIGHIJKLJKL 4 | ABCDABCDEFGHEFGHIJKLIJKL 6 | ABCDEFABCDEFGHIJKLGHIJKL 12 | ABCDEFGHIJKLABCDEFGHIJKL これは、素数のプログラムは2つの方法でしか倍増できないことに注意してください。すべての文字が倍増するか、プログラム全体が2回繰り返されます。 ルール: コードは完全なプログラムまたは機能でなければなりません。 標準的な抜け穴は禁止されています。 標準のI / Oメソッドが許可されます。 空白や改行を含むすべての文字/バイトは、コードの長さでカウントされ、チャンクに寄与します。 あなたは入力とその四角はあなたの言語のint型/整数型で表すことができることを前提としています。 あなたはないかもしれません末尾の改行やその他の文字を想定する。 バイト数の後の見出しにチャンクサイズを指定します。 これはコードゴルフですなので、短いプログラムの方が優れています!2つのプログラムの長さが同じである場合、小さいチャンク長を使用するプログラムが優先されます。(短いチャンク長を使用する長いプログラムがある場合は、投稿する価値もあります!) プログラムが2番目の入力/行を必要とする場合、その値について何も仮定しません。特に、2番目の入力が空の場合、最初の入力と同じ場合、または異なる整数の場合、プログラムは動作するはずです。プログラムが2番目の入力/行を必要としない場合、この制限を無視できます。 サンドボックスリンク

21
マインスイーパタイルの周囲は何ですか?
掃海艇は、すべての地雷の位置を特定することを目的として、地雷が非記述タイルのボードの周りに隠されているパズルゲームです。地雷をクリックするとゲームに負けますが、他のタイルをクリックすると0〜8の数字が表示され、それが直接地雷を囲んでいる数を示します。 番号を指定すると、空のタイルとその周囲の地雷のランダムな*可能な組み合わせを表示する必要があります。これは3x3配列の形式でなければなりません。中央のタイルは、入力として取得される鉱山の数である必要があります。 *すべての組み合わせが発生する可能性はゼロではありません。 例 _ = blank square X = mine 0 ___ _0_ ___ 1 _X_ _1_ ___ 1 ___ _1_ X__ ___ _1_ __X 4 _X_ X4X _X_ 4 X_X _4_ X_X 4 ___ X4X X_X 8 XXX X8X XXX 入力 中央のタイルを囲む鉱山の数(0〜8) 出力 タイルの3x3配列を表示する適切な形式の出力 その他の規則 各組み合わせは、発生する可能性が同じである必要はありません。プログラムの実行時に各組み合わせが発生する可能性がゼロ以外である必要があります。 鉱山と空のタイルには、任意の2文字を選択できます。 これはコードゴルフで、最少バイトのプログラムが勝ちます。

6
教科書を並べ替える
教科書を並べ替える 学校はまもなく開始されます(まだ開始されていない場合)。したがって、教科書を整理する時が来ました。アルファベット順で本を並べ替える必要がありますが、時間がかかりすぎるため、プログラムを作成することにします。 例 入力: _ | | _ |F| | | |o|_|P| |o|B|P| | |a|C| | |r|G| |_|_|_| 出力: _ | |_ |F| | _|o|P| |B|o|P| |a| |C| |r| |G| |_|_|_| 入力 入力は、アルファベット順に並べ替える必要がある書籍のセットになります。:それだけが含まれます|、_、、とA-Za-z。書籍のタイトルは上下に垂直に読まれます。 入力に空白が埋め込まれ、長方形に収まると仮定することもできます。入力に空白を埋め込むことを選択した場合は、回答でこれを指定してください。 プログラムで処理する必要がある本の最大の高さは、失敗せずに5,120行です。 書籍は常に1枚の厚さで、入力では常に少なくとも1冊の本になります 出力 出力は、アルファベット順に整理された同じ本のセットである必要があります。書籍の高さは同じままであり、タイトルを再配置するときは上から同じ間隔にする必要があります。 書籍はアルファベット順にソートする必要があります。あなたの言語がソート機能を備えている場合、それを使用できます。それ以外の場合は、ここで説明するアルファベット順の並べ替えを使用できます。 書籍名の例 _ | | | | |F| |o| |o| | | …

8
alphabeTrieを作成する
次のアルファベット順にソートされた単語のリストを検討してください。 balderdash ballet balloonfish balloonist ballot brooding broom すべての単語はで始まりb、最初の5つはで始まりbalます。最初の2つの単語だけを見ると: balderdash ballet 代わりに書くことができます: balderdash +let ここ' 'で、単語が前の単語と接頭辞文字を共有する場所で使用されます。'+'2番目の単語が前の単語と接頭辞を共有する最後の文字を示す文字を除きます。 これは一種の「トライ」視覚化です。親は「bal」であり、2つの子孫が'derdash'あり'let'ます。 次のような長いリストの場合: balderdash ballet brooding さらに、パイプ文字'|'を使用して、次のように共有プレフィックスの末尾を明確にすることができます。 balderdash | +let +rooding そして、同等の木は根のだろう'b'2人の子供持つ:サブツリーたルート'al'と、その2人の子供'derdash'とを'let'、および'rooding'。 この戦略を元のリストに適用すると、 balderdash ballet balloonfish balloonist ballot brooding broom 次のような出力が得られます。 balderdash | +let | +oonfish | | +ist | +t +rooding +m リスト内の2つの連続した単語に共有プレフィックスがない場合、特殊文字は置換されません。例えばリストの場合: broom …
31 code-golf  string 

7
何を忘れましたか?
あなたの仕事は、バイトのシーケンスで構成される空でないコンピュータープログラムを書くことです。プログラム内の特定のバイトを選択し、そのインスタンスをすべてプログラムから削除すると、変更されたプログラムは削除されたバイトを出力するはずです。 たとえば、プログラムが aabacba 次に、bcb出力しa、出力aaacaする必要があり、出力bしaababaますc。 変更されていないプログラムが何をするかは問題ではありません。 回答は、バイト数を最小化することを目的として、バイト単位でスコアリングされます。

9
整数のqvolume
すべての負でない整数は4つの2乗整数の合計として書き換えられることは古くからの知識です。たとえば、数値1は02+02+02+1202+02+02+120^2+0^2+0^2+1^2として表現できます。または、一般に、負でない整数nnn、整数a,b,c,da,b,c,da,b,c,dように n=a2+b2+c2+d2n=a2+b2+c2+d2n = a^2+b^2+c^2+d^2 ジョセフ=ルイ・ラグランジュはこれを1700年代に証明したので、しばしばラグランジュの定理と呼ばれます。 これは時々四元に関連して説明されている-によって発見数の種類ウィリアム・ハミルトンとして表さ1800年代に、w+xi+yj+zkw+xi+yj+zkw+x\textbf{i}+y\textbf{j}+z\textbf{k}w,x,y,zw,x,y,zw,x,y,zの実数であり、およびi,ji,j\textbf{i}, \textbf{j}およびkk\textbf{k}は、可換的に乗算しない別個の虚数単位です。具体的には、四元数w 2 + x 2 + y 2 + zの各成分の2乗に関連して説明します。w2+x2+y2+z2w2+x2+y2+z2w^2+x^2+y^2+z^2この量は、ノルム、二乗ノルム、または四分円とも呼ばれます。ラグランジュの定理のいくつかの現代の証明では、四元数を使用しています。 ルドルフ・リプシッツは、リプシッツ四元数と呼ばれる整数成分のみを持つ四元数を研究しました。四分円を使用すると、すべてのリプシッツ四元数が整数の友人を持つと考えることができると想像できます。たとえば、クォータニオン0+0i+0j+1k0+0i+0j+1k0+0\textbf{i}+0\textbf{j}+1\textbf{k}は、整数1=02+02+02+121=02+02+02+121=0^2+0^2+0^2+1^2関連付けられていると考えることができます。また、逆方向に進むと、すべての整数はリプシッツ四元数に友人がいると考えることができます。 しかし、ラグランジュの定理には興味深い詳細があります。合計は一意ではありません。各整数には、合計して作成できる4つの正方形のいくつかの異なるセットがある場合があります。たとえば、数値1は、非負の整数を使用して4つの方法で表現できます(このチャレンジでは非負のみを考慮してください): 1=02+02+02+121=02+02+02+121=0^2+0^2+0^2+1^2 1=02+02+12+021=02+02+12+021=0^2+0^2+1^2+0^2 1=02+12+02+021=02+12+02+021=0^2+1^2+0^2+0^2 1=12+02+02+021=12+02+02+021=1^2+0^2+0^2+0^2 被加数は常に0または1の2乗ですが、式の異なる位置に配置できます。 この課題では、重複を排除するために被加数を最低から最高に「ソート」して、この演習では1が4つの正方形の合計として表される1つの方法しかないと考えられるようにします。 1=02+02+02+121=02+02+02+121=0^2+0^2+0^2+1^2 もう1つの例は、4つの方法で表現できる42番です(ここでも、非負のa、b、c、dのみを考慮し、重複するコンポーネント配置を排除します) 42=02+12+42+5242=02+12+42+5242=0^2+1^2+4^2+5^2 42=12+12+22+6242=12+12+22+6242=1^2+1^2+2^2+6^2 42=12+32+42+4242=12+32+42+4242=1^2+3^2+4^2+4^2 42=22+22+32+5242=22+22+32+5242=2^2+2^2+3^2+5^2 整数を特定の四元数に関連付けられていると表現するこれらの異なる方法のそれぞれを想像するとどうなりますか?次に、42という数字がこれらの4つの四元数に関連付けられていると言えます。 0+1i+4j+5k0+1i+4j+5k0+1\textbf{i}+4\textbf{j}+5\textbf{k} 1+1i+2j+6k1+1i+2j+6k1+1\textbf{i}+2\textbf{j}+6\textbf{k} 1+3i+4j+4k1+3i+4j+4k1+3\textbf{i}+4\textbf{j}+4\textbf{k} 2+2i+3j+5k2+2i+3j+5k2+2\textbf{i}+3\textbf{j}+5\textbf{k} ii\textbf{i}、jj\textbf{j}、kk\textbf{k}が3次元ユークリッド空間のベクトルであるため、クォータニオンの標準的なコンピューターグラフィックスの解釈を想像すると、クォータニオンのxxx、yyy、zzz成分は3次元のデカルト座標になります。整数は、この思考プロセスを通じて、空間内の3次元座標のセットに関連付けることができます。たとえば、番号42は、次の4つの(x,y,z)(x,y,z)(x,y,z)座標に関連付けられています:(1,4,5),(1,2,6),(3,4,4),(2,3,5)(1,4,5),(1,2,6),(3,4,4),(2,3,5)(1,4,5),(1,2,6),(3,4,4),(2,3,5) これは、点群、または空間内の点のセットと考えることができます。さて、空間内の有限点のセットに関する興味深い点の1つは、周囲に最小限の境界ボックスを常に描画できることです。このボックスは、すべてのポイントを収めるのに十分な大きさを持ちます。ボックスがx,y,zx,y,zx,y,z軸で整列された通常のボックスであると想像する場合、それは軸整列境界ボックスと呼ばれます。境界ボックスには、幅、長さ、高さを決定し、それらを掛け合わせることで計算可能なボリュームもあります。 次に、四元数によって形成されるポイントの境界ボックスのボリュームを想像できます。整数1には、この演習の基準を使用して、象限が0+0i+0j+1k0+0i+0j+1k0+0\textbf{i}+0\textbf{j}+1\textbf{k}である1つのクォータニオンがあります。これは非常に単純なポイントクラウドであり、1つのポイントしか持っていないため、バウンディングボックスのボリュームは0です。ボックスの最小点である(1,2,4)(1,2,4)(1,2,4)最大である(3,4,6)(3,4,6)(3,4,6) その結果、幅、長さ、高さが2、2、2になり、ボリュームが8になります。 整数ためものとするnnn、qvolumeはquadranceを有する四元により形成された全ての3D点の軸平行境界ボックスの容積が等しいnnn、ここで四元数の成分w+xi+yj+zkw+xi+yj+zkw+x\textbf{i}+y\textbf{j}+z\textbf{k}は非負で、w&lt;=x&lt;=y&lt;=zw&lt;=x&lt;=y&lt;=zw<=x<=y<=zです。 単一の非負整数nnn与えられると、nnnのqvolume を出力するプログラムまたは関数を作成します。 例: input -&gt; output 0 -&gt; 0 1 …

23
デッキのシャッフルをやめて、もうプレイしてください。
チャレンジ: 入力:範囲内の明確な正整数の。[1,list-size][1,list-size][1, \text{list-size}] 出力:整数:リストがリッフルシャッフルされる回数。リストの場合、これはリストが2つの半分に分割され、これらの半分がインターリーブされることを意味します(つまり、リストを[1,2,3,4,5,6,7,8,9,10]1回リッフルシャッフルすると結果が[1,6,2,7,3,8,4,9,5,10]になるため、このチャレンジでは入力[1,6,2,7,3,8,4,9,5,10]がになります1)。 チャレンジルール: リストには、の範囲の正の整数のみが含まれると仮定でき(または 0インデックス付きの入力リストを選択した場合は)。[1,list-size][1,list-size][1, \text{list-size}][0,list-size−1][0,list-size−1][0, \text{list-size}-1] すべての入力リストは、有効なリフルシャッフルリスト、またはシャッフルされていないソート済みリスト(この場合、出力は0)のいずれかであると想定できます。 input-listには少なくとも3つの値が含まれると想定できます。 段階的な例: 入力: [1,3,5,7,9,2,4,6,8] 一度アンシャフリングすると[1,5,9,4,8,3,7,2,6]、次のよう[1, ,5, ,9, ,4, ,8]になります。偶数の0インデックスが付けられたすべてのアイテムが最初に来て、その後、奇数の0インデックスが付けられたすべてのアイテムがその後に来るためです[ ,3, ,7, ,2, ,6, ]。 リストはまだ順序付けられていないため、続行します。 もう一度リストをUnshufflingは次のようになります[1,9,8,7,6,5,4,3,2] :再びになる[1,8,6,4,2,9,7,5,3] その後:[1,6,2,7,3,8,4,9,5] :そして最後に[1,2,3,4,5,6,7,8,9]、我々はunshuffling行われているので、順序付けられたリストです。 を取得するために元のファイルを[1,3,5,7,9,2,4,6,8]5回シャッフル解除した[1,2,3,4,5,6,7,8,9]ため、出力は5この場合になります。 一般的なルール: これはcode-golfであるため、バイト単位の最短回答が優先されます。 コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。 デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーター、戻り値型、完全なプログラムを使用できます。あなたの電話。 デフォルトの抜け穴は禁止されています。 可能であれば、コードのテスト(TIOなど)へのリンクを追加してください。 また、回答の説明を追加することを強くお勧めします。 テストケース: Input Output [1,2,3] 0 [1,2,3,4,5] 0 [1,3,2] 1 …

21
球上のランダムポイント
チャレンジ 入力を受け取らず、理論的に均一なランダム方向に長さ111ベクトルを出力するプログラムまたは関数を作成します。 これは、x 2 + y 2 + z 2 = 1で記述される球上のランダムポイントに相当します。x2+y2+z2=1x2+y2+z2=1x^2+y^2+z^2=1 そのような分布をもたらします 出力 方程式x2+y2+z2=1x2+y2+z2=1x^2+y^2+z^2=1が精度の限界に当てはまる理論的に均一なランダム分布からの3つのフロート。 チャレンジ発言 ランダム分布は理論的に均一である必要があります。つまり、擬似乱数ジェネレーターを実数からの真のRNGに置き換えると、球体上の点のランダムな分布が均一になります。 一様分布から3つの乱数を生成し、それらを正規化することは無効です。3次元空間の隅に向かって偏りがあります。 同様に、一様分布から2つの乱数を生成し、それらを球座標として使用することは無効です。球の極に向かってバイアスがかかります。 適切な均一性は、以下を含むがこれらに限定されないアルゴリズムによって達成できます。 0付近の正規(ガウス)分布から3つの乱数xxx、yyy、zzzを生成し、それらを正規化します。 000 実装例 3つの乱数発生するxxx、yyy及びzzzから均一な範囲の分布(−1,1)(−1,1)(-1,1)。ベクトルの長さをl = √で計算しますl=x2+y2+z2−−−−−−−−−−√l=x2+y2+z2l=\sqrt{x^2+y^2+z^2}。次に、l&gt;1l&gt;1l>1場合、ベクトルを拒否し、新しい数値セットを生成します。場合他、l≤1l≤1l \leq 1、ベクトルを正規化し、結果を返します。 実装例 2つの乱数発生iii及びjjjより均一な範囲の分布(0,1)(0,1)(0,1)などのような球座標に変換:θϕ=2×π×i=cos−1(2×j−1)θ=2×π×iϕ=cos−1⁡(2×j−1)\begin{align}\theta &= 2 \times \pi \times i\\\\\phi &= \cos^{-1}(2\times j -1)\end{align}ので、xxx、yyy、zzzは xで計算できますxyz=cos(θ)×sin(ϕ)=sin(θ)×sin(ϕ)=cos(ϕ)x=cos⁡(θ)×sin⁡(ϕ)y=sin⁡(θ)×sin⁡(ϕ)z=cos⁡(ϕ)\begin{align}x &= \cos(\theta) \times \sin(\phi)\\\\y &= \sin(\theta) \times \sin(\phi)\\\\z &= …

5
8ビット仮想マシン
バックグラウンド 私は古い8ビット6502チップが好きです。6502マシンコードでPPCGの問題を解決するのは楽しいことです。しかし、単純であるべきいくつかのこと(データの読み取りやstdoutへの出力など)は、マシンコードで行うのは不必要に面倒です。だから、私の頭の中には大まかなアイデアがあります。6502に触発された独自の8ビット仮想マシンを発明します。何かを実装し始めて、VMの設計が最小限に抑えられている場合、これ自体が素晴らしい挑戦であるかもしれないことに気付きました:) 仕事 次の仕様に準拠する8ビット仮想マシンを実装します。これはcode-golfであるため、バイト数が最も少ない実装が優先されます。 入力 実装には、次の入力が必要です。 単一の符号なしバイトpc、これは初期プログラムカウンター(VMが実行を開始するメモリ内のアドレス、0ベース) 256エントリの最大長を持つバイトのリスト。これは仮想マシンのRAM(初期コンテンツを含む) この入力は、適切な形式で入力できます。 出力 VMが終了した後のRAMの最終的な内容であるバイトのリスト(以下を参照)。最終的に終了することにつながる入力のみを取得すると仮定できます。賢明な形式はすべて許可されます。 仮想CPU 仮想CPUには 8ビットプログラムカウンター、 呼ばれる8ビットアキュムレータレジスタAと という8ビットのインデックスレジスタX。 3つのステータスフラグがあります。 Z -何らかの操作の結果、ゼロフラグが設定された 0 N -負のフラグは、何らかの操作の結果が負の数になった後に設定されます(結果のビット7が設定されます) C -キャリーフラグは、結果の「欠落」ビットの加算とシフトによって設定されます スタート時には、フラグが全てクリアされ、プログラムカウンタは、与えられた値との内容に設定されているAとX不定です。 8ビット値は、 符号なしの範囲の整数[0..255] 範囲の符号付き整数、2の補数[-128..127] コンテキストに応じて。操作がオーバーフローまたはアンダーフローすると、値は折り返されます(また、追加の場合、キャリーフラグが影響を受けます)。 終了 仮想マシンは次の場合に終了します HLT命令に到達します 存在しないメモリアドレスがアクセスされた プログラムカウンターはメモリ外で実行されます(VMに256バイトのメモリがすべて与えられてもラップアラウンドしないことに注意してください) ドレッシングモード 暗黙的 -命令には引数がありません。オペランドは暗黙的です 即時 -オペランドは命令の直後のバイトです relative-(分岐のみ)命令が署名された後のバイト(2の補数)。分岐が行われた場合にプログラムカウンターに追加するオフセットを決定します。0次の命令の場所です absolute-命令の後のバイトは、オペランドのアドレスです インデックス付き -命令プラスX(レジスタ)の後のバイトは、オペランドのアドレスです 説明書 各命令はオペコード(1バイト)で構成され、アドレッシングモードでは、immediate、relative、absolute、およびindexedの2番目の引数バイトです。仮想CPUが命令を実行すると、それに応じて(1または2)プログラムカウンターをインクリメントします。 ここに示されているすべてのオペコードは16進数です。 LDA -オペランドをロードする A オペコード:即時:00、絶対:02、インデックス付き:04 …

22
雨を降らせる
このチャットミニチャレンジに触発されました。 入力として文字列(ASCII印刷可能文字のみ)が与えられた場合、「雨」の文字を含む文字列を出力します。各文字は、下向きのランダムな行数(0文字列の長さと長さがランダムで、それぞれの確率がゼロではない)で、列ごとに1文字のみである必要があります。可能性のあるすべての出力は、発生する可能性がゼロ以外である必要があります。 それは少し混乱するかもしれないので、ここに例があります(そのCMCから引用): Hello World d H o llo l W e r Hが1つ下のスペースdであり、ゼロが下であり、lloすべてが整列することに注意してください。のrで、最も遠いダウンしている9が、離れて上から文字列の長さよりもまだ小さいです。これはほんの一例であり、入力には他にも多くの可能性がありますHello World。 他の例は次のとおりです。 test t e s t PP&amp;CG &amp; G P P C 入力と出力は 任意の便利な方法で。 入力は空でないことが保証されます(つまり、受信することはありません ""入力として)。 STDOUTに出力するか、関数の結果として返すことができます。 完全なプログラムまたは機能のいずれかが受け入れられます。 文字が適切に並んでいる限り、任意の量の余分な空白を使用できます(たとえば、長方形として自由に埋めることができます)。 標準抜け穴は禁止されています。 これはコードゴルフなので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

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