私の呪文キャストを最適化する!


8

私は若い魔法使いで、魔法のような出会いの際にマナを無駄にしないように心がけています。
私はいつでもX呪文を利用でき、それぞれに独自のマナコスト
Yがあります。X、Yは厳密に11未満の正の整数です。
初心者として、私のマナプールは大きく変動します(常に11未満です)。 、そして私はマナプールを空にしながら、できるだけ少ない呪文をキャストするのに助けが必要です(スクロールは高価です、そうですね)。私のマナプールのサイズと完全に一致するスペルの組み合わせが見つからない場合は、最も近い(そしてより安い)組み合わせを提供します。

私はあなたとあなたの無限の知恵に来て、私が最大の暗い魔法使いになるのを助けました。私はがっかりしないでしょう。

INPUTスタイル(スタイルがすべてであるため):
Y; abcdef
Yはマナプールのサイズです。(a、b、c、d、e、f)は呪文です。呪文は6つあり、最初の呪文は「a」マナ、2番目の呪文は「b」マナというように続きます。

入力:4; 1 2 3 3 7 6
私は4つのマナと6つの呪文を利用できます。2つの呪文は1マナ、1つの呪文は2マナ、2つの呪文は3マナなどのコストがかかります。

出力:(3,1)


入力:3; 1 3 5 2 10
出力:(3)


入力:8; 4 1 9
出力:(4,1)


入力:4; 1 2 2 3
出力:(2,2)、(1,3)

呪文のすべての組み合わせを出力する必要がありますが、同じコストの呪文を区別する必要はありません。

あなたが望むどんな機械への最も短い呪文も、たくさんの感謝と運命の鞭を与えられます。


ポイントを逃したか、多分私はあなたの例を理解していないと思います:最初の例:7つの呪文を見つけました-明確にできますか?最後の1つ:なぜ正しい出力が(4)にならないのですか?呪文は(2,2)ほど少なく、パズルは「できるだけ少ない呪文を唱えるために助けが必要だ」と述べています。同じ数のスペルを持つ複数のソリューションがある場合、すべてのソリューションを出力する必要があるということですか?
— ハワード、

明らかに、私は入力と出力をめちゃくちゃにしました、これはおそらく修正されています。最新の質問については、はい。同じ量のスペルを持つすべての組み合わせを出力する必要があります。ありがとう。
— Fabinout 2013年

入力/出力形式が指定されていますか、それとも数値+数値の配列=>数値の2D配列ですか?
— John Dvorak

あいまいな言語のスクロール(brainfck)の出力と入力の両方が明確で読みやすい限り、私は対応します。
— Fabinout 2013年

または、プログラム全体ではなく、2つの引数を持つ関数を作成することもできますか?それとも表現?
— John Dvorak

回答:


4

GolfScript、55文字

[[]]\{{+}+1$%|}/.@{1$0+{+}*.@>!*100*\,-~}+:s%$0={\s=}+,

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

> 4 [1 1 2 3 3 7 6]
[[1 3]]

> 3 [1 3 5 2 10]
[[3]]

> 8 [4 1 9]
[[4 1]]

> 4 [1 2 2 3]
[[2 2] [1 3]]

5

APL(87)

↑∪m/⍨t=⌊/t←⊃∘⍴¨m←m/⍨t=⌈/t←+/¨m←{a/⍨⊃i≥+/a←k[⍵]}¨⊃,/g,{z/⍨∧/¨2>/¨z←,⍳⍵/⍴k}¨1↓g←⍳⍴k←1↓i←⎕

入力形式はAPLリストで、最初の要素はマナプールで、残りの要素は呪文です。出力では、スペルの可能な組み合わせがそれぞれ別の行に表示されます。

⎕:    4, 1 2 3 3 7 6
3 1
⎕:    3, 1 3 5 2 10
3
⎕:    8, 4 1 9
1 4
⎕:    4, 1 2 2 3
2 2
3 1

説明:

  • k←1↓i←⎕:入力からリストを読み取り、それをに格納しiます。最初の要素(マナ)をドロップし、残りをに格納しkます。
  • 1↓g←⍳⍴k:から1までの長さのリストを生成しk、に保存しgます。最初の要素をドロップし、を与え[2..len k]ます。
  • {... }¨:これらのそれぞれについてk、長さのそれぞれの一意の組み合わせのインデックスを取得します⍵。
    • z←,⍳⍵/⍴k:⍵長さのインデックスの2次元行列を取得しk、フラット化して、に格納しzます。
    • ∧/¨2>/¨:各インデックスの各座標について、Nth次元のすべての座標がth次元の座標よりも高いかどうかを確認しますN-1。
    • z/⍨:z上記が当てはまる要素から選択
  • ⊃,/g,:上記は1次元のベクトルでは機能しないgため、前に追加します。これで、すべての一意のインデックスのリスト(foreachのため)のリストのリストが作成されましたk。リストを連結して分離します(その結果、リストのリストが作成されます)。
  • {... }¨:可能な座標リストごとにk、の値の対応する組み合わせを検索し、高すぎる値を除外します。
    • a←k[⍵]:現在の組み合わせを調べて、にk保存しaます。
    • a/⍨⊃i≥+/a:(マナプール)aの最初のアイテムiがの要素の合計以上である場合にのみ選択しますa。
  • m←:のマナ制限を超えないすべての呪文の組み合わせを保存しmます。
  • m←m/⍨t=⌈/t←+/¨m:m合計が最も高価な組み合わせの合計と等しい組み合わせのみを選択し、m再度格納します。
  • m/⍨t=⌊/t←⊃∘⍴¨m:m最短の組み合わせの長さに等しい長さの組み合わせのみを選択します。
  • ↑∪:重複を削除し、マトリックスに変換します(各組み合わせを別々の行に表示するため)。

1
これは難解です!ウィザードに最適...
— マークトーマス

5

ルビー、 114 113文字

x,y=eval gets
(d=0..10).find{|r|d.find{|c|s=y.sort.combination(c).select{|s|s.reduce(:+)==x-r}.uniq
p s if s[0]}}

入力:ウィザードマナとスペルリストの2要素の配列。1行のJSONでフォーマットされています。

出力:1行のJSONとしてフォーマットされた、またはnilウィザードがスペルをキャストできない場合の、スペルリストの2D配列。

特に大好きx,y = eval getsです。とても危険で邪悪でありながら、とても強力でシンプルです。ゴルフに最適です。

どちらsortとuniqneccessaryです。それ以外の場合、これはなどの入力に対して重複を生成します[4, [1, 3, 1]]。私はこれに満足していません。

find制御フローの便利な方法です。ただし、ここでは戻り値はあまり役に立ちません。長さについては、と同等でありany?、戻り値の有用性はさらに低くなります。

例:

> [4, [1, 2, 3, 3, 7, 6]]
# [[1, 3]]
> [3, [1, 3, 5, 2, 10]]
# [[3]]
> [8, [4, 1, 9]]
# [[1, 4]]
> [4, [1, 2, 2, 3]]
# [[1, 3], [2, 2]]
> [4, [5, 6, 7]]
# nil

map代わりに使用できませんfindか?また、必要.reduce(:+)ありません&
— ドアノブ

map最初の肯定的な結果で止まらない。マナコストとサイズでグループ化されたすべての可能性を出力します。2番目のアドバイスをありがとう。
— John Dvorak

1

ハスケル(GHC)、172の167 143文字

import Data.List
import GHC.Exts
f(x:y)=head.groupWith length.last.groupWith sum.filter((<=x).sum).nub$subsequences y
main=interact$show.f.read

難読化解除:

import Data.List
import GHC.Exts

f (x:xs) = head
         . groupWith length
         . last
         . groupWith sum
         . filter ((<= x) . sum)
         . nub
         $ subsequences xs

main = interact (show . f . read)
  • 入力フォーマット:頭が利用可能なマナ、尾が利用可能なスペル(例:)で囲まれたリスト[4,1,2,3,3,7,6]。
  • 出力形式:リストの括弧で囲まれたリスト。各サブリストは1つの可能なスペルのセットを表します。

簡単な解決策:入力のパワーセットを取得し、十分なマナがある組み合わせをフィルタリングするなどして、それを減らします。


0

Mathematica 131

もっと短い方法があるはずですが、これは私が思いついたものです。

l=Length;
f[{a_,b_}]:=Select[t=Cases[s=SortBy[Union@Cases[Subsets[b],x_/;0<Tr@x<a+1:>{x,Tr@x}],Last],
{x_,s[[-1,2]]}:> x],l@#==l@t[[1]]&]

f[{4, {1, 2, 3, 7, 6}}]

{{1、3}}


f[{3, {1, 3, 5, 2, 10}}]

{{3}}


f[{8, {4, 1, 9}}]

{{4、1}}


f[{4, {1, 2, 2, 3}}]

{{1、3}、{2、2}}

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