Petualangan Golfer
Ini tantangan pertama! Akan ada lebih banyak tantangan nanti yang akan membutuhkan data dari tantangan sebelumnya :)
Bab 1: Vas
Mari kita bayangkan sebentar .. Anda adalah Dewa yang kuat, kekuatan Anda tidak terbatas tetapi membutuhkan satu hal: Jiwa. Setiap jiwa di sini diwakili oleh satu byte, setiap byte yang Anda gunakan tidak mengorbankan jiwa. Jadi tujuannya jelas untuk menyelamatkan jumlah terbesar orang sambil mengorbankan jumlah jiwa paling sedikit.
Tantangan pertama Anda adalah menyelamatkan sebuah desa kecil, iblis tidak mau menghancurkan seluruh desa jika Anda menyelesaikan tantangannya.
Tantangan :
Anda memiliki vas vertikal yang dapat berisi tepat 10 hal (termasuk udara). Jika Anda memasukkan sesuatu ke dalam vas itu, gravitasi akan membuat benda itu jatuh ke dasar. Jika vas sudah penuh (dan selalu penuh jika Anda menganggapnya "penuh udara"), input akan menggantikan elemen di bagian atas vas.
Ini adalah seperangkat hal yang diizinkan:
- Udara
0 /
- Sebuah batu
1 / -
- Daun
2 / ~
- Sebuah bom
3 / x
Jika ada batu atau daun di atas "Bom", itu akan meledak dan menghancurkan benda di atasnya.
Input adalah daftar hal-hal yang akan Anda masukkan ke dalam vas setiap belokan.
Contoh: 11231: Anda akan meletakkan 2 batu, lalu daun, lalu bom dan akhirnya batu terakhir.
Saat vasnya statis, Anda bisa mulai menghitung dengan aturan berikut:
- Rock menambahkan 1 unit ke akumulator
- Leaf mengalikan akumulator dengan 2
- Bom mengurangi akumulator dengan 1
- Udara tidak melakukan apa-apa
(Anda harus mulai menghitung dari atas vas)
Berikut ini simulasi yang kami dapat menggunakan "11231" sebagai input:
|-| |-| |~| |x| |-| | | | | | | | | | | | |
| | |-| |-| |~| |x| |-| | | | | | | | | | |
| | | | |-| |-| |~| |x| |-| | | | | | | | |
| | | | | | |-| |-| |~| |x| |-| | | | | | |
| | | | | | | | |-| |-| |~| |x| |-| | | | |
| | | | | | | | | | |-| |-| |~| |x| |-| | |
| | | | | | | | | | | | |-| |-| |~| |x| | |
| | | | | | | | | | | | | | |-| |-| |~| |~|
| | | | | | | | | | | | | | | | |-| |-| |-|
| | | | | | | | | | | | | | | | | | |-| |-|
Dan hasilnya akan 2 (dihitung sebagai ((0 x 2) + 1) + 1
) Tidak perlu mencetak semua status vas!
Program dasar (Python3)
Anda dapat menjalankannya untuk memahami cara kerjanya.
def printVase(vase):
for i in vase:
if i == 1:
print("|-|")
elif i == 2:
print("|~|")
elif i == 3:
print("|x|")
else:
print("| |")
def updateVase(vase):
changed = False
for i in range(len(vase), -1, -1):
if i < len(vase) - 1:
if vase[i+1] == 3 and vase[i] in [1,2]:
vase[i], vase[i+1] = 0, 0
changed = True
if not vase[i+1] and vase[i] in [1, 2, 3]:
vase[i], vase[i+1] = vase[i+1], vase[i]
changed = True
return changed
userInput = input("Vase : ")
vase = [0 for i in range(0, 10)]
oldVase = vase
while updateVase(vase) or userInput != "":
if userInput != "":
vase[0] = int(userInput[0])
userInput = userInput[1::]
printVase(vase)
input()
accumulator = 0
for i in vase:
if i == 1:
accumulator += 1
if i == 2:
accumulator *= 2
if i == 3:
accumulator -= 1
print(accumulator)
Versi golf (Python3, tanpa Layar Vas): 360 byte = 360 poin
def u(v):
c=0
for i in range(len(v),-1,-1):
if i<len(v)-1:
if v[i+1]==3 and v[i]in[1,2]:v[i],v[i+1],c=0,0,1
if not v[i+1]and v[i]in[1,2,3]:v[i],v[i+1],c=v[i+1],v[i],1
return c
l,v=input(),[0 for i in range(0, 10)]
while u(v)or l!="":
if l!="":v[0],l=int(l[0]),l[1::]
a=0
for i in v:
if i==1:a+=1
if i==2:a*=2
if i==3:a-=1
print(a)
Jika Anda ingin menguji apakah program Anda berfungsi dengan benar, Anda dapat menguji input ini: 12122111131
Jawaban yang benar adalah 43 :) (Terima kasih Emigna)
Sekarang untuk poin:
- (x) menunjukkan di mana: x adalah jumlah byte yang diperlukan untuk menulis program Anda. Jika Anda menjawab setelah tantangan berikutnya diposting, poin untuk tantangan ini tidak akan ditambahkan ke jumlah total poin Anda.
Tujuannya adalah untuk menjaga jumlah minimum poin selama seluruh tantangan :) Jika Anda melewatkan salah satu bagian dari tantangan, Anda akan memiliki (wx + 1) poin secara default untuk bagian yang dilewati (di mana wx adalah skor terburuk untuk tantangan itu).
Data yang akan dibutuhkan untuk tantangan berikutnya:
Output saat input = 10100000200310310113030200221013111213110130332101
Juara Saat Ini: Emigna
Semoga beruntung semuanya !
333
membuat vas[0, 0, 0, 0, 0, 0, 0, 3, 3, 3]
dalam algoritme golf Anda dan karenanya skor-3
, tetapi bukankah seharusnya demikian[0, 0, 0, 0, 0, 0, 0, 0, 0, 3]
dan kemudian skor-1
sesuai dengan spesifikasi Anda?Jawaban:
Python 2 -
208191 185 180 172 172156 byteKerusakan itu menghilangkan udara dan bom jika ada di tumpukan kemudian dihitung.
EDIT: Saya bertukar ke Python 2 untuk menyimpan byte, tetapi sekarang input harus dimasukkan ke dalam kawat gigi seperti '3312123
EDIT2: Saya juga agak bangga dengan jumlah akumulator
EDIT3: Terima kasih atas semua saran Anda, saya tidak akan pernah berpikir saya bisa mendapatkannya begitu rendah
sumber
t[:10][::-1]
alih-alihreverse()
untuk menyimpan 4 byte dan juga mungkin menggunakan Python 2 untuk menyimpan braket padaprint
? Datang ke 5 lebih banyak jiwa yang diselamatkan untuk saya :)05AB1E ,
2836 byte05AB1E menggunakan pengkodean CP-1252 .
Cobalah online!
sumber
T£ÀRS
->
Air mata->
saya menangis baik-baik saja ...Retina ,
5856 byteCobalah online!
sumber
Python 2,
150146 byteTerima kasih kepada Pâris Douady untuk rumus poin, dan untuk menghemat 4 byte.
sumber
for c in input()
langsungJavascript,
267264249 jiwa dikorbankanVersi yang diedit, karena yang sebelumnya salah untuk input yang lebih besar. Golf sedikit lebih jauh dengan membuat
string.prototype.replace()
panggilan fungsi array-diakses. Penjelasan:f('11231');
kembali2
. Cobalah onlinesumber
Haskell,
221 202 181 177166 bytejiwaCobalah di ideone . Mengambil item sebagai daftar integer.
Pemakaian:
(Sunting: Lama) Penjelasan:
sumber
f "0000000000" ""
, Anda tidak perlu spasi di antara mereka. Saya menambahkan penjelasan ke kode.