คุณจัดการผับได้ไหม?


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
โทรดี ฉันคิดถึงสิ่งนั้นทั้งหมด ฉันจะลบน้ำมันมะกอก (ใครจะดื่มนั่นล่ะ?) ต่ำกว่าหรือเท่ากับที่ควรจะเป็นเท็จ ฉันจะเพิ่มที่
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

Python 3, 131

ตอนนี้เรากำลังเล่นกอล์ฟกับงู!

บันทึกแล้ว 18 ไบต์ขอบคุณ shebang
บันทึกอีก 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))

ฉันคิดว่ามันอาจจะดีถ้าคุณทำ 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

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

Ruby, 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และalerts [true|false]ผลตามที่


การแก้ไข

  • บันทึก 5 ไบต์โดยใช้นิพจน์โลจิคัล||0แทนการประกาศเครื่องดื่มพร้อม0หน่วย ขอขอบคุณที่user81655
  • บันทึก 3 ไบต์โดยเก็บไว้promptในตัวแปรและทำให้การเริ่มต้นสั้นลง ขอขอบคุณที่Stefnotch

1
คุณสามารถประหยัด 6 ไบต์โดยการเปลี่ยนไป,e:0,j:0}[b[++i]] }[b[++i]]|0
user81655

@ user81655 เมื่อวานนี้ผมคิดว่าวิธีการกำจัดของบรรดา0-values ฉันไม่คิดอย่างนั้น ต้องใช้||แทนตัวดำเนินการระดับบิต ยังน้อยกว่า 5 ไบต์ ขอบคุณ
แทรกชื่อที่นี่

ไม่มีปัญหา. ฉันลืมเกี่ยวกับค่าที่ไม่ใช่จำนวนเต็มที่เป็นไปได้
user81655

1
for(s=i=0,a=prompt(),b=prompt();สามารถเปลี่ยนเป็น:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch

1
@Stefnotch นั่นฉลาด ฉันชอบมัน. ขอบคุณสำหรับการบันทึก 3 ไบต์
แทรกชื่อที่นี่

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 ไบต์โดยการผสานสองอาร์เรย์สำหรับเครื่องดื่มและคูณและโดยการเอาจาก00.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.