パブを処理できますか?


23

バックグラウンド

金曜日の午後遅く、あなたとあなたの友人はその夜遅くにパブに行くことにしましたが、パブに行く前に、いくつかの飲み物が必要だと思います。ただし、事態は急速に拡大します。友人のシャドックパンプルムースが今週初めに宝くじに当選し、さまざまな飲み物の入った木箱に木箱を持ち込むことにしました。パブでのセキュリティは非常に厳しく、敷地内に入ろうとする前に過度に消費する場合、中に入ることはできません。あなたはすべてプログラマーです-だからとにかく物事がうまくいくと思います。

チャレンジ

あなたが合理的なパブの制限を上回っている/下回っている場合、真実/偽を出力するアルコールメーターをプログラムする必要があります。パブに行く前にstdin、測定プログラムが読み取る夕方に消費した量と飲料の種類を入力します。それが真実を出力する場合、あなたはパブの制限を超えており、家にいます。それが偽物を出力する場合、あなたは行ってもいいです。

入力

0体重をキログラムで表し、改行が続く整数よりも大きい整数。この入力の後に、次の形式で一連の1桁の金額と飲料が続きます。

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

ビール1本の場合、これは次のようになります。

1Bob

各入力はスペースで区切られます。

入力仕様

各飲料には、それに起因する衝撃に対応する単位があります。体重を2で割った数より多くのユニットを消費する場合、パブはもう選択肢ではありません。

(これは現実を反映する場合としない場合があります)

以下は、有効な飲料および飲料の対応するアルコール単位です。

  • ビール:b1単位

  • エネルギードリンク:e0単位

  • ホットソース:h2ユニット(強力なもの)

  • ジュース(有機果実などからなる)j0単位

  • ラム:r6単位

  • テキーラ:t7単位

  • ウォッカ:v6単位

  • ワイン:w3単位

さまざまな金額タイプがあります。

  • ボトル: B

  • 木枠: C

  • ガラス: G

  • 樽: K

  • 一口: S

各金額タイプには、それに含まれる飲料のアルコール単位を乗算する乗数があります。

  • ボトル: 3

  • 木枠: 25

  • ガラス: 2

  • 樽: 50

  • 一口: 0.2

出力

プログラムは、消費量が体重を2で割った値より上/下である場合に、真実/偽を出力しstdoutます。消費量が体重を2で割った値と等しい場合、偽を出力する必要があります。

可能な入力および出力のサンプル

入力

70
1Bob 3Soj

出力

False

入力

2
1Cov

出力

1

入力

50
1Cob

出力

0

入力

100
4Gow 1Koe 1Bov 1Gow 2Sot

出力

True

バイト単位の最短プログラムが勝ちです!


1
1. oは特に指定していませんが、フォーマット文字であるようです。これを明確にする必要があります(oオリーブオイルも参照)。2.厳密に制限に達した場合、何を出力しますか。またはそれは重要ではありませんか?
レベルリバーセント

1
良い電話; 私はそれを見逃しました。私はオリーブオイルを除去しています(とにかく誰がそれを飲みますか?)限界以下で偽物を出力するはずです。それを追加します。
sweerpotato

1
1桁以上の飲み物はありますか?例えば、43Gow
モーガンスラップ

6
良い質問を1つ追加しますが、金曜日の午後なので、ビールを飲みに出かけなければなりません。たぶん月曜日:)
MickyT

1
負の量を除いて、実際に任意の量になるように意図しました。それが曖昧になるとは思わなかった。これを変更すると、あなたの答えが無効になります。それが私たちのやり方ではありません。金額は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

Python 3、131

今、私たちはヘビとゴルフをしています!

shebangのおかげで18バイト節約されました。
DSMのおかげでさらに4バイト節約できました。
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))

辞書を削除して、printステートメントですべてを実行した方が良いと思います。したがって、ビットを削除しm、で置き換え、同じものをm[p[-1]]で置き換えます。これらのコードの変更により、168になりました。[3,25,2,50,.2]['BCGKS'.find(p[-1])]d
ケード

4

Minkolang 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:むしろ、あなたはそれを十分にゴルフしていません。:)
エルエンディアスターマン

というか、両方。: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

CJam、77

qN%~S%{:BW="behjrtvw"\#10206773s:~\=[3 25 2 50 .2]"BCGKS"B-3=#=*1mO}%:+\~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

:改行ではなく改行を使用しても短くなることはありませんが、ゴルフのように見えます!

読み取り可能な形式

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複数行入力をサポートしていないため、スペースで区切られた重みを持つ1つの文字列として入力します


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)

を使用して2つの値を読み取りpromptalertsとして結果を取得し[true|false]ます。


編集

  • 飲料を単位で宣言する代わりに、論理式を使用して5バイトを節約||00ました。おかげuser81655
  • 変数に保存して初期化を短縮することにより、3バイトを節約しpromptました。Stefnotchに感謝します

1
に変更,e:0,j:0}[b[++i]]すると、6バイト節約できます}[b[++i]]|0
user81655

@ user81655昨日、それらの0値を取り除く方法を考えていました。まあ、私はそれを考えていませんでした。||ビット演算子の代わりに使用する必要がありました。それでも5バイト少なくなります。ありがとう。
insertusernamehere

問題ない。可能な非整数値を忘れていました。
user81655

1
for(s=i=0,a=prompt(),b=prompt();次のように変更できますfor(c=prompt,b=c(a=c(s=i=0));
。– Stefnotch

1
@Stefnotchそれは賢い。私はそれが好きです。3バイトを保存していただきありがとうございます。
insertusernamehere

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を
insertusernamehere

1
ES6に進み、矢印演算子を使用して、30バイトを節約 できます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))
insertusernamehere

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台を


編集

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