Değişken Fiyatlar geliri!


16

Giriş ve kredi

Bir barmen olduğunuzu varsayın. Çoğu zaman barınızda birçok mutlu insan var, ama birçoğu sadece aynı içeceği ve zevkinize göre çok az içiyor ve bunu değiştirmek istiyorsunuz. Yani, bir içeceğin fiyatının değiştiği, zaten kaçının satıldığına bağlı olarak, ancak belirli eşiklerden daha fazla veya daha az pahalı olmadığı bir sistem sunuyorsunuz. Bazı garip nedenlerden dolayı her zaman satılan tüm içecekleri ve fiyatları uygun şekilde takip etmeyi unutursunuz ve bu nedenle tüketilen içecek miktarı verildiğinde sizin için matematik yapan kısa (= unutulmaz!) Bir kod parçası düşünmeniz gerekir.

Bu zorluk 2012 yılında ara sınavımda üniversitemdeki fonksiyonel programlama kursunda ortaya çıktı ve profesörümün buraya göndermesini sağladım. Sınavın dilinde örnek bir çözüm sağladık.

Giriş

Girişiniz boşluk içermeyen dizelerin bir listesi olacaktır - bunlar satılan içeceklerin adlarıdır. Girişi, tercih ettiğiniz genel kabul görmüş giriş yöntemini kullanarak alın .

Çıktı

Çıktınız tek bir sayı olacaktır - bu akşam elde ettiğiniz gelir budur. Tercih ettiğiniz genel kabul görmüş çıktı yöntemini kullanarak çıktıyı verin .

Ne yapalım?

Bu her içecek için ayrı ayrı geçerlidir:

  • Başlangıç ​​fiyatı 10.
  • İçki her satın alındığında, fiyatı bir sonraki alıcı için 1 oranında artırılır.
  • En yüksek fiyat 50'dir. Eğer içki 50 için satın alınmışsa, yeni fiyat tekrar 10 olacaktır.

Göreviniz, yukarıdaki kurallara göre verilen içeceklerin giriş listesi tarafından üretilen toplam geliri bulmaktır.


Merak ediyorsanız: "50 dolar içki için gerçekten çok pahalı!" kayan noktalı aritmetik.

Kim kazanır?

Bu , bu yüzden bayt içindeki en kısa kod kazanır! Standart kurallar geçerlidir.

Potansiyel Köşe Kılıfları

Giriş listesi boşsa, çıkış 0 olacaktır
. Giriş listesinin içeceğe göre sıralandığı varsayılmaz.

Örnekler

[] -> 0
["A"] -> 10
["A","B"] -> 20
["A","A","B"] -> 31
["A","B","A"] -> 31
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1240
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"] -> 1304 
["D","A","A","C","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"] -> 1304
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1304

1
Profesörünüzü yayınlamadan önce sorma sahne, oldukça OG hareket.
Sihirli Ahtapot Urn

Yanıtlar:


4

JavaScript (ES6), 50 bayt

a=>a.map(x=>t+=d[x]=d[x]<50?d[x]+1:10,t=0,d={})&&t

d[x]10'a nereden başladın ?
Titus

@Titus d[x]Ayarlanmamışsa undefined; Bu markaları d[x]<50yüzden return false d[x]=d[x]<50?d[x]+1:10setleri d[x]için 10.
ETHproductions

JS'nin olduğunu unutuyorum undefined. :)
Titus

4

Python 2, 79 74 54 48 Bayt

Sorunu yeniden düşünerek büyük bayt sayısı artar. Oyunculardan kurtulmak istiyorum intama beynim çalışmıyor . l.pop()Listeyi iki kez kesmekten ve bazı eski eski lambda yinelemelerinden kaçınmak için kullanın :)

f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0

Jonathan Allan'a 6 bayt kazandığı için teşekkürler :)

Eski 54 baytlık sürümümle gurur duydum :)

f=lambda l:int(l>[])and~-l.count(l[0])%41+10+f(l[1:])

...l>[]and 1*~...yapabileceğinizi bildiğiniz bu 3 baytı kaydetmek için.
Jonathan Allan

Aslında ile 1 daha az:f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
Jonathan Allan

Oooh ve diğer ikisi:f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Jonathan Allan

@JonathanAllan ipuçları için teşekkürler!
Yazımı

2

Pyth, 15 bayt

ssm<*lQ}T50/Qd{

Bir listenin girdisini alan ve sonucu basan bir program.

Test takımı (Çoklu girişe izin veren ilk satır)

Nasıl çalışır

ssm<*lQ}T50/Qd{   Program. Input: Q
ssm<*lQ}T50/Qd{Q  Implicit input fill
              {Q  Deduplicate Q
  m               Map over that with variable d:
       }T50        Yield [10, 11, 12, ..., 48, 49, 50]
    *lQ            Repeat len(Q) times
   <       /Qd     First Q.count(d) elements of that
 s                Flatten
s                 Sum
                  Implicitly print

2

Jöle , 14 11 10 bayt

50⁵rṁЀĠSS

TryItOnline!

Nasıl?

50⁵rṁЀĠSS - Main link: list of drink names                e.g. ['d', 'a', 'b', 'a', 'c']
       Ġ   - group indices by values                       e.g. [[2, 4], [3], [5], [1]]
  ⁵        - 10
50         - 50
   r       - inclusive range, i.e. [10, 11, 12, ..., 48, 49, 50]
    ṁЀ    - mould left (the range) like €ach of right(Ð)  e.g. [[10, 11], [10], [10], [10]]
                 note: moulding wraps, so 42 items becomes [10, 11, 12, ..., 48, 49, 50, 10]
        S  - sum (vectorises)                              e.g. [40, 11]
         S - sum                                           e.g. 51

2

05AB1E , 16 15 bayt

Bir bayt tasarrufu için Emigna'ya teşekkürler !

ÎÙv¹y¢L<41%T+OO

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


ÎÙv¹y¢L<41%T+OOkaydedilen 1 bayt için çalışmalıdır
Emigna

@Emigna Çok güzel! Teşekkürler :)
Adnan

1

Perl 41 Bayt

İçin +1 içerir -p

$\+=$H{$_}+=$H{$_}?$H{$_}>49?-40:1:10;}{

Yeni satırlarda girdi alır.

Artışlar bir karma değer ölçütü: 10 o eğer undef, -40o eğer > 49yani 50, ya 1başka türlü. Bu daha sonra $\çıktıları ayırıcıya eklenir -p.

Misal:

$ echo -e 'A\nB\nA' | perl -pe '$\+=$H{$_}+=$H{$_}?$H{$_}>49?-40:1:10;}{'
31

1

05AB1E , 13 bayt

{.¡€gL<41%T+O

açıklama

["A","B","A"] örnek olarak kullanılmıştır.

{               # sort input
                # STACK: ["A","A","B"]
 .¡             # split on different
                # STACK: [["A","A"],["B"]]
   €g           # length of each sublist
                # STACK: [2,1]
     L          # range [1 ... x] (vectorized)
                # STACK: [1,2,1]
      <         # decrease by 1
                # STACK: [0,1,0]
       41%      # mod 41
                # STACK: [0,1,0]
          T+    # add 10
                # STACK: [10,11,10]
            O   # sum
                # OUTPUT: 31

1

C ++ 14, 105 bayt

Genel adsız lambda referans parametresi ile döner. Bir kap için giriş gerektirir stringolduğu var push_backgibi,vector<string> .

%41+10Kade'nin Python cevabındaki numarayı kullanarak .

[](auto X,int&r){r=0;decltype(X)P;for(auto x:X){int d=0;for(auto p:P)d+=x==p;r+=d%41+10;P.push_back(x);}}

PZaten sunulanları bellek olarak boş bir kap oluşturur . Fiyat sayarak hesaplanır xin P.

Ungolfed ve kullanımı:

#include<iostream>
#include<vector>
#include<string>

using namespace std;

auto f=
[](auto X, int& r){
  r = 0;
  decltype(X) P;
  for (auto x:X){
    int d = 0;
    for (auto p:P)
      d += x==p;
    r += d % 41 + 10;
    P.push_back(x);
  }
}
;

int main(){
 int r;
 vector<string> V;
 f(V,r);cout << r << endl;
 V={"A"};
 f(V,r);cout << r << endl;
 V={"A","B"};
 f(V,r);cout << r << endl;
 V={"A","B","C"};
 f(V,r);cout << r << endl;
 V={"A","A"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"};
 f(V,r);cout << r << endl;
}

0

Mathematica, 64 bayt

Daha kısa olması gerektiğini düşünüyor.

Tr[(19+#)#/2&/@(Length/@Gather@#//.z_/;z>41:>Sequence[41,z-41])]&

Length/@Gather@#her içeceğin tekrarlarını sayar. //.z_/;z>41:>Sequence[41,z-41]bu sayıdaki z41'i aşan bir tamsayıyı fiyat düşüşünü yansıtacak şekilde 41ve içine böler z-41. Daha sonra sayıların her biri , en fazla 41 olduğu sürece içeceklerin (19+#)#/2toplam maliyeti olan formüle takılır. Son olarak, bu maliyetleri özetler.##Tr


0

k, 22 bayt

Argüman herhangi bir liste olabilir - dizeler, sayısallar vb.

{+/,/10+(#:'=x)#\:!41}

qÇeviri okumak daha kolaydır:

{sum raze 10+(count each group x)#\:til 41}

0

C #, 193 bayt + 33

Fazladan 33 bayt using System.Collections.Generic;

void m(string[]a){int t=0;Dictionary<string,int>v=new Dictionary<string,int>();foreach(string s in a){if(v.ContainsKey(s)){v[s]=v[s]==50?10:v[s]+1;}else{v.Add(s,10);}t+=v[s];}Console.WriteLine(t);}

Eminim bu unutulmaya golf edilebilir, Sözlükler kesinlikle bunu yapmanın en iyi yolu değildir ve muhtemelen benim içine bir üçlü çalışabilir. Bunun dışında bence sorun yok!

Örnekler:

a = {"A", "A", "A", "B", "B", "C"};
//output = 64

a = {"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A",, "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A" "A" ,"A", "A" ,"A", "B", "B", "C"};
//output 727

Ungolfed

void m(string[] a)
{
    int t=0;
    Dictionary<string,int> v = new Dictionary<string,int>();
    foreach(string s in a)
    {
        if(v.ContainsKey(s))
        {
            v[s]=v[s]==50?10:v[s]+1;
        }
        else
        {
            v.Add(s,10);
        }
        t+=v[s];
    }
    Console.Write(t);
}

0

Clojure, 79 bayt

#(apply +(mapcat(fn[l](for[i(range l)](+(mod i 41)10)))(vals(frequencies %)))))

İçeceklerin frekanslarını sayar, sonra taban fiyatı olarak hesaplar 10 + (i % 41). mapcatbunları birleştirir ve apply +toplamı hesaplar.


0

PHP, 47 bayt

while($k=$argv[++$i])$s+=10+$p[$k]++%41;echo$s;

komut satırı bağımsız değişkenlerinden girdi alır; ile çalıştırın -r.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.