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


23

Задний план

Поздний вечер пятницы, и вы и ваши друзья решите зайти в паб позже тем же вечером, но перед тем, как пойти в паб, вы полагаете, что вам следует выпить несколько напитков. Однако все быстро обостряется; Ваш друг Шеддок Памплемус выиграл в лотерею ранее на этой неделе и решил принести ящики на ящики с различными напитками. Безопасность в пабе очень строгая, и если вы чрезмерно потребляете, прежде чем пытаться войти в помещение, вам не разрешают войти внутрь. Вы все программисты - так что вы полагаете, что все равно получится великолепно.

Вызов

Вам нужно запрограммировать счетчик алкоголя, который выдает правду / ложь, если вы выше / ниже разумного лимита паба. Перед тем, как идти в паб, вы вводите количество и тип напитка, которые вы употребляли в течение вечера, до 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

  • Crate: C

  • Стекло: G

  • Бочонок: K

  • Глоток: S

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

  • Бутылка: 3

  • Crate: 25

  • Стекло: 2

  • Бочонок: 50

  • Глоток: 0.2

Выход

Ваша программа должна выводить достоверность / ложность,stdout если потребляемая сумма выше / ниже веса вашего тела, деленного на 2. Если потребляемая сумма равна вашему весу, деленному на 2, вы должны выводить ложные значения.

Образцы возможного ввода и вывода

вход

70
1Bob 3Soj

Выход

False

вход

2
1Cov

Выход

1

вход

50
1Cob

Выход

0

вход

100
4Gow 1Koe 1Bov 1Gow 2Sot

Выход

True

Самая короткая программа в байтах побеждает!


1
1. Похоже, что oэто символ формата, хотя вы не сказали это специально. Вы должны уточнить это (как oотносится и к оливковому маслу). 2. Что мы выводим, если находимся на пределе? или это не имеет значения?
Уровень Река St

1
Хороший звонок; Я полностью пропустил это. Я удаляю оливковое масло (кто что пьет в любом случае?), Ниже или равный предел должен выводить ложные. Я добавлю это.
Sweerpotato

1
Будет ли когда-нибудь более одной цифры напитка? Например 43Gow?
Морган Трепп

6
+1 хороший вопрос, но сегодня пятница, и мне нужно пойти на пиво. Возможно понедельник :)
MickyT

1
Я намеревался сделать так, чтобы это была любая сумма, за исключением отрицательных сумм. Я не думал, что это окажется неоднозначным. Я понимаю, что если я изменю это, это лишит законной силы ваш ответ, и это не то, как мы делаем вещи. Сумма будет уточнена одной цифрой.
Sweerpotato

Ответы:


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 байтов благодаря Shebang.
Сохранено еще 4 байта благодаря DSM.
Благодаря 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

Довольно уверен, что это может быть в гольф. Мое манипулирование строкой Mid(Right())кажется чрезмерно многословным, но выполнение массива, тем не менее, StrReverseделает его длиннее. Если мы предполагаем, что вы пьете только 0-9 от любого конкретного напитка за раз, мы можем сэкономить несколько байтов

Возьмите ввод как одну строку с весом, разделенным пробелом как VBA доза не поддерживает многострочный ввод


2

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

Мне нужно как-то избавиться от gsubs

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и alertполучая результат как [true|false].


Правки

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

1
Вы можете сохранить 6 байтов, изменив ,e:0,j:0}[b[++i]]на }[b[++i]]|0.
user81655

@ user81655 Вчера я думал, как избавиться от этих значений 0. Ну, я не думал об этом. Пришлось использовать ||вместо побитового оператора. Еще на 5 байт меньше. Спасибо.
insertusername здесь

Нет проблем. Я забыл о возможных нецелых значениях.
user81655

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 .
insertusername здесь

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.