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

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

2
ダイナマイト付きマウス
あなたはマウスです。あなたのマウスの友人はすべて捕らえられており、無意識であり、入口/出口が1つしかない迷路に閉じ込められています。あなたはたまたま迷路の完全な地図を持っているので、あなたは急いでそれらをすべて安全に運ぶために解決策を計画することができます。ただし、迷路はセキュリティシステムで保護されており、しきい値に1000達するとアラートをトリガーし、あなたを捕らえて救助ミッションに失敗させます。 迷路の以前の調査から、踏み込んだ各正方形(つまり、水平方向または垂直方向の移動- マウスは斜めに移動できない)が1セキュリティシステムのカウンターに追加されます。ただし、重量(ダイナマイトのブロックまたは無意識のマウスフレンド)を運んでいる2場合は、追加の圧力を検出するため、代わりに追加されます。入り口/出口の広場にはこのセキュリティシステムがないため、カウンターに追加されません。 入り口に持ってきたダイナマイトは無制限にあるので、壁を爆破して友達を解放できます。しかし、あなたはそうすることに注意する必要があります。なぜなら、各爆発は50脳震盪の圧​​力からカウンターに加わるからです。さらに、一度に持ち運ぶことができるのは、1匹のマウスまたは1ブロックのダイナマイトです。ダイナマイトの各ブロックは1つの壁スペースのみを爆発させることができるため、複数の壁が連続して存在する場合は、手に手を入れて入り口まで戻ってさらに手に入れる必要があります。 実例 迷路が次のようになっているとします: ###### #M# E# ###### cカウンターに使用します。私たちは、から始まりE、N-トランスダイナマイトを運んでいる間1つの平方左に移動しますc=2。壁を爆発させるためにダイナマイトを爆発させc=52ます。手ぶらで2つの正方形を左に移動してを取得c=54し、マウスの正方形の上に立っています。私たちは友人を選び、3つの正方形をExitに戻しますが、最後の正方形はセンサーを持たないためカウントされません。そのため、背中に何かがある2つの正方形だけです。つまり、最後のマウスで出口に到達すると、c=58は未満で1000あり、ミッションは成功します。 チャレンジ 入力された迷路が与えられると、マウスヒーローであるあなたが、上記で概説した制約内ですべての閉じ込められたマウスを正常に救出できるかどうか、またはミッションが失敗であるかどうかを出力します。 入力 受け入れ可能な形式(複数行の文字列、文字列の配列など)の2D迷路。 この挑戦のために、私は#内壁と外壁の両方M、ネズミの友達、そしてE入り口に使用します。 入口が内壁にすぐ隣接することはありません(常に少なくとも1つのスペースが自由に移動できます)。 一貫性がある限り、任意の印刷可能なASCII文字に置き換えることができます。これはない、あなたが使用することを選択した場合に限り、あなたが一貫性(例えばを維持するように、外壁対内壁のための2つの異なるシンボルを使用できるようにする@代わりに、内壁のために、そして休暇#外装のため、すべての内壁がなければなりません@し、すべての外壁#)。 迷路は常に完全に壁に囲まれていますが、必ずしも長方形ではありません。必要に応じて、長方形の入力を作成するために迷路にスペースが埋め込まれていると想定できます(オプション)。 迷路には、ダイナマイトなしでは到達できないセクションがある場合があります。 迷路の外壁をダイナマイトすることはできません。 出力 truthy / falseyの値。「はい、マウスは他のすべてのマウスを救出できます」の場合は真実、「いいえ、アラームシステムが作動します」の場合は偽です。 ルール 完全なプログラムまたは機能のいずれかが受け入れられます。 標準的な抜け穴は禁止されています。 これはコードゴルフなので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。 例 空白行で区切られた真実の例。 ##### #M E# ##### ###### #M# E# ###### ######## #E # M# # # # # # # # …

1
ASCIIでヒップルーフのトップダウンビューをレンダリングする
まず、いくつかの用語(source): ヒップの屋根は、「通常、かなり緩やかな斜面で、壁にどこすべての側面の斜面下向き屋根のタイプを」ウィキペディア(Wikipediaを引用)されます 斜面は、屋根の一部である平らな表面です 尾根は、向かい合う2つの屋根の斜面が交わるエッジです ヒップは、垂直の壁に属する2つの斜面が交わる凸状のエッジです 谷は、垂直の壁に属する2つの斜面が出会う凹状の縁です。 ヒップとバレーは、対角線エッジと総称されます。 可能な入力: ** * *** ******** ** * ** 対応する出力: +-------+ +---+ +-----------+ |\ /| |\ /| |\ /| | \ / | | V | | \ ^---< | | \ / | | | | | \ / \ \| +---+ V …

11
デカンティング問題
C 0 ... C N-1リットル(0 < C <50)と目標Gリットルを保持できるN個のデカンタ(0 < N <10)が与えられた場合、次のアクション: デカンターを満たします デカンターを空にする 注がれているものがいっぱいになるか、注がれているものが空になるまで、あるデカンタから別のデカンタに注ぐ 目標量Gは、最後の容器の1つに含まれる水の量でなければなりません。「出力デカンタ」を使用することはできません。 例 N:2 C 0:5 C 1:12 G:1つの 結果:はい N:3 C 0:6 C 1:9 C 2:21 G:5 結果:いいえ ヒント:可能かどうかを計算するには、Gが容量のGCDで割り切れるかどうかを確認します。また、コンテナに収まることを確認してください。 これはcode-golfであるため、バイト数が最小のコードが優先されます。 リーダーボード これは、通常のリーダーボードと言語別の勝者の概要の両方を生成するスタックスニペットです。 回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。 # Language Name, N bytes N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば: # Ruby, <s>104</s> <s>101</s> 96 bytes ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。 …
23 code-golf  math 

25
配列の逆デルタ
配列の逆デルタ 配列の逆デルタの続き あなたの仕事は、符号付き32ビット整数の配列を取得し、そのデルタを逆にして再コンパイルすることです。 例 リスト、 18 19 17 20 16 デルタがあります: 1 -2 3 -4 逆にすると、次の結果が得られます。 -4 3 -2 1 次に、yieldsを使用して再コンパイルします。 18 14 17 15 16 これが戻り値になります。 再コンパイルではC、配列の最初の値であるを取得します。この場合18、、およびデルタを順番に適用します。そう18 + -4なります14、14 + 3 gives 17など。 入出力 list / array / table / tuple / stack / etcが与えられます。任意の標準入力メソッドを介した入力としての符号付き整数 上記のデルタ反転方法に従って、変更可能なデータを受け入れ可能な形式でもう一度出力する必要があります。 0 < N …

16
ピラミッド型マトリックスを作成する
ピラミッド型マトリックスは、以下の2つのマトリックスのように、すべての数値が中心点から増減する正方マトリックスです。 1 1 1 1 1 1 2 2 2 1 1 2 3 2 1 1 2 2 2 1 1 1 1 1 1 または: 3 3 3 3 3 3 2 2 2 3 3 2 1 2 3 3 2 2 2 3 3 3 3 …

14
だから羊飼いは言う
私は疲れていますが、眠りに落ちることはできません。羊を数えるのを手伝ってください。 入力N(正の整数)が与えられると、以下のサンプルのように、N羊がアスキーフェンスを飛び越えるようにします。一度に表示されるフレームは1つだけです。 o |-| ──|-|── 0 o|-| ──|-|── 0 o |-| ──|-|── 0 |-|o ──|-|── 0 |-| o ──|-|── 0 o |-| ──|-|── 1 o|-| ──|-|── 1 o |-| ──|-|── 1 カウントは「地面」の右下に保持する必要があります。末尾と先頭の空白と改行が許可されます。選択した言語で各フレームの画面をクリアするのが難しい場合、画面をクリアするのに十分な改行を追加できます。これに追加する行数を回答に明記してください。N番目の羊が5番目のフロアタイルにいるとき、プログラムは終了するはずです。 明日早く起きなければならないので、バイト単位の最短コードが勝ちます。機能または完全なプログラムを提出してください。標準の抜け穴が適用されます。

3
焦げたパンケーキの問題
この課題は、パンケーキの反転に関連しています。 パンケーキの並べ替えを聞いたことがあるかもしれません。パンケーキがプレート上で最小から最大に並べ替えられるまで、スパチュラをスタックに挿入し、スパチュラの上にあるすべてのパンケーキをひっくり返すことで、サイズによってパンケーキのスタックが並べ替えられます。焦げたパンケーキの問題は少し異なります。これで、すべてのパンケーキの片面が焼かれ、並べ替えが完了すると、各パンケーキの焼いた面がプレートに面する必要があります。 たとえば、次のスタックがある場合(左側のパンケーキのサイズ。右側が焼けた側を、右側が焼かれた側0を1意味します): 1 0 3 1 2 1 スタック全体を反転して取得し20 30 11、トップ2を31 21 11反転して取得し10 20 30、スタック全体を反転して取得します。焦げたパンケーキのソートされたスタックです。この一連の動き、フリップ3、フリップ2、フリップ3は、として表すことができます3 2 3。 チャレンジ パンケーキのサイズ(必ずしも一意ではない)の配列とその向きを指定して、有効な焼きパンケーキの並べ替え順序、つまり、焼き菓子の側面を下にしてパンケーキのスタックを最小から最大に並べ替える一連のフリップを出力します。 入力と出力は、区切り文字を含む任意の健全な形式である場合がありますが、使用する形式を指定し、入力形式のどちらの端がスタックの最上部(TOS)であるかを指定してください。 ゼロのパンケーキの反転は許可されています。 入出力でセパレーターを混在させることができます。 テストケース 以下のすべてのテストケースでは、入力はリストであり、出力はスペースで区切られた文字列であり、TOSは左側にあります。 [[1, 0], [3, 1], [2, 1]] "3 2 3" [[5, 1], [3, 0], [4, 1], [2, 1], [1, 0]] "5 3 4 1 3 2 …

20
ジミーこれらの配列
同僚のジミーは、C / C ++の初心者です。彼は一種の遅い学習者でもあります。公平を期すために、彼のコードは常にコンパイルされますが、彼は本当にずさんな習慣を持っています。たとえば、次のように配列を定義できることは誰もが知っています。 int spam[] = {4, 8, 15, 16, 23, 42}; それは、ジミーを除く全員です。彼は、配列を作成する唯一の方法は次のようであると確信しています。 int spam[6]; spam[0] = 4; spam[1] = 8; spam[2] = 15; spam[3] = 16; spam[4] = 23; spam[5] = 42; 私はコードレビューで彼のためにこれを修正し続けていますが、彼は学びません。そのため、彼がコミットしたときに自動的にこれを行うツールを作成する必要があります¹。 チャレンジ 完全なプログラムか、入力として複数行の文字列を取り込んで、よりコンパクトなバージョンのC配列を出力する関数のいずれかを作成してほしい。入力は常に空白を含むこの形式に従います。 identifier_one identifier_two[some_length]; identifier_two[0] = some_number; identifier_two[1] = some_number; identifier_two[2] = some_number; ... identifier_two[some_length …
23 code-golf  string  parsing  c 

27
nのすべての順序付けられたパーティションをリスト
課題は、特定の正の整数のすべての順序付けられたパーティション(組成(組み合わせ))をリストすることnです。これらは、から1までの数字のリストnですn。たとえば、inputを指定するn = 4と、結果は次のようになります。 4 1、3 3、1 2、2 2、1、1 1、2、1 1、1、2 1、1、1、1 結果は任意の順序にすることができますが、順序付けされた各パーティションを1回ずつ含める必要があります。この手段そのためn = 4、[1, 1, 2]、[1, 2, 1]および[2, 1, 1]すべての結果の一部でなければなりません。 これを実現するJavaScriptコードは次のとおりです。 function range(n) { for (var range = [], i = 0; i < n; range.push(++i)); return range; } function composition(n) { return n < 1 ? [[]] : range(n).map(function(i) …

23
ミックスのベース
入力: 各アイテムがの範囲にある整数のリスト/配列2-36。 出力: 整数の合計(10を底とする)。次の各整数は前の値の底(通常の10から始まる)にあります。 例:次の ような入力があるとします。[4, 12, 34, 20, 14, 6, 25, 13, 33] 次に、次のような合計があります。 4 (4 in base-10) + 6 (12 in base-4 ) + 40 (34 in base-12) + 68 (20 in base-34) + 24 (14 in base-20) + 6 (6 in base-14) + 17 (25 in base-6 …

19
偽のソースコード
ソースコードの各文字に対して1つのランダムな文字を出力します(下図を参照)。各文字の確率は、元のソースコードでの頻度です。したがって、出力はクインに似た偽のソースコードになります。 仕様 制限事項 標準のクイン制約が適用されます。空のプログラムや機能はありません。また、あなた自身のソースを読むこともありません。 出力 出力される文字数は、ソースコードの文字数と正確に一致する必要があります 各出力文字はランダムに選択する必要があります 任意の文字を選択する確率は等しい (occurrences in source) / (length of source) これは、単項解でさえ1確率で「ランダムに」選択する必要があることを意味します1。つまり、出力をハードコーディングすることはできません。 勝ち これはコードゴルフであるため、最少バイトが勝ちます 例 Program Frequency Probability Possible Output ------- --------- ----------- --------------- a@!@ a - 1 a - 25% @@a@ ! - 1 ! - 25% @ - 2 @ - 50% Program Frequency …

6
正確な小数の分数
2つの整数a、bを指定したプログラムまたは関数を作成し、小数部a / bを 正確に表す10進数を含む文字列を出力します。 a / bが整数の場合は、小数点または先行ゼロなしで値を出力するだけです: 123562375921304812375087183597 / 2777 -> 44494913907563850333124661 81 / 3 -> 27 -6 / 2 -> -3 a / bが整数ではなく、基数10で有限表現を持つ場合、先頭または末尾のゼロなしで値を出力します(ドットの前の単一のゼロを除く)。 1 / 2 -> 0.5 3289323463 / -250000000 -> -13.157293852 場合、最終的に、および場合にのみ(SOなし0.999...)/ bは整数ではなく、有限の表現を持っていない、出力が有限の部分は、括弧内の繰り返し部分が続いていません。繰り返し部分はできるだけ小さく、できるだけ早く開始する必要があります。 -1 / 3 -> -0.(3) 235 / 14 -> 16.7(857142) 123 / 321 …

12
順列のサイクル数
次のような整数の順列1、...、を考えてみましょう。nn = 6 [5,2,4,3,6,1] 順列をから[1,2,3,4,5,6]へのマッピングとして表示する場合[5,2,4,3,6,1]、順列は互いに素なサイクルに分解できます。サイクルは、相互にマッピングされる要素のサブセットです。たとえば、1にマッピングされます5。これはにマッピングされ6、にマッピングされ1ます。したがって、1サイクルは[1,5,6]です。他のサイクルがある[2]と[3,4]。したがって、この順列のサイクル数は3です。 一般に、順列のサイクルは一意で(最大)、サイズの順列のサイクル数nはから1に変化しnます。 チャレンジ 空でない順列が与えられた場合、そのサイクル数を出力します。 入力によって形成された配列であるn整数1、2、...、nどこ、n > 0。各整数は1回だけ出現します。上記の例のように、それらが現れる順序は順列を定義します。 配列の代わりに、リスト、数字の間の区切り文字を持つ文字列、各数字の個別の入力、または妥当なものを使用できます。 サイズの順列でnは、1から始まる整数のセット1...の代わりにn、0から始まるセット0... を一貫して使用できますn-1。もしそうなら、あなたの答えでそれを示してください。 コードは、のために働く必要がありますnまで20、妥当な時間で1分未満を言います。 コードゴルフ。すべてのビルトインが許可されます。 テストケース これは、1ベースの配列入力を前提としています。 [1] -> 1 [3,2,1] -> 2 [2,3,4,5,1] -> 1 [5,2,4,3,6,1] -> 3 [8,6,4,5,2,1,7,3] -> 2 [4,5,11,12,7,1,3,9,10,6,8,2] -> 1 [4,2,5,11,12,7,1,3,9,10,6,8] -> 5 [5,8,6,18,16,9,14,10,11,12,4,20,15,19,2,17,1,13,7,3] -> 3 [14,5,17,15,10,18,1,3,4,13,11,16,2,12,9,7,20,6,19,8] -> 7 関連する この関連する課題は、実際の順列のサイクルではなく、それらの数を求めます。サイクル数のみを要求すると、実際のサイクルを回避するアルゴリズムが短くなる可能性があります。

2
言語を推測する
前書き このサイトはコードスニペットの巨大なデータセットを急速に構築しているので、それで何かをしましょう! これがデータファイルです。このサイトから取得した113言語の9,066の一意の言語とスニペットのペアが含まれています。形式はタブで区切られ(language-TAB-snippet)、スニペットのすべての改行がに置き換えられ<LF>、すべてのタブが4つのスペースに置き換えられます。各言語には少なくとも5つのスニペットがあります。 [更新:以前見逃していたPythonとRegExpのいくつかのバージョンをマージするために、データファイルに小さな変更を加えました-上記のリンクが更新されました] チャレンジ コードスニペットを取得し、記述された言語を出力するプログラムまたは関数を作成します(詳細については以下を参照)。ソース+必要なデータの合計サイズは300バイト以下である必要があり、プログラムは独自のソースコードが与えられたときに正しい言語を出力する必要があります。最高の精度(上記のデータセットで最も正解)が優先されます。 ルール ソースコード、リソース、および必要なコンパイル/ランタイムフラグの合計サイズは300バイトを超えてはなりません。 回答は上記のデータセットに対してテストされます。入力として「スニペット」値の1つが与えられ、その出力がデータセットに従って「正しい」出力と比較されます。これはデータセット内のすべてのエントリに対して繰り返され、正解の最終的な数がスコアになります。 入力エンコーディングを選択できます。UTF-8を想定していますので、別のエンコーディングが必要な場合は回答で指定してください。 <LF>改行に代わるものを使用する必要はありません。エントリがリテラル改行(char 10)として改行を受け取ることを期待している場合は、回答でそれを指定します。 エントリは、入力スニペットが記述されていると思われる言語を出力する必要があります。多くの言語文字列を圧縮する必要を避けるため、マッピングを許可します(「Java」の3を出力する場合は問題ありません)。回答のマッピングに注意してください。 各言語に対して1つの出力マッピングのみを使用できます(つまり、3が「Java」を意味する場合、4は「Java」を意味することもできません)。 独自のソースコードを与えられたとき、あなたのプログラムがなければなりません正解(必須出力は、記述されている言語)を生成します。 データセット内のすべての言語をサポートする必要はありません。必要に応じて、追加の言語をサポートできます(たとえば、エントリがデータセット内の言語のいずれでもない場合)。 プログラムは確定的である必要があります(同じ入力を2回提供すると、同じ出力が生成される必要があります)。 タイブレーク 関係は、1つのエントリが勝つまでデータセットを減らすことによって決定されます。データセットは、最も一般的な言語のすべてのスニペットを削除することで削減されます(つまり、まれな言語の精度によって関係が壊れます)。たとえば、完全なデータセットでAとBのスコアが70%の場合、すべてのPythonスニペットが削除されます。AとBの両方が60%を獲得した場合、CJamは削除されます。Aのスコアが50%で、Bのスコアが55%の場合、Bが勝者です。 100%の精度が達成された場合、同じ言語のより多くのサンプルを含む2番目の(ブラインド)データセットを使用して、同順位が決定されます。 例1 Pythonスクリプト: print("python") このスクリプトは、独自のソースコードを指定すると「python」を正常に生成するため、有効です。データセットでは、スコア1008/9066 = 11.1% 例2 JavaScript関数: function f(s){return /function/.test(s)?1:2} マッピング1→javascript、2→python。ここでも、独自のソースに対して1(「javascript」)が正常に生成され、データセットでは1092/9066 = 12.0%のスコアが付けられます。 データはどこから来たのですか? このサイトの[code-golf]チャレンジからサンプルを取得するSEDEクエリを作成しました。結果の10,000件の回答から、ハッキングされたpythonスクリプトを使用してそれぞれのコードと言語名を見つけ、5つ未満の例ですべての言語を除外しました。データは100%クリーンではありませんが(プルしたコード以外のスニペットがあることは知っています)、十分に良いはずです。 今年の初めからこの課題に触発された:誰が言ったの?2016年大統領選挙 一部は言語とは何か?

6
正の整数の部分分解
正の整数のコレクションd_1 d_2 ... d_kは、次の場合に正の整数の因数分解nです。 d_1 * d_2 * ... * d_k = n 各正の整数には一意の素因数分解がありますが、一般に、いくつかの項が合成される因数分解もあります。例えば 12 = 6 * 2 = 4 * 3 = 3 * 2 * 2 入力として単一の正の整数を取り、その明確な因数分解の完全なリストを返すか出力するプログラム、関数、動詞、または同様のものを書きます。因数分解は任意の順序で作成でき、それらの用語は任意の順序で作成できますが、2つが互いの順列であってはなりません。因数分解には12つの例外が含まれないn場合がn*1ありnます。入力のために、空のリストの代わりに1因数分解1を与えることができます。 入力は符号付き32ビット整数の範囲内にあると想定できます。出力が文字列である場合、因数分解内の数値の区切りと因数分解の区切りの間には明確な区別があるはずですが、(たとえば)因子をで結合する必要はありません*。 コードは、妥当なデスクトップマシンで10分以内に有効な入力を処理できる必要があります。 例 1 [[]] or [[1]] or [[1 1]] 7 [[7]] or [[7 1]] or [[1 7]] 12 [[12] …

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