Ви можете впоратися з пабом?


23

Фон

Пізно в п’ятницю вдень, і ви та ваші друзі вирішите потрапити в паб пізніше того вечора, але перед тим, як заходити в паб, ви вважаєте, що вам слід випити кілька напоїв. Однак речі швидко ескалірують; ваш друг Shaddock Pamplemousse виграв лотерею на початку цього тижня і вирішив принести ящики на ящики з різними напоями. Безпека в пабі дуже сувора, і якщо ви надмірно споживаєте, перш ніж намагатися зайти до приміщення, вас не пускають всередину. Хоча ви всі програмісти - так ви вважаєте, що все одно вийде чудовим.

Виклик

Вам потрібно запрограмувати лічильник алкоголю, який виводить правду / хибність, якщо ви вище / нижче розумної межі пабу. Перш ніж спуститися в паб, ви вводите кількість та тип напою, який ви спожили протягом вечора, на stdinякий читається ваша програма вимірювання. Якщо він випускає правду, ви знаходитесь вище межі паба і залишаєтесь вдома. Якщо це виходить помилково, вам добре піти.

Вхідні дані

На одне ціле число більше, ніж 0відображається ваша маса тіла в кілограмах, а за ним новий рядок. Після цього введення подається серія з однозначної кількості та напоїв у такій формі:

<amount><amount type>o<beverage type>

Для однієї пляшки пива це буде виглядати так:

1Bob

Кожен вхід відокремлений пробілом.

Специфікація вводу

Кожен напій має одиницю, яка відповідає впливу, спричиненому ним. Якщо ви споживаєте більше одиниць, ніж ваша вага, розділену на дві, паб уже не є варіантом.

(Це може чи не може відображати реальність)

Нижче наведені дійсні напої та відповідні алкогольні одиниці напою:

  • Пиво: b, 1блок

  • Енергетичний напій: e, 0одиниці

  • Гострий соус: h, 2одиниці (сильний матеріал)

  • Сік (з органічних фруктів і т.д.): j, 0блоки

  • Ром: r, 6одиниці

  • Текіла: t, 7одиниці

  • Горілка: v, 6одиниці

  • Вино: w, 3одиниці

Існують різні типи суми:

  • Пляшка: B

  • Ящик: C

  • Скло: G

  • Кег: K

  • Ковток: S

Кожен тип кількості має множник, який примножує алкогольні одиниці напою, що міститься в ньому:

  • Пляшка: 3

  • Ящик: 25

  • Скло: 2

  • Кег: 50

  • Ковток: 0.2

Вихідні дані

Ваша програма повинна вихід truthy / falsy в stdoutразі , якщо кількість споживаного вище / нижче вага тіла ділиться на 2. Якщо кількість споживаного одно ваша вага , поділений на 2, то вивести falsy.

Зразки можливого введення та виведення

Вхідні дані

70
1Bob 3Soj

Вихідні дані

False

Вхідні дані

2
1Cov

Вихідні дані

1

Вхідні дані

50
1Cob

Вихідні дані

0

Вхідні дані

100
4Gow 1Koe 1Bov 1Gow 2Sot

Вихідні дані

True

Виграє найкоротша програма в байтах!


1
1. Здається, що oце символ формату, хоча ви цього конкретно не говорили. Ви повинні уточнити це (як це oтакож стосується оливкової олії.) 2. Що ми отримуємо, якщо ми точно на межі? чи це не має значення?
Рівень р. Св.

1
Хороший дзвінок; Я це зовсім пропустив. Я видаляю оливкову олію (хто це все-таки п'є?) Нижче або рівне межі повинно бути помилковим. Я додам це.
підміта

1
Чи буде колись більше однієї цифри напою? Наприклад 43Gow,?
Морган Трапп

6
+1 хороше запитання, але в п'ятницю вдень, і мені потрібно вийти на пиво. Можливо, понеділок :)
MickyT

1
Я призначав, що це дійсно будь-яка сума - крім негативних сум. Я не думав, що це вийде як неоднозначне. Я розумію, що якщо я це зміню, це визнає недійсною вашу відповідь, і це не так, як ми робимо справи. Сума буде уточнена як одна цифра.
підміта

Відповіді:


4

CJam, 53 байти

6:B50:C2*:K4:G.4:S];q"behjrtvwo ""10206763*"er~*]:-U<

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

6:B          e# Push 6 and save it in B.
50:C         e# Push 50 and save it in C.
2*:K         e# Multiply by 2 to push 100 and save it in K.
4:G          e# Push 4 and save it in G.
.4:S         e# Push 0.4 and save it in S.
             e#
             e# The letters representing the types will now push its doubled
             e# (to avoid diving the weight by 2) associated multiplier.
];           e# Clear the stack.
q            e# Read all input.
"behjrtvwo " e# Push the string of beverages, concatenated with "o ".
"10206763*"  e# Push the string of associated units of alcohol and '*'.
er           e# Transliterate. This replaces each beverage letter with the
             e# associated units of alcohol, and each 'o' and ' ' with '*'.
             e#
             e# For example, the input
             e# 70
             e# 1Bob 3Soj
             e# is transformed into
             e# 70
             e# 1B*1*3S*0
             e#
~            e# Evaluate the resulting string.
             e#
             e# For the example this does the following:
             e#   + Push 70.
             e#   + Push 1, push 6, multiply, push 1, multiply.
             e#   + Push 3, push 0.4, multiply, push 0.
             e#
*            e# Multiply the last two (for the lack of a trailing space).
]            e# Collect all results in an array.
:-           e# Reduce by subtraction; subtract all other elements from the
             e# first element (body weight).
U<           e# Compare the result with 0.

8

Пітон 3, 131

Тепер ми гольфуємо зі зміями!

Збережено 18 байт завдяки шебангу.
Збережено ще 4 байти завдяки DSM.
Збережено багато байтів завдяки tzaman.

Велика подяка tzaman за його блискучий трюк зловживання .find()поверненням, -1якщо він не знаходить цінності.

В даний час це передбачає, що цей формат напою є саме таким, яким він заявлений у виклику, наприклад, лише 1 цифра коштує кожен напій.

w=input()
print(sum([6,50,4,100,.4]['BCGKS'.find(b)]*int(a)*int('1267730'['bhrtvw'.find(v)])for a,b,_,v in input().split())>int(w))

Я думаю, що це може бути добре, якщо ви відмовитеся від диктів і зробите все, що стосується друкованої заяви. Отже, видаліть mі замініть m[p[-1]]біт на [3,25,2,50,.2]['BCGKS'.find(p[-1])], і те саме з d. Я змінився до вашого 168 із тими змінами у вашому коді.
Каде

4

Мінколанг 0,11 , 59 байт

126763355*25l*2l$:"SKGCBwvtrhb"m(0pI)n(no0qoxo0q**2*-$I)`N.

Спробуйте тут.

Пояснення

126763355*25l*2l$:    Pushes the values of the characters
"SKGCBwvtrhb"         Pushes the characters themselves
m                     Merge; interleaves the first and second halves of the stack
(                     Open while loop
 0p                   Put character's value in character's place in the codebox
   I)                 Close while loop when stack is empty
n                     Read in integer (weight)
(                     Open while loop
 n                    Read in integer, ignoring any non-numeric characters
  o0q                 Read in character and get its value from the codebox
     ox               Read in character and dump it
       o0q            Read in character and get its value from the codebox
          **          Multiply the three numbers together
            2*-       Multiply by 2 and subtract from weight
               $I)    Close while loop when input is empty
`                     1 if less than 0, 0 otherwise
 N.                   Output as integer and stop.

Я думаю, що CJam застаріває ... Мені потрібно закінчити мову
anOKsquirrel

@anOKsquirrel: А точніше, ви просто не пограли в нього достатньо. :)
El'endia Starman

А точніше, обидва. : P
anOKsquirrel

Ні, насправді мені просто погано: p
anOKsquirrel

3

CJam, 54 байти

ldlS/{A,s"CbretjvwSBK"+f#A,[25X6T7T6Z.2Z50Y]+f=:*-}/0<

Трохи химерно і, ймовірно, неоптимально, але я думаю, що це працює нормально. Спробуйте в Інтернеті .

Пояснення

ld             Read first line, convert to double
lS/            Read second line, split by space
{...}/         For each item in the second line...
  A,s"..."+f#    Get index in "0123456789CbretjvwSBK", or -1 if not found
  A,[...]+f=     Index into [0 1 2 3 4 5 6 7 8 9 25 1 6 0 7 0 6 3 0.2 3 50 2]
  :*             Take product
  -              Subtract from weight
0<             Check if < 0

Зауважте, що числовий масив має в кінці 2, що означає Gho, що відсутні в першому рядку, відображаються на 2.



2

VBA, 251 байт

Function k(x) As Boolean:q=Split(x):g="b1e0h2j0r6t7v6w3":h="B03C25G02K50S.2":For i=1 To UBound(q):j=j+Left(q(i),Len(q(i))-3)*Mid(h,InStr(h,Mid(Right(q(i),3),1,1))+1,2)*Mid(g,InStr(g,Mid(Right(q(i),3),3,1))+1,1):Next i:If q(0)/2<j Then k=1
End Function

Якщо використовувати :Newline, то це не робить його коротшим, але він виглядає більш гофрованим!

Читальний формат

Function b(x) As Boolean
q = Split(x)
g = "b1e0h2j0r6t7v6w3"
h = "B03C25G02K50S.2"
For i = 1 To UBound(q)
j = j + Left(q(i), Len(q(i)) - 3) * _          'Left most digits would be the Quantity
Mid(h, InStr(h, Mid(Right(q(i), 3), 1, 1)) + 1, 2) * _  'Find the Container value in h
Mid(g, InStr(g, Mid(Right(q(i), 3), 3, 1)) + 1, 1)      'Find the Drink value in g
Next i
If q(0) / 2 < j Then b = 1 'Checks if Drunk or not
End Function

Досить впевнений, що це можна пограти в гольф. мій String Manipulation з Mid(Right())видається надмірно багатослівним, але все ж працює масивStrReverse робить його довшим. Якщо ми припускаємо, що ви запиваєте лише 0-9 будь-якого конкретного напою, ми можемо заощадити кілька байтів

Візьміть введення як один рядок з вагою, розділеною пробілом, оскільки VBAдоза не підтримує багаторядкове введення


2

Рубін, 153 байти

Мені потрібно якось позбутися гсубів

w=gets.to_i;$><<(eval(gets.chars{|c|c[/[0-9]/]!=p ? ($_[c]+='*'):0}.tr('behjrtvwo BG','10206763*+32').gsub('C','25').gsub('K','50').gsub('S','0.2'))>w/2)

2

JavaScript, 131 134 139 байт

Це повна програма і в основному адаптація моєї відповіді PHP :

for(c=prompt,b=c(a=c(s=i=0));b[i];i+=2)s+=b[i++]*{B:3,C:25,G:2,K:50,S:.2}[b[i++]]*{b:1,h:2,r:6,t:7,v:6,w:3}[b[++i]]||0;alert(s>a/2)

Він читає два значення, використовуючи promptі alerts результат як [true|false].


Правки

  • Збережено 5 байт , використовуючи логічний вираз ||0замість декларування напоїв 0одиницями. Завдяки користувачеві81655 .
  • Збережено 3 байти , зберігаючи promptзмінну та скорочуючи ініціалізацію. Завдяки Стефнотчу .

1
Ви можете зберегти 6 байт, змінивши ,e:0,j:0}[b[++i]]на }[b[++i]]|0.
користувач81655

@ user81655 Вчора я думав, як позбутися цих 0значень. Ну, я про це не думав. Довелося використовувати ||замість бітового оператора. Ще на 5 байт менше. Спасибі.
insertusernamehere

Без проблем. Я забув про можливі не цілі значення.
користувач81655

1
for(s=i=0,a=prompt(),b=prompt();можна змінити на:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch

1
@Stefnotch Це розумно. Мені це подобається. Дякуємо, що зберегли 3 байти.
insertusernameту

1

bash (+ bc + GNU sed), 200 196 194 байт

read x
read y
y="$(sed 's/^/((/;s/$/))/;s/ /)+(/g;s/o/*/g;s/b/1/g;s/[ej]/0/g;s/h/2/g;s/[rv]/6/g;s/w/3/g;s/t/7/g;s/B/*3/g;s/C/*25/g;s/G/*2/g;s/K/*50/g;s/S/*0.2/g'<<<"$y")"
echo "$y>$x/2"|bc -l

1

Javascript, 159 байт

function b(t){return a={B:3,C:25,G:2,K:50,S:.2,b:1,h:2,w:3,r:6,v:6,t:7},t.split(/\W/).reduceRight(function(t,n,r){return r?n[0]*a[n[1]]*a[n[3]]+t||t:t>n/2},0)}

Оскільки Javascript вимагає бібліотеки для доступу до STDIN, цей код є лише функцією, яка приймає всю вхідність, тобто b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")


1
Як примітка: prompt()зазвичай приймається в якості дійсної альтернативи STDINв JavaScript .
вставитикористувач туди

1
Ви можете заощадити 30 байт , перейшовши ES6 і з допомогою стрілки-оператора: b=t=>(a={B:3,C:25,G:2,K:50,S:.2,b:1,h:2,w:3,r:6,v:6,t:7},t.split(/\W/).reduceRight((t,n,r)=>r?n[0]*a[n[1]]*a[n[3]]+t||t:t>n/2,0)).
Вставтекористування

1

Python 3, 157 байт

n,l,d,u=int(input()),input(),"behjrtvwBCGKS",[1,0,2,0,6,7,6,3,3,25,2,50,.2]
print(sum(map(lambda x:int(x[0])*u[d.find(x[1])]*u[d.find(x[3])],l.split()))>n/2)

1

PHP, 163 169 байт

for($a=fgets(STDIN),$b=fgets(STDIN),$v=[b=>1,h=>2,r=>6,t=>7,v=>6,w=>3,B=>3,C=>25,G=>2,K=>50,S=>.2];$b[$i];$i+=2)$s+=$b[$i++]*$v[$b[$i++]]*$v[$b[++$i]];echo$s>$a/2;

Виходи 1 або нічого, працює для всіх тестових випадків.


Мені все ще цікаво, що таке гострий соус , маючи 2 одиниці .


Правки

  • Збережено 6 байтів , об'єднавши два масиви для напоїв та множника та вилучивши 0з 0.2.

1

Кег , 165 байт (SBCS)

¿®w?(: =[_]")0®u(!4/|\0-&:B=[&3*&|:C=[&55**&|:G=[&2*&|:K=[&\2*&|&15/*&]]]]__:b=[&1*&|:e=[&0&|:h=[&2*&|:j=[&0&|:r=[&6*&|:t=[&7*&|:v=[&6*&|&3*&]]]]]]]_©u&+®u)©w2/:©u<.

Спробуйте в Інтернеті!

Я відчуваю, ніби відповідь Кега ніколи не була більш доречною! Напевно, це може бути гольф, але я не думаю, що це може.

Пояснив

¿®w                                                                         #Take the weight and store it in a variable
?(: =[_]")                                                                  #Take the second line and remove spaces
0®u                                                                         #Store the units in a variable
(!4/|                                                                       #For every part in the input
\0-&                                                                        #Store the amount of drink in the register
:B=[&3*&|:C=[&55**&|:G=[&2*&|:K=[&\2*&|&15/*&]]]]__                         #Determine the beverage multiplier
:b=[&1*&|:e=[&0&|:h=[&2*&|:j=[&0&|:r=[&6*&|:t=[&7*&|:v=[&6*&|&3*&]]]]]]]_   #Determine the drink
©u&+®u)                                                                     #Add the amount to units
©w2/:©u<.                                                                   #Check the condition and print
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.