Bisakah kamu menangani pub?


23

Latar Belakang

Ini Jumat sore dan Anda dan teman Anda memutuskan untuk pergi ke pub malam itu, tetapi sebelum pergi ke pub Anda pikir Anda harus memiliki beberapa minuman. Namun, hal-hal meningkat dengan cepat; temanmu Shaddock Pamplemousse memenangkan lotre awal minggu ini dan memutuskan untuk membawa peti ke atas peti dengan minuman yang berbeda. Keamanan di pub sangat ketat, dan jika Anda menggunakan terlalu banyak sebelum mencoba memasuki tempat Anda tidak diizinkan masuk. Anda semua adalah programmer - jadi Anda pikir semuanya akan baik-baik saja.

Tantangan

Anda perlu memprogram pengukur alkohol yang menghasilkan kebenaran / kepalsuan jika Anda berada di atas / di bawah batas pub yang masuk akal. Sebelum Anda pergi ke pub, Anda memasukkan jumlah dan jenis minuman yang telah Anda konsumsi pada malam hari stdinketika program pengukuran Anda membaca. Jika hasilnya benar, Anda berada di atas batas pub dan tinggal di rumah. Jika hasilnya salah, Anda bisa melakukannya.

Memasukkan

Satu bilangan bulat lebih besar dari 0yang mewakili berat badan Anda dalam kilogram diikuti oleh garis baru. Input ini diikuti oleh serangkaian jumlah dan minuman satu digit pada formulir berikut:

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

Untuk satu botol bir ini akan terlihat seperti:

1Bob

Setiap input dipisahkan oleh spasi.

Spesifikasi input

Setiap minuman memiliki unit yang sesuai dengan dampak yang ditimbulkan olehnya. Jika Anda mengonsumsi lebih banyak unit daripada berat Anda dibagi dua, pub bukan merupakan pilihan lagi.

(Ini mungkin atau mungkin tidak mencerminkan kenyataan)

Berikut ini adalah minuman yang valid dan unit alkohol yang sesuai dari minuman tersebut:

  • Beer: b, 1Unit

  • Minuman energi: e, 0unit

  • Saus panas: h, 2unit (barang-barang yang kuat)

  • Juice (terbuat dari buah-buahan organik dll): j, 0unit

  • Rum: r, 6unit

  • Tequila: t, 7unit

  • Vodka: v, 6unit

  • Wine: w, 3unit

Ada beberapa jenis jumlah:

  • Botol: B

  • Peti: C

  • Kaca: G

  • Tong: K

  • Menyesap: S

Setiap jenis jumlah memiliki pengganda yang mengalikan unit alkohol dari minuman yang terkandung di dalamnya:

  • Botol: 3

  • Peti: 25

  • Kaca: 2

  • Tong: 50

  • Menyesap: 0.2

Keluaran

Program Anda akan menampilkan kebenaran / kepalsuan ke stdoutjika jumlah yang dikonsumsi di atas / di bawah berat badan Anda dibagi dengan 2. Jika jumlah yang dikonsumsi sama dengan berat Anda dibagi dengan 2, Anda harus menghasilkan kepalsuan.

Sampel kemungkinan input dan output

Memasukkan

70
1Bob 3Soj

Keluaran

False

Memasukkan

2
1Cov

Keluaran

1

Memasukkan

50
1Cob

Keluaran

0

Memasukkan

100
4Gow 1Koe 1Bov 1Gow 2Sot

Keluaran

True

Program terpendek dalam byte menang!


1
1. Tampaknya itu oadalah format karakter, meskipun Anda belum mengatakannya secara khusus. Anda harus mengklarifikasi ini (sebagaimana ojuga mengacu pada minyak zaitun). 2. Apa yang kita hasilkan jika kita benar-benar dalam batas? atau tidak masalah?
Level River St

1
Panggilan yang bagus; Saya benar-benar merindukan itu. Saya mengeluarkan minyak zaitun (siapa yang meminumnya?) Di bawah atau sama dengan batas harus menghasilkan falsy. Saya akan menambahkannya.
sweerpotato

1
Apakah akan ada lebih dari satu digit minuman? Misalnya 43Gow,?
Morgan Thrapp

6
+1 pertanyaan yang bagus, tapi ini hari Jumat sore dan saya harus keluar untuk minum bir. Mungkin Senin :)
MickyT

1
Saya bermaksud agar jumlahnya benar-benar - kecuali untuk jumlah negatif. Saya tidak berpikir itu akan menjadi ambigu. Saya menyadari jika saya mengubahnya ini akan membatalkan jawaban Anda, dan bukan itu yang kami lakukan. Jumlah akan diklarifikasi sebagai satu digit.
sweerpotato

Jawaban:


4

CJam, 53 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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

Sekarang kita bermain golf dengan ular!

Disimpan 18 byte berkat shebang.
Disimpan 4 byte lebih banyak berkat DSM.
Menyimpan banyak byte berkat tzaman.

Banyak terima kasih kepada tzaman atas tipu muslihatnya yang menyalahgunakan untuk .find()kembali -1jika tidak menemukan nilai.

Saat ini mengasumsikan format minuman ini persis seperti yang dinyatakan dalam tantangan, misalnya, hanya 1 digit nilai setiap minuman.

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

Saya pikir mungkin baik jika Anda menjatuhkan dicts dan melakukan segalanya dalam pernyataan cetak. Jadi, hapus mdan ganti m[p[-1]]bit dengan [3,25,2,50,.2]['BCGKS'.find(p[-1])], dan sama dengan d. Saya turun ke 168 dengan perubahan-perubahan pada kode Anda.
Kade

4

Minkolang 0,11 , 59 byte

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

Coba di sini.

Penjelasan

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.

Saya kira CJam sudah ketinggalan jaman ... Saya harus menyelesaikan bahasa saya saat itu
anOKsquirrel

@anOKsquirrel: Atau lebih tepatnya, Anda hanya belum cukup bermain golf. :)
El'endia Starman

Atau lebih tepatnya, keduanya. : P
anOKsquirrel

Tidak, sebenarnya, saya hanya buruk: p
anOKsquirrel

3

CJam, 54 byte

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

Agak fiddly dan mungkin suboptimal, tapi saya pikir ini berfungsi dengan baik. Cobalah online .

Penjelasan

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

Perhatikan bahwa array numerik memiliki 2 di akhir, yang berarti bahwa Gho, yang hilang dari string pertama, bisa dipetakan ke 2.


2

CJam, 77

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

2

VBA, 251 byte

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

Menggunakan :lebih daripada Newline tidak membuatnya lebih pendek, tetapi memang terlihat lebih golf!

Format yang Dapat Dibaca

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

Cukup yakin ini bisa bermain golf. Manipulasi String saya dengan Mid(Right())tampaknya terlalu bertele-tele, Tetapi menjalankan array meskipun StrReversemembuatnya lebih lama. Jika kami menganggap Anda hanya minum 0-9 dari minuman tertentu pada suatu waktu, kami dapat menyimpan beberapa byte

Ambil input sebagai satu string dengan berat dipisahkan oleh spasi karena VBAdosis tidak mendukung input multi baris


2

Ruby, 153 byte

Saya perlu menyingkirkan gsubs entah bagaimana

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 byte

Ini adalah program lengkap dan pada dasarnya merupakan adaptasi dari jawaban PHP saya :

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)

Bunyinya dua nilai menggunakan promptdan alerts hasilnya sebagai [true|false].


Suntingan

  • Disimpan 5 byte dengan menggunakan ekspresi logis ||0alih-alih menyatakan minuman dengan 0unit. Terima kasih kepada user81655 .
  • Disimpan 3 byte dengan menyimpan promptdalam variabel dan memperpendek inisialisasi. Terima kasih untuk Stefnotch .

1
Anda dapat menyimpan 6 byte dengan mengubah ,e:0,j:0}[b[++i]]ke }[b[++i]]|0.
user81655

@ user81655 Kemarin saya berpikir, bagaimana cara menyingkirkan nilai- 0nilai itu. Yah, saya tidak memikirkan itu. Harus menggunakan ||bukan operator bitwise. Masih 5 byte lebih sedikit. Terima kasih.
masukkan nama pengguna di sini

Tidak masalah. Saya lupa tentang kemungkinan nilai-nilai non-integer.
user81655

1
for(s=i=0,a=prompt(),b=prompt();dapat diubah menjadi:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch

1
@Stefnotch Itu pintar. Saya suka itu. Terima kasih telah menyimpan 3 byte.
masukkan nama pengguna di sini

1

bash (+ bc + GNU sed), 200 196 194 byte

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 byte

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

Karena Javascript membutuhkan pustaka untuk mengakses STDIN, kode ini hanyalah fungsi yang menerima keseluruhan input, yaitu b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")


1
Sebagai catatan: prompt()diterima secara umum sebagai alternatif yang valid STDINdalam JavaScript .
masukkan nama pengguna di sini

1
Anda bisa menyimpan 30 byte dengan pergi ES6 dan menggunakan panah operator: 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)).
masukkan nama pengguna di sini

1

Python 3, 157 byte

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 byte

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;

Keluaran 1 atau tidak sama sekali, bekerja untuk semua kasus uji.


Saya masih bertanya-tanya apa saus panas ini, memiliki 2 unit .


Suntingan

  • Disimpan 6 byte dengan menggabungkan dua array untuk minuman dan pengganda dan dengan menghapus 0dari 0.2.

1

Keg , 165 byte (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<.

Cobalah online!

Saya merasa seolah-olah jawaban Tong tidak pernah lebih tepat! Ini mungkin bisa golf, tetapi saya pikir itu tidak bisa.

Dijelaskan

¿®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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.