Wprowadzenie i zaliczenie
Załóżmy, że jesteś barmanem. W twoim barze jest wielu szczęśliwych ludzi, ale wielu z nich pije tylko ten sam napój i za mało dla twojego smaku i chcesz to zmienić. Wprowadzasz więc system, w którym cena napoju jest zmienna, w zależności od tego, ile już zostało sprzedanych, ale nigdy nie jest droższe niż pewne progi. Z jakiegoś dziwnego powodu zawsze zapominasz o właściwym śledzeniu wszystkich sprzedawanych napojów i cen, dlatego musisz pomyśleć o krótkim (= niezapomnianym!) Fragmencie kodu, który robi matematykę dla ciebie biorąc pod uwagę ilość wypitych napojów.
Wyzwanie to pojawiło się już podczas egzaminu śródokresowego w 2012 r. Na kursie programowania funkcjonalnego na moim uniwersytecie i mam zgodę profesora na opublikowanie go tutaj. Dostaliśmy przykładowe rozwiązanie w języku egzaminu.
Wejście
Twój wkład to lista ciągów znaków, które nie zawierają spacji - są to nazwy sprzedawanych napojów. Wprowadź dane wejściowe, używając preferowanej, ogólnie akceptowanej metody wprowadzania danych.
Wynik
Twój wynik będzie pojedynczą liczbą - to przychód, który wygenerowałeś dziś wieczorem. Podaj dane wyjściowe przy użyciu preferowanej, ogólnie akceptowanej metody wydruku.
Co robić?
Dotyczy to każdego drinka z osobna:
- Cena wywoławcza wynosi 10.
- Za każdym razem, gdy napój jest kupowany, jego cena jest podwyższana o 1 dla następnego nabywcy.
- Maksymalna cena to 50. Jeśli napój został kupiony za 50, nowa cena ponownie wyniesie 10.
Twoim zadaniem jest znaleźć całkowity dochód wygenerowany przez listę wejściową napojów przy powyższych zasadach.
Jeśli zastanawiasz się: „50 dolców jest naprawdę cholernie drogie za drinka!”, To 50 dolców za decy, więc 50 * 0,1 * Jednostka, ale zdecydowałem się na 10-50, aby nie wykluczać języków bez arytmetyka zmiennoprzecinkowa.
Kto wygrywa?
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach! Obowiązują standardowe zasady.
Potencjalne narożne skrzynki
Jeżeli lista wejściowa jest pusta, wartość wyjściowa powinna wynosić 0.
Nie można zakładać, że lista wejściowa jest posortowana według napoju.
Przykłady
[] -> 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
Odpowiedzi:
JavaScript (ES6), 50 bajtów
źródło
d[x]
do 10?d[x]
nie został ustawiony, jestundefined
; powoduje to, żed[x]<50
return jest fałszywy, więcd[x]=d[x]<50?d[x]+1:10
ustawia sięd[x]
na10
.undefined
. :)Python 2,
79745448 bajtówOgromny wzrost liczby bajtów poprzez ponowne przemyślenie problemu.
Chciałbym się pozbyć. Korzystając z,int
obsady, ale mój mózg nie działal.pop()
aby uniknąć dwukrotnego przycinania listy i dobrej starej rekurencji lambda :)dzięki Jonathanowi Allanowi za uratowanie 6 bajtów :)
Moja stara 54-bajtowa wersja, z której byłem dość dumny :)
źródło
...l>[]and 1*~...
aby zapisać te 3 bajty, o których wiedziałeś, że możesz.f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Pyth, 15 bajtów
Program, który pobiera dane z listy i drukuje wynik.
Zestaw testowy (pierwszy wiersz umożliwiający wielokrotne wprowadzanie danych)
Jak to działa
źródło
Galaretka ,
14 1110 bajtówTryItOnline!
W jaki sposób?
źródło
05AB1E ,
1615 bajtówDzięki Emignie za uratowanie bajtu!
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
ÎÙv¹y¢L<41%T+OO
powinien działać na zapisany 1 bajtPerl 41 bajtów
Obejmuje +1 dla
-p
Bierze wkład w nowe linie.
Zwiększa wartość skrótu o:
10
jeśli jestundef
,-40
jeśli jest> 49
tj.50
Lub w1
inny sposób. To jest następnie dodawane do$\
separatora wyjściowego, który-p
drukuje.Przykład:
źródło
05AB1E , 13 bajtów
Wyjaśnienie
["A","B","A"]
użyty jako przykład.źródło
C ++ 14, 105 bajtów
Jako ogólna nienazwana lambda powracająca poprzez parametr referencyjny. Wymaga, aby dane wejściowe były kontenerem
string
tegopush_back
typuvector<string>
.Używając
%41+10
sztuczki z odpowiedzi Kade'a na Python .Tworzy pusty pojemnik
P
jako pamięć, która została już obsłużona. Cena jest obliczana poprzez zliczeniex
wP
.Niegolfowane i użytkowanie:
źródło
Mathematica, 64 bajty
Wydaje się, że powinien być krótszy.
Length/@Gather@#
liczy powtórzenia każdego napoju.//.z_/;z>41:>Sequence[41,z-41]
dzieli dowolną liczbę całkowitąz
przekraczającą 41 w tym na41
iz-41
, aby odzwierciedlić spadek ceny. Następnie każdy z liczników jest podłączany do formuły(19+#)#/2
, która jest całkowitym kosztem#
napojów tak długo, jak#
najwyżej 41. Wreszcie,Tr
podsumowuje te koszty.źródło
k, 22 bajtów
Argumentem może być dowolna lista - ciągi, cyfry itp.
q
Tłumaczenie jest łatwiejsze do odczytania:źródło
C #, 193 bajtów + 33
Dodatkowe 33 bajty dla
using System.Collections.Generic;
Jestem pewien, że można to pograć w zapomnienie, Słowniki zdecydowanie nie są najlepszym sposobem na zrobienie tego i prawdopodobnie mógłbym wprowadzić trójkę do mojego if. Poza tym myślę, że jest w porządku!
Przykłady:
Nie golfił
źródło
Clojure, 79 bajtów
Liczy częstotliwości napojów, a następnie oblicza cenę podstawową jako
10 + (i % 41)
.mapcat
łączy je iapply +
oblicza sumę.źródło
PHP, 47 bajtów
pobiera dane wejściowe z argumentów wiersza poleceń; biegać z
-r
.źródło