おもちゃ屋の利益


15

物語

「2016?Al..right」と、おもちゃの売り手ヒルベルトはつぶやいた。彼は目を開け、サラダドレッシングを耳から少しずつ拭き取り​​、朝のキックスタートクリームニットを食べました。例の休日。しかし、彼は今すぐ仕事に行き、その年の会計を終える必要があります。

クリスマスは、特に彼の販売にとって、一年で非常に収穫の多い時期です。ヒルベルトは、それがどのように機能するかを正確に知っています。人が店に来て、提供された最初の贈り物を買います。彼らはそれを支払い、別の店に逃げます。実際には、ギフトが実際に何であるかは、実際には違いを生みません。高すぎない限り、価格も無関係です。それはすべて、クリスマスまでの残り時間に依存します。時間が短ければ短いほど、顧客の後悔は大きくなり、顧客が喜んで支払う価格が大きくなります。

ヒルベルトに必要なのは時計を見ることだけで、顧客はどれだけのお金を使うことができるかすぐにわかります。彼はこの事実を簡単に活用できます。彼は、特定の顧客に販売できる最も高価なギフトを見つけて、それを顧客に提供するだけです。彼は昨年、このcな戦略を採用するのを忘れたことに気付いたのです。しかし、それは変わるでしょう!

それにもかかわらず、ヒルベルトは、実際に彼の壮大な計画を使用していた場合、彼のビジネスがどれほど繁栄していたかを知りたいと思っています。彼は彼の店に来た人々のリストをまとめることができましたが、彼が彼らにどれだけのお金を稼ぐことができたかはわかりません。

あなたのタスク(TL; DR)

入力は、利用可能なギフトの価格の昇順リスト、および顧客の予算のリストで構成されます。予算のリストは、顧客がショップに到着したときと同じ順序で、すべての顧客が少なくとも前の予算と同額を支払うという条件で、昇順でもあります。

顧客ごとに、彼らが支払いたいと思う最も高価な贈り物を見つけ、その価格を出力します。予算内でギフトが利用できない場合は、を出力し0ます。

-40%アルゴリズムの漸近的な時間の複雑さがO(n+m)(些細ではなくO(n*m))である場合、文字ボーナスが得られます。入力リストの長さはどこにn, mありますか。

これは、最短バイトが勝ちます。標準的な抜け穴は禁止されています。

入力:

1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22

出力:

1 0 2 2 5 2 10 20 7 0

このタスクは地元のプログラミング競技会から取られ、私が英語に翻訳しました。元の割り当ては次のとおりです。https//www.ksp.sk/ulohy/zadania/1131/


9
ボーナスはチャレンジを書くときに避けるべきものの1つです。しかし、ここでは大丈夫かもしれません。維持したい場合は、パーセントベースのボーナスに変更することをお勧めします。20文字のボーナスはJavaの提出には何の意味もありませんが、ゴルフ言語のソリューションでは基本的に必須です。
デンカー

バックストーリーだけでOPに賞金を授与できますか?正直なところ、それは私を笑顔にしました。すべての課題にはそれらのいずれかが必要です。

@tacありがとう。しかし、下部の小さなテキストに記されているように、私は実際にバックストーリーを作りませんでした-私はそれを翻訳しただけです。
sammko

@sammkoはい、私はそれを見ましたが、私の上記のコメントはまだ保持されます:)
cat

回答:


5

Pyth、17 16バイト

Pietu1998のおかげで1バイト

VE=.-Q]
e|fgNTQ0

デモンストレーション

説明:

VE=.-Q]<\n>e|fgNTQ0
                        Implicit: Q is the list of prices.
VE                      For N in the list of budgets
             f   Q      Filter the list of prices
              gNT       On the current person's budget being >= that price
            |     0     If there aren't any, use 0 instead.
          e             Take the last (most expensive) value.
      <\n>              Print it out.
  =.-Q                  Remove it from the list of prices.

VE=.-Q]\ nで1バイト節約できると思いますe|fgNTQ0。基本的に同じことですが、ループがあります。
-PurkkaKoodari

4

Haskell、67バイト

a#(b:c)|(h,t)<-span(<=b)a=last(0:h):(init(h++[0|h==[]])++t)#c
_#x=x

使用例:[1,2,2,2,5,7,10,20] # [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0]

価格を2つの部分に分割します。(h,t)ここでh、すべての価格<=は次の顧客の予算でありt、その他はすべてです。最後の価格を取り、最後hhプラスtと残りの予算を除くすべてで再帰的に続行します。空の場合にlast(0:h)評価されます。同様:ダミー要素をif が空の場合に追加するため、ドロップするものがあります(空のリストで失敗します)。0hinit (h++[0|h==[]]) ++ t0hhinitinit


3

Java、154 * 0.6 = 92.4バイト

-13バイトは、ラムダが実際に使用できるためint[]、ではありませんInteger[]BunjiquoBiancoに感謝)

これにはO(n + m)時間とO(n + m)の追加スペースが必要です(大きなO表記法を理解していると仮定)

g->b->{int l=g.length,L=b.length,G=0,B=0,A=0;int[]a=new int[l],s=new int[L];for(;B<L;){while(G<l&&g[G]<=b[B])a[A++]=g[G++];s[B++]=A>0?a[--A]:0;}return s;}

インデント:(オンラインで試してみてください!

static int[] toyStore(int[]g,int[]b) {
    int gl=g.length,bl=b.length,gp=0,bp=0,ap=0;
    int[] a=new int[gl],s=new int[bl];
    for (;bp<bl;) {
        while(gp<gl&&g[gp]<=b[bp])a[ap++]=g[gp++];
        s[bp++]=ap>0?a[--ap]:0;
    }
    return s;
}

public static void main(String[] args)
{
    System.out.println(Arrays.toString(
        toyStore(new int[] {1,2,2,2,5,7,10,20},
                 new int[] {1,1,2,3,6,6,15,21,21,22})
        ));
}

ここでは、型宣言がよりクリーンであり、まったく同じロジックであるため、非ラムダ展開を示します。ラムダは、ideoneリンクに存在します。

説明:

使用される変数:

  • gはギフト価格bのリスト、予算のリストです。
  • glはの長さでgblはの長さですb
  • a手頃な価格のギフト用のスタックでsあり、販売されたギフトの出力配列です。
  • gpbp、およびapのためのポインタであるgbaそれぞれ。bpはのポインタでもありますs

アルゴリズム:

  • 予算の長さの各予算について
    • この予算でギフトを購入できますが g[gp]
      • 予算をスタックにプッシュしてa増分するgp
    • 存在する場合はトップをaにポップし、s[bp]存在しない場合はをポップします0

ラムダをカレーできませんか?(つまり(g,b)->g->b->
ASCIIのみ

@somebody、はい。何らかの理由で、以前は機能していませんでしたが、今では機能します。0.o(あなたはボーナス後に0.6バイトを救った。)
CAD97

入力がlong []であると想定される場合は、longsを使用していくつかのバイトを節約できます(158バイトになります)-ideone.com/invHlc
BunjiquoBianco

1
実際、@ BunjiquoBiancoはint []を使用できます。何らかの理由で、型引数は参照型(したがってのような値型のプリミティブではない)を取るため、参照型intの配列を使用する必要があるという印象を受けました。しかし、intの配列をうまく使用できます。機会があれば更新します。
CAD97

@ CAD97ハ!...私はそのリンクをしなかったと信じてすることはできません
BunjiquoBianco

2

Haskell、87 * 0.6 = 52.2バイト

g s(p:q)d@(b:c)|p<=b=g(p:s)q d
g[]p(b:c)=0:g[]p c
g(s:t)p(b:c)=s:g t p c
g _ _ _=[]
g[]

私はボーナスに行くので、他の答えとはまったく異なります。

最後の行(-> g[])は定義の一部ではありませんが、呼び出しのオーバーヘッドです。使用例:g [] [1,2,2,2,5,7,10,20] [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0]

基本的に@ CAD97の回答と同じように機能します。つまり、(最初は空の)ヘルパースタックを使用して、購入可能なアイテムを追跡します。詳細:チェックイン順:

  • 最初の価格が最初の予算以下の場合、価格をスタックに移動します。もう一度電話してください。
  • スタックが空の場合、0を返し、続いて予算を落とした再帰呼び出しを返します。
  • スタックとバジェットリストの両方が空でない場合、スタックのトップを返し、スタックとバジェットがポップされた再帰呼び出しが続きます。
  • それ以外の場合は、空のリストを返します。

これは、m+na)ヘルパースタックでの操作が一定の時間を使用し、b)各再帰呼び出しでリストの1つが1つの要素で短縮されるため、時間内に機能します。


2

ゼリー、15 バイト

ṀṄ;©®œ^
Rf@€ç/Ṁ

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

使い方

ṀṄ;©®œ^  Helper link. Arguments: G, H (lists of affordable gifts)

Ṁ        Compute the maximum of G (0 if the list is empty).
 Ṅ       Print it.
  ; ®    Concatenate it with the register (initially 0).
   ©     Save the result in the register.
     œ^  Compute the multiset symmetric difference of the updated register and H.

Rf@€ç/Ṁ  Main link. Arguments: B (budgets), P (prices)

R        Range; replace each t in B with [1, ..., t].
 f@€     Intersect the list of prices with each budget range, obtaining, for each
         customer, the list of all gifts he's willing to pay for.
    ç/   Reduce the array of lists by the helper link.
         In each iteration, this computes and prints the most expensive gift for
         a customer, than removes the selected gift (and all previously
         selected gifts) from the next list.
      Ṁ  Compute the maximum of the resulting list, which corresponds to the last
         customer.

1

JavaScript、85 * 0.6 = 51バイト

f=(a,b,s=[],[t,...u]=a,[v,...w]=b)=>v?t<=v?f(u,b,[...s,t]):[s.pop()|0,...f(a),w,s)]:[]

@ CAD97の答えの別のクローン。

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