술집을 다룰 수 있습니까?


23

배경

금요일 오후 늦었고 당신과 친구들은 그날 저녁 늦게 술집을 치기로 결정했지만 술집에 가기 전에 몇 가지 음료가 있어야한다고 생각합니다. 그러나 상황이 빠르게 확대됩니다. 당신의 친구 Shaddock Pamplemousse는 이번 주 초 복권에 당첨되어 다른 음료수를 가진 상자에 상자를 가져 오기로 결정했습니다. 술집의 보안은 매우 엄격하며 구내로 들어가기 전에 과잉 섭취하면 내부에 출입 할 수 없습니다. 당신은 모두 프로그래머입니다-그래서 당신은 일이 어쨌든 크게 될 것이라고 생각합니다.

도전

합리적인 술집 한도를 초과 / 하한 경우 진실 / 거짓을 출력하는 알코올 측정기를 프로그래밍해야합니다. 술집에 가기 전에 stdin측정 프로그램이 읽는 저녁 동안 소비 한 양과 음료 유형을 입력하십시오 . 그것이 진실로 출력되면, 당신은 술집 한도를 초과하고 집에 머물러 있습니다. 그것이 허위로 출력되면, 당신은 갈 것입니다.

입력

이보다 큰 정수 0는 체중을 킬로그램 단위로 나타내며 개행이 이어집니다. 이 입력 다음에 다음과 같은 형식으로 일련의 한 자리수의 음료와 음료가 이어집니다.

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

맥주 한 병의 경우 다음과 같습니다.

1Bob

각 입력은 공백으로 구분됩니다.

입력 사양

각 음료에는 음료로 인한 충격에 해당하는 단위가 있습니다. 체중을 2로 나눈 것보다 더 많은 단위를 소비하면 술집은 더 이상 옵션이 아닙니다.

(이것은 현실을 반영하거나 반영하지 않을 수 있습니다)

다음은 유효한 음료 및 음료의 해당 알코올 단위입니다.

  • 맥주 : 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

산출

프로그램 은 소비량이 체중을 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. 정확히 한계에 도달하면 무엇을 출력합니까? 아니면 중요하지 않습니까?
Level River St

1
좋은 전화; 나는 그것을 완전히 놓쳤다. 나는 올리브 오일을 제거하고 있습니다 (어쨌든 누가 마십니까?) 한계 이하이거나 틀리면 출력해야합니다. 추가하겠습니다.
sweerpotato

1
두 자리 이상의 음료가 있습니까? 예를 들어 43Gow?
Morgan Thrapp

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

이제 우리는 뱀과 함께 골프를 치고 있습니다!

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))

나는 당신이 dicts를 버리고 인쇄 진술에서 모든 것을했다면 좋을 것이라고 생각합니다. 그래서, 제거 m및 교체 m[p[-1]]와 비트 [3,25,2,50,.2]['BCGKS'.find(p[-1])], 그리고와 같은 d. 코드 변경으로 168로 줄었습니다.
Kade

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 : 또는 당신은 충분히 골프하지 않았습니다. :)
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에 매핑됩니다.


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

:오히려 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

자바 스크립트, 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)

다음을 사용하여 두 개의 값을 읽습니다. promptalert같은 결과이야 [true|false].


편집

  • 논리식을 사용하여 5 바이트 절약||0음료수를 0단위 로 선언하는 대신 . user81655 감사합니다 .
  • 변수 에 저장 하고 초기화를 단축하여 3 바이트절약했습니다prompt . Stefnotch 에게 감사합니다 .

1
로 변경 ,e:0,j:0}[b[++i]]하여 6 바이트를 절약 할 수 }[b[++i]]|0있습니다.
user81655 10

@ 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

떠들썩한 파티 (+ GNU가 나오지 기원전 +), 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

자바 스크립트, 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에서 자바 스크립트 .
insertusernamehere 여기

1
ES6로 이동하고 arrow-operator를 사용하여 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))
insertusername 여기

1

파이썬 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, 163169 바이트

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

Keg , 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.