コードゴルフ:同じ種類のものが触れないようにナッツを混ぜます


16

入力:

入力は、(あなたの言語での)ナッツのランダム化された配列であり、可能なナッツが続きます。プログラムには、整数コードなど、さまざまな種類のナットを表す方法が必要です。プログラムは、ナットのあらゆる構成のあらゆるサイズの配列を処理できる必要があります。

可能なナット:

Kola nut
Macadamia
Mamoncillo
Maya nut
Mongongo
Oak acorns
Ogbono nut
Paradise nut
Pili nut
Pistachio
Walnut

出力:

出力は、同じ種類の隣接するナットがないような方法でソートされた配列でなければなりません。これが不可能な場合、出力は空の配列でなければなりません。

入力例(簡略化):

["walnut", "walnut", "pistachio"]

出力例:

["walnut", "pistachio", "walnut"]

ソリューションは、偶然に一意になるまでアレイを単純にシャッフルしない場合があります。採用されるソートは決定論的なものでなければなりません

ミックスナッツ? 2つのアーモンドが触れているのが見えます!


4
「あなたのプログラムには、整数コードなど、さまざまな種類のナットを表す方法が必要です」—「偶然に配列が一意になるまで、配列を単純にシャッフルすることはできません。採用されるソートは決定論的なものでなければなりません」シャッフルは依然として決定論的です。プログラムの時間の複雑さに制限を課すつもりですか?
反時計回りを回すのをやめた

1
@leftaroundaboutに同意する必要がありますが、特定のアルゴリズムは非常に正当な理由なくばかげています。このようなコードゲームで最も価値のあることの1つは、採用されるさまざまな方法です。
dmckee

@dmckee、アルゴリズムが決定論的であるという要件は合理的だと思います-RNGに欠陥があるか、入力がかなり長い場合、非決定論的ソリューションは終了に失敗する可能性があります。
ブースビー

@boothby。えー 私は素粒子物理学者です。モンテカルロはそれ自体が重要なツールです。私は固定PRNGと固定種を選択した場合はさらに、それがある決定論。
-dmckee

1
私はいくつかの解決策を持っている例を見つけたと思いますが、いくつかの答えがそれらのいずれかを見つけられない可能性があります。追加できますか?(5,4,4,3,3,2)perl6 -e 'my @a="aaaaabbbbccccdddee".comb;my @b = @a.pick(*) while @b.squish !== @a;say [~] @b' baedcbdacdecbabaca(3,3,2)により、それらも失敗する場合があります。
ブラッドギルバートb2gills

回答:


8

GolfScript、42 41 37 38文字

~.`{\`{=}+%1-,}+$.,)2//zip[]*.2<..&=*p

コードはSTDINでの入力を予期し、結果をSTDOUTに出力します。例:

> ["walnut" "walnut" "walnut" "macadamia" "pistachio"]
["walnut" "macadamia" "walnut" "pistachio" "walnut"]

> ["walnut" "walnut" "walnut" "macadamia" "walnut"]
[]

スクリプトは予想よりも長くなりましたが、改善の余地があると思います。

編集:単一のアイテムを含むリストの場合、1文字のコストがかかります(思いつく最高の比較はPeterの場合と同じです)。


1
私はまだこれを実装するために座っていませんでした$.,)2//zipが、まさに私が念頭に置いていたものです。私の仕様の解釈では、スタックで入力を受け取り、スタックに残すことができるということでしたので、明確にするためにプッシュする必要があります。
ピーターテイラー

@PeterTaylor、かっこいい。私のために働く。
ブースビー

これ["walnut"]は、compare-the-first-twoセクションの入力時にクラッシュします。
ピーターテイラー

@PeterTaylorそうですね。そのコーナーケースで作業する必要があります。
ハワード

6

GolfScript、32文字

~:x{]x\-,}$.,)2//zip[]*.2<..&=*`

ハワードのソリューションと同じ入力および出力形式。


私はソート部分で同じ考えを持っていましたが、まだコーディングしていませんでした:-)良い仕事です!
ハワード

6

Brachylog v2、10バイト

p.¬{s₂=}∨Ė

オンラインでお試しください!

ブルートフォースソリューション。(これは、チャレンジが「完全なプログラム」と言っていないため許可されている関数です。)また、ほとんどの場合、仕様の直接翻訳です(唯一の微妙な点は、すべての暗黙的な制約が適切な場所、したがって、それらを明確にするために余分な文字は必要ありません)。

これは、任意の種類のリストを再配置するための一般的なアルゴリズムであり、2つの触れる要素がないように注意してください。要素の文字列表現を処理でき、整数コードも同様に処理できます。したがって、「あなたのプログラムは、整数コードなどのさまざまな種類のナットを表す方法を持たなければならない」ということは、実際には問題ではありません。質問からの要件が解釈されます。

説明

p.¬{s₂=}∨Ė
p            Find a permutation of {the input}
  ¬{   }     which does not have the following property:
    s₂         it contains a pair of adjacent elements
      =        that are equal
        ∨    {no constraint on what value the equal elements can have}
 .           If you find such a permutation, output it.
        ∨    If no permutation is found, ignore the input and
         Ė     {output} an empty list

1

J、80文字

]`_:@.(0<2&([:+/=/\))({.~-:@#),((],.|.)~>.@-:@#)<"1;(\:#&.>)(</.])[;.1' ',1!:1[1

これについては実際にはGolfscriptと同じリーグではありません。利益が得られると思いますが、プログラムにリストを入れるために必要な14文字[;.1' ',1!:1[1は大きなハンディキャップです。

基本的に、プログラムはリストを取得し、同様のアイテムをグループ化し、各グループのアイテム数で降順に並べ替え、リストの前半と後半の間で出力を交互に切り替えます。コードが余分なアイテムを取り除き、リストが有効な出力であるかどうかを判断する場合(残りの場合は無限を出力します_)。

例:

macadamia walnut walnut pistachio walnut

グループ(</.])

macadamia walnut walnut walnut pistachio

並べ替え(\:#&.>)

walnut walnut walnut macadamia pistachio

ラヴェル((],.|.)~>.@-:@#)

walnut macadamia walnut pistachio walnut


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