İlk halka arz ihalesi

Aug 16 2020

Görüntü transkripsiyonu:

Bir şirket bir halka arz için kaydolur. Tüm hisseler, teklif penceresi adı verilen bir zaman dilimi boyunca teklif vermek için web sitesinde mevcuttur. İhale penceresinin sonunda, hangisi önce gelirse, tüm hisseler tahsis edilene kadar veya tüm teklif sahipleri teklif verdikleri hisseleri alana kadar, hangi teklif verene kaç adet mevcut hissenin gideceğine karar vermek için bir açık artırma mantığı kullanılır.

Teklifler, teklif penceresi kapanana kadar kullanıcılardan [kullanıcı kimliği, # hisse, teklif fiyatı, zaman damgası] şeklinde gelir.

Açık artırma mantığı, hisseleri şu şekilde atar:

  1. En yüksek fiyata sahip teklif veren, teklif ettiği hisse adedini alır

  2. Birden fazla teklif verenin aynı fiyattan teklif vermesi durumunda, teklif sahiplerine tekliflerini verdikleri sıraya göre hisse atanır (ilk teklifler önce)

Tüm hisseler tahsis edildikten sonra 1 pay bile almayan tüm kullanıcıların kullanıcı kimliklerini listeleyin.

Giriş


  • [kullanıcı kimliği, # paylaşım, $ teklif, zaman damgası] 'nı temsil eden giriş listelerinin teklifler listesi
  • totalShares dağıtılacak
    toplam hisse sayısı.

Yapmak

hisseleri teklif verenler arasında dağıtmak ve 0 hissesi olan teklif sahiplerinin kullanıcı kimliklerini iade etmek.

Dağıtım mantığını paylaşın:

  1. En yüksek teklife sahip teklif veren, teklif ettiği tüm hisseleri alır ve sonra
  2. $ teklif fiyatında bağlar varsa, hisseleri önceki teklif verene atayın.

Bulduğum çözümün nispeten basit olduğunu hissediyorum. Aklıma gelen tüm uç durumlardan geçiyor gibi görünüyor.

Soru

Şüpheli bir durum buldum:
Teklif fiyatı ve süreleri aynı ve tüm teklif verenler için yeterli hisse yok, yani: bidseşittir [[0,2,10,0], [1,2,10,0]]ve totalSharesöyle 2. Her birine 1 paylaşım verilmesi mi gerektiği yoksa userid 0'ın her ikisini birden mi alacağı belli değil.

Kod

Çözümüm yine de optimize edilebilir mi?

def getUnallocatesUsers(bids, totalShares):
  s = 0
  for b in bids:
      s += b[1]  
  if totalShares >= s: return []  # no losers because enough shares to go around

  bids.sort(key = lambda x: (-x[2],x[3]))  # sort by highest bid, then timestamp for ties
  losers = []
  for b in bids:
    if totalShares <= 0: losers.append(b[0])
    else:
      totalShares -= b[1]
  return losers

Yanıtlar

2 RootTwo Aug 18 2020 at 09:39

Problemde verilen fonksiyon adını kullanın:

def getUnallottedUsers(bids, totalShares):

Sorun, tüm teklif verenler için yeterli hisse bulunma olasılığı hakkında herhangi bir bilgi sağlamaz, bu nedenle IMO ilk döngü, erken optimizasyon örneğidir.

"Sihirli sayılar" yerine sabitler kullanın. Anlamlı isimler kullanın. Yaygın biçimlendirme kuralları hakkında PEP8'e bir göz atın. Bunlar, kodu okunabilir hale getirmede uzun bir yol kat ediyor.

USERID = 0
SHARES = 1
PRICE = 2
TIME = 3

bids.sort(key=lambda bid:(-bid[PRICE], bid[TIME]))

for index, bid in enumerate(bids):
    totalShares -= bid[SHARES]

    if totalShares <= 0:
        break

Sorulan soruyu yanıtlayın: "İşlev, her biri hiç hisse almayan teklif sahipleri için bir kimlik olan ve artan düzende sıralanmış bir tam sayılar listesi döndürmelidir. "

return sorted(bid[USERID] for bid in bids[index + 1:])

Hep birlikte:

USERID = 0
SHARES = 1
PRICE = 2
TIME = 3

def getUnallottedUsers(bids, totalShares):
    bids.sort(key=lambda bid:(-bid[PRICE], bid[TIME]))

    for index, bid in enumerate(bids):
        totalShares -= bid[SHARES]

        if totalShares <= 0:
            break

    return sorted(bid[USERID] for bid in bids[index + 1:])

Veya bir yineleyici kullanın:

    bids = iter(bids)
    while totalShares > 0:
        price = next(bid)[PRICE]
        totalShares -= price

    return sorted(bid[USERID] for bid in bids)