変動価格収入!


16

紹介とクレジット

あなたがバーテンダーだと仮定します。ほとんどの場合、バーには多くの幸せな人がいますが、多くの人は同じ飲み物を飲むだけで、あなたの好みには少なすぎて、それを変えたいと思っています。そこで、すでに販売された数に応じて飲み物の価格が可変であるシステムを導入しますが、特定のしきい値を超えることはありません。何らかの奇妙な理由で、販売されたすべての飲み物と価格の適切な追跡を常に忘れているため、消費された飲み物の量を計算するための短い(=記憶に残る)コードを考える必要があります。

この課題は、2012年に大学の関数型プログラミングコースで行われた中間試験にすでに現れており、教授にここに投稿しても大丈夫です。試験の言語でのソリューション例が提供されています。

入力

入力は、スペースを含まない文字列のリストになります-これらは販売された飲み物の名前です。一般的に受け入れられている好みの入力方法を使用して入力を行います

出力

あなたの出力は単一の数字になります-これは今晩あなたが生み出した収入です。一般的に受け入れられている好みの出力方法を使用して出力を行います

何をすべきか?

これは各飲み物に個別に適用されます:

  • 開始価格は10です。
  • 飲み物を購入するたびに、次の購入者の価格が1ずつ上がります。
  • 最高価格は50です。飲み物が50で購入された場合、新しい価格は再び10になります。

あなたの仕事は、上記のルールが与えられた飲み物の入力リストによって生成された全体的な収入を見つけることです。


あなたが疑問に思っている場合:「50ドルは飲み物には本当に高価です!」、これは50デシのバックなので、50 * 0.1 *単位ですが、言語を除外しないために10-50に行くことを選択しました浮動小数点演算。

誰が勝ちますか?

これはなので、バイト単位の最短コードが勝ちです!標準ルールが適用されます。

潜在的なコーナーケース

入力リストが空の場合、出力は0になります。
。入力リストは、飲み物でソートされるとは想定できません。

[] -> 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
投稿する前にあなたの教授に尋ねる小道具、かなりOGの動き。
魔法のタコUr

回答:


4

JavaScript(ES6)、50バイト

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

どこでd[x]10に初期化しますか?
タイタス

@Titus d[x]設定されていない場合、undefined; これによりd[x]<50false が返されるため、にd[x]=d[x]<50?d[x]+1:10設定さd[x]10ます。
ETHproductions 16

JSが持っていることを忘れてしまいましたundefined。:)
タイタス

4

Python 2、79 74 54 48バイト

問題を再考することにより、大量のバイトカウントが増加します。キャストを取り除きたいのですintが、私の脳は働いていませんl.pop()リストの2回のトリミングと古き良きラムダ再帰を避けるために利用:)

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

6バイトを節約してくれたJonathan Allanに感謝します:)

私の古い54バイトバージョンは、私が非常に誇りに思っていました:)

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

...l>[]and 1*~...知っていた3バイトを保存します。
ジョナサンアラン

実際には以下で1つ少ない:f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
ジョナサンアラン

Ooohと別の2人:f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
ジョナサンアラン

@JonathanAllanのヒントをありがとう!すぐに投稿を更新します:)
Kade

2

Pyth、15バイト

ssm<*lQ}T50/Qd{

リストの入力を受け取り、結果を出力するプログラム。

テストスイート(複数行の入力を許可する最初の行)

使い方

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

ゼリー 14 11 10 バイト

50⁵rṁЀĠSS

TryItOnline!

どうやって?

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


1

Perl 41バイト

+1を含む -p

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

改行で入力を受け取ります。

インクリメントハッシュ値を:10 それはだ場合undef-40それはだ場合> 49、すなわち50、または1それ以外の場合は。これは$\、出力セパレーターに追加され、出力され-pます。

例:

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

1

05AB1E、13バイト

{.¡€gL<41%T+O

説明

["A","B","A"] 例として使用。

{               # 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バイト

参照パラメーター経由で返される一般的な名前のないラムダとして。入力のコンテナされている必要がstringあり、そのpush_backような、vector<string>

%41+10KadeのPython answerのトリックを使用します

[](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);}}

P既に提供されているものとして、空のコンテナをメモリとして作成します。価格は、xinをカウントして計算されますP

ゴルフをしないと使用法:

#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バイト

短くする必要があるように感じます。

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

Length/@Gather@#各飲み物の繰り返しをカウントします。//.z_/;z>41:>Sequence[41,z-41]任意の整数分割zには、この中に41を超えるを41し、z-41価格下落を反映して、。次に、各カウントは、最大41である限り(19+#)#/2#飲み物の合計コストである式にプラグインされます。#最後に、Trそれらのコストを合計します。


0

k、22バイト

引数には、文字列、数値などの任意のリストを指定できます。

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

q翻訳は読みやすいです。

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

0

C#、193バイト+ 33

追加の33バイト 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);}

私はこれを忘れることができると確信しています。辞書は間違いなくこれを行うための最良の方法ではなく、おそらくifに3進法を組み込むことができます。それ以外は大丈夫だと思います!

例:

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

非ゴルフ

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バイト

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

飲み物の頻度をカウントし、基本価格をとして計算し10 + (i % 41)ます。mapcatそれらを連結しapply +、合計を計算します。


0

PHP、47バイト

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

コマンドライン引数から入力を受け取ります。で実行し-rます。

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